From 239cad00e4c6df756dda8fcbea55d825d708571c Mon Sep 17 00:00:00 2001 From: David Bieber Date: Sun, 5 Apr 2020 11:32:51 -0400 Subject: [PATCH 1/4] mac-capture: Use window id to identify windows on MacOS Use a window's window id in init_window in the mac window capture plugin. --- plugins/mac-capture/window-utils.m | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/mac-capture/window-utils.m b/plugins/mac-capture/window-utils.m index 0380df656..eed65d67b 100644 --- a/plugins/mac-capture/window-utils.m +++ b/plugins/mac-capture/window-utils.m @@ -76,6 +76,7 @@ void init_window(cocoa_window_t cw, obs_data_t *settings) cw->owner_name = @(obs_data_get_string(settings, "owner_name")); cw->window_name = @(obs_data_get_string(settings, "window_name")); + cw->window_id = obs_data_get_int(settings, "window"); [cw->owner_name retain]; [cw->window_name retain]; find_window(cw, settings, true); From ebbe856d83e5e96870a29c55686a5006d5c71113 Mon Sep 17 00:00:00 2001 From: David Bieber Date: Sun, 5 Apr 2020 22:10:36 -0400 Subject: [PATCH 2/4] mac-capture: Only find window by window id when owner name and pid match --- plugins/mac-capture/window-utils.h | 1 + plugins/mac-capture/window-utils.m | 39 ++++++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/plugins/mac-capture/window-utils.h b/plugins/mac-capture/window-utils.h index da0743acb..b62696aee 100644 --- a/plugins/mac-capture/window-utils.h +++ b/plugins/mac-capture/window-utils.h @@ -6,6 +6,7 @@ struct cocoa_window { CGWindowID window_id; + NSNumber *owner_pid; pthread_mutex_t name_lock; NSString *owner_name; diff --git a/plugins/mac-capture/window-utils.m b/plugins/mac-capture/window-utils.m index eed65d67b..88d3916ed 100644 --- a/plugins/mac-capture/window-utils.m +++ b/plugins/mac-capture/window-utils.m @@ -60,8 +60,10 @@ bool find_window(cocoa_window_t cw, obs_data_t *settings, bool force) NSNumber *window_id = (NSNumber *)dict[WINDOW_NUMBER]; cw->window_id = window_id.intValue; + cw->owner_pid = (NSNumber *)dict[OWNER_PID]; obs_data_set_int(settings, "window", cw->window_id); + obs_data_set_int(settings, "owner_pid", cw->owner_pid.intValue); return true; } @@ -76,10 +78,43 @@ void init_window(cocoa_window_t cw, obs_data_t *settings) cw->owner_name = @(obs_data_get_string(settings, "owner_name")); cw->window_name = @(obs_data_get_string(settings, "window_name")); - cw->window_id = obs_data_get_int(settings, "window"); [cw->owner_name retain]; [cw->window_name retain]; - find_window(cw, settings, true); + + // Find initial window. + pthread_mutex_lock(&cw->name_lock); + + if (!cw->window_name.length && !cw->owner_name.length) + goto invalid_name; + + NSNumber *owner_pid = @(obs_data_get_int(settings, "owner_pid")); + NSNumber *window_id = @(obs_data_get_int(settings, "window")); + for (NSDictionary *dict in enumerate_windows()) { + bool owner_names_match = + [cw->owner_name isEqualToString:dict[OWNER_NAME]]; + bool ids_match = + [owner_pid isEqualToNumber:dict[OWNER_PID]] && + [window_id isEqualToNumber:dict[WINDOW_NUMBER]]; + bool window_names_match = + [cw->window_name isEqualToString:dict[WINDOW_NAME]]; + + if (owner_names_match && (ids_match || window_names_match)) { + pthread_mutex_unlock(&cw->name_lock); + + NSNumber *window_id = (NSNumber *)dict[WINDOW_NUMBER]; + cw->window_id = window_id.intValue; + cw->owner_pid = (NSNumber *)dict[OWNER_PID]; + + obs_data_set_int(settings, "window", cw->window_id); + obs_data_set_int(settings, "owner_pid", + cw->owner_pid.intValue); + return; + } + } + +invalid_name: + pthread_mutex_unlock(&cw->name_lock); + return; } void destroy_window(cocoa_window_t cw) From 4718e5ecf5357a996ba9f11719c9c65db105deaa Mon Sep 17 00:00:00 2001 From: David Bieber Date: Tue, 7 Apr 2020 13:26:46 -0400 Subject: [PATCH 3/4] mac-capture: Use int in place of NSNumber for owner_pid --- plugins/mac-capture/window-utils.h | 2 +- plugins/mac-capture/window-utils.m | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/plugins/mac-capture/window-utils.h b/plugins/mac-capture/window-utils.h index b62696aee..588e9eda3 100644 --- a/plugins/mac-capture/window-utils.h +++ b/plugins/mac-capture/window-utils.h @@ -6,7 +6,7 @@ struct cocoa_window { CGWindowID window_id; - NSNumber *owner_pid; + int owner_pid; pthread_mutex_t name_lock; NSString *owner_name; diff --git a/plugins/mac-capture/window-utils.m b/plugins/mac-capture/window-utils.m index 88d3916ed..56491ac98 100644 --- a/plugins/mac-capture/window-utils.m +++ b/plugins/mac-capture/window-utils.m @@ -60,10 +60,11 @@ bool find_window(cocoa_window_t cw, obs_data_t *settings, bool force) NSNumber *window_id = (NSNumber *)dict[WINDOW_NUMBER]; cw->window_id = window_id.intValue; - cw->owner_pid = (NSNumber *)dict[OWNER_PID]; + NSNumber *owner_pid = (NSNumber *)dict[OWNER_PID]; + cw->owner_pid = owner_pid.intValue; obs_data_set_int(settings, "window", cw->window_id); - obs_data_set_int(settings, "owner_pid", cw->owner_pid.intValue); + obs_data_set_int(settings, "owner_pid", cw->owner_pid); return true; } @@ -103,11 +104,11 @@ void init_window(cocoa_window_t cw, obs_data_t *settings) NSNumber *window_id = (NSNumber *)dict[WINDOW_NUMBER]; cw->window_id = window_id.intValue; - cw->owner_pid = (NSNumber *)dict[OWNER_PID]; + NSNumber *owner_pid = (NSNumber *)dict[OWNER_PID]; + cw->owner_pid = owner_pid.intValue; obs_data_set_int(settings, "window", cw->window_id); - obs_data_set_int(settings, "owner_pid", - cw->owner_pid.intValue); + obs_data_set_int(settings, "owner_pid", cw->owner_pid); return; } } From 46979536a1a0579ec646237cab0494653c88996c Mon Sep 17 00:00:00 2001 From: David Bieber Date: Tue, 7 Apr 2020 13:30:53 -0400 Subject: [PATCH 4/4] mac-capture: update owner_pid in `update_window` --- plugins/mac-capture/window-utils.m | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/mac-capture/window-utils.m b/plugins/mac-capture/window-utils.m index 56491ac98..aa2a390f8 100644 --- a/plugins/mac-capture/window-utils.m +++ b/plugins/mac-capture/window-utils.m @@ -136,6 +136,7 @@ void update_window(cocoa_window_t cw, obs_data_t *settings) [cw->window_name retain]; pthread_mutex_unlock(&cw->name_lock); + cw->owner_pid = obs_data_get_int(settings, "owner_pid"); cw->window_id = obs_data_get_int(settings, "window"); }