#include #include #include #include #include #include "xcbXorg.h" struct XcbConnectionInfo { std::unique_ptr connection; int screenNumber; XcbConnectionInfo() : connection(nullptr, &xcb_disconnect), screenNumber(0) {} }; static XcbConnectionInfo xcbConn; static CExportedImplexorApiDesc xcbXorgExportedImplexorApis[] = { { .name = "video-implexor" } }; static sal_mlo_initializeIndFn xcbXorg_initializeInd; static sal_mlo_finalizeIndFn xcbXorg_finalizeInd; static sal_mlo_attachDeviceReqFn xcbXorg_attachDeviceReq; static sal_mlo_detachDeviceReqFn xcbXorg_detachDeviceReq; static Csal_mgmt_libOps xcbXorgMgmtLibOps = { .initializeInd = xcbXorg_initializeInd, .finalizeInd = xcbXorg_finalizeInd, .attachDeviceReq = xcbXorg_attachDeviceReq, .detachDeviceReq = xcbXorg_detachDeviceReq }; static CSenseApiDesc xcbXorgApiDesc = { .name = "xcb-xorg", .numExportedImplexorApis = sizeof(xcbXorgExportedImplexorApis) / sizeof(*xcbXorgExportedImplexorApis), .exportedImplexorApis = xcbXorgExportedImplexorApis, .sal_mgmt_libOps = &xcbXorgMgmtLibOps }; extern HK_UNMANGLED getSenseApiDescFn HK_GET_SENSE_API_DESC_FN_NAME; const CSenseApiDesc *HK_GET_SENSE_API_DESC_FN_NAME(void) { return &xcbXorgApiDesc; } static sal_mlo_initializeIndFn xcbXorg_initializeInd; int xcbXorg_initializeInd(void) { xcbConn.connection.reset( xcb_connect(nullptr, &xcbConn.screenNumber)); if (xcb_connection_has_error(xcbConn.connection.get())) { throw std::runtime_error( std::string(__func__) + ": Failed to connect to X server"); } std::cout << __func__ << ": Connected to X server, screen number " << xcbConn.screenNumber << "\n"; return 0; } static sal_mlo_finalizeIndFn xcbXorg_finalizeInd; int xcbXorg_finalizeInd(void) { if (!xcbConn.connection) { return 0; } xcbConn.connection.reset(); std::cout << __func__ << ": Disconnected from X server\n"; return 0; } static sal_mlo_attachDeviceReqFn xcbXorg_attachDeviceReq; int xcbXorg_attachDeviceReq(const CSenseDeviceSpec *const desc) { std::cout << __func__ << ": Attaching device spec: " << *desc << "\n"; return 0; } static sal_mlo_detachDeviceReqFn xcbXorg_detachDeviceReq; int xcbXorg_detachDeviceReq(const CSenseDeviceSpec *const spec) { std::cout << __func__ << "\n"; return 0; }