From 3b7e9b4eba6ddea067689859e99ca6981665fa58 Mon Sep 17 00:00:00 2001 From: Chris Angelico Date: Tue, 21 May 2019 12:36:57 +1000 Subject: [PATCH 1/7] Create a command for opening a projector. Depends on obs-studio#1910 for back end functionality. --- src/WSRequestHandler.cpp | 1 + src/WSRequestHandler.h | 1 + src/WSRequestHandler_General.cpp | 25 +++++++++++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/src/WSRequestHandler.cpp b/src/WSRequestHandler.cpp index 8b31c0b7..3458a043 100644 --- a/src/WSRequestHandler.cpp +++ b/src/WSRequestHandler.cpp @@ -32,6 +32,7 @@ QHash WSRequestHandler::messageM { "GetStats", WSRequestHandler::HandleGetStats }, { "SetHeartbeat", WSRequestHandler::HandleSetHeartbeat }, { "GetVideoInfo", WSRequestHandler::HandleGetVideoInfo }, + { "OpenProjector", WSRequestHandler::HandleOpenProjector }, { "SetFilenameFormatting", WSRequestHandler::HandleSetFilenameFormatting }, { "GetFilenameFormatting", WSRequestHandler::HandleGetFilenameFormatting }, diff --git a/src/WSRequestHandler.h b/src/WSRequestHandler.h index 0e729e55..62bbc01d 100644 --- a/src/WSRequestHandler.h +++ b/src/WSRequestHandler.h @@ -79,6 +79,7 @@ class WSRequestHandler : public QObject { static HandlerResponse HandleGetStats(WSRequestHandler* req); static HandlerResponse HandleSetHeartbeat(WSRequestHandler* req); static HandlerResponse HandleGetVideoInfo(WSRequestHandler* req); + static HandlerResponse HandleOpenProjector(WSRequestHandler* req); static HandlerResponse HandleSetFilenameFormatting(WSRequestHandler* req); static HandlerResponse HandleGetFilenameFormatting(WSRequestHandler* req); diff --git a/src/WSRequestHandler_General.cpp b/src/WSRequestHandler_General.cpp index ecb3f48f..d98d0c4f 100644 --- a/src/WSRequestHandler_General.cpp +++ b/src/WSRequestHandler_General.cpp @@ -298,3 +298,28 @@ HandlerResponse WSRequestHandler::HandleGetVideoInfo(WSRequestHandler* req) { obs_data_set_string(response, "scaleType", describe_scale_type(ovi.scale_type)); return req->SendOKResponse(response); } + +/** + * Open a projector window or create a projector on a monitor. + * + * @param {String (Optional)} `type` Type of projector: Preview (default), Source, Scene, StudioProgram, or Multiview (case insensitive). + * @param {int (Optional)} `monitor` Monitor to open the projector on. If -1 or omitted, opens a window. + * @param {String (Optional)} `geometry` Size and position of the projector window (only if monitor is -1). Encoded in base 64. + * @param {String (Optional)} `name` Name of the source or scene to be displayed (ignored for other projector types). + * + * @api requests + * @name OpenProjector + * @category general + * @since 4.7.0 + */ +HandlerResponse WSRequestHandler::HandleOpenProjector(WSRequestHandler* req) { + const char *type = obs_data_get_string(req->data, "type"); + int monitor = -1; + if (req->hasField("monitor")) { + monitor = obs_data_get_int(req->data, "monitor"); + } + const char *geometry = obs_data_get_string(req->data, "geometry"); + const char *name = obs_data_get_string(req->data, "name"); + obs_frontend_open_projector(type, monitor, geometry, name); + return req->SendOKResponse(); +} From edbb28038f1de5a54ce19aa5b8eb00ffefa6ebaf Mon Sep 17 00:00:00 2001 From: Chris Angelico Date: Mon, 25 Nov 2019 22:36:17 +1100 Subject: [PATCH 2/7] Guard open_projector() with a version check. I can't find a way to probe for an actual feature here. --- src/WSRequestHandler_General.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/WSRequestHandler_General.cpp b/src/WSRequestHandler_General.cpp index d98d0c4f..b4654db1 100644 --- a/src/WSRequestHandler_General.cpp +++ b/src/WSRequestHandler_General.cpp @@ -313,6 +313,7 @@ HandlerResponse WSRequestHandler::HandleGetVideoInfo(WSRequestHandler* req) { * @since 4.7.0 */ HandlerResponse WSRequestHandler::HandleOpenProjector(WSRequestHandler* req) { + #if LIBOBS_API_VER >= 0x18000003 const char *type = obs_data_get_string(req->data, "type"); int monitor = -1; if (req->hasField("monitor")) { @@ -322,4 +323,7 @@ HandlerResponse WSRequestHandler::HandleOpenProjector(WSRequestHandler* req) { const char *name = obs_data_get_string(req->data, "name"); obs_frontend_open_projector(type, monitor, geometry, name); return req->SendOKResponse(); + #else + return req->SendErrorResponse("Projector opening requires libobs v21.0.3 or newer."); + #endif } From c0eb4d652b244ae89b4ab9a364c484ec26496c34 Mon Sep 17 00:00:00 2001 From: Chris Angelico Date: Tue, 26 Nov 2019 00:48:24 +1100 Subject: [PATCH 3/7] Mention the OBS version requirement in the docos --- docs/generated/comments.json | 61 ++++++++++++++++++++++++++++++++ docs/generated/protocol.md | 24 +++++++++++++ src/WSRequestHandler_General.cpp | 6 ++-- 3 files changed, 88 insertions(+), 3 deletions(-) diff --git a/docs/generated/comments.json b/docs/generated/comments.json index 559467e0..2a03e6f2 100644 --- a/docs/generated/comments.json +++ b/docs/generated/comments.json @@ -3287,6 +3287,67 @@ "lead": "", "type": "class", "examples": [] + }, + { + "subheads": [], + "description": "Open a projector window or create a projector on a monitor. Requires OBS v24.0.4 or newer.", + "param": [ + "{String (Optional)} `type` Type of projector: Preview (default), Source, Scene, StudioProgram, or Multiview (case insensitive).", + "{int (Optional)} `monitor` Monitor to open the projector on. If -1 or omitted, opens a window.", + "{String (Optional)} `geometry` Size and position of the projector window (only if monitor is -1). Encoded in base 64.", + "{String (Optional)} `name` Name of the source or scene to be displayed (ignored for other projector types)." + ], + "api": "requests", + "name": "OpenProjector", + "category": "general", + "since": "4.7.0", + "params": [ + { + "type": "String (Optional)", + "name": "type", + "description": "Type of projector: Preview (default), Source, Scene, StudioProgram, or Multiview (case insensitive)." + }, + { + "type": "int (Optional)", + "name": "monitor", + "description": "Monitor to open the projector on. If -1 or omitted, opens a window." + }, + { + "type": "String (Optional)", + "name": "geometry", + "description": "Size and position of the projector window (only if monitor is -1). Encoded in base 64." + }, + { + "type": "String (Optional)", + "name": "name", + "description": "Name of the source or scene to be displayed (ignored for other projector types)." + } + ], + "names": [ + { + "name": "", + "description": "OpenProjector" + } + ], + "categories": [ + { + "name": "", + "description": "general" + } + ], + "sinces": [ + { + "name": "", + "description": "4.7.0" + } + ], + "heading": { + "level": 2, + "text": "OpenProjector" + }, + "lead": "", + "type": "class", + "examples": [] } ], "outputs": [ diff --git a/docs/generated/protocol.md b/docs/generated/protocol.md index 81edecea..114fb463 100644 --- a/docs/generated/protocol.md +++ b/docs/generated/protocol.md @@ -118,6 +118,7 @@ auth_response = base64_encode(auth_response_hash) + [GetStats](#getstats) + [BroadcastCustomMessage](#broadcastcustommessage-1) + [GetVideoInfo](#getvideoinfo) + + [OpenProjector](#openprojector) * [Outputs](#outputs) + [ListOutputs](#listoutputs) + [GetOutputInfo](#getoutputinfo) @@ -1332,6 +1333,29 @@ _No specified parameters._ | `colorRange` | _String_ | Color range (full or partial) | +--- + +### OpenProjector + + +- Added in v4.7.0 + +Open a projector window or create a projector on a monitor. Requires OBS v24.0.4 or newer. + +**Request Fields:** + +| Name | Type | Description | +| ---- | :---: | ------------| +| `type` | _String (Optional)_ | Type of projector: Preview (default), Source, Scene, StudioProgram, or Multiview (case insensitive). | +| `monitor` | _int (Optional)_ | Monitor to open the projector on. If -1 or omitted, opens a window. | +| `geometry` | _String (Optional)_ | Size and position of the projector window (only if monitor is -1). Encoded in base 64. | +| `name` | _String (Optional)_ | Name of the source or scene to be displayed (ignored for other projector types). | + + +**Response Items:** + +_No additional response items._ + --- ## Outputs diff --git a/src/WSRequestHandler_General.cpp b/src/WSRequestHandler_General.cpp index b4654db1..821a87a8 100644 --- a/src/WSRequestHandler_General.cpp +++ b/src/WSRequestHandler_General.cpp @@ -300,7 +300,7 @@ HandlerResponse WSRequestHandler::HandleGetVideoInfo(WSRequestHandler* req) { } /** - * Open a projector window or create a projector on a monitor. + * Open a projector window or create a projector on a monitor. Requires OBS v24.0.4 or newer. * * @param {String (Optional)} `type` Type of projector: Preview (default), Source, Scene, StudioProgram, or Multiview (case insensitive). * @param {int (Optional)} `monitor` Monitor to open the projector on. If -1 or omitted, opens a window. @@ -313,7 +313,7 @@ HandlerResponse WSRequestHandler::HandleGetVideoInfo(WSRequestHandler* req) { * @since 4.7.0 */ HandlerResponse WSRequestHandler::HandleOpenProjector(WSRequestHandler* req) { - #if LIBOBS_API_VER >= 0x18000003 + #if LIBOBS_API_VER >= 0x18000004 const char *type = obs_data_get_string(req->data, "type"); int monitor = -1; if (req->hasField("monitor")) { @@ -324,6 +324,6 @@ HandlerResponse WSRequestHandler::HandleOpenProjector(WSRequestHandler* req) { obs_frontend_open_projector(type, monitor, geometry, name); return req->SendOKResponse(); #else - return req->SendErrorResponse("Projector opening requires libobs v21.0.3 or newer."); + return req->SendErrorResponse("Projector opening requires libobs v21.0.4 or newer."); #endif } From 78584b31942ab468b75616b9e88440a23c55fb65 Mon Sep 17 00:00:00 2001 From: Chris Angelico Date: Tue, 26 Nov 2019 00:59:57 +1100 Subject: [PATCH 4/7] Fix version number in message --- src/WSRequestHandler_General.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/WSRequestHandler_General.cpp b/src/WSRequestHandler_General.cpp index 821a87a8..43bf3783 100644 --- a/src/WSRequestHandler_General.cpp +++ b/src/WSRequestHandler_General.cpp @@ -324,6 +324,6 @@ HandlerResponse WSRequestHandler::HandleOpenProjector(WSRequestHandler* req) { obs_frontend_open_projector(type, monitor, geometry, name); return req->SendOKResponse(); #else - return req->SendErrorResponse("Projector opening requires libobs v21.0.4 or newer."); + return req->SendErrorResponse("Projector opening requires libobs v24.0.4 or newer."); #endif } From 9fc41e4245c5d168c45bccd1338c457b78101642 Mon Sep 17 00:00:00 2001 From: Chris Angelico Date: Thu, 5 Mar 2020 05:14:46 +1100 Subject: [PATCH 5/7] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes all the easy ones. I'll look into the more substantive changes in a bit. Co-Authored-By: Stéphane Lepin --- src/WSRequestHandler_General.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/WSRequestHandler_General.cpp b/src/WSRequestHandler_General.cpp index 8d3794ed..762dcea7 100644 --- a/src/WSRequestHandler_General.cpp +++ b/src/WSRequestHandler_General.cpp @@ -316,10 +316,10 @@ RpcResponse WSRequestHandler::GetVideoInfo(const RpcRequest& request) { * @api requests * @name OpenProjector * @category general - * @since 4.7.0 + * @since unreleased */ RpcResponse WSRequestHandler::OpenProjector(const RpcRequest& request) { - #if LIBOBS_API_VER >= 0x18000004 +#if LIBOBS_API_VER >= 0x18000004 const char *type = obs_data_get_string(request.parameters(), "type"); int monitor = -1; if (request.hasField("monitor")) { @@ -329,7 +329,7 @@ RpcResponse WSRequestHandler::OpenProjector(const RpcRequest& request) { const char *name = obs_data_get_string(request.parameters(), "name"); obs_frontend_open_projector(type, monitor, geometry, name); return request.success(); - #else +#else return request.failed("Projector opening requires libobs v24.0.4 or newer."); - #endif +#endif } From f4f760a231b9fe9988c901d7e8a8a6785eb6b3e1 Mon Sep 17 00:00:00 2001 From: Chris Angelico Date: Wed, 11 Mar 2020 22:05:37 +1100 Subject: [PATCH 6/7] Punt on explaining what the geometry string actually means --- src/WSRequestHandler_General.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/WSRequestHandler_General.cpp b/src/WSRequestHandler_General.cpp index 762dcea7..aca02d59 100644 --- a/src/WSRequestHandler_General.cpp +++ b/src/WSRequestHandler_General.cpp @@ -310,13 +310,13 @@ RpcResponse WSRequestHandler::GetVideoInfo(const RpcRequest& request) { * * @param {String (Optional)} `type` Type of projector: Preview (default), Source, Scene, StudioProgram, or Multiview (case insensitive). * @param {int (Optional)} `monitor` Monitor to open the projector on. If -1 or omitted, opens a window. - * @param {String (Optional)} `geometry` Size and position of the projector window (only if monitor is -1). Encoded in base 64. + * @param {String (Optional)} `geometry` Size and position of the projector window (only if monitor is -1). Encoded in base 64. Corresponds to OBS's saved projectors. * @param {String (Optional)} `name` Name of the source or scene to be displayed (ignored for other projector types). * * @api requests * @name OpenProjector * @category general - * @since unreleased + * @since unreleased */ RpcResponse WSRequestHandler::OpenProjector(const RpcRequest& request) { #if LIBOBS_API_VER >= 0x18000004 From 62ad1a483c91dc21b4186c8325586fbf04a90668 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Wed, 11 Mar 2020 12:09:08 +0100 Subject: [PATCH 7/7] docs(OpenProjector): add info on geometry encoding --- src/WSRequestHandler_General.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/WSRequestHandler_General.cpp b/src/WSRequestHandler_General.cpp index aca02d59..c957da49 100644 --- a/src/WSRequestHandler_General.cpp +++ b/src/WSRequestHandler_General.cpp @@ -310,7 +310,7 @@ RpcResponse WSRequestHandler::GetVideoInfo(const RpcRequest& request) { * * @param {String (Optional)} `type` Type of projector: Preview (default), Source, Scene, StudioProgram, or Multiview (case insensitive). * @param {int (Optional)} `monitor` Monitor to open the projector on. If -1 or omitted, opens a window. - * @param {String (Optional)} `geometry` Size and position of the projector window (only if monitor is -1). Encoded in base 64. Corresponds to OBS's saved projectors. + * @param {String (Optional)} `geometry` Size and position of the projector window (only if monitor is -1). Encoded in Base64 using Qt's geometry encoding (https://doc.qt.io/qt-5/qwidget.html#saveGeometry). Corresponds to OBS's saved projectors. * @param {String (Optional)} `name` Name of the source or scene to be displayed (ignored for other projector types). * * @api requests