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 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 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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',
 | 
			
		||||
    'grabs.c',
 | 
			
		||||
    'inpututils.c',
 | 
			
		||||
    'lookup.c',
 | 
			
		||||
    'pixmap.c',
 | 
			
		||||
    'privates.c',
 | 
			
		||||
    'property.c',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue