diff --git a/src/bar_manager.c b/src/bar_manager.c index df02067..f7cf21f 100644 --- a/src/bar_manager.c +++ b/src/bar_manager.c @@ -1,7 +1,9 @@ #include "bar_manager.h" #include "bar.h" #include "bar_item.h" +#include "custom_events.h" #include "event.h" +#include "misc/defines.h" #include "misc/env_vars.h" #include "misc/helpers.h" #include "wifi.h" @@ -717,7 +719,6 @@ struct popup* bar_manager_get_popup_by_point(struct bar_manager* bar_manager, CG if (CGRectContainsPoint(frame, point)) return &bar_item->popup; } return NULL; - } struct bar* bar_manager_get_bar_by_point(struct bar_manager* bar_manager, CGPoint point) { @@ -754,33 +755,50 @@ void bar_manager_custom_events_trigger(struct bar_manager* bar_manager, char* na } } +void bar_manager_handle_display_event(struct bar_manager* bar_manager, + uint32_t did, + void (*display_event_handler)(struct bar_manager*)) { + bar_manager->active_adid = display_active_display_adid(); + + bar_manager_freeze(bar_manager); + bar_manager_reset(bar_manager); + bar_manager_unfreeze(bar_manager); + bar_manager_refresh(bar_manager, true, false); + + display_event_handler(bar_manager); + + bar_manager_handle_space_change(bar_manager, true); + animator_renew_display_link(&bar_manager->animator); +} + void bar_manager_display_resized(struct bar_manager* bar_manager, uint32_t did) { - bar_manager_display_changed(bar_manager); + bar_manager_handle_display_event(bar_manager, + did, + bar_manager_handle_display_resized); } void bar_manager_display_moved(struct bar_manager* bar_manager, uint32_t did) { - bar_manager_display_changed(bar_manager); + bar_manager_handle_display_event(bar_manager, + did, + bar_manager_handle_display_moved); } void bar_manager_display_removed(struct bar_manager* bar_manager, uint32_t did) { - bar_manager_display_changed(bar_manager); + bar_manager_handle_display_event(bar_manager, + did, + bar_manager_handle_display_removed); } -void bar_manager_display_added(struct bar_manager* bar_manager, uint32_t did) { - bar_manager_display_changed(bar_manager); +void bar_manager_display_added(struct bar_manager *bar_manager, uint32_t did) { + bar_manager_handle_display_event(bar_manager, + did, + bar_manager_handle_display_added); } void bar_manager_display_changed(struct bar_manager* bar_manager) { - bar_manager->active_adid = display_active_display_adid(); - - bar_manager_freeze(bar_manager); - bar_manager_reset(bar_manager); - bar_manager_unfreeze(bar_manager); - bar_manager_refresh(bar_manager, true, false); - - bar_manager_handle_display_change(bar_manager); - bar_manager_handle_space_change(bar_manager, true); - animator_renew_display_link(&bar_manager->animator); + bar_manager_handle_display_event(bar_manager, + 0, + bar_manager_handle_display_change); } void bar_manager_cancel_drag(struct bar_manager* bar_manager) { @@ -1016,7 +1034,95 @@ void bar_manager_handle_display_change(struct bar_manager* bar_manager) { env_vars_destroy(&env_vars); } -void bar_manager_handle_system_will_sleep(struct bar_manager* bar_manager) { +void bar_manager_handle_display_resized(struct bar_manager *bar_manager) { + // TODO + bar_manager->active_adid = display_active_display_adid(); + struct env_vars env_vars; + env_vars_init(&env_vars); + char adid_str[3]; + snprintf(adid_str, 3, "%d", bar_manager->active_adid); + env_vars_set(&env_vars, string_copy("INFO"), string_copy(adid_str)); + + bar_manager_custom_events_trigger( + bar_manager, COMMAND_SUBSCRIBE_DISPLAY_RESIZED, &env_vars); + + bar_manager_refresh(bar_manager, false, false); + env_vars_destroy(&env_vars); +} +void bar_manager_handle_display_moved(struct bar_manager *bar_manager) { + // TODO + bar_manager->active_adid = display_active_display_adid(); + struct env_vars env_vars; + env_vars_init(&env_vars); + char adid_str[3]; + snprintf(adid_str, 3, "%d", bar_manager->active_adid); + env_vars_set(&env_vars, string_copy("INFO"), string_copy(adid_str)); + + bar_manager_custom_events_trigger(bar_manager, + COMMAND_SUBSCRIBE_DISPLAY_MOVED, &env_vars); + + bar_manager_refresh(bar_manager, false, false); + env_vars_destroy(&env_vars); +} +void notify_items_on_removed_display(struct bar_manager *bar_manager, uint32_t removed_display_id, struct env_vars *env_vars) { + for (int i = 0; i < bar_manager->bar_item_count; i++) { + struct bar_item* bar_item = bar_manager->bar_items[i]; + bool item_is_on_removed_display = bar_item->associated_display & ( 1 << removed_display_id); + if(!item_is_on_removed_display) { + continue; + } + bar_item_update(bar_item, COMMAND_SUBSCRIBE_DISPLAY_REMOVED, true, env_vars); + } +} +void bar_manager_handle_display_removed(struct bar_manager *bar_manager) { + uint32_t active_display_count = display_active_display_count(); + + // this would probably be more robust and reliable if we + // cache display UUIDs and diff those instead + bool active_display_removed = + bar_manager->active_displays > active_display_count; + uint32_t removed_display_id = bar_manager->active_displays; + if (active_display_removed) { + printf("[Sketchybar]: removed display ID %d\n", removed_display_id); + } + // TODO + bar_manager->active_adid = display_active_display_adid(); + struct env_vars env_vars; + env_vars_init(&env_vars); + char removed_display_id_str[3]; + snprintf(removed_display_id_str, 3, "%d", removed_display_id); + env_vars_set(&env_vars, string_copy("INFO"), + string_copy(removed_display_id_str)); + + bar_manager_custom_events_trigger( + bar_manager, COMMAND_SUBSCRIBE_DISPLAY_REMOVED, &env_vars); + + notify_items_on_removed_display(bar_manager, removed_display_id, &env_vars); + + bar_manager_refresh(bar_manager, false, false); + env_vars_destroy(&env_vars); +} +void bar_manager_handle_display_added(struct bar_manager *bar_manager) { + // this would probably be more robust and reliable if we + // cache display UUIDs and diff those instead + uint32_t active_display_count = display_active_display_count(); + printf("[Sketchybar]: display added event. active display count %d\n", + active_display_count); + // TODO + bar_manager->active_adid = display_active_display_adid(); + struct env_vars env_vars; + env_vars_init(&env_vars); + char added_display[3]; + snprintf(added_display, 3, "%d", active_display_count); + env_vars_set(&env_vars, string_copy("INFO"), string_copy(added_display)); + + bar_manager_custom_events_trigger(bar_manager, + COMMAND_SUBSCRIBE_DISPLAY_ADDED, &env_vars); + + bar_manager_refresh(bar_manager, false, false); + env_vars_destroy(&env_vars); +} +void bar_manager_handle_system_will_sleep(struct bar_manager *bar_manager) { bar_manager_custom_events_trigger(bar_manager, COMMAND_SUBSCRIBE_SYSTEM_WILL_SLEEP, NULL ); diff --git a/src/bar_manager.h b/src/bar_manager.h index 4a39824..01f50bf 100644 --- a/src/bar_manager.h +++ b/src/bar_manager.h @@ -116,6 +116,10 @@ void bar_manager_handle_mouse_exited(struct bar_manager* bar_manager, struct bar void bar_manager_handle_front_app_switch(struct bar_manager* bar_manager, char* info); void bar_manager_handle_space_change(struct bar_manager* bar_manager, bool forced); void bar_manager_handle_display_change(struct bar_manager* bar_manager); +void bar_manager_handle_display_resized(struct bar_manager* bar_manager); +void bar_manager_handle_display_moved(struct bar_manager* bar_manager); +void bar_manager_handle_display_removed(struct bar_manager* bar_manager); +void bar_manager_handle_display_added(struct bar_manager* bar_manager); void bar_manager_handle_system_woke(struct bar_manager* bar_manager); void bar_manager_handle_system_will_sleep(struct bar_manager* bar_manager); void bar_manager_handle_volume_change(struct bar_manager* bar_manager, float volume); diff --git a/src/custom_events.c b/src/custom_events.c index 77256f7..12dbcd1 100644 --- a/src/custom_events.c +++ b/src/custom_events.c @@ -23,6 +23,10 @@ void custom_events_init(struct custom_events* custom_events) { custom_events_append(custom_events, string_copy(COMMAND_SUBSCRIBE_FRONT_APP_SWITCHED), NULL); custom_events_append(custom_events, string_copy(COMMAND_SUBSCRIBE_SPACE_CHANGE), NULL); custom_events_append(custom_events, string_copy(COMMAND_SUBSCRIBE_DISPLAY_CHANGE), NULL); + custom_events_append(custom_events, string_copy(COMMAND_SUBSCRIBE_DISPLAY_RESIZED), NULL); + custom_events_append(custom_events, string_copy(COMMAND_SUBSCRIBE_DISPLAY_REMOVED), NULL); + custom_events_append(custom_events, string_copy(COMMAND_SUBSCRIBE_DISPLAY_MOVED), NULL); + custom_events_append(custom_events, string_copy(COMMAND_SUBSCRIBE_DISPLAY_ADDED), NULL); custom_events_append(custom_events, string_copy(COMMAND_SUBSCRIBE_SYSTEM_WOKE), NULL); custom_events_append(custom_events, string_copy(COMMAND_SUBSCRIBE_MOUSE_ENTERED), NULL); custom_events_append(custom_events, string_copy(COMMAND_SUBSCRIBE_MOUSE_EXITED), NULL); diff --git a/src/misc/defines.h b/src/misc/defines.h index 655c5ae..f580726 100644 --- a/src/misc/defines.h +++ b/src/misc/defines.h @@ -122,6 +122,10 @@ #define COMMAND_SUBSCRIBE_FRONT_APP_SWITCHED "front_app_switched" #define COMMAND_SUBSCRIBE_SPACE_CHANGE "space_change" #define COMMAND_SUBSCRIBE_DISPLAY_CHANGE "display_change" +#define COMMAND_SUBSCRIBE_DISPLAY_RESIZED "display_resized" +#define COMMAND_SUBSCRIBE_DISPLAY_MOVED "display_moved" +#define COMMAND_SUBSCRIBE_DISPLAY_ADDED "display_added" +#define COMMAND_SUBSCRIBE_DISPLAY_REMOVED "display_removed" #define COMMAND_SUBSCRIBE_SYSTEM_WOKE "system_woke" #define COMMAND_SUBSCRIBE_SYSTEM_WILL_SLEEP "system_will_sleep" #define COMMAND_SUBSCRIBE_VOLUME_CHANGE "volume_change"