Skip to content

Commit

Permalink
better tracing performance (#1)
Browse files Browse the repository at this point in the history
  • Loading branch information
FelixKratz committed Nov 2, 2023
1 parent 271093e commit 9ca6073
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 26 deletions.
77 changes: 52 additions & 25 deletions src/border.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,21 @@ static void border_destroy(struct border* border) {
border_init(border);
}

static void border_move(struct border* border) {
int cid = SLSMainConnectionID();
CFTypeRef transaction = SLSTransactionCreate(cid);

CGRect window_frame;
SLSGetWindowBounds(cid, border->target_wid, &window_frame);
CGRect frame = CGRectInset(window_frame, -g_border_width, -g_border_width);
SLSTransactionMoveWindowWithGroup(transaction, border->wid, frame.origin);

SLSTransactionCommit(transaction, true);
border->origin = window_frame.origin;

CFRelease(transaction);
}

static void border_draw(struct border* border) {
int cid = SLSMainConnectionID();

Expand Down Expand Up @@ -64,11 +79,11 @@ static void border_draw(struct border* border) {
CGPoint origin = frame.origin;
frame.origin = CGPointZero;

CFTypeRef frame_region;
CGSNewRegionWithRect(&frame, &frame_region);

SLSDisableUpdate(cid);
if (!border->wid) {
CFTypeRef frame_region;
CGSNewRegionWithRect(&frame, &frame_region);

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

Expand All @@ -92,13 +107,39 @@ static void border_draw(struct border* border) {
border->bounds = frame;
border->origin = origin;
border->needs_redraw = true;
CFRelease(frame_region);

if (!border->sid) {
CFArrayRef spaces = SLSCopySpacesForWindows(cid, 0x2, target_ref);
if (CFArrayGetCount(spaces) > 0) {
CFNumberRef number = CFArrayGetValueAtIndex(spaces, 0);
uint64_t sid;
CFNumberGetValue(number, CFNumberGetType(number), &sid);
border->sid = sid;
CFRelease(number);
}
CFRelease(spaces);
}
CFRelease(target_ref);

CFArrayRef window_list = cfarray_of_cfnumbers(&border->wid,
sizeof(uint32_t),
1,
kCFNumberSInt32Type);

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

CFTypeRef transaction = SLSTransactionCreate(cid);
if (!CGRectEqualToRect(frame, border->bounds)) {
CFTypeRef frame_region;
CGSNewRegionWithRect(&frame, &frame_region);

border->bounds = frame;
SLSSetWindowShape(cid, border->wid, -9999, -9999, frame_region);
border->needs_redraw = true;
CFRelease(frame_region);
}

SLSTransactionMoveWindowWithGroup(transaction, border->wid, origin);
Expand All @@ -107,28 +148,6 @@ static void border_draw(struct border* border) {
SLSSetWindowSubLevel(cid, border->wid, sub_level);

SLSOrderWindow(cid, border->wid, -1, border->target_wid);
CFRelease(frame_region);

if (!border->sid) {
CFArrayRef spaces = SLSCopySpacesForWindows(cid, 0x2, target_ref);
if (CFArrayGetCount(spaces) > 0) {
CFNumberRef number = CFArrayGetValueAtIndex(spaces, 0);
uint64_t sid;
CFNumberGetValue(number, CFNumberGetType(number), &sid);
border->sid = sid;
CFRelease(number);
}
CFRelease(spaces);
}
CFRelease(target_ref);

CFArrayRef window_list = cfarray_of_cfnumbers(&border->wid,
sizeof(uint32_t),
1,
kCFNumberSInt32Type);

SLSMoveWindowsToManagedSpace(cid, window_list, border->sid);
CFRelease(window_list);

if (border->needs_redraw) {
border->needs_redraw = false;
Expand Down Expand Up @@ -230,6 +249,14 @@ void borders_window_focus(struct borders* borders, uint32_t wid) {
}
}

void borders_move_border(struct borders* borders, uint32_t wid) {
for (int i = 0; i < borders->num_borders; i++) {
if (borders->borders[i].target_wid == wid) {
border_move(&borders->borders[i]);
}
}
}

uint32_t get_front_window() {
int cid = SLSMainConnectionID();
ProcessSerialNumber psn;
Expand Down
1 change: 1 addition & 0 deletions src/border.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ void borders_add_border(struct borders* borders, uint32_t wid, uint64_t sid);
void borders_remove_border(struct borders* borders, uint32_t wid, uint64_t sid);
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();

Expand Down
2 changes: 1 addition & 1 deletion src/events.c
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ static void window_modify_handler(uint32_t event, void* data, size_t data_length

if (event == EVENT_WINDOW_MOVE) {
printf("Window Move: %d\n", wid);
borders_update_border(&g_borders, wid);
borders_move_border(&g_borders, wid);
} else if (event == EVENT_WINDOW_RESIZE) {
borders_update_border(&g_borders, wid);
} else if (event == EVENT_WINDOW_REORDER) {
Expand Down

0 comments on commit 9ca6073

Please sign in to comment.