mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2025-03-01 10:33:28 +00:00
Use query interface for void returning X requests
This commit is contained in:
@@ -4,27 +4,46 @@
|
||||
|
||||
#include <xcb/xcb.h>
|
||||
|
||||
template<class Request, class ...Args>
|
||||
std::unique_ptr<typename Request::ResponseType, decltype(&free)>
|
||||
query(xcb_connection_t * connection, Args&& ...args)
|
||||
void check_error(xcb_generic_error_t * error)
|
||||
{
|
||||
auto cookie = Request::RequestFunction(connection,args...);
|
||||
|
||||
xcb_generic_error_t * error = nullptr;
|
||||
std::unique_ptr<typename Request::ResponseType, decltype(&free)> xcbResponse(
|
||||
Request::ReplyFunction(connection, cookie, &error), free);
|
||||
|
||||
if (error) {
|
||||
Logger * LOGGER = Logger::getInstance("XCB");
|
||||
Error(LOGGER,
|
||||
"Cannot get the image data event_error: response_type:%u error_code:%u "
|
||||
"XCB request failed, event_error: response_type:%u error_code:%u "
|
||||
"sequence:%u resource_id:%u minor_code:%u major_code:%u.\n",
|
||||
error->response_type, error->error_code, error->sequence,
|
||||
error->resource_id, error->minor_code, error->major_code);
|
||||
|
||||
free(error);
|
||||
return {nullptr, nullptr};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Requests with void response type
|
||||
template<class Request, class ...Args>
|
||||
typename std::enable_if<std::is_same<typename Request::ResponseType, xcb_void_cookie_t>::value, void>::type
|
||||
query(xcb_connection_t * connection, Args&& ...args)
|
||||
{
|
||||
auto cookie = Request::RequestFunction(connection, std::forward<Args>(args)...);
|
||||
|
||||
xcb_generic_error_t * error = Request::ReplyFunction(connection, cookie);
|
||||
|
||||
check_error(error);
|
||||
}
|
||||
|
||||
// Requests with non-void response type
|
||||
template<class Request, class ...Args>
|
||||
typename std::enable_if<!std::is_same<typename Request::ResponseType, xcb_void_cookie_t>::value,
|
||||
std::unique_ptr<typename Request::ResponseType, decltype(&free)>>::type
|
||||
query(xcb_connection_t * connection, Args&& ...args)
|
||||
{
|
||||
auto cookie = Request::RequestFunction(connection, std::forward<Args>(args)...);
|
||||
|
||||
xcb_generic_error_t * error = nullptr;
|
||||
std::unique_ptr<typename Request::ResponseType, decltype(&free)> xcbResponse(
|
||||
Request::ReplyFunction(connection, cookie, &error), free);
|
||||
|
||||
check_error(error);
|
||||
|
||||
return xcbResponse;
|
||||
}
|
||||
|
Reference in New Issue
Block a user