disable alias capture during system animations (#341)

This commit is contained in:
Felix Kratz 2023-03-16 22:09:22 +01:00
parent db9fc50a68
commit 2f01d41d4d
7 changed files with 61 additions and 27 deletions

1
.gitignore vendored
View file

@ -1,3 +1,4 @@
test
bin bin
todo.md todo.md
notifications.md notifications.md

View file

@ -86,23 +86,6 @@ void alias_init(struct alias* alias) {
image_init(&alias->image); image_init(&alias->image);
} }
void alias_setup(struct alias* alias, char* owner, char* name) {
alias->name = name;
alias->owner = owner;
alias_get_permission(alias);
alias_update_image(alias);
}
uint32_t alias_get_length(struct alias* alias) {
if (alias->image.image_ref) return alias->image.bounds.size.width;
return 0;
}
uint32_t alias_get_height(struct alias* alias) {
if (alias->image.image_ref) return alias->image.bounds.size.height;
return 0;
}
static void alias_find_window(struct alias* alias) { static void alias_find_window(struct alias* alias) {
CFArrayRef window_list = CGWindowListCopyWindowInfo(kCGWindowListOptionAll, CFArrayRef window_list = CGWindowListCopyWindowInfo(kCGWindowListOptionAll,
kCGNullWindowID ); kCGNullWindowID );
@ -171,7 +154,7 @@ static void alias_find_window(struct alias* alias) {
CFRelease(window_list); CFRelease(window_list);
} }
bool alias_update_image(struct alias* alias) { static bool alias_update_image(struct alias* alias, bool forced) {
if (alias->window.id == 0) alias_find_window(alias); if (alias->window.id == 0) alias_find_window(alias);
if (alias->window.id == 0) return false; if (alias->window.id == 0) return false;
@ -182,16 +165,36 @@ bool alias_update_image(struct alias* alias) {
return false; return false;
} }
return image_set_image(&alias->image, image_ref, alias->window.frame, false); return image_set_image(&alias->image,
image_ref,
alias->window.frame,
forced );
} }
bool alias_update(struct alias* alias) { void alias_setup(struct alias* alias, char* owner, char* name) {
alias->name = name;
alias->owner = owner;
alias_get_permission(alias);
alias_update_image(alias, true);
}
uint32_t alias_get_length(struct alias* alias) {
if (alias->image.image_ref) return alias->image.bounds.size.width;
return 0;
}
uint32_t alias_get_height(struct alias* alias) {
if (alias->image.image_ref) return alias->image.bounds.size.height;
return 0;
}
bool alias_update(struct alias* alias, bool forced) {
if (alias->update_frequency == 0) return false; if (alias->update_frequency == 0) return false;
alias->counter++; alias->counter++;
if (alias->counter >= alias->update_frequency) { if (forced || alias->counter >= alias->update_frequency) {
alias->counter = 0; alias->counter = 0;
if (alias_update_image(alias)) { if (alias_update_image(alias, forced)) {
return true; return true;
} }
} }

View file

@ -25,13 +25,12 @@ struct alias {
void alias_init(struct alias* alias); void alias_init(struct alias* alias);
void alias_setup(struct alias* alias, char* owner, char* name); void alias_setup(struct alias* alias, char* owner, char* name);
bool alias_update_image(struct alias* alias);
uint32_t alias_get_length(struct alias* alias); uint32_t alias_get_length(struct alias* alias);
uint32_t alias_get_height(struct alias* alias); uint32_t alias_get_height(struct alias* alias);
void alias_calculate_bounds(struct alias* alias, uint32_t x, uint32_t y); void alias_calculate_bounds(struct alias* alias, uint32_t x, uint32_t y);
void alias_draw(struct alias* alias, CGContextRef context); void alias_draw(struct alias* alias, CGContextRef context);
bool alias_update(struct alias* alias); bool alias_update(struct alias* alias, bool forced);
void alias_destroy(struct alias* alias); void alias_destroy(struct alias* alias);
void print_all_menu_items(FILE* rsp); void print_all_menu_items(FILE* rsp);

View file

@ -440,7 +440,7 @@ void bar_manager_update_alias_components(struct bar_manager* bar_manager, bool f
continue; continue;
} }
bar_item_update(bar_manager->bar_items[i], NULL, forced, NULL); alias_update(&bar_manager->bar_items[i]->alias, forced);
} }
} }
@ -520,7 +520,7 @@ void bar_manager_update(struct bar_manager* bar_manager, bool forced) {
if (bar_item->has_alias if (bar_item->has_alias
&& bar_item_is_shown(bar_item) && bar_item_is_shown(bar_item)
&& alias_update(&bar_item->alias)) { && alias_update(&bar_item->alias, false)) {
bar_item_needs_update(bar_item); bar_item_needs_update(bar_item);
needs_refresh = true; needs_refresh = true;
} }

View file

@ -116,7 +116,8 @@ void image_copy(struct image* image, CGImageRef source) {
bool image_set_image(struct image* image, CGImageRef new_image_ref, CGRect bounds, bool forced) { bool image_set_image(struct image* image, CGImageRef new_image_ref, CGRect bounds, bool forced) {
CFDataRef new_data_ref = CGDataProviderCopyData(CGImageGetDataProvider(new_image_ref)); CFDataRef new_data_ref = CGDataProviderCopyData(CGImageGetDataProvider(new_image_ref));
if (!forced && image_data_equals(image, new_data_ref)) { if (!forced && image_data_equals(image, new_data_ref)
&& CGSizeEqualToSize(image->size, bounds.size) ) {
CFRelease(new_data_ref); CFRelease(new_data_ref);
CGImageRelease(new_image_ref); CGImageRelease(new_image_ref);
return false; return false;

View file

@ -41,6 +41,7 @@ char g_config_file[4096];
char g_lock_file[MAXLEN]; char g_lock_file[MAXLEN];
bool g_volume_events; bool g_volume_events;
bool g_brightness_events; bool g_brightness_events;
int64_t g_disable_capture = 0;
static int client_send_message(int argc, char **argv) { static int client_send_message(int argc, char **argv) {
if (argc <= 1) { if (argc <= 1) {
@ -198,6 +199,17 @@ static void parse_arguments(int argc, char **argv) {
exit(client_send_message(argc, argv)); exit(client_send_message(argc, argv));
} }
void system_events(uint32_t event, void* data, size_t data_length, void* context) {
if (event == 1322) {
g_disable_capture = clock_gettime_nsec_np(CLOCK_MONOTONIC_RAW_APPROX);
} else if (event == 905) {
g_disable_capture = -1;
} else {
g_disable_capture = 0;
}
}
extern CGError SLSRegisterNotifyProc(void* callback, uint32_t event, void* context);
int main(int argc, char **argv) { int main(int argc, char **argv) {
if (argc > 1) parse_arguments(argc, argv); if (argc > 1) parse_arguments(argc, argv);
@ -209,6 +221,12 @@ int main(int argc, char **argv) {
if (!event_loop_init(&g_event_loop)) if (!event_loop_init(&g_event_loop))
error("sketchybar: could not initialize event_loop! abort..\n"); error("sketchybar: could not initialize event_loop! abort..\n");
SLSRegisterNotifyProc((void*)system_events, 904, NULL);
SLSRegisterNotifyProc((void*)system_events, 905, NULL);
SLSRegisterNotifyProc((void*)system_events, 1401, NULL);
SLSRegisterNotifyProc((void*)system_events, 1508, NULL);
SLSRegisterNotifyProc((void*)system_events, 1322, NULL);
workspace_event_handler_init(&g_workspace_context); workspace_event_handler_init(&g_workspace_context);
bar_manager_init(&g_bar_manager); bar_manager_init(&g_bar_manager);

View file

@ -241,7 +241,19 @@ void window_disable_shadow(struct window* window) {
CFRelease(shadow_props_cf); CFRelease(shadow_props_cf);
} }
extern int64_t g_disable_capture;
CGImageRef window_capture(struct window* window) { CGImageRef window_capture(struct window* window) {
if (g_disable_capture) {
int64_t time = clock_gettime_nsec_np(CLOCK_MONOTONIC_RAW_APPROX);
if (g_disable_capture < 0) {
return NULL;
}
else if (time - g_disable_capture > (int64_t)2e9) {
g_disable_capture = 0;
} else {
return NULL;
}
}
CGImageRef image_ref = NULL; CGImageRef image_ref = NULL;
uint64_t wid = window->id; uint64_t wid = window->id;