diff --git a/webrtc/modules/desktop_capture/mac/full_screen_chrome_window_detector.cc b/webrtc/modules/desktop_capture/mac/full_screen_chrome_window_detector.cc index 84579c4149..2d3c2d9047 100644 --- a/webrtc/modules/desktop_capture/mac/full_screen_chrome_window_detector.cc +++ b/webrtc/modules/desktop_capture/mac/full_screen_chrome_window_detector.cc @@ -15,7 +15,6 @@ #include #include "webrtc/base/macutils.h" -#include "webrtc/modules/desktop_capture/mac/desktop_configuration.h" #include "webrtc/modules/desktop_capture/mac/window_list_utils.h" #include "webrtc/system_wrappers/include/logging.h" @@ -26,56 +25,6 @@ namespace { const int64_t kUpdateIntervalMs = 500; -// Returns true if the window is minimized. -bool IsWindowMinimized(CGWindowID id) { - CFArrayRef window_id_array = - CFArrayCreate(NULL, reinterpret_cast(&id), 1, NULL); - CFArrayRef window_array = - CGWindowListCreateDescriptionFromArray(window_id_array); - bool minimized = false; - - if (window_array && CFArrayGetCount(window_array)) { - CFDictionaryRef window = reinterpret_cast( - CFArrayGetValueAtIndex(window_array, 0)); - CFBooleanRef on_screen = reinterpret_cast( - CFDictionaryGetValue(window, kCGWindowIsOnscreen)); - - minimized = !on_screen; - } - - CFRelease(window_id_array); - CFRelease(window_array); - - return minimized; -} - -// Returns true if the window is occupying a full screen. -bool IsWindowFullScreen(const MacDesktopConfiguration& desktop_config, - CFDictionaryRef window) { - bool fullscreen = false; - - CFDictionaryRef bounds_ref = reinterpret_cast( - CFDictionaryGetValue(window, kCGWindowBounds)); - - CGRect bounds; - if (bounds_ref && - CGRectMakeWithDictionaryRepresentation(bounds_ref, &bounds)) { - for (MacDisplayConfigurations::const_iterator it = - desktop_config.displays.begin(); - it != desktop_config.displays.end(); ++it) { - if (it->bounds.equals(DesktopRect::MakeXYWH(bounds.origin.x, - bounds.origin.y, - bounds.size.width, - bounds.size.height))) { - fullscreen = true; - break; - } - } - } - - return fullscreen; -} - std::string GetWindowTitle(CGWindowID id) { CFArrayRef window_id_array = CFArrayCreate(NULL, reinterpret_cast(&id), 1, NULL); diff --git a/webrtc/modules/desktop_capture/mac/window_list_utils.cc b/webrtc/modules/desktop_capture/mac/window_list_utils.cc index 0c3eaa3abd..0261c45a69 100644 --- a/webrtc/modules/desktop_capture/mac/window_list_utils.cc +++ b/webrtc/modules/desktop_capture/mac/window_list_utils.cc @@ -59,4 +59,56 @@ bool GetWindowList(WindowCapturer::WindowList* windows) { return true; } +// Returns true if the window is occupying a full screen. +bool IsWindowFullScreen( + const MacDesktopConfiguration& desktop_config, + CFDictionaryRef window) { + bool fullscreen = false; + CFDictionaryRef bounds_ref = reinterpret_cast( + CFDictionaryGetValue(window, kCGWindowBounds)); + + CGRect bounds; + if (bounds_ref && + CGRectMakeWithDictionaryRepresentation(bounds_ref, &bounds)) { + for (MacDisplayConfigurations::const_iterator it = + desktop_config.displays.begin(); + it != desktop_config.displays.end(); ++it) { + if (it->bounds.equals(DesktopRect::MakeXYWH(bounds.origin.x, + bounds.origin.y, + bounds.size.width, + bounds.size.height))) { + fullscreen = true; + break; + } + } + } + + return fullscreen; +} + +// Returns true if the window is minimized. +bool IsWindowMinimized(CGWindowID id) { + CFArrayRef window_id_array = + CFArrayCreate(NULL, reinterpret_cast(&id), 1, NULL); + CFArrayRef window_array = + CGWindowListCreateDescriptionFromArray(window_id_array); + bool minimized = false; + + if (window_array && CFArrayGetCount(window_array)) { + CFDictionaryRef window = reinterpret_cast( + CFArrayGetValueAtIndex(window_array, 0)); + CFBooleanRef on_screen = reinterpret_cast( + CFDictionaryGetValue(window, kCGWindowIsOnscreen)); + + minimized = !on_screen; + } + + CFRelease(window_id_array); + CFRelease(window_array); + + return minimized; +} + + + } // namespace webrtc diff --git a/webrtc/modules/desktop_capture/mac/window_list_utils.h b/webrtc/modules/desktop_capture/mac/window_list_utils.h index 7be38506bb..d56166fe75 100644 --- a/webrtc/modules/desktop_capture/mac/window_list_utils.h +++ b/webrtc/modules/desktop_capture/mac/window_list_utils.h @@ -11,6 +11,9 @@ #ifndef WEBRTC_MODULES_DESKTOP_CAPTURE_WINDOW_LIST_UTILS_H_ #define WEBRTC_MODULES_DESKTOP_CAPTURE_WINDOW_LIST_UTILS_H_ +#include + +#include "webrtc/modules/desktop_capture/mac/desktop_configuration.h" #include "webrtc/modules/desktop_capture/window_capturer.h" namespace webrtc { @@ -18,6 +21,14 @@ namespace webrtc { // A helper function to get the on-screen windows. bool GetWindowList(WindowCapturer::WindowList* windows); +// Returns true if the window is occupying a full screen. +bool IsWindowFullScreen(const MacDesktopConfiguration& desktop_config, + CFDictionaryRef window); + +// Returns true if the window is minimized. +bool IsWindowMinimized(CGWindowID id); + + } // namespace webrtc #endif // WEBRTC_MODULES_DESKTOP_CAPTURE_WINDOW_LIST_UTILS_H_ diff --git a/webrtc/modules/desktop_capture/window_capturer_mac.mm b/webrtc/modules/desktop_capture/window_capturer_mac.mm index 806fc5c1d4..22061edbe7 100644 --- a/webrtc/modules/desktop_capture/window_capturer_mac.mm +++ b/webrtc/modules/desktop_capture/window_capturer_mac.mm @@ -82,11 +82,12 @@ WindowCapturerMac::~WindowCapturerMac() { bool WindowCapturerMac::GetWindowList(WindowList* windows) { // Only get on screen, non-desktop windows. CFArrayRef window_array = CGWindowListCopyWindowInfo( - kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, + kCGWindowListExcludeDesktopElements, kCGNullWindowID); if (!window_array) return false; - + MacDesktopConfiguration desktop_config = MacDesktopConfiguration::GetCurrent( + MacDesktopConfiguration::TopLeftOrigin); // Check windows to make sure they have an id, title, and use window layer // other than 0. CFIndex count = CFArrayGetCount(window_array); @@ -108,6 +109,11 @@ bool WindowCapturerMac::GetWindowList(WindowList* windows) { int id; CFNumberGetValue(window_id, kCFNumberIntType, &id); + + // Skip windows that are minimized and not full screen. + if (IsWindowMinimized(id) && + !IsWindowFullScreen(desktop_config, window)) { continue;} + WindowCapturer::Window window; window.id = id; if (!rtc::ToUtf8(window_title, &(window.title)) ||