From a7af7ccbfed33b1af084718f10c6bd86c56628c0 Mon Sep 17 00:00:00 2001 From: Manuel Kroeber Date: Tue, 14 Oct 2014 20:45:16 +0200 Subject: [PATCH] Add monitor selection and basic properties --- plugins/win-capture/data/locale/en-US.ini | 2 + plugins/win-capture/monitor-capture.c | 103 +++++++++++++++++++--- 2 files changed, 94 insertions(+), 11 deletions(-) diff --git a/plugins/win-capture/data/locale/en-US.ini b/plugins/win-capture/data/locale/en-US.ini index 112e15969..0fc397458 100644 --- a/plugins/win-capture/data/locale/en-US.ini +++ b/plugins/win-capture/data/locale/en-US.ini @@ -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" diff --git a/plugins/win-capture/monitor-capture.c b/plugins/win-capture/monitor-capture.c index 3e799b819..31e6ef9e8 100644 --- a/plugins/win-capture/monitor-capture.c +++ b/plugins/win-capture/monitor-capture.c @@ -2,6 +2,11 @@ #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; @@ -75,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"); @@ -110,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; @@ -158,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 };