commit - 124df174f78190c79ad0bffaeff238e585457f4c
commit + 11e67c66f1c8ce938a965ffa4b32c4a7d0b38183
blob - 70485948562d17a7171533ec4f1137a62ddad7e9
blob + 5ea810c8f8c038be7133cec984df0ba8f1d22de4
--- mymenu.c
+++ mymenu.c
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;
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;
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;
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
.padding = padding,
.x_zero = border_w,
.y_zero = border_n,
+ .offset = 0,
.border_n = border_n,
.border_e = border_e,
.border_s = border_s,
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: {
for (int i = 0; i < textlen; ++i)
text[i] = 0;
update_completions(cs, text, lines, vlines, first_selected);
+ r.offset = 0;
break;
}
update_completions(cs, text, lines, vlines, first_selected);
free(input);
}
+ r.offset = 0;
break;
}
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);