53 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // This file is part of Desktop App Toolkit,
 | |
| // a set of libraries for developing nice desktop applications.
 | |
| //
 | |
| // For license and copyright information please follow this link:
 | |
| // https://github.com/desktop-app/legal/blob/master/LEGAL
 | |
| //
 | |
| #include <dlfcn.h>
 | |
| #include <stdlib.h>
 | |
| #include <xcb/xcb.h>
 | |
| #include <xcb/xcbext.h>
 | |
| 
 | |
| unsigned int xcb_send_request_with_fds(
 | |
| 		xcb_connection_t *c,
 | |
| 		int flags,
 | |
| 		struct iovec *vector,
 | |
| 		const xcb_protocol_request_t *req,
 | |
| 		unsigned int num_fds,
 | |
| 		int *fds) {
 | |
| 	const auto send_request_with_fds = reinterpret_cast<unsigned int(*)(
 | |
| 		xcb_connection_t*,
 | |
| 		int,
 | |
| 		struct iovec*,
 | |
| 		const xcb_protocol_request_t*,
 | |
| 		unsigned int,
 | |
| 		int*)>(dlsym(RTLD_NEXT, "xcb_send_request_with_fds"));
 | |
| 
 | |
| 	if (!dlerror()) {
 | |
| 		return send_request_with_fds(c, flags, vector, req, num_fds, fds);
 | |
| 	}
 | |
| 
 | |
| 	const auto send_fd = reinterpret_cast<void(*)(xcb_connection_t*, int)>(
 | |
| 		dlsym(RTLD_NEXT, "xcb_send_fd"));
 | |
| 
 | |
| 	if (dlerror()) {
 | |
| 		abort();
 | |
| 	}
 | |
| 
 | |
| 	const auto send_request = reinterpret_cast<unsigned int(*)(
 | |
| 		xcb_connection_t*,
 | |
| 		int,
 | |
| 		struct iovec*,
 | |
| 		const xcb_protocol_request_t*)>(dlsym(RTLD_NEXT, "xcb_send_request"));
 | |
| 
 | |
| 	if (dlerror()) {
 | |
| 		abort();
 | |
| 	}
 | |
| 
 | |
| 	for (int i = 0; i != num_fds; ++i) {
 | |
| 		send_fd(c, fds[i]);
 | |
| 	}
 | |
| 
 | |
| 	return send_request(c, flags, vector, req);
 | |
| }
 | 
