Skip to content

Commit

Permalink
fix obscure bug (#6)
Browse files Browse the repository at this point in the history
  • Loading branch information
FelixKratz committed Nov 2, 2023
1 parent 96534dd commit 03c58ea
Show file tree
Hide file tree
Showing 5 changed files with 101 additions and 98 deletions.
61 changes: 3 additions & 58 deletions src/border.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ static void border_draw(struct border* border) {
CFTypeRef frame_region;
CGSNewRegionWithRect(&frame, &frame_region);

uint64_t set_tags = 1ULL << 1;
uint64_t set_tags = 1ULL << 1;
uint64_t clear_tags = 0;

uint64_t id;
Expand Down Expand Up @@ -118,7 +118,6 @@ static void border_draw(struct border* border) {
CFRelease(window_list);
}

CFTypeRef transaction = SLSTransactionCreate(cid);
if (!CGRectEqualToRect(frame, border->bounds)) {
CFTypeRef frame_region;
CGSNewRegionWithRect(&frame, &frame_region);
Expand All @@ -129,8 +128,6 @@ static void border_draw(struct border* border) {
CFRelease(frame_region);
}

SLSTransactionMoveWindowWithGroup(transaction, border->wid, origin);

SLSSetWindowLevel(cid, border->wid, level);
SLSSetWindowSubLevel(cid, border->wid, sub_level);

Expand Down Expand Up @@ -169,8 +166,7 @@ static void border_draw(struct border* border) {
CFRelease(path);
}

SLSTransactionCommit(transaction, true);
CFRelease(transaction);
border_move(border);
SLSReenableUpdate(cid);
}

Expand Down Expand Up @@ -198,7 +194,7 @@ struct border* borders_add_border(struct borders* borders, uint32_t wid, uint64_
border->target_wid = wid;
border->sid = sid;
border->needs_redraw = true;
border_draw(&borders->borders[borders->num_borders - 1]);
border_draw(border);
return border;
}

Expand Down Expand Up @@ -244,54 +240,3 @@ void borders_move_border(struct borders* borders, uint32_t wid) {
}
}
}

uint32_t get_front_window() {
int cid = SLSMainConnectionID();
ProcessSerialNumber psn;
_SLPSGetFrontProcess(&psn);
int target_cid;
SLSGetConnectionIDForPSN(cid, &psn, &target_cid);

CFArrayRef displays = SLSCopyManagedDisplays(cid);
uint32_t space_count = CFArrayGetCount(displays);
uint64_t space_list[space_count];

for (int i = 0; i < space_count; i++) {
space_list[i] = SLSManagedDisplayGetCurrentSpace(cid,
CFArrayGetValueAtIndex(displays, i));
}

CFRelease(displays);

CFArrayRef space_list_ref = cfarray_of_cfnumbers(space_list,
sizeof(uint64_t),
space_count,
kCFNumberSInt64Type);

uint64_t set_tags = 1;
uint64_t clear_tags = 0;
CFArrayRef window_list = SLSCopyWindowsWithOptionsAndTags(cid,
target_cid,
space_list_ref,
0x2,
&set_tags,
&clear_tags );

uint32_t wid = 0;
if (window_list) {
uint32_t window_count = CFArrayGetCount(window_list);
CFTypeRef query = SLSWindowQueryWindows(cid, window_list, window_count);
if (query) {
CFTypeRef iterator = SLSWindowQueryResultCopyWindows(query);
if (iterator) {
wid = SLSWindowIteratorGetWindowID(iterator);
CFRelease(iterator);
}
CFRelease(query);
}
CFRelease(window_list);
}

CFRelease(space_list_ref);
return wid;
}
2 changes: 0 additions & 2 deletions src/border.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,6 @@ void borders_update_border(struct borders* borders, uint32_t wid);
void borders_window_focus(struct borders* borders, uint32_t wid);
void borders_move_border(struct borders* borders, uint32_t wid);

uint32_t get_front_window();

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

Expand Down
1 change: 1 addition & 0 deletions src/events.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ static void event_watcher(uint32_t event, void* data, size_t data_length, void*
dump_event(data, data_length);
}

bool g_first_time = true;
static void window_spawn_handler(uint32_t event, void* data, size_t data_length, void* context) {
int cid = (intptr_t)context;
uint32_t wid = *(uint32_t *)(data + 0x8);
Expand Down
132 changes: 94 additions & 38 deletions src/windows.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,41 +5,55 @@ void windows_init(struct windows* windows) {
memset(windows, 0, sizeof(struct windows));
}

static uint64_t window_space_id(int cid, uint32_t wid) {
uint64_t sid = 0;

CFArrayRef window_list_ref = cfarray_of_cfnumbers(&wid,
sizeof(uint32_t),
1,
kCFNumberSInt32Type);
static void windows_add_border_to_current_space(struct windows* windows, struct borders* borders) {
int cid = SLSMainConnectionID();
CFArrayRef displays = SLSCopyManagedDisplays(cid);
uint32_t space_count = CFArrayGetCount(displays);
uint64_t space_list[space_count];

for (int i = 0; i < space_count; i++) {
space_list[i] = SLSManagedDisplayGetCurrentSpace(cid,
CFArrayGetValueAtIndex(displays, i));
}

CFArrayRef space_list_ref = SLSCopySpacesForWindows(cid,
0x7,
window_list_ref);
CFRelease(displays);

CFArrayRef space_list_ref = cfarray_of_cfnumbers(space_list,
sizeof(uint64_t),
space_count,
kCFNumberSInt64Type);

if (space_list_ref) {
int count = CFArrayGetCount(space_list_ref);
if (count > 0) {
CFNumberRef id_ref = CFArrayGetValueAtIndex(space_list_ref, 0);
CFNumberGetValue(id_ref, CFNumberGetType(id_ref), &sid);
uint64_t set_tags = 1;
uint64_t clear_tags = 0;
CFArrayRef window_list = SLSCopyWindowsWithOptionsAndTags(cid,
0,
space_list_ref,
0x2,
&set_tags,
&clear_tags );

if (window_list) {
uint32_t window_count = CFArrayGetCount(window_list);
CFTypeRef query = SLSWindowQueryWindows(cid, window_list, window_count);
if (query) {
CFTypeRef iterator = SLSWindowQueryResultCopyWindows(query);
if (iterator) {
while(SLSWindowIteratorAdvance(iterator)) {
ITERATOR_WINDOW_SUITABLE(iterator, {
uint32_t wid = SLSWindowIteratorGetWindowID(iterator);
borders_add_border(borders, wid, 0);
});
}
}
CFRelease(query);
}
CFRelease(space_list_ref);
}
CFRelease(window_list_ref);

if (sid) return sid;

CFStringRef uuid = SLSCopyManagedDisplayForWindow(cid, wid);
if (uuid) {
uint64_t sid = SLSManagedDisplayGetCurrentSpace(cid, uuid);
CFRelease(uuid);
return sid;
CFRelease(window_list);
}

return 0;
CFRelease(space_list_ref);
}

extern bool g_first_time;
void windows_add_existing_windows(int cid, struct windows* windows, struct borders* borders) {
uint64_t *space_list = NULL;
int space_count = 0;
Expand Down Expand Up @@ -93,32 +107,23 @@ void windows_add_existing_windows(int cid, struct windows* windows, struct borde
while (SLSWindowIteratorAdvance(iterator)) {
ITERATOR_WINDOW_SUITABLE(iterator, {
uint32_t wid = SLSWindowIteratorGetWindowID(iterator);
uint64_t sid = window_space_id(cid, wid);
windows_add_window(windows, wid);
struct border* border = borders_add_border(borders, wid, sid);
CFArrayRef border_ref = cfarray_of_cfnumbers(&border->wid,
sizeof(uint32_t),
1,
kCFNumberSInt32Type);

border->sid = sid;
SLSMoveWindowsToManagedSpace(cid, border_ref, sid);
CFRelease(border_ref);
});
}

SLSRequestNotificationsForWindows(cid,
windows->wids,
windows->num_windows);


CFRelease(query);
CFRelease(iterator);
}
CFRelease(window_list_ref);
}

CFRelease(space_list_ref);
free(space_list);
windows_add_border_to_current_space(windows, borders);
}

void windows_add_window(struct windows* windows, uint32_t wid) {
Expand All @@ -143,3 +148,54 @@ bool windows_remove_window(struct windows* windows, uint32_t wid) {
}
return false;
}

uint32_t get_front_window() {
int cid = SLSMainConnectionID();
ProcessSerialNumber psn;
_SLPSGetFrontProcess(&psn);
int target_cid;
SLSGetConnectionIDForPSN(cid, &psn, &target_cid);

CFArrayRef displays = SLSCopyManagedDisplays(cid);
uint32_t space_count = CFArrayGetCount(displays);
uint64_t space_list[space_count];

for (int i = 0; i < space_count; i++) {
space_list[i] = SLSManagedDisplayGetCurrentSpace(cid,
CFArrayGetValueAtIndex(displays, i));
}

CFRelease(displays);

CFArrayRef space_list_ref = cfarray_of_cfnumbers(space_list,
sizeof(uint64_t),
space_count,
kCFNumberSInt64Type);

uint64_t set_tags = 1;
uint64_t clear_tags = 0;
CFArrayRef window_list = SLSCopyWindowsWithOptionsAndTags(cid,
target_cid,
space_list_ref,
0x2,
&set_tags,
&clear_tags );

uint32_t wid = 0;
if (window_list) {
uint32_t window_count = CFArrayGetCount(window_list);
CFTypeRef query = SLSWindowQueryWindows(cid, window_list, window_count);
if (query) {
CFTypeRef iterator = SLSWindowQueryResultCopyWindows(query);
if (iterator) {
wid = SLSWindowIteratorGetWindowID(iterator);
CFRelease(iterator);
}
CFRelease(query);
}
CFRelease(window_list);
}

CFRelease(space_list_ref);
return wid;
}
3 changes: 3 additions & 0 deletions src/windows.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,6 @@ void windows_init(struct windows* windows);
void windows_add_existing_windows(int cid, struct windows* windows, struct borders* borders);
void windows_add_window(struct windows* windows, uint32_t wid);
bool windows_remove_window(struct windows* windows, uint32_t wid);

uint32_t get_front_window();

0 comments on commit 03c58ea

Please sign in to comment.