diff --git a/server/region.c b/server/region.c index 33e2a54fab9..0e52f2f0bdc 100644 --- a/server/region.c +++ b/server/region.c @@ -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( ®ion->extents, x, y ); } /* mirror a region relative to a window client rect */ diff --git a/server/user.h b/server/user.h index e7eecd4c6ae..1236b0e14e4 100644 --- a/server/user.h +++ b/server/user.h @@ -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 */ diff --git a/server/window.c b/server/window.c index 70812095d25..0a32d46497d 100644 --- a/server/window.c +++ b/server/window.c @@ -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 ) {