Skip to content

Commit

Permalink
#2331 #2324 moving windows to spaces require SIP to be disabled
Browse files Browse the repository at this point in the history
  • Loading branch information
koekeishiya committed Jun 23, 2024
1 parent 773be71 commit a1abe2c
Show file tree
Hide file tree
Showing 7 changed files with 98 additions and 10 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm

## [Unreleased]
### Changed
- Moving windows to other spaces requires SIP to be disabled on macOS Sequoia [#2324](https://github.com/koekeishiya/yabai/issues/2324) [#2331](https://github.com/koekeishiya/yabai/issues/2331)
- Updated scripting-addition mach loader/injection and payload to work for macOS Sequoia Beta 1 [#2324](https://github.com/koekeishiya/yabai/issues/2324) [#2331](https://github.com/koekeishiya/yabai/issues/2331)

## [7.1.1] - 2024-05-18
Expand Down
4 changes: 3 additions & 1 deletion src/osax/common.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#ifndef SA_COMMON_H
#define SA_COMMON_H

#define OSAX_VERSION "2.1.11"
#define OSAX_VERSION "2.1.12"

#define OSAX_ATTRIB_DOCK_SPACES 0x01
#define OSAX_ATTRIB_DPPM 0x02
Expand Down Expand Up @@ -38,6 +38,8 @@ enum sa_opcode
SA_OPCODE_WINDOW_SWAP_PROXY_OUT = 0x0F,
SA_OPCODE_WINDOW_ORDER = 0x10,
SA_OPCODE_WINDOW_ORDER_IN = 0x11,
SA_OPCODE_WINDOW_LIST_TO_SPACE = 0x12,
SA_OPCODE_WINDOW_TO_SPACE = 0x13,
};

#endif
50 changes: 50 additions & 0 deletions src/osax/payload.m
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
extern void SLSManagedDisplaySetCurrentSpace(int cid, CFStringRef display_ref, uint64_t sid);
extern uint64_t SLSManagedDisplayGetCurrentSpace(int cid, CFStringRef display_ref);
extern CFStringRef SLSCopyManagedDisplayForSpace(int cid, uint64_t sid);
extern void SLSMoveWindowsToManagedSpace(int cid, CFArrayRef window_list, uint64_t sid);
extern void SLSShowSpaces(int cid, CFArrayRef space_list);
extern void SLSHideSpaces(int cid, CFArrayRef space_list);
extern CFTypeRef SLSTransactionCreate(int cid);
Expand Down Expand Up @@ -869,6 +870,49 @@ static void do_window_order_in(char *message)
CFRelease(transaction);
}

static inline CFArrayRef cfarray_of_cfnumbers(void *values, size_t size, int count, CFNumberType type)
{
CFNumberRef temp[count];

for (int i = 0; i < count; ++i) {
temp[i] = CFNumberCreate(NULL, type, ((char *)values) + (size * i));
}

CFArrayRef result = CFArrayCreate(NULL, (const void **)temp, count, &kCFTypeArrayCallBacks);

for (int i = 0; i < count; ++i) {
CFRelease(temp[i]);
}

return result;
}

static void do_window_list_move_to_space(char *message)
{
uint64_t sid;
unpack(sid);

int count = 0;
unpack(count);

CFArrayRef window_list_ref = cfarray_of_cfnumbers((uint32_t*)message, sizeof(uint32_t), count, kCFNumberSInt32Type);
SLSMoveWindowsToManagedSpace(SLSMainConnectionID(), window_list_ref, sid);
CFRelease(window_list_ref);
}

static void do_window_move_to_space(char *message)
{
uint64_t sid;
unpack(sid);

uint32_t wid;
unpack(wid);

CFArrayRef window_list_ref = cfarray_of_cfnumbers(&wid, sizeof(uint32_t), 1, kCFNumberSInt32Type);
SLSMoveWindowsToManagedSpace(SLSMainConnectionID(), window_list_ref, sid);
CFRelease(window_list_ref);
}

static void do_handshake(int sockfd)
{
uint32_t attrib = 0;
Expand Down Expand Up @@ -949,6 +993,12 @@ static void handle_message(int sockfd, char *message)
case SA_OPCODE_WINDOW_ORDER_IN: {
do_window_order_in(message);
} break;
case SA_OPCODE_WINDOW_LIST_TO_SPACE: {
do_window_list_move_to_space(message);
} break;
case SA_OPCODE_WINDOW_TO_SPACE: {
do_window_move_to_space(message);
} break;
}
}

Expand Down
2 changes: 2 additions & 0 deletions src/sa.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,7 @@ bool scripting_addition_swap_window_proxy_in(struct window_animation *animation_
bool scripting_addition_swap_window_proxy_out(struct window_animation *animation_list, int animation_count);
bool scripting_addition_order_window(uint32_t a_wid, int order, uint32_t b_wid);
bool scripting_addition_order_window_in(uint32_t *window_list, int window_count);
bool scripting_addition_move_window_list_to_space(uint64_t sid, uint32_t *window_list, int window_count);
bool scripting_addition_move_window_to_space(uint64_t sid, uint32_t wid);

#endif
19 changes: 19 additions & 0 deletions src/sa.m
Original file line number Diff line number Diff line change
Expand Up @@ -602,6 +602,25 @@ bool scripting_addition_order_window_in(uint32_t *window_list, int window_count)
return sa_payload_send(SA_OPCODE_WINDOW_ORDER_IN);
}

bool scripting_addition_move_window_list_to_space(uint64_t sid, uint32_t *window_list, int window_count)
{
sa_payload_init();
pack(sid);
pack(window_count);
for (int i = 0; i < window_count; ++i) {
pack(window_list[i]);
}
return sa_payload_send(SA_OPCODE_WINDOW_LIST_TO_SPACE);
}

bool scripting_addition_move_window_to_space(uint64_t sid, uint32_t wid)
{
sa_payload_init();
pack(sid);
pack(wid);
return sa_payload_send(SA_OPCODE_WINDOW_TO_SPACE);
}

#undef sa_payload_init
#undef pack
#undef sa_payload_send
31 changes: 22 additions & 9 deletions src/space_manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -694,12 +694,29 @@ uint64_t space_manager_active_space(void)
return display_space_id(did);
}

void space_manager_move_window_list_to_space(uint64_t sid, uint32_t *window_list, int window_count)
{
if (workspace_is_macos_sonoma14_5_or_newer()) {
if (!scripting_addition_move_window_list_to_space(sid, window_list, window_count)) {
SLSSpaceSetCompatID(g_connection, sid, 0x79616265);
SLSSetWindowListWorkspace(g_connection, window_list, window_count, 0x79616265);
SLSSpaceSetCompatID(g_connection, sid, 0x0);
}
} else {
CFArrayRef window_list_ref = cfarray_of_cfnumbers(window_list, sizeof(uint32_t), window_count, kCFNumberSInt32Type);
SLSMoveWindowsToManagedSpace(g_connection, window_list_ref, sid);
CFRelease(window_list_ref);
}
}

void space_manager_move_window_to_space(uint64_t sid, struct window *window)
{
if (workspace_is_macos_sonoma14_5_or_newer()) {
SLSSpaceSetCompatID(g_connection, sid, 0x79616265);
SLSSetWindowListWorkspace(g_connection, &window->id, 1, 0x79616265);
SLSSpaceSetCompatID(g_connection, sid, 0x0);
if (!scripting_addition_move_window_to_space(sid, window->id)) {
SLSSpaceSetCompatID(g_connection, sid, 0x79616265);
SLSSetWindowListWorkspace(g_connection, &window->id, 1, 0x79616265);
SLSSpaceSetCompatID(g_connection, sid, 0x0);
}
} else {
CFArrayRef window_list_ref = cfarray_of_cfnumbers(&window->id, sizeof(uint32_t), 1, kCFNumberSInt32Type);
SLSMoveWindowsToManagedSpace(g_connection, window_list_ref, sid);
Expand Down Expand Up @@ -777,15 +794,11 @@ static enum space_op_error space_manager_swap_space_with_space_on_display(uint32
table_add(&g_space_manager.view, &b_sid, a_view);

if (a_window_list_count) {
CFArrayRef window_list_ref = cfarray_of_cfnumbers(a_window_list, sizeof(uint32_t), a_window_list_count, kCFNumberSInt32Type);
SLSMoveWindowsToManagedSpace(g_connection, window_list_ref, b_sid);
CFRelease(window_list_ref);
space_manager_move_window_list_to_space(b_sid, a_window_list, a_window_list_count);
}

if (b_window_list_count) {
CFArrayRef window_list_ref = cfarray_of_cfnumbers(b_window_list, sizeof(uint32_t), b_window_list_count, kCFNumberSInt32Type);
SLSMoveWindowsToManagedSpace(g_connection, window_list_ref, a_sid);
CFRelease(window_list_ref);
space_manager_move_window_list_to_space(a_sid, b_window_list, b_window_list_count);
}

for (int i = 0; i < buf_len(g_space_manager.labels); ++i) {
Expand Down
1 change: 1 addition & 0 deletions src/space_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ bool space_manager_set_padding_for_space(struct space_manager *sm, uint64_t sid,
bool space_manager_toggle_padding_for_space(struct space_manager *sm, uint64_t sid);
bool space_manager_rotate_space(struct space_manager *sm, uint64_t sid, int degrees);
bool space_manager_mirror_space(struct space_manager *sm, uint64_t sid, enum window_node_split axis);
void space_manager_move_window_list_to_space(uint64_t sid, uint32_t *window_list, int window_count);
void space_manager_move_window_to_space(uint64_t sid, struct window *window);
enum space_op_error space_manager_focus_space(uint64_t sid);
enum space_op_error space_manager_switch_space(uint64_t sid);
Expand Down

0 comments on commit a1abe2c

Please sign in to comment.