server: Pass the rectangle in client coordinates for update_window_zorder.
This commit is contained in:
parent
d56ac06260
commit
6ee4521886
|
@ -731,19 +731,16 @@ static void X11DRV_Expose( HWND hwnd, XEvent *xev )
|
||||||
|
|
||||||
if (!(data = X11DRV_get_win_data( hwnd ))) return;
|
if (!(data = X11DRV_get_win_data( hwnd ))) return;
|
||||||
|
|
||||||
|
rect.left = event->x;
|
||||||
|
rect.top = event->y;
|
||||||
|
rect.right = event->x + event->width;
|
||||||
|
rect.bottom = event->y + event->height;
|
||||||
if (event->window == data->whole_window)
|
if (event->window == data->whole_window)
|
||||||
{
|
{
|
||||||
rect.left = data->whole_rect.left + event->x;
|
OffsetRect( &rect, data->whole_rect.left - data->client_rect.left,
|
||||||
rect.top = data->whole_rect.top + event->y;
|
data->whole_rect.top - data->client_rect.top );
|
||||||
flags |= RDW_FRAME;
|
flags |= RDW_FRAME;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
rect.left = data->client_rect.left + event->x;
|
|
||||||
rect.top = data->client_rect.top + event->y;
|
|
||||||
}
|
|
||||||
rect.right = rect.left + event->width;
|
|
||||||
rect.bottom = rect.top + event->height;
|
|
||||||
|
|
||||||
if (event->window != root_window)
|
if (event->window != root_window)
|
||||||
{
|
{
|
||||||
|
@ -758,8 +755,6 @@ static void X11DRV_Expose( HWND hwnd, XEvent *xev )
|
||||||
}
|
}
|
||||||
SERVER_END_REQ;
|
SERVER_END_REQ;
|
||||||
|
|
||||||
/* make position relative to client area instead of parent */
|
|
||||||
OffsetRect( &rect, -data->client_rect.left, -data->client_rect.top );
|
|
||||||
flags |= RDW_ALLCHILDREN;
|
flags |= RDW_ALLCHILDREN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -119,29 +119,6 @@ void X11DRV_Xcursor_Init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* get_coords
|
|
||||||
*
|
|
||||||
* get the coordinates of a mouse event
|
|
||||||
*/
|
|
||||||
static inline void get_coords( HWND hwnd, Window window, int x, int y, POINT *pt )
|
|
||||||
{
|
|
||||||
struct x11drv_win_data *data = X11DRV_get_win_data( hwnd );
|
|
||||||
|
|
||||||
if (!data) return;
|
|
||||||
|
|
||||||
if (window == data->client_window)
|
|
||||||
{
|
|
||||||
pt->x = x + data->client_rect.left;
|
|
||||||
pt->y = y + data->client_rect.top;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pt->x = x + data->whole_rect.left;
|
|
||||||
pt->y = y + data->whole_rect.top;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* clip_point_to_rect
|
* clip_point_to_rect
|
||||||
*
|
*
|
||||||
|
@ -241,25 +218,33 @@ void set_window_cursor( HWND hwnd, HCURSOR handle )
|
||||||
*/
|
*/
|
||||||
static void update_mouse_state( HWND hwnd, Window window, int x, int y, unsigned int state, POINT *pt )
|
static void update_mouse_state( HWND hwnd, Window window, int x, int y, unsigned int state, POINT *pt )
|
||||||
{
|
{
|
||||||
struct x11drv_thread_data *data = x11drv_thread_data();
|
struct x11drv_win_data *data = X11DRV_get_win_data( hwnd );
|
||||||
|
|
||||||
get_coords( hwnd, window, x, y, pt );
|
if (!data) return;
|
||||||
|
|
||||||
|
if (window == data->whole_window)
|
||||||
|
{
|
||||||
|
x += data->whole_rect.left - data->client_rect.left;
|
||||||
|
y += data->whole_rect.top - data->client_rect.top;
|
||||||
|
}
|
||||||
|
pt->x = x + data->client_rect.left;
|
||||||
|
pt->y = y + data->client_rect.top;
|
||||||
|
|
||||||
cursor_window = hwnd;
|
cursor_window = hwnd;
|
||||||
|
|
||||||
/* update the wine server Z-order */
|
/* update the wine server Z-order */
|
||||||
|
|
||||||
if (window != data->grab_window &&
|
if (window != x11drv_thread_data()->grab_window &&
|
||||||
/* ignore event if a button is pressed, since the mouse is then grabbed too */
|
/* ignore event if a button is pressed, since the mouse is then grabbed too */
|
||||||
!(state & (Button1Mask|Button2Mask|Button3Mask|Button4Mask|Button5Mask|Button6Mask|Button7Mask)))
|
!(state & (Button1Mask|Button2Mask|Button3Mask|Button4Mask|Button5Mask|Button6Mask|Button7Mask)))
|
||||||
{
|
{
|
||||||
SERVER_START_REQ( update_window_zorder )
|
SERVER_START_REQ( update_window_zorder )
|
||||||
{
|
{
|
||||||
req->window = wine_server_user_handle( hwnd );
|
req->window = wine_server_user_handle( hwnd );
|
||||||
req->rect.left = pt->x;
|
req->rect.left = x;
|
||||||
req->rect.top = pt->y;
|
req->rect.top = y;
|
||||||
req->rect.right = pt->x + 1;
|
req->rect.right = x + 1;
|
||||||
req->rect.bottom = pt->y + 1;
|
req->rect.bottom = y + 1;
|
||||||
wine_server_call( req );
|
wine_server_call( req );
|
||||||
}
|
}
|
||||||
SERVER_END_REQ;
|
SERVER_END_REQ;
|
||||||
|
|
|
@ -2441,7 +2441,7 @@ enum coords_relative
|
||||||
/* Update the z order of a window so that a given rectangle is fully visible */
|
/* Update the z order of a window so that a given rectangle is fully visible */
|
||||||
@REQ(update_window_zorder)
|
@REQ(update_window_zorder)
|
||||||
user_handle_t window; /* handle to the window */
|
user_handle_t window; /* handle to the window */
|
||||||
rectangle_t rect; /* rectangle that must be visible */
|
rectangle_t rect; /* rectangle that must be visible (in client coords) */
|
||||||
@END
|
@END
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2423,18 +2423,20 @@ DECL_HANDLER(get_update_region)
|
||||||
/* update the z order of a window so that a given rectangle is fully visible */
|
/* update the z order of a window so that a given rectangle is fully visible */
|
||||||
DECL_HANDLER(update_window_zorder)
|
DECL_HANDLER(update_window_zorder)
|
||||||
{
|
{
|
||||||
rectangle_t tmp;
|
rectangle_t tmp, rect = req->rect;
|
||||||
struct window *ptr, *win = get_window( req->window );
|
struct window *ptr, *win = get_window( req->window );
|
||||||
|
|
||||||
if (!win || !win->parent || !is_visible( win )) return; /* nothing to do */
|
if (!win || !win->parent || !is_visible( win )) return; /* nothing to do */
|
||||||
|
if (win->ex_style & WS_EX_LAYOUTRTL) mirror_rect( &win->client_rect, &rect );
|
||||||
|
offset_rect( &rect, win->client_rect.left, win->client_rect.top );
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY( ptr, &win->parent->children, struct window, entry )
|
LIST_FOR_EACH_ENTRY( ptr, &win->parent->children, struct window, entry )
|
||||||
{
|
{
|
||||||
if (ptr == win) break;
|
if (ptr == win) break;
|
||||||
if (!(ptr->style & WS_VISIBLE)) continue;
|
if (!(ptr->style & WS_VISIBLE)) continue;
|
||||||
if (ptr->ex_style & WS_EX_TRANSPARENT) continue;
|
if (ptr->ex_style & WS_EX_TRANSPARENT) continue;
|
||||||
if (!intersect_rect( &tmp, &ptr->visible_rect, &req->rect )) continue;
|
if (!intersect_rect( &tmp, &ptr->visible_rect, &rect )) continue;
|
||||||
if (ptr->win_region && !rect_in_region( ptr->win_region, &req->rect )) continue;
|
if (ptr->win_region && !rect_in_region( ptr->win_region, &rect )) continue;
|
||||||
/* found a window obscuring the rectangle, now move win above this one */
|
/* found a window obscuring the rectangle, now move win above this one */
|
||||||
/* making sure to not violate the topmost rule */
|
/* making sure to not violate the topmost rule */
|
||||||
if (!(ptr->ex_style & WS_EX_TOPMOST) || (win->ex_style & WS_EX_TOPMOST))
|
if (!(ptr->ex_style & WS_EX_TOPMOST) || (win->ex_style & WS_EX_TOPMOST))
|
||||||
|
|
Loading…
Reference in New Issue