Files
salmanoff/senseApis/xcbXorg/xcbXorg.cpp
T
hayodea 660f0f0e73 DevMgr: Make vectors hold sh_ptr and not uniq_ptr
This allows us to mirror the contents of the two lists into the unified
list much more easily.
2025-01-13 08:02:59 -04:00

95 lines
2.5 KiB
C++

#include <iostream>
#include <algorithm>
#include <stdexcept>
#include <memory>
#include <xcb/xcb.h>
#include "xcbXorg.h"
struct XcbConnectionInfo {
std::unique_ptr<xcb_connection_t, decltype(&xcb_disconnect)> 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;
}