Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
140 changes: 123 additions & 17 deletions src/bar_manager.c
Original file line number Diff line number Diff line change
@@ -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"
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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 );
Expand Down
4 changes: 4 additions & 0 deletions src/bar_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
4 changes: 4 additions & 0 deletions src/custom_events.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
4 changes: 4 additions & 0 deletions src/misc/defines.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down