mirror of
https://github.com/FelixKratz/SketchyBar
synced 2024-11-22 03:13:02 +00:00
disable alias capture during system animations (#341)
This commit is contained in:
parent
db9fc50a68
commit
2f01d41d4d
7 changed files with 61 additions and 27 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,3 +1,4 @@
|
||||||
|
test
|
||||||
bin
|
bin
|
||||||
todo.md
|
todo.md
|
||||||
notifications.md
|
notifications.md
|
||||||
|
|
47
src/alias.c
47
src/alias.c
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
12
src/window.c
12
src/window.c
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue