112 lines
2.9 KiB
C++
112 lines
2.9 KiB
C++
#include "SafeGetters.h"
|
|
#include "Utils.h"
|
|
|
|
#include <X11/X.h>
|
|
|
|
BAN::ErrorOr<Object::Window&> get_window(Client& client_info, CARD32 wid, BYTE op_major, BYTE op_minor)
|
|
{
|
|
auto it = g_objects.find(wid);
|
|
if (it == g_objects.end() || it->value->type != Object::Type::Window)
|
|
{
|
|
xError error {
|
|
.type = X_Error,
|
|
.errorCode = BadWindow,
|
|
.sequenceNumber = client_info.sequence,
|
|
.resourceID = wid,
|
|
.minorCode = op_minor,
|
|
.majorCode = op_major,
|
|
};
|
|
TRY(encode(client_info.output_buffer, error));
|
|
return BAN::Error::from_errno(ENOENT);
|
|
}
|
|
|
|
return it->value->object.get<Object::Window>();
|
|
}
|
|
|
|
BAN::ErrorOr<Object::Pixmap&> get_pixmap(Client& client_info, CARD32 pid, BYTE op_major, BYTE op_minor)
|
|
{
|
|
auto it = g_objects.find(pid);
|
|
if (it == g_objects.end() || it->value->type != Object::Type::Pixmap)
|
|
{
|
|
xError error {
|
|
.type = X_Error,
|
|
.errorCode = BadPixmap,
|
|
.sequenceNumber = client_info.sequence,
|
|
.resourceID = pid,
|
|
.minorCode = op_minor,
|
|
.majorCode = op_major,
|
|
};
|
|
TRY(encode(client_info.output_buffer, error));
|
|
return BAN::Error::from_errno(ENOENT);
|
|
}
|
|
|
|
return it->value->object.get<Object::Pixmap>();
|
|
}
|
|
|
|
BAN::ErrorOr<Object::GraphicsContext&> get_gc(Client& client_info, CARD32 gc, BYTE op_major, BYTE op_minor)
|
|
{
|
|
auto it = g_objects.find(gc);
|
|
if (it == g_objects.end() || it->value->type != Object::Type::GraphicsContext)
|
|
{
|
|
xError error {
|
|
.type = X_Error,
|
|
.errorCode = BadGC,
|
|
.sequenceNumber = client_info.sequence,
|
|
.resourceID = gc,
|
|
.minorCode = op_minor,
|
|
.majorCode = op_major,
|
|
};
|
|
TRY(encode(client_info.output_buffer, error));
|
|
return BAN::Error::from_errno(ENOENT);
|
|
}
|
|
|
|
return it->value->object.get<Object::GraphicsContext>();
|
|
}
|
|
|
|
BAN::ErrorOr<DrawableInfo> get_drawable_info(Client& client_info, CARD32 drawable, BYTE op_major, BYTE op_minor)
|
|
{
|
|
auto drawable_it = g_objects.find(drawable);
|
|
if (drawable_it == g_objects.end() || (drawable_it->value->type != Object::Type::Window && drawable_it->value->type != Object::Type::Pixmap))
|
|
{
|
|
xError error {
|
|
.type = X_Error,
|
|
.errorCode = BadDrawable,
|
|
.sequenceNumber = client_info.sequence,
|
|
.resourceID = drawable,
|
|
.minorCode = op_minor,
|
|
.majorCode = op_major,
|
|
};
|
|
TRY(encode(client_info.output_buffer, error));
|
|
return BAN::Error::from_errno(ENOENT);
|
|
}
|
|
|
|
DrawableInfo info;
|
|
|
|
switch (drawable_it->value->type)
|
|
{
|
|
case Object::Type::Window:
|
|
{
|
|
auto& window = drawable_it->value->object.get<Object::Window>();
|
|
auto& texture = window.texture();
|
|
info.data_u32 = texture.pixels().data();
|
|
info.w = texture.width();
|
|
info.h = texture.height();
|
|
info.depth = window.depth;
|
|
break;
|
|
}
|
|
case Object::Type::Pixmap:
|
|
{
|
|
auto& pixmap = drawable_it->value->object.get<Object::Pixmap>();
|
|
info.data_u32 = reinterpret_cast<uint32_t*>(pixmap.data.data());
|
|
info.w = pixmap.width;
|
|
info.h = pixmap.height;
|
|
info.depth = pixmap.depth;
|
|
break;
|
|
}
|
|
default:
|
|
ASSERT_NOT_REACHED();
|
|
}
|
|
|
|
return info;
|
|
}
|