Simplify match scrolling - wmenu - 🔧 fork of wmenu
(HTM) git clone git@git.drkhsh.at/wmenu.git
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit d23a2c563a5e9b722a07c22d33f1898793627a40
(DIR) parent 906b55019e50558e7d2ee0b26b9732b64b6306e1
(HTM) Author: adnano <me@adnano.co>
Date: Mon, 26 Feb 2024 10:47:35 -0500
Simplify match scrolling
Diffstat:
M main.c | 88 ++++++++++---------------------
1 file changed, 28 insertions(+), 60 deletions(-)
---
(DIR) diff --git a/main.c b/main.c
@@ -183,79 +183,47 @@ void scroll_matches(struct menu_state *state) {
return;
}
+ if (state->leftmost == NULL && state->rightmost == NULL) {
+ state->leftmost = state->matches;
+ }
+
if (state->vertical) {
if (state->leftmost == NULL) {
- state->leftmost = state->matches;
- if (state->rightmost == NULL) {
- int offs = 0;
- struct menu_item *item;
- for (item = state->matches; item->left != state->selection; item = item->right) {
- offs += state->line_height;
- if (offs >= state->height) {
- state->leftmost = item->left;
- offs = state->height - offs;
- }
- }
- } else {
- int offs = 0;
- struct menu_item *item;
- for (item = state->rightmost; item; item = item->left) {
- offs += state->line_height;
- if (offs >= state->height) {
- state->leftmost = item->right;
- break;
- }
- }
+ struct menu_item *item = state->rightmost;
+ for (int i = 1; item->left && i < state->lines; i++) {
+ item = item->left;
}
- }
- if (state->rightmost == NULL) {
- state->rightmost = state->matches;
- int offs = 0;
- struct menu_item *item;
- for (item = state->leftmost; item; item = item->right) {
- offs += state->line_height;
- if (offs >= state->height) {
- break;
- }
- state->rightmost = item;
+ state->leftmost = item;
+ } else if (state->rightmost == NULL) {
+ struct menu_item *item = state->leftmost;
+ for (int i = 1; item->right && i < state->lines; i++) {
+ item = item->right;
}
+ state->rightmost = item;
}
} else {
// Calculate available space
- int padding = state->padding;
- int width = state->width - state->inputw - state->promptw
+ int max_width = state->width - state->inputw - state->promptw
- state->left_arrow - state->right_arrow;
+
if (state->leftmost == NULL) {
- state->leftmost = state->matches;
- if (state->rightmost == NULL) {
- int offs = 0;
- struct menu_item *item;
- for (item = state->matches; item->left != state->selection; item = item->right) {
- offs += item->width + 2 * padding;
- if (offs >= width) {
- state->leftmost = item->left;
- offs = width - offs;
- }
- }
- } else {
- int offs = 0;
- struct menu_item *item;
- for (item = state->rightmost; item; item = item->left) {
- offs += item->width + 2 * padding;
- if (offs >= width) {
- state->leftmost = item->right;
- break;
- }
+ state->leftmost = state->rightmost;
+ int total_width = 0;
+ struct menu_item *item;
+ for (item = state->rightmost; item; item = item->left) {
+ total_width += item->width + 2 * state->padding;
+ if (total_width > max_width) {
+ break;
}
+ state->leftmost = item;
}
- }
- if (state->rightmost == NULL) {
- state->rightmost = state->matches;
- int offs = 0;
+ } else if (state->rightmost == NULL) {
+ state->rightmost = state->leftmost;
+ int total_width = 0;
struct menu_item *item;
for (item = state->leftmost; item; item = item->right) {
- offs += item->width + 2 * padding;
- if (offs >= width) {
+ total_width += item->width + 2 * state->padding;
+ if (total_width > max_width) {
break;
}
state->rightmost = item;