Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
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-winehq
Commits
807fe074
Commit
807fe074
authored
Sep 17, 2004
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Don't bother to return partial region data in get_window_region and
get_visible_region, return STATUS_BUFFER_OVERFLOW instead.
parent
e1db0543
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
50 additions
and
43 deletions
+50
-43
winpos.c
dlls/x11drv/winpos.c
+13
-18
region.c
server/region.c
+20
-5
user.h
server/user.h
+4
-2
window.c
server/window.c
+4
-5
winpos.c
windows/winpos.c
+9
-13
No files found.
dlls/x11drv/winpos.c
View file @
807fe074
...
...
@@ -33,6 +33,7 @@
#include "wingdi.h"
#include "winuser.h"
#include "winerror.h"
#include "ntstatus.h"
#include "wownt32.h"
#include "wine/wingdi16.h"
...
...
@@ -138,9 +139,9 @@ static int clip_children( HWND parent, HWND last, HRGN hrgn, int whole_window )
static
HRGN
get_server_visible_region
(
HWND
hwnd
,
HWND
top
,
UINT
flags
)
{
RGNDATA
*
data
;
NTSTATUS
status
;
HRGN
ret
=
0
;
size_t
size
=
256
;
BOOL
retry
=
FALSE
;
do
{
...
...
@@ -151,28 +152,22 @@ static HRGN get_server_visible_region( HWND hwnd, HWND top, UINT flags )
req
->
top_win
=
top
;
req
->
flags
=
flags
;
wine_server_set_reply
(
req
,
data
->
Buffer
,
size
);
if
(
!
wine_server_call_err
(
req
))
if
(
!
(
status
=
wine_server_call
(
req
)
))
{
if
(
reply
->
total_size
<=
size
)
{
size_t
reply_size
=
wine_server_reply_size
(
reply
);
data
->
rdh
.
dwSize
=
sizeof
(
data
->
rdh
);
data
->
rdh
.
iType
=
RDH_RECTANGLES
;
data
->
rdh
.
nCount
=
reply_size
/
sizeof
(
RECT
);
data
->
rdh
.
nRgnSize
=
reply_size
;
ret
=
ExtCreateRegion
(
NULL
,
size
,
data
);
retry
=
FALSE
;
}
else
{
size
=
reply
->
total_size
;
retry
=
TRUE
;
}
size_t
reply_size
=
wine_server_reply_size
(
reply
);
data
->
rdh
.
dwSize
=
sizeof
(
data
->
rdh
);
data
->
rdh
.
iType
=
RDH_RECTANGLES
;
data
->
rdh
.
nCount
=
reply_size
/
sizeof
(
RECT
);
data
->
rdh
.
nRgnSize
=
reply_size
;
ret
=
ExtCreateRegion
(
NULL
,
size
,
data
);
}
else
size
=
reply
->
total_size
;
}
SERVER_END_REQ
;
HeapFree
(
GetProcessHeap
(),
0
,
data
);
}
while
(
retry
);
}
while
(
status
==
STATUS_BUFFER_OVERFLOW
);
if
(
status
)
SetLastError
(
RtlNtStatusToDosError
(
status
)
);
return
ret
;
}
...
...
server/region.c
View file @
807fe074
...
...
@@ -618,19 +618,23 @@ void set_region_rect( struct region *region, const rectangle_t *rect )
}
/* retrieve the region data for sending to the client */
rectangle_t
*
get_region_data
(
const
struct
region
*
region
,
size_t
*
total_size
)
rectangle_t
*
get_region_data
(
const
struct
region
*
region
,
size_t
max_size
,
size_t
*
total_size
)
{
const
rectangle_t
*
data
=
region
->
rects
;
if
(
!
(
*
total_size
=
region
->
num_rects
*
sizeof
(
rectangle_t
)))
{
/* return a single empty rect for empty regions */
*
total_size
=
sizeof
(
empty_rect
);
return
memdup
(
&
empty_rect
,
sizeof
(
empty_rect
)
)
;
data
=
&
empty_rect
;
}
return
memdup
(
region
->
rects
,
*
total_size
);
if
(
max_size
>=
*
total_size
)
return
memdup
(
data
,
*
total_size
);
set_error
(
STATUS_BUFFER_OVERFLOW
);
return
NULL
;
}
/* retrieve the region data for sending to the client and free the region at the same time */
rectangle_t
*
get_region_data_and_free
(
struct
region
*
region
,
size_t
*
total_size
)
rectangle_t
*
get_region_data_and_free
(
struct
region
*
region
,
size_t
max_size
,
size_t
*
total_size
)
{
rectangle_t
*
ret
=
region
->
rects
;
...
...
@@ -638,7 +642,18 @@ rectangle_t *get_region_data_and_free( struct region *region, size_t *total_size
{
/* return a single empty rect for empty regions */
*
total_size
=
sizeof
(
empty_rect
);
ret
=
memdup
(
&
empty_rect
,
sizeof
(
empty_rect
)
);
if
(
max_size
>=
sizeof
(
empty_rect
))
{
ret
=
memdup
(
&
empty_rect
,
sizeof
(
empty_rect
)
);
free
(
region
->
rects
);
}
}
if
(
max_size
<
*
total_size
)
{
free
(
region
->
rects
);
set_error
(
STATUS_BUFFER_OVERFLOW
);
ret
=
NULL
;
}
free
(
region
);
return
ret
;
...
...
server/user.h
View file @
807fe074
...
...
@@ -71,8 +71,10 @@ extern struct region *create_region( const rectangle_t *rects, unsigned int nb_r
extern
struct
region
*
create_region_from_req_data
(
const
void
*
data
,
size_t
size
);
extern
void
free_region
(
struct
region
*
region
);
extern
void
set_region_rect
(
struct
region
*
region
,
const
rectangle_t
*
rect
);
extern
rectangle_t
*
get_region_data
(
const
struct
region
*
region
,
size_t
*
total_size
);
extern
rectangle_t
*
get_region_data_and_free
(
struct
region
*
region
,
size_t
*
total_size
);
extern
rectangle_t
*
get_region_data
(
const
struct
region
*
region
,
size_t
max_size
,
size_t
*
total_size
);
extern
rectangle_t
*
get_region_data_and_free
(
struct
region
*
region
,
size_t
max_size
,
size_t
*
total_size
);
extern
int
is_region_empty
(
const
struct
region
*
region
);
extern
void
get_region_extents
(
const
struct
region
*
region
,
rectangle_t
*
rect
);
extern
void
offset_region
(
struct
region
*
region
,
int
x
,
int
y
);
...
...
server/window.c
View file @
807fe074
...
...
@@ -1084,8 +1084,8 @@ DECL_HANDLER(get_visible_region)
if
((
region
=
get_visible_region
(
win
,
top
,
req
->
flags
)))
{
rectangle_t
*
data
=
get_region_data_and_free
(
region
,
&
reply
->
total_size
);
set_reply_data_ptr
(
data
,
min
(
reply
->
total_size
,
get_reply_max_size
())
);
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
);
}
}
...
...
@@ -1097,11 +1097,10 @@ DECL_HANDLER(get_window_region)
if
(
!
win
)
return
;
reply
->
total_size
=
0
;
if
(
win
->
win_region
)
{
rectangle_t
*
data
=
get_region_data
(
win
->
win_region
,
&
reply
->
total_size
);
set_reply_data_ptr
(
data
,
min
(
reply
->
total_size
,
get_reply_max_size
()
)
);
rectangle_t
*
data
=
get_region_data
(
win
->
win_region
,
get_reply_max_size
(),
&
reply
->
total_size
);
if
(
data
)
set_reply_data_ptr
(
data
,
reply
->
total_size
);
}
}
...
...
windows/winpos.c
View file @
807fe074
...
...
@@ -29,6 +29,7 @@
#include "winbase.h"
#include "wingdi.h"
#include "winerror.h"
#include "ntstatus.h"
#include "wine/winuser16.h"
#include "wine/server.h"
#include "controls.h"
...
...
@@ -172,10 +173,10 @@ BOOL WINAPI GetWindowRect( HWND hwnd, LPRECT rect )
int
WINAPI
GetWindowRgn
(
HWND
hwnd
,
HRGN
hrgn
)
{
int
nRet
=
ERROR
;
NTSTATUS
status
;
HRGN
win_rgn
=
0
;
RGNDATA
*
data
;
size_t
size
=
256
;
BOOL
retry
=
FALSE
;
do
{
...
...
@@ -188,31 +189,26 @@ int WINAPI GetWindowRgn ( HWND hwnd, HRGN hrgn )
{
req
->
window
=
hwnd
;
wine_server_set_reply
(
req
,
data
->
Buffer
,
size
);
if
(
!
wine_server_call_err
(
req
))
if
(
!
(
status
=
wine_server_call
(
req
)
))
{
if
(
!
reply
->
total_size
)
retry
=
FALSE
;
/* no region at all */
else
if
(
reply
->
total_size
<=
size
)
size_t
reply_size
=
wine_server_reply_size
(
reply
);
if
(
reply_
size
)
{
size_t
reply_size
=
wine_server_reply_size
(
reply
);
data
->
rdh
.
dwSize
=
sizeof
(
data
->
rdh
);
data
->
rdh
.
iType
=
RDH_RECTANGLES
;
data
->
rdh
.
nCount
=
reply_size
/
sizeof
(
RECT
);
data
->
rdh
.
nRgnSize
=
reply_size
;
win_rgn
=
ExtCreateRegion
(
NULL
,
size
,
data
);
retry
=
FALSE
;
}
else
{
size
=
reply
->
total_size
;
retry
=
TRUE
;
}
}
else
size
=
reply
->
total_size
;
}
SERVER_END_REQ
;
HeapFree
(
GetProcessHeap
(),
0
,
data
);
}
while
(
retry
);
}
while
(
status
==
STATUS_BUFFER_OVERFLOW
);
if
(
win_rgn
)
if
(
status
)
SetLastError
(
RtlNtStatusToDosError
(
status
)
);
else
if
(
win_rgn
)
{
nRet
=
CombineRgn
(
hrgn
,
win_rgn
,
0
,
RGN_COPY
);
DeleteObject
(
win_rgn
);
...
...
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