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);
|
|
}
|