commit 11e67c66f1c8ce938a965ffa4b32c4a7d0b38183 from: Omar Polo date: Sat Aug 11 23:06:43 2018 UTC Scroll + Initial mouse handling Scroll as respond to scroll event commit - 124df174f78190c79ad0bffaeff238e585457f4c commit + 11e67c66f1c8ce938a965ffa4b32c4a7d0b38183 blob - 70485948562d17a7171533ec4f1137a62ddad7e9 blob + 5ea810c8f8c038be7133cec984df0ba8f1d22de4 --- mymenu.c +++ mymenu.c @@ -96,6 +96,8 @@ struct rendering { int padding; int x_zero; // the "zero" on the x axis (may not be 0 'cause the border) int y_zero; // the same a x_zero, only for the y axis + + size_t offset; // a scrolling offset // The four border int border_n; @@ -460,7 +462,7 @@ void draw_horizontally(struct rendering *r, char *text XFillRectangle(r->d, r->w, r->completion_bg, start_at, r->y_zero, r->width, inner_height(r)); - for (size_t i = 0; i < cs->lenght; ++i) { + for (size_t i = r->offset; i < cs->lenght; ++i) { struct completion *c = &cs->completions[i]; enum text_type tt = cs->selected == (ssize_t)i ? COMPL_HIGH : COMPL; @@ -502,7 +504,7 @@ void draw_vertically(struct rendering *r, char *text, start_at += r->y_zero; - for (size_t i = 0; i < cs->lenght; ++i){ + for (size_t i = r->offset; i < cs->lenght; ++i){ struct completion *c = &cs->completions[i]; enum text_type tt = cs->selected == (ssize_t)i ? COMPL_HIGH : COMPL; GC h = cs->selected == (ssize_t)i ? r->completion_highlighted_bg : r->completion_bg; @@ -1263,7 +1265,7 @@ int main(int argc, char **argv) { set_win_atoms_hints(d, w, width, height); // we want some events - XSelectInput(d, w, StructureNotifyMask | KeyPressMask | KeymapStateMask); + XSelectInput(d, w, StructureNotifyMask | KeyPressMask | KeymapStateMask | ButtonPressMask); XMapRaised(d, w); // if embed, listen for other events as well @@ -1294,6 +1296,7 @@ int main(int argc, char **argv) { .padding = padding, .x_zero = border_w, .y_zero = border_n, + .offset = 0, .border_n = border_n, .border_e = border_e, .border_s = border_s, @@ -1457,17 +1460,20 @@ int main(int argc, char **argv) { case PREV_COMPL: { complete(cs, first_selected, true, &text, &textlen, &status); + r.offset = cs->selected; break; } case NEXT_COMPL: { complete(cs, first_selected, false, &text, &textlen, &status); + r.offset = cs->selected; break; } case DEL_CHAR: popc(text); update_completions(cs, text, lines, vlines, first_selected); + r.offset = 0; break; case DEL_WORD: { @@ -1480,6 +1486,7 @@ int main(int argc, char **argv) { for (int i = 0; i < textlen; ++i) text[i] = 0; update_completions(cs, text, lines, vlines, first_selected); + r.offset = 0; break; } @@ -1504,6 +1511,7 @@ int main(int argc, char **argv) { update_completions(cs, text, lines, vlines, first_selected); free(input); } + r.offset = 0; break; } @@ -1516,6 +1524,23 @@ int main(int argc, char **argv) { break; } } + + case ButtonPress: { + XButtonPressedEvent *ev = (XButtonPressedEvent*)&e; + /* if (ev->button == Button1) { /\* click *\/ */ + /* int x = ev->x - r.border_w; */ + /* int y = ev->y - r.border_n; */ + /* fprintf(stderr, "Click @ (%d, %d)\n", x, y); */ + /* } */ + + if (ev->button == Button4) /* scroll up */ + r.offset = MAX((ssize_t)r.offset - 1, 0); + + if (ev->button == Button5) /* scroll down */ + r.offset = MIN(r.offset + 1, cs->lenght - 1); + + break; + } } draw(&r, text, cs);