提交 db9204de 编写于 作者: J Jim

Merge pull request #283 from ElectronicWar/monitor-capture-upd

Add monitor selection and properties to Monitor Capture (Win)
......@@ -7,3 +7,5 @@ WindowCapture.Priority.Class="Window Class"
WindowCapture.Priority.Exe="Executable Name"
CaptureCursor="Capture Cursor"
Compatibility="Multi-adapter Compatibility"
Monitor="Monitor"
PrimaryMonitor="Primary Monitor"
#include <util/dstr.h>
#include "dc-capture.h"
#define TEXT_MONITOR_CAPTURE obs_module_text("MonitorCapture")
#define TEXT_CAPTURE_CURSOR obs_module_text("CaptureCursor")
#define TEXT_COMPATIBILITY obs_module_text("Compatibility")
#define TEXT_MONITOR obs_module_text("Monitor")
#define TEXT_PRIMARY_MONITOR obs_module_text("PrimaryMonitor")
struct monitor_capture {
obs_source_t *source;
......@@ -49,7 +55,7 @@ static BOOL CALLBACK enum_monitor(HMONITOR handle, HDC hdc, LPRECT rect,
UNUSED_PARAMETER(hdc);
UNUSED_PARAMETER(handle);
return (monitor->desired_id < monitor->cur_id++);
return (monitor->desired_id > monitor->cur_id++);
}
static void update_monitor(struct monitor_capture *capture,
......@@ -74,6 +80,7 @@ static void update_monitor(struct monitor_capture *capture,
static inline void update_settings(struct monitor_capture *capture,
obs_data_t *settings)
{
capture->monitor = (int)obs_data_get_int(settings, "monitor");
capture->capture_cursor = obs_data_get_bool(settings, "capture_cursor");
capture->compatibility = obs_data_get_bool(settings, "compatibility");
......@@ -85,7 +92,7 @@ static inline void update_settings(struct monitor_capture *capture,
static const char *monitor_capture_getname(void)
{
return obs_module_text("MonitorCapture");
return TEXT_MONITOR_CAPTURE;
}
static void monitor_capture_destroy(void *data)
......@@ -109,6 +116,12 @@ static void monitor_capture_defaults(obs_data_t *settings)
obs_data_set_default_bool(settings, "compatibility", false);
}
static void monitor_capture_update(void *data, obs_data_t *settings)
{
struct monitor_capture *mc = data;
update_settings(mc, settings);
}
static void *monitor_capture_create(obs_data_t *settings, obs_source_t *source)
{
struct monitor_capture *capture;
......@@ -157,16 +170,85 @@ static uint32_t monitor_capture_height(void *data)
return capture->data.height;
}
static BOOL CALLBACK enum_monitor_props(HMONITOR handle, HDC hdc, LPRECT rect,
LPARAM param)
{
UNUSED_PARAMETER(hdc);
UNUSED_PARAMETER(rect);
obs_property_t *monitor_list = (obs_property_t*)param;
MONITORINFO mi;
size_t monitor_id = 0;
struct dstr monitor_desc = { 0 };
struct dstr resolution = { 0 };
struct dstr format_string = { 0 };
monitor_id = obs_property_list_item_count(monitor_list);
mi.cbSize = sizeof(mi);
GetMonitorInfo(handle, &mi);
dstr_catf(&resolution,
"%dx%d @ %d,%d",
mi.rcMonitor.right - mi.rcMonitor.left,
mi.rcMonitor.bottom - mi.rcMonitor.top,
mi.rcMonitor.left,
mi.rcMonitor.top);
dstr_copy(&format_string, "%s %d: %s");
if (mi.dwFlags == MONITORINFOF_PRIMARY) {
dstr_catf(&format_string, " (%s)", TEXT_PRIMARY_MONITOR);
}
dstr_catf(&monitor_desc,
format_string.array,
TEXT_MONITOR,
monitor_id,
resolution.array);
obs_property_list_add_int(monitor_list,
monitor_desc.array, (int)monitor_id);
dstr_free(&monitor_desc);
dstr_free(&resolution);
dstr_free(&format_string);
return TRUE;
}
static obs_properties_t *monitor_capture_properties(void *unused)
{
UNUSED_PARAMETER(unused);
obs_properties_t *props = obs_properties_create();
obs_property_t *monitors = obs_properties_add_list(props,
"monitor", TEXT_MONITOR,
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
obs_property_t *compatmode = obs_properties_add_bool(props,
"compatibility", TEXT_COMPATIBILITY);
obs_property_t *capture_cursor = obs_properties_add_bool(props,
"capture_cursor", TEXT_CAPTURE_CURSOR);
EnumDisplayMonitors(NULL, NULL, enum_monitor_props, (LPARAM)monitors);
return props;
}
struct obs_source_info monitor_capture_info = {
.id = "monitor_capture",
.type = OBS_SOURCE_TYPE_INPUT,
.output_flags = OBS_SOURCE_VIDEO | OBS_SOURCE_CUSTOM_DRAW,
.get_name = monitor_capture_getname,
.create = monitor_capture_create,
.destroy = monitor_capture_destroy,
.video_render = monitor_capture_render,
.video_tick = monitor_capture_tick,
.get_width = monitor_capture_width,
.get_height = monitor_capture_height,
.get_defaults = monitor_capture_defaults
.id = "monitor_capture",
.type = OBS_SOURCE_TYPE_INPUT,
.output_flags = OBS_SOURCE_VIDEO | OBS_SOURCE_CUSTOM_DRAW,
.get_name = monitor_capture_getname,
.create = monitor_capture_create,
.destroy = monitor_capture_destroy,
.video_render = monitor_capture_render,
.video_tick = monitor_capture_tick,
.update = monitor_capture_update,
.get_width = monitor_capture_width,
.get_height = monitor_capture_height,
.get_defaults = monitor_capture_defaults,
.get_properties = monitor_capture_properties
};
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册