opt: avoid infinite loops

This commit is contained in:
DreamMaoMao 2025-05-07 17:37:44 +08:00
parent 013a5393a2
commit 48a8fabae1

View file

@ -5535,20 +5535,26 @@ void setsel(struct wl_listener *listener, void *data) {
wlr_seat_set_selection(seat, event->source, event->serial); wlr_seat_set_selection(seat, event->source, event->serial);
} }
// 获取tags中最坐标的tag的tagmask // 获取tags中最前面的tag的tagmask
unsigned int get_tags_first_tag(unsigned int source_tags) { unsigned int get_tags_first_tag(unsigned int source_tags) {
unsigned int i, target, tag; unsigned int i, tag;
tag = 0; tag = 0;
if (!source_tags) { if (!source_tags) {
return selmon->pertag->curtag; return selmon->pertag->curtag;
} }
for (i = 0; !(tag & 1) && source_tags != 0; i++) { for (i = 0; !(tag & 1) && source_tags != 0 && i < LENGTH(tags); i++) {
tag = source_tags >> i; tag = source_tags >> i;
} }
target = 1 << (i - 1);
return target; if (i == 1) {
return 1;
} else if (i > 9) {
return 1 << 8;
} else {
return 1 << (i - 1);
}
} }
void show_hide_client(Client *c) { void show_hide_client(Client *c) {
@ -7085,7 +7091,7 @@ void viewtoright_have_client(const Arg *arg) {
return; return;
} }
for (target <<= 1; target & TAGMASK; target <<= 1, n++) { for (target <<= 1; target & TAGMASK && n <= LENGTH(tags); target <<= 1, n++) {
wl_list_for_each(c, &clients, link) { wl_list_for_each(c, &clients, link) {
if (c->mon == selmon && target & c->tags) { if (c->mon == selmon && target & c->tags) {
found = 1; found = 1;
@ -7164,7 +7170,7 @@ void viewtoleft_have_client(const Arg *arg) {
return; return;
} }
for (target >>= 1; target > 0; target >>= 1, n++) { for (target >>= 1; target > 0 && n <= LENGTH(tags); target >>= 1, n++) {
wl_list_for_each(c, &clients, link) { wl_list_for_each(c, &clients, link) {
if (c->mon == selmon && target & c->tags) { if (c->mon == selmon && target & c->tags) {
found = 1; found = 1;