util.h 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. typedef struct {
  2. int sel,scr,h,n;
  3. } SCROLL;
  4. #define ScrollInit(s) ((s)->sel=0,(s)->scr=0)
  5. #define ScrollChg(s,n) ((s)->sel+=n)
  6. #define ScrollUp(s) (--(s)->sel)
  7. #define ScrollDn(s) (++(s)->sel)
  8. #define ScrollHasUpArrow(s) (!!((s)->scr))
  9. #define ScrollHasDnArrow(s) ((s)->scr+(s)->h<(s)->n)
  10. void ScrollUpd(SCROLL *s) {
  11. int n=s->n;
  12. while (s->sel<0) s->sel+=n;
  13. while (s->sel>=n) s->sel-=n;
  14. /* Now s->sel is OK, let's update s->scr */
  15. if (s->sel<s->scr) s->scr=s->sel;
  16. if (s->sel>=s->scr+s->h) s->scr=s->sel-s->h+1;
  17. }
  18. void ScrollUpdNoWrap(SCROLL *s) { /* same as ScrollUpd, but doesn't wrap */
  19. int n=s->n;
  20. if (s->sel<0) s->sel=0;
  21. if (s->sel>=n) s->sel=n-1;
  22. /* Now s->sel is OK, let's update s->scr */
  23. if (s->sel<s->scr) s->scr=s->sel;
  24. if (s->sel>=s->scr+s->h) s->scr=s->sel-s->h+1;
  25. }
  26. void ScrollUpdNoWrapDots(SCROLL *s) { /* same as ScrollUpdNoWrap, but leaves 1 blank on the border */
  27. int n=s->n;
  28. if (s->sel>=n) s->sel=n-1;
  29. if (s->sel<0) s->sel=0;
  30. /* Now s->sel is OK, let's update s->scr */
  31. if (s->sel-1<s->scr) s->scr=s->sel-1;
  32. if (s->sel+1>=s->scr+s->h) s->scr=s->sel+1-s->h+1;
  33. while (s->scr+s->h>=n) s->scr--;
  34. if (s->scr<0) s->scr=0; // this is what happens if s->h==s->n
  35. }
  36. void ScrollChgWrapOnlyAtEnd(SCROLL *s,int d) {
  37. /* likes ScrollChg, but prevents selection from wrapping if cursor was not at end */
  38. int n=s->n,sel2=s->sel+d;
  39. if (sel2<0) { if (s->sel>0) sel2=0; else sel2=-1; }
  40. else if (sel2>=n) { if (s->sel<n-1) sel2=n-1; else sel2=n; }
  41. s->sel=sel2;
  42. }
  43. void strtolower(char *s) {
  44. while (*s) *s=tolower(*s),s++;
  45. }