mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2023-10-10 13:36:59 +02:00
Merge pull request #945 from m-seker/improvement/xcb
Use query interface for void returning X requests
This commit is contained in:
commit
6e039a0d83
@ -4,27 +4,46 @@
|
|||||||
|
|
||||||
#include <xcb/xcb.h>
|
#include <xcb/xcb.h>
|
||||||
|
|
||||||
template<class Request, class ...Args>
|
void check_error(xcb_generic_error_t * error)
|
||||||
std::unique_ptr<typename Request::ResponseType, decltype(&free)>
|
|
||||||
query(xcb_connection_t * connection, Args&& ...args)
|
|
||||||
{
|
{
|
||||||
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) {
|
if (error) {
|
||||||
Logger * LOGGER = Logger::getInstance("XCB");
|
Logger * LOGGER = Logger::getInstance("XCB");
|
||||||
Error(LOGGER,
|
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",
|
"sequence:%u resource_id:%u minor_code:%u major_code:%u.\n",
|
||||||
error->response_type, error->error_code, error->sequence,
|
error->response_type, error->error_code, error->sequence,
|
||||||
error->resource_id, error->minor_code, error->major_code);
|
error->resource_id, error->minor_code, error->major_code);
|
||||||
|
|
||||||
free(error);
|
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;
|
return xcbResponse;
|
||||||
}
|
}
|
||||||
|
@ -53,3 +53,83 @@ struct RenderQueryPictFormats
|
|||||||
static constexpr auto ReplyFunction = xcb_render_query_pict_formats_reply;
|
static constexpr auto ReplyFunction = xcb_render_query_pict_formats_reply;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ShmCreatePixmap
|
||||||
|
{
|
||||||
|
typedef xcb_void_cookie_t ResponseType;
|
||||||
|
|
||||||
|
static constexpr auto RequestFunction = xcb_shm_create_pixmap_checked;
|
||||||
|
static constexpr auto ReplyFunction = xcb_request_check;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ShmAttach
|
||||||
|
{
|
||||||
|
typedef xcb_void_cookie_t ResponseType;
|
||||||
|
|
||||||
|
static constexpr auto RequestFunction = xcb_shm_attach_checked;
|
||||||
|
static constexpr auto ReplyFunction = xcb_request_check;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ShmDetach
|
||||||
|
{
|
||||||
|
typedef xcb_void_cookie_t ResponseType;
|
||||||
|
|
||||||
|
static constexpr auto RequestFunction = xcb_shm_detach_checked;
|
||||||
|
static constexpr auto ReplyFunction = xcb_request_check;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CreatePixmap
|
||||||
|
{
|
||||||
|
typedef xcb_void_cookie_t ResponseType;
|
||||||
|
|
||||||
|
static constexpr auto RequestFunction = xcb_create_pixmap_checked;
|
||||||
|
static constexpr auto ReplyFunction = xcb_request_check;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RenderCreatePicture
|
||||||
|
{
|
||||||
|
typedef xcb_void_cookie_t ResponseType;
|
||||||
|
|
||||||
|
static constexpr auto RequestFunction = xcb_render_create_picture_checked;
|
||||||
|
static constexpr auto ReplyFunction = xcb_request_check;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RenderSetPictureFilter
|
||||||
|
{
|
||||||
|
typedef xcb_void_cookie_t ResponseType;
|
||||||
|
|
||||||
|
static constexpr auto RequestFunction = xcb_render_set_picture_filter_checked;
|
||||||
|
static constexpr auto ReplyFunction = xcb_request_check;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RenderSetPictureTransform
|
||||||
|
{
|
||||||
|
typedef xcb_void_cookie_t ResponseType;
|
||||||
|
|
||||||
|
static constexpr auto RequestFunction = xcb_render_set_picture_transform_checked;
|
||||||
|
static constexpr auto ReplyFunction = xcb_request_check;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RenderComposite
|
||||||
|
{
|
||||||
|
typedef xcb_void_cookie_t ResponseType;
|
||||||
|
|
||||||
|
static constexpr auto RequestFunction = xcb_render_composite_checked;
|
||||||
|
static constexpr auto ReplyFunction = xcb_request_check;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RenderFreePicture
|
||||||
|
{
|
||||||
|
typedef xcb_void_cookie_t ResponseType;
|
||||||
|
|
||||||
|
static constexpr auto RequestFunction = xcb_render_free_picture_checked;
|
||||||
|
static constexpr auto ReplyFunction = xcb_request_check;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FreePixmap
|
||||||
|
{
|
||||||
|
typedef xcb_void_cookie_t ResponseType;
|
||||||
|
|
||||||
|
static constexpr auto RequestFunction = xcb_free_pixmap_checked;
|
||||||
|
static constexpr auto ReplyFunction = xcb_request_check;
|
||||||
|
};
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ void XcbGrabber::freeResources()
|
|||||||
|
|
||||||
if(_XcbShmAvailable)
|
if(_XcbShmAvailable)
|
||||||
{
|
{
|
||||||
xcb_shm_detach(_connection, _shminfo);
|
query<ShmDetach>(_connection, _shminfo);
|
||||||
shmdt(_shmData);
|
shmdt(_shmData);
|
||||||
shmctl(_shminfo, IPC_RMID, 0);
|
shmctl(_shminfo, IPC_RMID, 0);
|
||||||
|
|
||||||
@ -70,9 +70,9 @@ void XcbGrabber::freeResources()
|
|||||||
|
|
||||||
if (_XcbRenderAvailable)
|
if (_XcbRenderAvailable)
|
||||||
{
|
{
|
||||||
xcb_free_pixmap(_connection, _pixmap);
|
query<FreePixmap>(_connection, _pixmap);
|
||||||
xcb_render_free_picture(_connection, _srcPicture);
|
query<RenderFreePicture>(_connection, _srcPicture);
|
||||||
xcb_render_free_picture(_connection, _dstPicture);
|
query<RenderFreePicture>(_connection, _dstPicture);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,7 +88,7 @@ void XcbGrabber::setupResources()
|
|||||||
_shminfo = xcb_generate_id(_connection);
|
_shminfo = xcb_generate_id(_connection);
|
||||||
int id = shmget(IPC_PRIVATE, size_t(_width) * size_t(_height) * 4, IPC_CREAT | 0777);
|
int id = shmget(IPC_PRIVATE, size_t(_width) * size_t(_height) * 4, IPC_CREAT | 0777);
|
||||||
_shmData = static_cast<uint8_t*>(shmat(id, nullptr, 0));
|
_shmData = static_cast<uint8_t*>(shmat(id, nullptr, 0));
|
||||||
xcb_shm_attach(_connection, _shminfo, id, 0);
|
query<ShmAttach>(_connection, _shminfo, id, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_XcbRenderAvailable)
|
if (_XcbRenderAvailable)
|
||||||
@ -100,14 +100,14 @@ void XcbGrabber::setupResources()
|
|||||||
if(_XcbShmPixmapAvailable)
|
if(_XcbShmPixmapAvailable)
|
||||||
{
|
{
|
||||||
_pixmap = xcb_generate_id(_connection);
|
_pixmap = xcb_generate_id(_connection);
|
||||||
xcb_shm_create_pixmap(
|
query<ShmCreatePixmap>(
|
||||||
_connection, _pixmap, _screen->root, _width,
|
_connection, _pixmap, _screen->root, _width,
|
||||||
_height, _screen->root_depth, _shminfo, 0);
|
_height, _screen->root_depth, _shminfo, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_pixmap = xcb_generate_id(_connection);
|
_pixmap = xcb_generate_id(_connection);
|
||||||
xcb_create_pixmap(_connection, _screen->root_depth, _pixmap, _screen->root, _width, _height);
|
query<CreatePixmap>(_connection, _screen->root_depth, _pixmap, _screen->root, _width, _height);
|
||||||
}
|
}
|
||||||
|
|
||||||
_srcFormat = findFormatForVisual(_screen->root_visual);
|
_srcFormat = findFormatForVisual(_screen->root_visual);
|
||||||
@ -119,11 +119,11 @@ void XcbGrabber::setupResources()
|
|||||||
const uint32_t value_mask = XCB_RENDER_CP_REPEAT;
|
const uint32_t value_mask = XCB_RENDER_CP_REPEAT;
|
||||||
const uint32_t values[] = { XCB_RENDER_REPEAT_NONE };
|
const uint32_t values[] = { XCB_RENDER_REPEAT_NONE };
|
||||||
|
|
||||||
xcb_render_create_picture(_connection, _srcPicture, _screen->root, _srcFormat, value_mask, values);
|
query<RenderCreatePicture>(_connection, _srcPicture, _screen->root, _srcFormat, value_mask, values);
|
||||||
xcb_render_create_picture(_connection, _dstPicture, _pixmap, _dstFormat, value_mask, values);
|
query<RenderCreatePicture>(_connection, _dstPicture, _pixmap, _dstFormat, value_mask, values);
|
||||||
|
|
||||||
const std::string filter = "fast";
|
const std::string filter = "fast";
|
||||||
xcb_render_set_picture_filter(_connection, _srcPicture, filter.size(), filter.c_str(), 0, nullptr);
|
query<RenderSetPictureFilter>(_connection, _srcPicture, filter.size(), filter.c_str(), 0, nullptr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -243,8 +243,8 @@ int XcbGrabber::grabFrame(Image<ColorRgb> & image, bool forceUpdate)
|
|||||||
DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(scale)
|
DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(scale)
|
||||||
};
|
};
|
||||||
|
|
||||||
xcb_render_set_picture_transform(_connection, _srcPicture, _transform);
|
query<RenderSetPictureTransform>(_connection, _srcPicture, _transform);
|
||||||
xcb_render_composite(_connection,
|
query<RenderComposite>(_connection,
|
||||||
XCB_RENDER_PICT_OP_SRC, _srcPicture,
|
XCB_RENDER_PICT_OP_SRC, _srcPicture,
|
||||||
XCB_RENDER_PICTURE_NONE, _dstPicture,
|
XCB_RENDER_PICTURE_NONE, _dstPicture,
|
||||||
(_src_x/_pixelDecimation),
|
(_src_x/_pixelDecimation),
|
||||||
|
Loading…
Reference in New Issue
Block a user