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
d3876ca8
Commit
d3876ca8
authored
Jul 05, 2018
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
server: Add a couple of rectangle helper functions.
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
dbfc4ab5
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
33 additions
and
47 deletions
+33
-47
region.c
server/region.c
+5
-16
user.h
server/user.h
+20
-1
window.c
server/window.c
+8
-30
No files found.
server/region.c
View file @
d3876ca8
...
...
@@ -129,7 +129,7 @@ static inline int validate_rectangles( const rectangle_t *rects, unsigned int nb
for
(
ptr
=
rects
,
end
=
rects
+
nb_rects
;
ptr
<
end
;
ptr
++
)
{
if
(
ptr
->
left
>=
ptr
->
right
||
ptr
->
top
>=
ptr
->
bottom
)
return
0
;
/* empty rectangle */
if
(
is_rect_empty
(
ptr
)
)
return
0
;
/* empty rectangle */
if
(
ptr
==
end
-
1
)
break
;
if
(
ptr
[
0
].
top
==
ptr
[
1
].
top
)
/* same band */
{
...
...
@@ -623,7 +623,7 @@ void free_region( struct region *region )
/* set region to a simple rectangle */
void
set_region_rect
(
struct
region
*
region
,
const
rectangle_t
*
rect
)
{
if
(
rect
->
left
<
rect
->
right
&&
rect
->
top
<
rect
->
bottom
)
if
(
!
is_rect_empty
(
rect
)
)
{
region
->
num_rects
=
1
;
region
->
rects
[
0
]
=
region
->
extents
=
*
rect
;
...
...
@@ -631,10 +631,7 @@ void set_region_rect( struct region *region, const rectangle_t *rect )
else
{
region
->
num_rects
=
0
;
region
->
extents
.
left
=
0
;
region
->
extents
.
top
=
0
;
region
->
extents
.
right
=
0
;
region
->
extents
.
bottom
=
0
;
region
->
extents
=
empty_rect
;
}
}
...
...
@@ -700,16 +697,8 @@ void offset_region( struct region *region, int x, int y )
if
(
!
region
->
num_rects
)
return
;
for
(
rect
=
region
->
rects
,
end
=
rect
+
region
->
num_rects
;
rect
<
end
;
rect
++
)
{
rect
->
left
+=
x
;
rect
->
right
+=
x
;
rect
->
top
+=
y
;
rect
->
bottom
+=
y
;
}
region
->
extents
.
left
+=
x
;
region
->
extents
.
right
+=
x
;
region
->
extents
.
top
+=
y
;
region
->
extents
.
bottom
+=
y
;
offset_rect
(
rect
,
x
,
y
);
offset_rect
(
&
region
->
extents
,
x
,
y
);
}
/* mirror a region relative to a window client rect */
...
...
server/user.h
View file @
d3876ca8
...
...
@@ -188,6 +188,25 @@ extern void set_process_default_desktop( struct process *process, struct desktop
extern
void
close_process_desktop
(
struct
process
*
process
);
extern
void
close_thread_desktop
(
struct
thread
*
thread
);
static
inline
int
is_rect_empty
(
const
rectangle_t
*
rect
)
{
return
(
rect
->
left
>=
rect
->
right
||
rect
->
top
>=
rect
->
bottom
);
}
static
inline
int
point_in_rect
(
const
rectangle_t
*
rect
,
int
x
,
int
y
)
{
return
(
x
>=
rect
->
left
&&
x
<
rect
->
right
&&
y
>=
rect
->
top
&&
y
<
rect
->
bottom
);
}
/* offset the coordinates of a rectangle */
static
inline
void
offset_rect
(
rectangle_t
*
rect
,
int
offset_x
,
int
offset_y
)
{
rect
->
left
+=
offset_x
;
rect
->
top
+=
offset_y
;
rect
->
right
+=
offset_x
;
rect
->
bottom
+=
offset_y
;
}
/* mirror a rectangle respective to the window client area */
static
inline
void
mirror_rect
(
const
rectangle_t
*
client_rect
,
rectangle_t
*
rect
)
{
...
...
@@ -204,7 +223,7 @@ static inline int intersect_rect( rectangle_t *dst, const rectangle_t *src1, con
dst
->
top
=
max
(
src1
->
top
,
src2
->
top
);
dst
->
right
=
min
(
src1
->
right
,
src2
->
right
);
dst
->
bottom
=
min
(
src1
->
bottom
,
src2
->
bottom
);
return
(
dst
->
left
<
dst
->
right
&&
dst
->
top
<
dst
->
bottom
);
return
!
is_rect_empty
(
dst
);
}
/* validate a window handle and return the full handle */
...
...
server/window.c
View file @
d3876ca8
...
...
@@ -114,6 +114,8 @@ struct user_handle_array
int
total
;
};
static
const
rectangle_t
empty_rect
;
/* global window pointers */
static
struct
window
*
shell_window
;
static
struct
window
*
shell_listview
;
...
...
@@ -431,8 +433,7 @@ struct process *get_top_window_owner( struct desktop *desktop )
void
get_top_window_rectangle
(
struct
desktop
*
desktop
,
rectangle_t
*
rect
)
{
struct
window
*
win
=
desktop
->
top_window
;
if
(
!
win
)
rect
->
left
=
rect
->
top
=
rect
->
right
=
rect
->
bottom
=
0
;
else
*
rect
=
win
->
window_rect
;
*
rect
=
win
?
win
->
window_rect
:
empty_rect
;
}
/* post a message to the desktop window */
...
...
@@ -447,7 +448,6 @@ void post_desktop_message( struct desktop *desktop, unsigned int message,
static
struct
window
*
create_window
(
struct
window
*
parent
,
struct
window
*
owner
,
atom_t
atom
,
mod_handle_t
instance
)
{
static
const
rectangle_t
empty_rect
;
int
extra_bytes
;
struct
window
*
win
=
NULL
;
struct
desktop
*
desktop
;
...
...
@@ -665,8 +665,7 @@ static inline int is_point_in_window( struct window *win, int x, int y )
return
0
;
/* disabled child */
if
((
win
->
ex_style
&
(
WS_EX_LAYERED
|
WS_EX_TRANSPARENT
))
==
(
WS_EX_LAYERED
|
WS_EX_TRANSPARENT
))
return
0
;
/* transparent */
if
(
x
<
win
->
visible_rect
.
left
||
x
>=
win
->
visible_rect
.
right
||
y
<
win
->
visible_rect
.
top
||
y
>=
win
->
visible_rect
.
bottom
)
if
(
!
point_in_rect
(
&
win
->
visible_rect
,
x
,
y
))
return
0
;
/* not in window */
if
(
win
->
win_region
&&
!
point_in_region
(
win
->
win_region
,
x
-
win
->
window_rect
.
left
,
y
-
win
->
window_rect
.
top
))
...
...
@@ -710,9 +709,7 @@ static struct window *child_window_from_point( struct window *parent, int x, int
if
(
ptr
->
style
&
(
WS_MINIMIZE
|
WS_DISABLED
))
return
ptr
;
/* if point is not in client area, return at once */
if
(
x
<
ptr
->
client_rect
.
left
||
x
>=
ptr
->
client_rect
.
right
||
y
<
ptr
->
client_rect
.
top
||
y
>=
ptr
->
client_rect
.
bottom
)
return
ptr
;
if
(
!
point_in_rect
(
&
ptr
->
client_rect
,
x
,
y
))
return
ptr
;
return
child_window_from_point
(
ptr
,
x
-
ptr
->
client_rect
.
left
,
y
-
ptr
->
client_rect
.
top
);
}
...
...
@@ -730,9 +727,7 @@ static int get_window_children_from_point( struct window *parent, int x, int y,
if
(
!
is_point_in_window
(
ptr
,
x
,
y
))
continue
;
/* skip it */
/* if point is in client area, and window is not minimized or disabled, check children */
if
(
!
(
ptr
->
style
&
(
WS_MINIMIZE
|
WS_DISABLED
))
&&
x
>=
ptr
->
client_rect
.
left
&&
x
<
ptr
->
client_rect
.
right
&&
y
>=
ptr
->
client_rect
.
top
&&
y
<
ptr
->
client_rect
.
bottom
)
if
(
!
(
ptr
->
style
&
(
WS_MINIMIZE
|
WS_DISABLED
))
&&
point_in_rect
(
&
ptr
->
client_rect
,
x
,
y
))
{
if
(
!
get_window_children_from_point
(
ptr
,
x
-
ptr
->
client_rect
.
left
,
y
-
ptr
->
client_rect
.
top
,
array
))
...
...
@@ -794,9 +789,7 @@ static int all_windows_from_point( struct window *top, int x, int y, struct user
if
(
!
is_point_in_window
(
top
,
x
,
y
))
return
1
;
/* if point is in client area, and window is not minimized or disabled, check children */
if
(
!
(
top
->
style
&
(
WS_MINIMIZE
|
WS_DISABLED
))
&&
x
>=
top
->
client_rect
.
left
&&
x
<
top
->
client_rect
.
right
&&
y
>=
top
->
client_rect
.
top
&&
y
<
top
->
client_rect
.
bottom
)
if
(
!
(
top
->
style
&
(
WS_MINIMIZE
|
WS_DISABLED
))
&&
point_in_rect
(
&
top
->
client_rect
,
x
,
y
))
{
if
(
!
is_desktop_window
(
top
))
{
...
...
@@ -907,12 +900,7 @@ static inline void client_to_screen( struct window *win, int *x, int *y )
static
inline
void
client_to_screen_rect
(
struct
window
*
win
,
rectangle_t
*
rect
)
{
for
(
;
win
&&
!
is_desktop_window
(
win
);
win
=
win
->
parent
)
{
rect
->
left
+=
win
->
client_rect
.
left
;
rect
->
right
+=
win
->
client_rect
.
left
;
rect
->
top
+=
win
->
client_rect
.
top
;
rect
->
bottom
+=
win
->
client_rect
.
top
;
}
offset_rect
(
rect
,
win
->
client_rect
.
left
,
win
->
client_rect
.
top
);
}
/* map the region from window to screen coordinates */
...
...
@@ -956,16 +944,6 @@ static struct region *clip_children( struct window *parent, struct window *last,
}
/* offset the coordinates of a rectangle */
static
inline
void
offset_rect
(
rectangle_t
*
rect
,
int
offset_x
,
int
offset_y
)
{
rect
->
left
+=
offset_x
;
rect
->
top
+=
offset_y
;
rect
->
right
+=
offset_x
;
rect
->
bottom
+=
offset_y
;
}
/* set the region to the client rect clipped by the window rect, in parent-relative coordinates */
static
void
set_region_client_rect
(
struct
region
*
region
,
struct
window
*
win
)
{
...
...
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