Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
4e47afb3
Commit
4e47afb3
authored
Mar 17, 2005
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Compute the top clipping window directly on the server side.
parent
7670aa12
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
29 additions
and
46 deletions
+29
-46
wnd.c
dlls/ttydrv/wnd.c
+2
-4
winpos.c
dlls/x11drv/winpos.c
+2
-5
server_protocol.h
include/wine/server_protocol.h
+1
-3
protocol.def
server/protocol.def
+0
-2
trace.c
server/trace.c
+0
-2
window.c
server/window.c
+24
-30
No files found.
dlls/ttydrv/wnd.c
View file @
4e47afb3
...
...
@@ -41,7 +41,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(ttydrv);
/***********************************************************************
* get_server_visible_region
*/
static
HRGN
get_server_visible_region
(
HWND
hwnd
,
HWND
top
,
UINT
flags
)
static
HRGN
get_server_visible_region
(
HWND
hwnd
,
UINT
flags
)
{
RGNDATA
*
data
;
NTSTATUS
status
;
...
...
@@ -54,7 +54,6 @@ static HRGN get_server_visible_region( HWND hwnd, HWND top, UINT flags )
SERVER_START_REQ
(
get_visible_region
)
{
req
->
window
=
hwnd
;
req
->
top_win
=
top
;
req
->
flags
=
flags
;
wine_server_set_reply
(
req
,
data
->
Buffer
,
size
);
if
(
!
(
status
=
wine_server_call
(
req
)))
...
...
@@ -97,7 +96,6 @@ static void set_window_pos( HWND hwnd, HWND insert_after, const RECT *rectWindow
SERVER_START_REQ
(
set_window_pos
)
{
req
->
handle
=
hwnd
;
req
->
top_win
=
0
;
req
->
previous
=
insert_after
;
req
->
flags
=
swp_flags
;
req
->
window
.
left
=
rectWindow
->
left
;
...
...
@@ -238,7 +236,7 @@ BOOL TTYDRV_GetDC( HWND hwnd, HDC hdc, HRGN hrgn, DWORD flags )
SetHookFlags16
(
HDC_16
(
hdc
),
DCHF_VALIDATEVISRGN
))
/* DC was dirty */
{
/* need to recompute the visible region */
HRGN
visRgn
=
get_server_visible_region
(
hwnd
,
GetDesktopWindow
(),
flags
);
HRGN
visRgn
=
get_server_visible_region
(
hwnd
,
flags
);
if
(
flags
&
(
DCX_EXCLUDERGN
|
DCX_INTERSECTRGN
))
CombineRgn
(
visRgn
,
visRgn
,
hrgn
,
(
flags
&
DCX_INTERSECTRGN
)
?
RGN_AND
:
RGN_DIFF
);
...
...
dlls/x11drv/winpos.c
View file @
4e47afb3
...
...
@@ -85,7 +85,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(x11drv);
/***********************************************************************
* get_server_visible_region
*/
static
HRGN
get_server_visible_region
(
HWND
hwnd
,
HWND
top
,
UINT
flags
)
static
HRGN
get_server_visible_region
(
HWND
hwnd
,
UINT
flags
)
{
RGNDATA
*
data
;
NTSTATUS
status
;
...
...
@@ -98,7 +98,6 @@ static HRGN get_server_visible_region( HWND hwnd, HWND top, UINT flags )
SERVER_START_REQ
(
get_visible_region
)
{
req
->
window
=
hwnd
;
req
->
top_win
=
top
;
req
->
flags
=
flags
;
wine_server_set_reply
(
req
,
data
->
Buffer
,
size
);
if
(
!
(
status
=
wine_server_call
(
req
)))
...
...
@@ -248,7 +247,7 @@ BOOL X11DRV_GetDC( HWND hwnd, HDC hdc, HRGN hrgn, DWORD flags )
SetHookFlags16
(
HDC_16
(
hdc
),
DCHF_VALIDATEVISRGN
))
/* DC was dirty */
{
/* need to recompute the visible region */
HRGN
visRgn
=
get_server_visible_region
(
hwnd
,
top
,
flags
);
HRGN
visRgn
=
get_server_visible_region
(
hwnd
,
flags
);
if
(
flags
&
(
DCX_EXCLUDERGN
|
DCX_INTERSECTRGN
))
CombineRgn
(
visRgn
,
visRgn
,
hrgn
,
(
flags
&
DCX_INTERSECTRGN
)
?
RGN_AND
:
RGN_DIFF
);
...
...
@@ -680,7 +679,6 @@ BOOL X11DRV_set_window_pos( HWND hwnd, HWND insert_after, const RECT *rectWindow
const
RECT
*
rectClient
,
UINT
swp_flags
,
const
RECT
*
valid_rects
)
{
struct
x11drv_win_data
*
data
;
HWND
top
=
get_top_clipping_window
(
hwnd
);
RECT
new_whole_rect
;
WND
*
win
;
DWORD
old_style
,
new_style
;
...
...
@@ -720,7 +718,6 @@ BOOL X11DRV_set_window_pos( HWND hwnd, HWND insert_after, const RECT *rectWindow
SERVER_START_REQ
(
set_window_pos
)
{
req
->
handle
=
hwnd
;
req
->
top_win
=
top
;
req
->
previous
=
insert_after
;
req
->
flags
=
swp_flags
&
~
SWP_WINE_NOHOSTMOVE
;
req
->
window
.
left
=
rectWindow
->
left
;
...
...
include/wine/server_protocol.h
View file @
4e47afb3
...
...
@@ -2584,7 +2584,6 @@ struct set_window_pos_request
{
struct
request_header
__header
;
user_handle_t
handle
;
user_handle_t
top_win
;
user_handle_t
previous
;
unsigned
int
flags
;
rectangle_t
window
;
...
...
@@ -2658,7 +2657,6 @@ struct get_visible_region_request
{
struct
request_header
__header
;
user_handle_t
window
;
user_handle_t
top_win
;
unsigned
int
flags
;
};
struct
get_visible_region_reply
...
...
@@ -3782,6 +3780,6 @@ union generic_reply
struct
duplicate_token_reply
duplicate_token_reply
;
};
#define SERVER_PROTOCOL_VERSION 1
59
#define SERVER_PROTOCOL_VERSION 1
60
#endif
/* __WINE_WINE_SERVER_PROTOCOL_H */
server/protocol.def
View file @
4e47afb3
...
...
@@ -1826,7 +1826,6 @@ enum message_type
/* Set the position and Z order of a window */
@REQ(set_window_pos)
user_handle_t handle; /* handle to the window */
user_handle_t top_win; /* top window to clip against */
user_handle_t previous; /* previous window in Z order */
unsigned int flags; /* SWP_* flags */
rectangle_t window; /* window rectangle */
...
...
@@ -1874,7 +1873,6 @@ enum message_type
/* Get the visible region of a window */
@REQ(get_visible_region)
user_handle_t window; /* handle to the window */
user_handle_t top_win; /* top window to clip against */
unsigned int flags; /* DCX flags */
@REPLY
size_t total_size; /* total size of the resulting region */
...
...
server/trace.c
View file @
4e47afb3
...
...
@@ -2191,7 +2191,6 @@ static void dump_get_window_tree_reply( const struct get_window_tree_reply *req
static
void
dump_set_window_pos_request
(
const
struct
set_window_pos_request
*
req
)
{
fprintf
(
stderr
,
" handle=%p,"
,
req
->
handle
);
fprintf
(
stderr
,
" top_win=%p,"
,
req
->
top_win
);
fprintf
(
stderr
,
" previous=%p,"
,
req
->
previous
);
fprintf
(
stderr
,
" flags=%08x,"
,
req
->
flags
);
fprintf
(
stderr
,
" window="
);
...
...
@@ -2256,7 +2255,6 @@ static void dump_get_windows_offset_reply( const struct get_windows_offset_reply
static
void
dump_get_visible_region_request
(
const
struct
get_visible_region_request
*
req
)
{
fprintf
(
stderr
,
" window=%p,"
,
req
->
window
);
fprintf
(
stderr
,
" top_win=%p,"
,
req
->
top_win
);
fprintf
(
stderr
,
" flags=%08x"
,
req
->
flags
);
}
...
...
server/window.c
View file @
4e47afb3
...
...
@@ -657,12 +657,20 @@ static void set_region_client_rect( struct region *region, struct window *win )
}
/* get the top-level window to clip against for a given window */
static
inline
struct
window
*
get_top_clipping_window
(
struct
window
*
win
)
{
while
(
win
->
parent
&&
win
->
parent
!=
top_window
)
win
=
win
->
parent
;
return
win
;
}
/* compute the visible region of a window */
static
struct
region
*
get_visible_region
(
struct
window
*
win
,
struct
window
*
top
,
unsigned
int
flags
)
static
struct
region
*
get_visible_region
(
struct
window
*
win
,
unsigned
int
flags
)
{
struct
region
*
tmp
,
*
region
;
int
offset_x
,
offset_y
;
struct
window
*
top
=
get_top_clipping_window
(
win
);
if
(
!
(
region
=
create_empty_region
()))
return
NULL
;
...
...
@@ -1028,10 +1036,11 @@ static unsigned int get_child_update_flags( struct window *win, unsigned int fla
/* expose a region of a window, looking for the top most parent that needs to be exposed */
/* the region is in window coordinates */
static
void
expose_window
(
struct
window
*
win
,
struct
window
*
top
,
struct
region
*
region
)
static
void
expose_window
(
struct
window
*
win
,
struct
region
*
region
)
{
struct
window
*
parent
,
*
ptr
;
int
offset_x
,
offset_y
;
struct
window
*
top
=
get_top_clipping_window
(
win
);
/* find the top most parent that doesn't clip either siblings or children */
for
(
parent
=
ptr
=
win
;
ptr
!=
top
;
ptr
=
ptr
->
parent
)
...
...
@@ -1056,28 +1065,18 @@ static void expose_window( struct window *win, struct window *top, struct region
/* set the window and client rectangles, updating the update region if necessary */
static
void
set_window_pos
(
struct
window
*
win
,
struct
window
*
top
,
struct
window
*
previous
,
static
void
set_window_pos
(
struct
window
*
win
,
struct
window
*
previous
,
unsigned
int
swp_flags
,
const
rectangle_t
*
window_rect
,
const
rectangle_t
*
client_rect
,
const
rectangle_t
*
valid_rects
)
{
struct
region
*
old_vis_rgn
,
*
new_vis_rgn
;
struct
region
*
old_vis_rgn
=
NULL
,
*
new_vis_rgn
;
const
rectangle_t
old_window_rect
=
win
->
window_rect
;
const
rectangle_t
old_client_rect
=
win
->
client_rect
;
int
visible
=
(
win
->
style
&
WS_VISIBLE
)
||
(
swp_flags
&
SWP_SHOWWINDOW
);
/* if the window is not visible, everything is easy */
if
(
win
->
parent
&&
!
is_visible
(
win
->
parent
))
visible
=
0
;
if
((
win
->
parent
&&
!
is_visible
(
win
->
parent
))
||
(
!
(
win
->
style
&
WS_VISIBLE
)
&&
!
(
swp_flags
&
SWP_SHOWWINDOW
)))
{
win
->
window_rect
=
*
window_rect
;
win
->
client_rect
=
*
client_rect
;
if
(
!
(
swp_flags
&
SWP_NOZORDER
))
link_window
(
win
,
win
->
parent
,
previous
);
if
(
swp_flags
&
SWP_SHOWWINDOW
)
win
->
style
|=
WS_VISIBLE
;
else
if
(
swp_flags
&
SWP_HIDEWINDOW
)
win
->
style
&=
~
WS_VISIBLE
;
return
;
}
if
(
!
(
old_vis_rgn
=
get_visible_region
(
win
,
top
,
DCX_WINDOW
)))
return
;
if
(
visible
&&
!
(
old_vis_rgn
=
get_visible_region
(
win
,
DCX_WINDOW
)))
return
;
/* set the new window info before invalidating anything */
...
...
@@ -1087,7 +1086,10 @@ static void set_window_pos( struct window *win, struct window *top, struct windo
if
(
swp_flags
&
SWP_SHOWWINDOW
)
win
->
style
|=
WS_VISIBLE
;
else
if
(
swp_flags
&
SWP_HIDEWINDOW
)
win
->
style
&=
~
WS_VISIBLE
;
if
(
!
(
new_vis_rgn
=
get_visible_region
(
win
,
top
,
DCX_WINDOW
)))
/* if the window is not visible, everything is easy */
if
(
!
visible
)
return
;
if
(
!
(
new_vis_rgn
=
get_visible_region
(
win
,
DCX_WINDOW
)))
{
free_region
(
old_vis_rgn
);
clear_error
();
/* ignore error since the window info has been modified already */
...
...
@@ -1101,7 +1103,7 @@ static void set_window_pos( struct window *win, struct window *top, struct windo
offset_region
(
old_vis_rgn
,
old_window_rect
.
left
-
window_rect
->
left
,
old_window_rect
.
top
-
window_rect
->
top
);
if
(
xor_region
(
new_vis_rgn
,
old_vis_rgn
,
new_vis_rgn
))
expose_window
(
win
,
top
,
new_vis_rgn
);
expose_window
(
win
,
new_vis_rgn
);
}
free_region
(
old_vis_rgn
);
...
...
@@ -1426,18 +1428,12 @@ DECL_HANDLER(set_window_pos)
{
const
rectangle_t
*
valid_rects
=
NULL
;
struct
window
*
previous
=
NULL
;
struct
window
*
top
=
top_window
;
struct
window
*
win
=
get_window
(
req
->
handle
);
unsigned
int
flags
=
req
->
flags
;
if
(
!
win
)
return
;
if
(
!
win
->
parent
)
flags
|=
SWP_NOZORDER
;
/* no Z order for the desktop */
if
(
req
->
top_win
)
{
if
(
!
(
top
=
get_window
(
req
->
top_win
)))
return
;
}
if
(
!
(
flags
&
SWP_NOZORDER
))
{
if
(
!
req
->
previous
)
/* special case: HWND_TOP */
...
...
@@ -1470,7 +1466,7 @@ DECL_HANDLER(set_window_pos)
if
(
get_req_data_size
()
>=
2
*
sizeof
(
rectangle_t
))
valid_rects
=
get_req_data
();
set_window_pos
(
win
,
top
,
previous
,
flags
,
&
req
->
window
,
&
req
->
client
,
valid_rects
);
set_window_pos
(
win
,
previous
,
flags
,
&
req
->
window
,
&
req
->
client
,
valid_rects
);
reply
->
new_style
=
win
->
style
;
}
...
...
@@ -1557,12 +1553,10 @@ DECL_HANDLER(get_visible_region)
{
struct
region
*
region
;
struct
window
*
win
=
get_window
(
req
->
window
);
struct
window
*
top
=
NULL
;
if
(
!
win
)
return
;
if
(
req
->
top_win
&&
!
(
top
=
get_window
(
req
->
top_win
)))
return
;
if
((
region
=
get_visible_region
(
win
,
top
,
req
->
flags
)))
if
((
region
=
get_visible_region
(
win
,
req
->
flags
)))
{
rectangle_t
*
data
=
get_region_data_and_free
(
region
,
get_reply_max_size
(),
&
reply
->
total_size
);
if
(
data
)
set_reply_data_ptr
(
data
,
reply
->
total_size
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment