Skip to content

Commit

Permalink
#81 properly destroy view when space changes layout
Browse files Browse the repository at this point in the history
  • Loading branch information
koekeishiya committed Jun 30, 2019
1 parent 429fdd7 commit 8d45921
Show file tree
Hide file tree
Showing 9 changed files with 72 additions and 23 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
### Changed
- Prevent *status_bar* and *window borders* from displaying in native fullscreen spaces [#71](https://github.com/koekeishiya/yabai/issues/71)
- Fixed an issue with the *status_bar* where *has_battery* and *charging* would not be default initialized when macOS report that there are zero power sources [#60](https://github.com/koekeishiya/yabai/issues/60)
- Properly destroy the underlaying *view* when a *space* changes layout [#81](https://github.com/koekeishiya/yabai/issues/81)

## [1.0.2] - 2019-06-25
### Changed
Expand Down
12 changes: 8 additions & 4 deletions src/event.c
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,8 @@ static EVENT_CALLBACK(EVENT_HANDLER_APPLICATION_TERMINATED)
struct view *view = window_manager_find_managed_window(&g_window_manager, window);
if (view) {
space_manager_untile_window(&g_space_manager, view, window);
window_manager_remove_managed_window(&g_window_manager, window);
window_manager_remove_managed_window(&g_window_manager, window->id);
window_manager_purify_window(&g_window_manager, window);
}

if (g_mouse_state.window == window) g_mouse_state.window = NULL;
Expand Down Expand Up @@ -398,7 +399,8 @@ static EVENT_CALLBACK(EVENT_HANDLER_APPLICATION_HIDDEN)
struct view *view = window_manager_find_managed_window(&g_window_manager, window);
if (view) {
space_manager_untile_window(&g_space_manager, view, window);
window_manager_remove_managed_window(&g_window_manager, window);
window_manager_remove_managed_window(&g_window_manager, window->id);
window_manager_purify_window(&g_window_manager, window);
}
}

Expand Down Expand Up @@ -481,7 +483,8 @@ static EVENT_CALLBACK(EVENT_HANDLER_WINDOW_DESTROYED)
struct view *view = window_manager_find_managed_window(&g_window_manager, window);
if (view) {
space_manager_untile_window(&g_space_manager, view, window);
window_manager_remove_managed_window(&g_window_manager, window);
window_manager_remove_managed_window(&g_window_manager, window->id);
window_manager_purify_window(&g_window_manager, window);
}

return EVENT_SUCCESS;
Expand Down Expand Up @@ -612,7 +615,8 @@ static EVENT_CALLBACK(EVENT_HANDLER_WINDOW_MINIMIZED)
struct view *view = window_manager_find_managed_window(&g_window_manager, window);
if (view) {
space_manager_untile_window(&g_space_manager, view, window);
window_manager_remove_managed_window(&g_window_manager, window);
window_manager_remove_managed_window(&g_window_manager, window->id);
window_manager_purify_window(&g_window_manager, window);
}

return EVENT_SUCCESS;
Expand Down
2 changes: 1 addition & 1 deletion src/event_loop.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ void event_loop_post(struct event_loop *event_loop, struct event *event)
sem_post(event_loop->semaphore);
} else if (event->status) {
*event->status = EVENT_IGNORED;
free(event);
event_destroy(event);
}
}

Expand Down
13 changes: 11 additions & 2 deletions src/space_manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,12 @@ void space_manager_set_layout_for_space(struct space_manager *sm, uint64_t sid,
{
struct view *view = space_manager_find_view(sm, sid);
view->layout = layout;
if (view->layout == VIEW_BSP) window_manager_check_for_windows_on_space(sm, &g_window_manager, sid);

if (view->layout == VIEW_BSP) {
window_manager_check_for_windows_on_space(sm, &g_window_manager, sid);
} else if (view->layout == VIEW_FLOAT) {
view_clear(view);
}
}

void space_manager_set_gap_for_space(struct space_manager *sm, uint64_t sid, int type, int gap)
Expand Down Expand Up @@ -200,7 +205,11 @@ void space_manager_set_layout_for_all_spaces(struct space_manager *sm, enum view
struct view *view = bucket->value;
if (!view->custom_layout) {
view->layout = layout;
if (view->layout == VIEW_BSP) window_manager_check_for_windows_on_space(sm, &g_window_manager, view->sid);
if (view->layout == VIEW_BSP) {
window_manager_check_for_windows_on_space(sm, &g_window_manager, view->sid);
} else if (view->layout == VIEW_FLOAT) {
view_clear(view);
}
}
}
bucket = bucket->next;
Expand Down
24 changes: 24 additions & 0 deletions src/view.c
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,15 @@ static void window_node_update(struct view *view, struct window_node *node)
}
}

static void window_node_destroy(struct window_node *node)
{
if (node->left) window_node_destroy(node->left);
if (node->right) window_node_destroy(node->right);

if (node->window_id) window_manager_remove_managed_window(&g_window_manager, node->window_id);
free(node);
}

float window_node_border_window_offset(struct ax_window *window)
{
float offset = window->border.enabled ? window->border.width : 0.0f;
Expand Down Expand Up @@ -494,3 +503,18 @@ struct view *view_create(uint64_t sid)

return view;
}

void view_clear(struct view *view)
{
if (view->root) {
if (view->root->left) {
window_node_destroy(view->root->left);
view->root->left = NULL;
}

if (view->root->right) {
window_node_destroy(view->root->right);
view->root->right = NULL;
}
}
}
1 change: 1 addition & 0 deletions src/view.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,5 +105,6 @@ bool view_is_dirty(struct view *view);
void view_flush(struct view *view);
void view_update(struct view *view);
struct view *view_create(uint64_t sid);
void view_clear(struct view *view);

#endif
11 changes: 7 additions & 4 deletions src/window.c
Original file line number Diff line number Diff line change
Expand Up @@ -176,15 +176,18 @@ char *window_title(struct ax_window *window)
CGRect window_ax_frame(struct ax_window *window)
{
CGRect frame = {};
CFTypeRef position_ref = NULL;
CFTypeRef size_ref = NULL;

CFTypeRef position_ref;
if (AXUIElementCopyAttributeValue(window->ref, kAXPositionAttribute, &position_ref) == kAXErrorSuccess) {
AXUIElementCopyAttributeValue(window->ref, kAXPositionAttribute, &position_ref);
AXUIElementCopyAttributeValue(window->ref, kAXSizeAttribute, &size_ref);

if (position_ref != NULL) {
AXValueGetValue(position_ref, kAXValueTypeCGPoint, &frame.origin);
CFRelease(position_ref);
}

CFTypeRef size_ref;
if (AXUIElementCopyAttributeValue(window->ref, kAXSizeAttribute, &size_ref) == kAXErrorSuccess) {
if (size_ref != NULL) {
AXValueGetValue(size_ref, kAXValueTypeCGSize, &frame.size);
CFRelease(size_ref);
}
Expand Down
29 changes: 18 additions & 11 deletions src/window_manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -224,10 +224,9 @@ struct view *window_manager_find_managed_window(struct window_manager *wm, struc
return table_find(&wm->managed_window, &window->id);
}

void window_manager_remove_managed_window(struct window_manager *wm, struct ax_window *window)
void window_manager_remove_managed_window(struct window_manager *wm, uint32_t wid)
{
table_remove(&wm->managed_window, &window->id);
window_manager_purify_window(wm, window);
table_remove(&wm->managed_window, &wid);
}

void window_manager_add_managed_window(struct window_manager *wm, struct ax_window *window, struct view *view)
Expand Down Expand Up @@ -999,7 +998,8 @@ void window_manager_send_window_to_display(struct space_manager *sm, struct wind
struct view *view = window_manager_find_managed_window(wm, window);
if (view) {
space_manager_untile_window(sm, view, window);
window_manager_remove_managed_window(wm, window);
window_manager_remove_managed_window(wm, window->id);
window_manager_purify_window(wm, window);
}

assert(space_is_visible(dst_sid));
Expand Down Expand Up @@ -1027,7 +1027,8 @@ void window_manager_send_window_to_space(struct space_manager *sm, struct window
struct view *view = window_manager_find_managed_window(wm, window);
if (view) {
space_manager_untile_window(sm, view, window);
window_manager_remove_managed_window(wm, window);
window_manager_remove_managed_window(wm, window->id);
window_manager_purify_window(wm, window);
}

space_manager_move_window_to_space(dst_sid, window);
Expand Down Expand Up @@ -1128,7 +1129,8 @@ void window_manager_toggle_window_float(struct space_manager *sm, struct window_
struct view *view = window_manager_find_managed_window(wm, window);
if (view) {
space_manager_untile_window(sm, view, window);
window_manager_remove_managed_window(wm, window);
window_manager_remove_managed_window(wm, window->id);
window_manager_purify_window(wm, window);
}
window_manager_make_children_floating(wm, window, true);
window_manager_make_floating(wm, window->id, true);
Expand All @@ -1148,7 +1150,8 @@ void window_manager_toggle_window_sticky(struct space_manager *sm, struct window
struct view *view = window_manager_find_managed_window(wm, window);
if (view) {
space_manager_untile_window(sm, view, window);
window_manager_remove_managed_window(wm, window);
window_manager_remove_managed_window(wm, window->id);
window_manager_purify_window(wm, window);
}
window_manager_make_sticky(window->id, true);
}
Expand All @@ -1164,7 +1167,8 @@ void window_manager_toggle_window_native_fullscreen(struct space_manager *sm, st
struct view *view = window_manager_find_managed_window(wm, window);
if (view) {
space_manager_untile_window(sm, view, window);
window_manager_remove_managed_window(wm, window);
window_manager_remove_managed_window(wm, window->id);
window_manager_purify_window(wm, window);
}
AXUIElementSetAttributeValue(window->ref, kAXFullscreenAttribute, kCFBooleanTrue);
}
Expand Down Expand Up @@ -1247,7 +1251,8 @@ void window_manager_validate_windows_on_space(struct space_manager *sm, struct w
if (!window) continue;

space_manager_untile_window(sm, view, window);
window_manager_remove_managed_window(wm, window);
window_manager_remove_managed_window(wm, window->id);
window_manager_purify_window(wm, window);
}
}

Expand All @@ -1269,7 +1274,8 @@ void window_manager_check_for_windows_on_space(struct space_manager *sm, struct
struct view *existing_view = window_manager_find_managed_window(wm, window);
if (existing_view && existing_view->sid != sid) {
space_manager_untile_window(sm, existing_view, window);
window_manager_remove_managed_window(wm, window);
window_manager_remove_managed_window(wm, window->id);
window_manager_purify_window(wm, window);
}

if (!existing_view || existing_view->sid != sid) {
Expand Down Expand Up @@ -1298,7 +1304,8 @@ void window_manager_handle_display_add_and_remove(struct space_manager *sm, stru
struct view *existing_view = window_manager_find_managed_window(wm, window);
if (existing_view && existing_view->layout == VIEW_BSP && existing_view->sid != space_list[0]) {
space_manager_untile_window(sm, existing_view, window);
window_manager_remove_managed_window(wm, window);
window_manager_remove_managed_window(wm, window->id);
window_manager_purify_window(wm, window);
}

if (!existing_view || (existing_view->layout == VIEW_BSP && existing_view->sid != space_list[0])) {
Expand Down
2 changes: 1 addition & 1 deletion src/window_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ void window_manager_focus_window_with_raise(uint32_t window_id);
struct ax_window *window_manager_focused_window(struct window_manager *wm);
struct ax_application *window_manager_focused_application(struct window_manager *wm);
struct view *window_manager_find_managed_window(struct window_manager *wm, struct ax_window *window);
void window_manager_remove_managed_window(struct window_manager *wm, struct ax_window *window);
void window_manager_remove_managed_window(struct window_manager *wm, uint32_t wid);
void window_manager_add_managed_window(struct window_manager *wm, struct ax_window *window, struct view *view);
bool window_manager_find_lost_front_switched_event(struct window_manager *wm, pid_t pid);
void window_manager_remove_lost_front_switched_event(struct window_manager *wm, pid_t pid);
Expand Down

0 comments on commit 8d45921

Please sign in to comment.