Browse code

Implement scrolling with mousewheel

Dario Rodriguez authored on 24/03/2022 18:13:42
Showing 1 changed files
... ...
@@ -14,6 +14,7 @@
14 14
 #include <limits.h>
15 15
 #include <signal.h>
16 16
 #include <time.h>
17
+#include <sys/time.h>
17 18
 
18 19
 #include "re_data.h"
19 20
 #include "re_plugin_unsaved.h"
... ...
@@ -111,6 +112,7 @@ typedef struct re_t {
111 112
         redata_t *funclisting;
112 113
         int originlinefunclisting;
113 114
         int curlinefunclisting;
115
+        struct timeval lastwheel;
114 116
 } re_t;
115 117
 
116 118
 volatile int flag_sigint;
... ...
@@ -159,6 +161,7 @@ int re_drawheader_command(re_t *re);
159 161
 int re_drawcontents(re_t *re, printout_t *printout);
160 162
 redata_t *re_getfunclisting(re_t *re);
161 163
 int re_funclistingxy2line(re_t *re,int mx,int my);
164
+int re_wheelaccel(re_t *re, int rawamount);
162 165
 
163 166
 
164 167
 int
... ...
@@ -305,6 +308,7 @@ fprintf(stderr,"RENDER\n");
305 308
                           || (event.type==SDL_KEYDOWN && (windowID=event.key.windowID)!=SDL_GetWindowID(re->ui->win))
306 309
                           || (event.type==SDL_TEXTEDITING && (windowID=event.edit.windowID)!=SDL_GetWindowID(re->ui->win))
307 310
                           || (event.type==SDL_TEXTINPUT && (windowID=event.text.windowID)!=SDL_GetWindowID(re->ui->win))
311
+                          || (event.type==SDL_MOUSEWHEEL && (windowID=event.text.windowID)!=SDL_GetWindowID(re->ui->win))
308 312
                           ) {
309 313
                                 printout_t *printout;
310 314
                                 for(i=0;i<re->sizeprints;i++) {
... ...
@@ -316,6 +320,7 @@ fprintf(stderr,"RENDER\n");
316 320
                                 if(i>=re->sizeprints)
317 321
                                         continue; /* unknown window */
318 322
                                 printout=re->prints+i;
323
+                                /* transfor mousewheel events to keydown events */
319 324
                                 switch(event.type) {
320 325
                                         case SDL_WINDOWEVENT:
321 326
                                                 if(event.window.event==SDL_WINDOWEVENT_SHOWN
... ...
@@ -331,18 +336,24 @@ fprintf(stderr,"RENDER\n");
331 336
                                                 }
332 337
                                                 break;
333 338
                                         case SDL_KEYDOWN:
334
-                                                if(event.key.keysym.sym==SDLK_ESCAPE) {
339
+                                        case SDL_MOUSEWHEEL:
340
+                                                if(event.type==SDL_KEYDOWN && event.key.keysym.sym==SDLK_ESCAPE) {
335 341
                                                         re_delprint(re,i);
336
-                                                } if(event.key.keysym.sym==SDLK_DOWN || event.key.keysym.sym==SDLK_UP || event.key.keysym.sym==SDLK_PAGEDOWN || event.key.keysym.sym==SDLK_PAGEUP) {
342
+                                                } if(event.type==SDL_MOUSEWHEEL || (event.type==SDL_KEYDOWN
343
+                                                  && (event.key.keysym.sym==SDLK_DOWN || event.key.keysym.sym==SDLK_UP
344
+                                                   || event.key.keysym.sym==SDLK_PAGEDOWN || event.key.keysym.sym==SDLK_PAGEUP))) {
337 345
                                                         int neworiginline;
338 346
                                                         int maxrow;
339 347
                                                         int linetotal;
348
+                                                        int wheelamount;
349
+                                                        wheelamount=(event.type==SDL_MOUSEWHEEL)?re_wheelaccel(re,-event.wheel.y):0;
340 350
                                                         maxrow=printout->ui->h/printout->ui->fontheight-1;
341 351
                                                         neworiginline=printout->originline;
342
-                                                        neworiginline+=(event.key.keysym.sym==SDLK_UP)?-1:
343
-                                                                       (event.key.keysym.sym==SDLK_DOWN)?1:
344
-                                                                       (event.key.keysym.sym==SDLK_PAGEUP)?-maxrow:
345
-                                                                       (event.key.keysym.sym==SDLK_PAGEDOWN)?maxrow:
352
+                                                        neworiginline+=(event.type==SDL_KEYDOWN && event.key.keysym.sym==SDLK_UP)?-1:
353
+                                                                       (event.type==SDL_KEYDOWN && event.key.keysym.sym==SDLK_DOWN)?1:
354
+                                                                       (event.type==SDL_KEYDOWN && event.key.keysym.sym==SDLK_PAGEUP)?-maxrow:
355
+                                                                       (event.type==SDL_KEYDOWN && event.key.keysym.sym==SDLK_PAGEDOWN)?maxrow:
356
+                                                                       (event.type==SDL_MOUSEWHEEL)?wheelamount:
346 357
                                                                        0;
347 358
                                                         linetotal=redata_line_total((printout->data!=NULL)?printout->data:re->data);
348 359
                                                         neworiginline=(neworiginline<0)?0:neworiginline;
... ...
@@ -351,12 +362,12 @@ fprintf(stderr,"RENDER\n");
351 362
                                                                 break; /* nothing to do, at top */
352 363
                                                         printout->originline=neworiginline;
353 364
                                                         printout->dirty=1;
354
-                                                } else if(event.key.keysym.sym==SDLK_DOWN || event.key.keysym.sym==SDLK_UP) {
365
+                                                } else if(event.type==SDL_KEYDOWN && (event.key.keysym.sym==SDLK_DOWN || event.key.keysym.sym==SDLK_UP)) {
355 366
                                                         if(event.key.keysym.sym==SDLK_UP && printout->originline==0)
356 367
                                                                 break; /* nothing to do, at top */
357 368
                                                         printout->originline+=((event.key.keysym.sym==SDLK_UP)?-1:1);
358 369
                                                         printout->dirty=1;
359
-                                                } else if(event.key.keysym.sym==SDLK_LEFT || event.key.keysym.sym==SDLK_RIGHT) {
370
+                                                } else if(event.type==SDL_KEYDOWN && (event.key.keysym.sym==SDLK_LEFT || event.key.keysym.sym==SDLK_RIGHT)) {
360 371
                                                         if(event.key.keysym.sym==SDLK_LEFT && printout->origincol==0)
361 372
                                                                 break; /* nothing to do, at top */
362 373
                                                         printout->origincol+=((event.key.keysym.sym==SDLK_LEFT)?-1:1)*8;
... ...
@@ -386,19 +397,25 @@ fprintf(stderr,"RENDER\n");
386 397
                                 case SDL_KEYDOWN:
387 398
                                 case SDL_TEXTINPUT:
388 399
                                 case SDL_TEXTEDITING:
400
+                                case SDL_MOUSEWHEEL:
389 401
                                         if(re->viewonly && (event.type==SDL_TEXTINPUT || event.type==SDL_TEXTEDITING))
390 402
                                                 break;
391
-                                        if(re->viewonly && event.type==SDL_KEYDOWN) {
392
-                                                if(event.key.keysym.sym==SDLK_ESCAPE) {
403
+                                        if(re->viewonly && (event.type==SDL_KEYDOWN || event.type==SDL_MOUSEWHEEL)) {
404
+                                                if(event.type==SDL_KEYDOWN && event.key.keysym.sym==SDLK_ESCAPE) {
393 405
                                                         do_exit=1;
394
-                                                } if(event.key.keysym.sym==SDLK_DOWN || event.key.keysym.sym==SDLK_UP || event.key.keysym.sym==SDLK_PAGEDOWN || event.key.keysym.sym==SDLK_PAGEUP) {
406
+                                                } if(event.type==SDL_MOUSEWHEEL || (event.type==SDL_KEYDOWN
407
+                                                  && (event.key.keysym.sym==SDLK_DOWN || event.key.keysym.sym==SDLK_UP
408
+                                                   || event.key.keysym.sym==SDLK_PAGEDOWN || event.key.keysym.sym==SDLK_PAGEUP))) {
395 409
                                                         int neworiginline;
396 410
                                                         int linetotal;
411
+                                                        int wheelamount;
412
+                                                        wheelamount=(event.type==SDL_MOUSEWHEEL)?re_wheelaccel(re,-event.wheel.y):0;
397 413
                                                         neworiginline=re->originline;
398
-                                                        neworiginline+=(event.key.keysym.sym==SDLK_UP)?-1:
399
-                                                                       (event.key.keysym.sym==SDLK_DOWN)?1:
400
-                                                                       (event.key.keysym.sym==SDLK_PAGEUP)?-re->maxrow:
401
-                                                                       (event.key.keysym.sym==SDLK_PAGEDOWN)?re->maxrow:
414
+                                                        neworiginline+=(event.type==SDL_KEYDOWN && event.key.keysym.sym==SDLK_UP)?-1:
415
+                                                                       (event.type==SDL_KEYDOWN && event.key.keysym.sym==SDLK_DOWN)?1:
416
+                                                                       (event.type==SDL_KEYDOWN && event.key.keysym.sym==SDLK_PAGEUP)?-re->maxrow:
417
+                                                                       (event.type==SDL_KEYDOWN && event.key.keysym.sym==SDLK_PAGEDOWN)?re->maxrow:
418
+                                                                       (event.type==SDL_MOUSEWHEEL)?wheelamount:
402 419
                                                                        0;
403 420
                                                         linetotal=redata_line_total(re->data);
404 421
                                                         neworiginline=(neworiginline<0)?0:neworiginline;
... ...
@@ -409,7 +426,7 @@ fprintf(stderr,"RENDER\n");
409 426
                                                         re->originline=neworiginline;
410 427
                                                         re->headerdirty=1;
411 428
                                                         re->contentsdirty=1;
412
-                                                } else if(event.key.keysym.sym==SDLK_LEFT || event.key.keysym.sym==SDLK_RIGHT) {
429
+                                                } else if(event.type==SDL_KEYDOWN && (event.key.keysym.sym==SDLK_LEFT || event.key.keysym.sym==SDLK_RIGHT)) {
413 430
                                                         if(event.key.keysym.sym==SDLK_LEFT && re->origincol==0)
414 431
                                                                 break; /* nothing to do, at top */
415 432
                                                         re->origincol+=((event.key.keysym.sym==SDLK_LEFT)?-1:1)*8;
... ...
@@ -829,6 +846,7 @@ int
829 846
 re_processkey_editing(re_t *re, SDL_Event *event)
830 847
 {
831 848
         SDL_Event fakeevent;
849
+        int wheelamount=0;
832 850
         if(re==NULL || event==NULL)
833 851
                 return(-1); /* sanity check failed */
834 852
         /* convert RETURN KEYDOWN to TEXTINPUT */
... ...
@@ -844,7 +862,6 @@ re_processkey_editing(re_t *re, SDL_Event *event)
844 862
                 event=&fakeevent;
845 863
                 event->type=SDL_TEXTINPUT;
846 864
                 /* If control is pressed, insert a real tab, otherwise, insert spaces until next tabstop */
847
-
848 865
                 if((SDL_GetModState()&KMOD_CTRL)!=0) {
849 866
                         strncpy(event->text.text,"\t",sizeof(event->text.text));
850 867
                         event->text.text[sizeof(event->text.text)-1]='\0';
... ...
@@ -887,6 +904,12 @@ fprintf(stderr,"SDL_KEYDOWN: DELETE\n");
887 904
 #if 0
888 905
 fprintf(stderr,"SDL_KEYDOWN: fake setup ok\n");
889 906
 #endif
907
+        } else if(event->type==SDL_MOUSEWHEEL && event->wheel.y!=0) {
908
+                wheelamount=re_wheelaccel(re,-event->wheel.y);
909
+                memset(&fakeevent,0,sizeof(SDL_Event));
910
+                event=&fakeevent;
911
+                event->type=SDL_KEYDOWN;
912
+                event->key.keysym.sym=(wheelamount>0)?SDLK_DOWN:SDLK_UP;
890 913
         }
891 914
         /* special case: text editing event */
892 915
         if(event->type==SDL_TEXTINPUT) {
... ...
@@ -938,18 +961,20 @@ fprintf(stderr,"SDL_KEYDOWN: sym:%i\n",event->key.keysym.sym);
938 961
         } else if(event->key.keysym.sym==SDLK_DOWN || event->key.keysym.sym==SDLK_UP) {
939 962
                 int move_res;
940 963
                 int oldcol=re->curcol,oldline=re->curline;
941
-                if((SDL_GetModState()&KMOD_CTRL)!=0 && event->key.keysym.sym==SDLK_UP && re->originline==0)
964
+                if(((SDL_GetModState()&KMOD_CTRL)!=0 || wheelamount!=0) && event->key.keysym.sym==SDLK_UP && re->originline==0)
942 965
                         return(0); /* nothing to do, already at top */
943
-                move_res=re_moveupdown(re,(event->key.keysym.sym==SDLK_UP)?-1:1);
966
+                move_res=re_moveupdown(re,(wheelamount!=0)?wheelamount:(event->key.keysym.sym==SDLK_UP)?-1:1);
944 967
                 if(move_res==0 && (SDL_GetModState()&KMOD_SHIFT)!=0 && (re->curcol!=oldcol || re->curline!=oldline)) {
945 968
                         re_sel_resize(re,oldcol,oldline,(event->key.keysym.sym==SDLK_UP)?-1:1);
946 969
                 }
947
-                if(move_res==0 && (SDL_GetModState()&KMOD_CTRL)!=0) {
970
+                if(move_res==0 && ((SDL_GetModState()&KMOD_CTRL)!=0 || wheelamount!=0)) {
948 971
                         if(event->key.keysym.sym==SDLK_UP && re->originline>0) {
949
-                                re->originline--;
972
+                                re->originline-=(wheelamount==0)?1:((wheelamount<0)?-wheelamount:wheelamount);
973
+                                re->originline=(re->originline<0)?0:re->originline;
950 974
                                 re->contentsdirty=1;
951 975
                         } else if(event->key.keysym.sym==SDLK_DOWN && re->originline<re->curline) {
952
-                                re->originline++;
976
+                                re->originline+=(wheelamount==0)?1:((wheelamount<0)?-wheelamount:wheelamount);
977
+                                re->originline=(re->originline>re->curline)?re->curline:re->originline;
953 978
                                 re->contentsdirty=1;
954 979
                         }
955 980
                 }
... ...
@@ -2575,6 +2600,26 @@ re_funclistingxy2line(re_t *re,int mx,int my)
2575 2600
         return(-1);
2576 2601
 }
2577 2602
 
2603
+int
2604
+re_wheelaccel(re_t *re, int rawamount)
2605
+{
2606
+        int wheelamount;
2607
+        struct timeval old;
2608
+        struct timezone dummy;
2609
+        int oldmsec,newmsec,d;
2610
+        if(re==NULL || rawamount==0)
2611
+                return(rawamount);
2612
+        memcpy(&old,&(re->lastwheel),sizeof(old));
2613
+        if(gettimeofday(&(re->lastwheel),&dummy)!=0 || old.tv_sec<(re->lastwheel.tv_sec-1) || old.tv_sec>re->lastwheel.tv_sec)
2614
+                return(rawamount);
2615
+        oldmsec=old.tv_usec/1000;
2616
+        newmsec=re->lastwheel.tv_usec/1000+((old.tv_sec<re->lastwheel.tv_sec)?1000:0);
2617
+        d=newmsec-oldmsec;
2618
+        wheelamount=rawamount;
2619
+        if(d<70)
2620
+                wheelamount*=10;
2621
+        return(wheelamount);
2622
+}
2578 2623
 
2579 2624
 
2580 2625