...
|
...
|
@@ -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
|
|