dix: lookup function for WindowPtr by XID
This new lookup function retrieves a pointer to WindowRec structure by associated XID. Unlike dixLookupWindow(), this one works globally, instead of just on one specific client, and it doesn't do any XACE calls. Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
		
							parent
							
								
									3b1d5fcffd
								
							
						
					
					
						commit
						daefa71a42
					
				| 
						 | 
					@ -253,4 +253,15 @@ extern Bool explicit_display;
 | 
				
			||||||
extern Bool disableBackingStore;
 | 
					extern Bool disableBackingStore;
 | 
				
			||||||
extern Bool enableBackingStore;
 | 
					extern Bool enableBackingStore;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * @brief lookup window by XID
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This globally looks for Window with given XID (all screens, all clients)
 | 
				
			||||||
 | 
					 * and returns a pointer to it. If not found, returns NULL.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unlike ::dixLookupWindow() it doesn't scan only one given client, nor does
 | 
				
			||||||
 | 
					 * it do any XACE calls.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					WindowPtr dixLookupWindowByXID(Window window);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* _XSERVER_DIX_PRIV_H */
 | 
					#endif /* _XSERVER_DIX_PRIV_H */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,42 @@
 | 
				
			||||||
 | 
					/* SPDX-License-Identifier: MIT OR X11
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright © 2024 Enrico Weigelt, metux IT consult <info@metux.net>
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @brief DIX lookup functions
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#include <dix-config.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "dix/dix_priv.h"
 | 
				
			||||||
 | 
					#include "include/windowstr.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct window_xid_match {
 | 
				
			||||||
 | 
					    WindowPtr pWin;
 | 
				
			||||||
 | 
					    Window id;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int dix_match_window_xid(WindowPtr pWin, void *ptr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    struct window_xid_match *walk = (struct window_xid_match*) ptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (walk->id == pWin->drawable.id) {
 | 
				
			||||||
 | 
					        walk->pWin = pWin;
 | 
				
			||||||
 | 
					        return WT_STOPWALKING;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        return WT_WALKCHILDREN;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WindowPtr dixLookupWindowByXID(Window window)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    struct window_xid_match walk = {
 | 
				
			||||||
 | 
					        .id = window,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (int i = 0; i < screenInfo.numScreens; i++) {
 | 
				
			||||||
 | 
					        WalkTree(screenInfo.screens[i], dix_match_window_xid, &walk);
 | 
				
			||||||
 | 
					        if (walk.pWin)
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return walk.pWin;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -19,6 +19,7 @@ srcs_dix = [
 | 
				
			||||||
    'glyphcurs.c',
 | 
					    'glyphcurs.c',
 | 
				
			||||||
    'grabs.c',
 | 
					    'grabs.c',
 | 
				
			||||||
    'inpututils.c',
 | 
					    'inpututils.c',
 | 
				
			||||||
 | 
					    'lookup.c',
 | 
				
			||||||
    'pixmap.c',
 | 
					    'pixmap.c',
 | 
				
			||||||
    'privates.c',
 | 
					    'privates.c',
 | 
				
			||||||
    'property.c',
 | 
					    'property.c',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue