Skip to content

Commit

Permalink
#2055 treat windows with non-standard window_level as floating
Browse files Browse the repository at this point in the history
  • Loading branch information
koekeishiya committed Feb 4, 2024
1 parent 1816dd7 commit c396bab
Show file tree
Hide file tree
Showing 8 changed files with 90 additions and 9 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]
### Changed
- All windows that report a non-standard window_level should be treated as floating (permanently), unless otherwise specified through manage=on rules [#2055](https://github.com/koekeishiya/yabai/issues/2055)

## [6.0.7] - 2024-01-25
### Changed
Expand Down
2 changes: 1 addition & 1 deletion src/message.c
Original file line number Diff line number Diff line change
Expand Up @@ -1978,7 +1978,7 @@ static void handle_domain_window(FILE *rsp, struct token domain, char *message)
} else if (token_equals(command, COMMAND_WINDOW_TOGGLE)) {
struct token value = get_token(&message);
if (token_equals(value, ARGUMENT_WINDOW_TOGGLE_FLOAT)) {
window_manager_make_window_floating(&g_space_manager, &g_window_manager, acting_window, !window_check_flag(acting_window, WINDOW_FLOAT));
window_manager_make_window_floating(&g_space_manager, &g_window_manager, acting_window, !window_check_flag(acting_window, WINDOW_FLOAT), false);
} else if (token_equals(value, ARGUMENT_WINDOW_TOGGLE_STICKY)) {
window_manager_make_window_sticky(&g_space_manager, &g_window_manager, acting_window, !window_check_flag(acting_window, WINDOW_STICKY));
} else if (token_equals(value, ARGUMENT_WINDOW_TOGGLE_SHADOW)) {
Expand Down
2 changes: 1 addition & 1 deletion src/space.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ uint32_t space_display_id(uint64_t sid)
uint32_t *space_window_list_for_connection(uint64_t *space_list, int space_count, int cid, int *count, bool include_minimized)
{
uint32_t *window_list = NULL;
uint64_t set_tags = 1;
uint64_t set_tags = 0;
uint64_t clear_tags = 0;
uint32_t options = include_minimized ? 0x7 : 0x2;

Expand Down
13 changes: 13 additions & 0 deletions src/window.c
Original file line number Diff line number Diff line change
Expand Up @@ -518,6 +518,12 @@ bool window_is_standard(struct window *window)
return standard_win;
}

bool window_level_is_standard(struct window *window)
{
int level = window_level(window->id);
return level == g_layer_normal_window_level;
}

bool window_is_unknown(struct window *window)
{
CFStringRef subrole = window_subrole(window);
Expand Down Expand Up @@ -564,3 +570,10 @@ void window_destroy(struct window *window)
CFRelease(window->ref);
free(window);
}

void window_dump_cg_window_levels(void)
{
for (int i = 0; i < CG_WINDOW_LEVEL_KEY_COUNT; ++i) {
printf("CGWindowLevelForKey(%s) -> %d\n", cg_window_level_key_str[i], CGWindowLevelForKey(i));
}
}
54 changes: 54 additions & 0 deletions src/window.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,58 @@ static CFStringRef ax_window_notification[] =
[AX_WINDOW_DEMINIMIZED_INDEX] = kAXWindowDeminiaturizedNotification
};

enum cg_window_level_key
{
CG_WINDOW_BASE_LEVEL_KEY = 0,
CG_WINDOW_MINIMUM_LEVEL_KEY = 1,
CG_WINDOW_DESKTOP_LEVEL_KEY = 2,
CG_WINDOW_BACKSTOP_MENU_LEVEL_KEY = 3,
CG_WINDOW_NORMAL_LEVEL_KEY = 4,
CG_WINDOW_FLOATING_LEVEL_KEY = 5,
CG_WINDOW_TORN_OFF_MENU_LEVEL_KEY = 6,
CG_WINDOW_DOCK_LEVEL_KEY = 7,
CG_WINDOW_MAIN_MENU_LEVEL_KEY = 8,
CG_WINDOW_STATUS_LEVEL_KEY = 9,
CG_WINDOW_MODAL_PANEL_LEVEL_KEY = 10,
CG_WINDOW_POPUP_MENU_LEVEL_KEY = 11,
CG_WINDOW_DRAGGING_LEVEL_KEY = 12,
CG_WINDOW_SCREENSAVER_LEVEL_KEY = 13,
CG_WINDOW_MAXIMUM_LEVEL_KEY = 14,
CG_WINDOW_OVERLAY_LEVEL_KEY = 15,
CG_WINDOW_HELP_LEVEL_KEY = 16,
CG_WINDOW_UTILITY_LEVEL_KEY = 17,
CG_WINDOW_DESKTOP_ICON_LEVEL_KEY = 18,
CG_WINDOW_CURSOR_LEVEL_KEY = 19,
CG_WINDOW_ASSISTIVE_TECH_HIGH_LEVEL_KEY = 20,
CG_WINDOW_LEVEL_KEY_COUNT = 21
};

static const char *cg_window_level_key_str[] =
{
[CG_WINDOW_BASE_LEVEL_KEY] = "CG_WINDOW_BASE_LEVEL_KEY",
[CG_WINDOW_MINIMUM_LEVEL_KEY] = "CG_WINDOW_MINIMUM_LEVEL_KEY",
[CG_WINDOW_DESKTOP_LEVEL_KEY] = "CG_WINDOW_DESKTOP_LEVEL_KEY",
[CG_WINDOW_BACKSTOP_MENU_LEVEL_KEY] = "CG_WINDOW_BACKSTOP_MENU_LEVEL_KEY",
[CG_WINDOW_NORMAL_LEVEL_KEY] = "CG_WINDOW_NORMAL_LEVEL_KEY",
[CG_WINDOW_FLOATING_LEVEL_KEY] = "CG_WINDOW_FLOATING_LEVEL_KEY",
[CG_WINDOW_TORN_OFF_MENU_LEVEL_KEY] = "CG_WINDOW_TORN_OFF_MENU_LEVEL_KEY",
[CG_WINDOW_DOCK_LEVEL_KEY] = "CG_WINDOW_DOCK_LEVEL_KEY",
[CG_WINDOW_MAIN_MENU_LEVEL_KEY] = "CG_WINDOW_MAIN_MENU_LEVEL_KEY",
[CG_WINDOW_STATUS_LEVEL_KEY] = "CG_WINDOW_STATUS_LEVEL_KEY",
[CG_WINDOW_MODAL_PANEL_LEVEL_KEY] = "CG_WINDOW_MODAL_PANEL_LEVEL_KEY",
[CG_WINDOW_POPUP_MENU_LEVEL_KEY] = "CG_WINDOW_POPUP_MENU_LEVEL_KEY",
[CG_WINDOW_DRAGGING_LEVEL_KEY] = "CG_WINDOW_DRAGGING_LEVEL_KEY",
[CG_WINDOW_SCREENSAVER_LEVEL_KEY] = "CG_WINDOW_SCREENSAVER_LEVEL_KEY",
[CG_WINDOW_MAXIMUM_LEVEL_KEY] = "CG_WINDOW_MAXIMUM_LEVEL_KEY",
[CG_WINDOW_OVERLAY_LEVEL_KEY] = "CG_WINDOW_OVERLAY_LEVEL_KEY",
[CG_WINDOW_HELP_LEVEL_KEY] = "CG_WINDOW_HELP_LEVEL_KEY",
[CG_WINDOW_UTILITY_LEVEL_KEY] = "CG_WINDOW_UTILITY_LEVEL_KEY",
[CG_WINDOW_DESKTOP_ICON_LEVEL_KEY] = "CG_WINDOW_DESKTOP_ICON_LEVEL_KEY",
[CG_WINDOW_CURSOR_LEVEL_KEY] = "CG_WINDOW_CURSOR_LEVEL_KEY",
[CG_WINDOW_ASSISTIVE_TECH_HIGH_LEVEL_KEY] = "CG_WINDOW_ASSISTIVE_TECH_HIGH_LEVEL_KEY",
[CG_WINDOW_LEVEL_KEY_COUNT] = "CG_WINDOW_LEVEL_KEY_COUNT"
};

struct window
{
struct application *application;
Expand Down Expand Up @@ -94,10 +146,12 @@ bool window_is_fullscreen(struct window *window);
bool window_is_sticky(struct window *window);
bool window_is_real(struct window *window);
bool window_is_standard(struct window *window);
bool window_level_is_standard(struct window *window);
bool window_is_unknown(struct window *window);
bool window_observe(struct window *window);
void window_unobserve(struct window *window);
struct window *window_create(struct application *application, AXUIElementRef window_ref, uint32_t window_id);
void window_destroy(struct window *window);
void window_dump_cg_window_levels(void);

#endif
23 changes: 17 additions & 6 deletions src/window_manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -125,10 +125,10 @@ void window_manager_apply_manage_rule_to_window(struct space_manager *sm, struct
if (!rule->subrole_regex_valid && !string_equals(window_subrole, "AXStandardWindow")) return;

window_rule_set_flag(window, WINDOW_RULE_MANAGED);
window_manager_make_window_floating(sm, wm, window, false);
window_manager_make_window_floating(sm, wm, window, false, true);
} else if (rule->manage == RULE_PROP_OFF) {
window_rule_clear_flag(window, WINDOW_RULE_MANAGED);
window_manager_make_window_floating(sm, wm, window, true);
window_manager_make_window_floating(sm, wm, window, true, true);
}
}

Expand Down Expand Up @@ -277,7 +277,7 @@ bool window_manager_should_manage_window(struct window *window)
if (window_check_flag(window, WINDOW_MINIMIZE)) return false;
if (window->application->is_hidden) return false;

return (window_is_standard(window) && window_can_move(window)) || window_rule_check_flag(window, WINDOW_RULE_MANAGED);
return (window_is_standard(window) && window_level_is_standard(window) && window_can_move(window)) || window_rule_check_flag(window, WINDOW_RULE_MANAGED);
}

struct view *window_manager_find_managed_window(struct window_manager *wm, struct window *window)
Expand Down Expand Up @@ -1381,8 +1381,11 @@ struct window *window_manager_create_and_add_window(struct space_manager *sm, st
goto out;
}

if ((window_is_sticky(window) || !window_is_standard(window) || !window_can_move(window)) ||
(window_is_undersized(window) && !window_can_resize(window))) {
if (window_is_sticky(window) ||
!window_can_move(window) ||
!window_is_standard(window) ||
!window_level_is_standard(window) ||
(!window_can_resize(window) && window_is_undersized(window))) {
window_set_flag(window, WINDOW_FLOAT);
}
} else {
Expand Down Expand Up @@ -1927,10 +1930,18 @@ enum window_op_error window_manager_apply_grid(struct space_manager *sm, struct
return WINDOW_OP_ERROR_SUCCESS;
}

void window_manager_make_window_floating(struct space_manager *sm, struct window_manager *wm, struct window *window, bool should_float)
void window_manager_make_window_floating(struct space_manager *sm, struct window_manager *wm, struct window *window, bool should_float, bool force)
{
if (!window_manager_is_window_eligible(window)) return;

if (!force) {
if (!window_is_standard(window) || !window_level_is_standard(window) || !window_can_move(window)) {
if (!window_rule_check_flag(window, WINDOW_RULE_MANAGED)) {
return;
}
}
}

if (should_float) {
struct view *view = window_manager_find_managed_window(wm, window);
if (view) {
Expand Down
2 changes: 1 addition & 1 deletion src/window_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ struct window **window_manager_add_application_windows(struct space_manager *sm,
void window_manager_add_existing_application_windows(struct space_manager *sm, struct window_manager *wm, struct application *application, int refresh_index);
enum window_op_error window_manager_apply_grid(struct space_manager *sm, struct window_manager *wm, struct window *window, unsigned r, unsigned c, unsigned x, unsigned y, unsigned w, unsigned h);
void window_manager_purify_window(struct window_manager *wm, struct window *window);
void window_manager_make_window_floating(struct space_manager *sm, struct window_manager *wm, struct window *window, bool should_float);
void window_manager_make_window_floating(struct space_manager *sm, struct window_manager *wm, struct window *window, bool should_float, bool force);
void window_manager_make_window_sticky(struct space_manager *sm, struct window_manager *wm, struct window *window, bool should_sticky);
void window_manager_adjust_layer(struct window *window, int layer);
bool window_manager_set_window_layer(struct window *window, int layer);
Expand Down
1 change: 1 addition & 0 deletions src/yabai.c
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@ static inline bool configure_settings_and_acquire_lock(void)
hook_nsobject_autorelease();
hook_autoreleasepool_drain();
hook_autoreleasepool_release();
window_dump_cg_window_levels();
#endif

int handle = open(g_lock_file, O_CREAT | O_WRONLY, 0600);
Expand Down

0 comments on commit c396bab

Please sign in to comment.