mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2025-05-17 08:34:23 -04:00
cs: implement TakeScreenShot command
This commit is contained in:
parent
8acf0a4fa9
commit
0ec23e74b5
6 changed files with 152 additions and 1 deletions
|
@ -25,6 +25,15 @@ namespace ams::cs {
|
|||
settings::system::FirmwareVersion firmware_version;
|
||||
};
|
||||
|
||||
struct ResponseTakeScreenShot {
|
||||
ResponseHeader header;
|
||||
s32 data_size;
|
||||
s32 width;
|
||||
s32 height;
|
||||
};
|
||||
|
||||
constinit u8 g_data[0x1000];
|
||||
|
||||
}
|
||||
|
||||
bool CommandProcessor::ProcessCommand(const CommandHeader &header, const u8 *body, s32 socket) {
|
||||
|
@ -32,7 +41,12 @@ namespace ams::cs {
|
|||
case Command_GetFirmwareVersion:
|
||||
SendFirmwareVersion(socket, header);
|
||||
break;
|
||||
/* TODO: Command support. */
|
||||
case Command_TakeScreenShot:
|
||||
this->TakeScreenShot(header, socket, vi::LayerStack_ApplicationForDebug);
|
||||
break;
|
||||
case Command_TakeForegroundScreenShot:
|
||||
this->TakeScreenShot(header, socket, vi::LayerStack_LastFrame);
|
||||
break;
|
||||
/* TODO: Command support. */
|
||||
default:
|
||||
scs::CommandProcessor::ProcessCommand(header, body, socket);
|
||||
|
@ -64,4 +78,45 @@ namespace ams::cs {
|
|||
}
|
||||
}
|
||||
|
||||
void CommandProcessor::TakeScreenShot(const CommandHeader &header, s32 socket, vi::LayerStack layer_stack) {
|
||||
/* Create the command data. */
|
||||
const CommandDataTakeScreenShot params = {
|
||||
.layer_stack = layer_stack,
|
||||
.send_header = [&](s32 data_size, s32 width, s32 height) {
|
||||
/* Use global buffer for response. */
|
||||
ResponseTakeScreenShot *response = reinterpret_cast<ResponseTakeScreenShot *>(g_data);
|
||||
|
||||
/* Set response header. */
|
||||
*response = {
|
||||
.header = {
|
||||
.id = header.id,
|
||||
.response = Response_ScreenShot,
|
||||
.body_size = static_cast<u32>(sizeof(data_size) + sizeof(width) + sizeof(height) + data_size),
|
||||
},
|
||||
.data_size = data_size,
|
||||
.width = width,
|
||||
.height = height,
|
||||
};
|
||||
|
||||
/* Send data. */
|
||||
Send(socket, response, sizeof(*response));
|
||||
},
|
||||
.send_data = [&](u8 *data, size_t data_size) {
|
||||
/* Send data. */
|
||||
Send(socket, data, data_size);
|
||||
},
|
||||
.buffer = g_data,
|
||||
.buffer_size = sizeof(g_data),
|
||||
};
|
||||
|
||||
/* Acquire the send lock. */
|
||||
auto lk = MakeSendGuardBlock();
|
||||
|
||||
/* Take the screenshot. */
|
||||
const Result result = DoTakeScreenShotCommand(params);
|
||||
if (R_FAILED(result)) {
|
||||
SendErrorResult(socket, header, result);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue