[PATCH 3/7] server: Use an explicit field to flag desktop windows.

Rémi Bernon rbernon at codeweavers.com
Fri Oct 15 04:47:58 CDT 2021


Instead or using the parent pointer only.

This also checks if the pointer itself is NULL, as the function is
sometimes called with win->parent parameter, which could be NULL for
orphan windows.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 server/window.c | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/server/window.c b/server/window.c
index 7ea91d2a7dc..2ed4aa57d1a 100644
--- a/server/window.c
+++ b/server/window.c
@@ -80,6 +80,7 @@ struct window
     unsigned int     is_unicode : 1;  /* ANSI or unicode */
     unsigned int     is_linked : 1;   /* is it linked into the parent z-order list? */
     unsigned int     is_layered : 1;  /* has layered info been set? */
+    unsigned int     is_desktop : 1;  /* is it a desktop window? */
     unsigned int     color_key;       /* color key for a layered window */
     unsigned int     alpha;           /* alpha value for a layered window */
     unsigned int     layered_flags;   /* flags for a layered window */
@@ -140,7 +141,7 @@ static inline struct window *get_window( user_handle_t handle )
 /* check if window is the desktop */
 static inline int is_desktop_window( const struct window *win )
 {
-    return !win->parent;  /* only desktop windows have no parent */
+    return win && !win->parent && win->is_desktop;
 }
 
 /* get next window in Z-order list */
@@ -183,7 +184,7 @@ static inline void update_pixel_format_flags( struct window *win )
 static unsigned int get_monitor_dpi( struct window *win )
 {
     /* FIXME: we return the desktop window DPI for now */
-    while (!is_desktop_window( win )) win = win->parent;
+    while (win->parent) win = win->parent;
     return win->dpi ? win->dpi : USER_DEFAULT_SCREEN_DPI;
 }
 
@@ -502,6 +503,7 @@ static struct window *create_window( struct window *parent, struct window *owner
     win->is_unicode     = 1;
     win->is_linked      = 0;
     win->is_layered     = 0;
+    win->is_desktop     = parent ? 0 : 1;
     win->dpi_awareness  = DPI_AWARENESS_PER_MONITOR_AWARE;
     win->dpi            = 0;
     win->user_data      = 0;
@@ -662,7 +664,7 @@ static void map_dpi_region( struct window *win, struct region *region, unsigned
 /* convert coordinates from client to screen coords */
 static inline void client_to_screen( struct window *win, int *x, int *y )
 {
-    for ( ; win && !is_desktop_window(win); win = win->parent)
+    for ( ; win && win->parent; win = win->parent)
     {
         *x += win->client_rect.left;
         *y += win->client_rect.top;
@@ -833,7 +835,8 @@ struct thread *window_thread_from_point( user_handle_t scope, int x, int y )
 static int all_windows_from_point( struct window *top, int x, int y, unsigned int dpi,
                                    struct user_handle_array *array )
 {
-    if (!is_desktop_window( top ) && !is_desktop_window( top->parent ))
+    assert( top != NULL );
+    if (top->parent && !is_desktop_window( top->parent ))
     {
         screen_to_client( top->parent, &x, &y, dpi );
         dpi = top->parent->dpi;
@@ -941,13 +944,14 @@ static struct region *intersect_window_region( struct region *region, struct win
 /* convert coordinates from client to screen coords */
 static inline void client_to_screen_rect( struct window *win, rectangle_t *rect )
 {
-    for ( ; win && !is_desktop_window(win); win = win->parent)
+    for ( ; win && win->parent; win = win->parent)
         offset_rect( rect, win->client_rect.left, win->client_rect.top );
 }
 
 /* map the region from window to screen coordinates */
 static inline void map_win_region_to_screen( struct window *win, struct region *region )
 {
+    assert( win != NULL );
     if (!is_desktop_window(win))
     {
         int x = win->window_rect.left;
@@ -2287,7 +2291,7 @@ DECL_HANDLER(set_window_pos)
     unsigned int flags = req->swp_flags;
 
     if (!win) return;
-    if (!win->parent) flags |= SWP_NOZORDER;  /* no Z order for the desktop */
+    if (is_desktop_window(win)) flags |= SWP_NOZORDER;  /* no Z order for the desktop */
 
     if (!(flags & SWP_NOZORDER))
     {
-- 
2.33.0




More information about the wine-devel mailing list