Browse code

Normalize the scroll behaviour by using the same function everywhere instead of multiple instances of ad-hoc code to scroll.

Dario Rodriguez authored on 09/10/2020 22:44:05
Showing 1 changed files
... ...
@@ -77,6 +77,7 @@ int re_setuidata(re_t *re);
77 77
 
78 78
 int re_setfilename(re_t *re, char *filename);
79 79
 int re_fixorigin(re_t *re);
80
+int re_fixorigin_center(re_t *re);
80 81
 int re_processkey_editing(re_t *re, SDL_Event *event);
81 82
 int re_processkey_commandwait(re_t *re, SDL_Event *event);
82 83
 int re_processkey_commanddata(re_t *re, SDL_Event *event);
... ...
@@ -335,11 +336,7 @@ re_setuidata(re_t *re)
335 336
         re->x=0,re->y=re->ui->fontheight,re->w=re->ui->w,re->h=re->ui->h-re->y;
336 337
         re->maxrow=re->h/re->ui->fontheight-1;
337 338
         re->maxcol=re->w/re->ui->fontwidth-1;
338
-        if(re->curline>=(re->originline+re->maxrow)) {
339
-                re->originline=re->curline-re->maxrow;
340
-                re->originline=(re->originline<0)?0:re->originline;
341
-        }
342
-        re->origincol=(re->curcol>(re->maxcol-COLFORCESCROLL))?(re->curcol-(re->maxcol-COLFORCESCROLL)):0;
339
+        re_fixorigin(re);
343 340
         return(0);
344 341
 }
345 342
 
... ...
@@ -358,6 +355,30 @@ re_setfilename(re_t *re, char *filename)
358 355
 
359 356
 int
360 357
 re_fixorigin(re_t *re)
358
+{
359
+        if(re==NULL)
360
+                return(-1);
361
+        if(re->curline<(re->originline+LINEFORCESCROLL)) {
362
+                re->originline=re->curline-LINEFORCESCROLL;
363
+                re->originline=(re->originline<0)?0:re->originline;
364
+        }
365
+        if(re->curline>(re->originline+re->maxrow-LINEFORCESCROLL)) {
366
+                re->originline=re->curline+LINEFORCESCROLL-re->maxrow;
367
+                re->originline=(re->originline<0)?0:(re->originline>re->curline)?re->curline:re->originline;
368
+        }
369
+        if(re->curcol<re->origincol) {
370
+                re->origincol=re->curcol;
371
+                re->origincol=(re->origincol<0)?0:re->origincol;
372
+        }
373
+        if(re->curcol>=(re->origincol+re->maxcol-COLFORCESCROLL)) {
374
+                re->origincol=re->curcol+COLFORCESCROLL-re->maxcol;
375
+                re->origincol=(re->origincol<0)?0:re->origincol;
376
+        }
377
+        return(0);
378
+}
379
+
380
+int
381
+re_fixorigin_center(re_t *re)
361 382
 {
362 383
         if(re==NULL)
363 384
                 return(-1);
... ...
@@ -369,6 +390,7 @@ re_fixorigin(re_t *re)
369 390
         return(0);
370 391
 }
371 392
 
393
+
372 394
 int
373 395
 re_processkey_editing(re_t *re, SDL_Event *event)
374 396
 {
... ...
@@ -376,8 +398,8 @@ re_processkey_editing(re_t *re, SDL_Event *event)
376 398
         if(re==NULL || event==NULL)
377 399
                 return(-1); /* sanity check failed */
378 400
         /* convert RETURN KEYDOWN to TEXTINPUT */
379
-#warning XXX TODO: If the "\n" of end-of-file is deleted using DEL, the editor bugs
380 401
         if(event->type==SDL_KEYDOWN && event->key.keysym.sym==SDLK_RETURN) {
402
+#warning file having two \n at the end, delete the second with DEL staying to the right of the first, if we go down then, it does an scroll but it shouldn't
381 403
                 memset(&fakeevent,0,sizeof(SDL_Event));
382 404
                 event=&fakeevent;
383 405
                 event->type=SDL_TEXTINPUT;
... ...
@@ -496,7 +518,7 @@ fprintf(stderr,"SDL_KEYDOWN: sym:%i\n",event->key.keysym.sym);
496 518
                 re->cursorpos=(event->key.keysym.sym==SDLK_PAGEDOWN)?(redata_getused(re->data)-1):0;
497 519
                 re->cursorpos=(re->cursorpos<0)?0:re->cursorpos;
498 520
                 redata_pos2linecol(re->data,re->cursorpos,&(re->curline),&(re->curcol));
499
-                re_fixorigin(re);
521
+                re_fixorigin_center(re);
500 522
                 re->headerdirty=1;
501 523
                 re->contentsdirty=1;
502 524
         } else if(event->key.keysym.sym==SDLK_PAGEDOWN || event->key.keysym.sym==SDLK_PAGEUP) {
... ...
@@ -510,14 +532,7 @@ fprintf(stderr,"SDL_KEYDOWN: sym:%i\n",event->key.keysym.sym);
510 532
                 re->cursorpos=newpos;
511 533
                 if(redata_pos2linecol(re->data,re->cursorpos,NULL,&(re->curcol))==-1)
512 534
                         return(-1); /* couldn't get col of current pos */;
513
-                if(re->curcol<re->origincol) {
514
-                        re->origincol=re->curcol;
515
-                        re->origincol=(re->origincol<0)?0:re->origincol;
516
-                }
517
-                if(re->curcol>(re->origincol+re->maxcol-COLFORCESCROLL)) {
518
-                        re->origincol=re->curcol+COLFORCESCROLL-re->maxcol;
519
-                        re->origincol=(re->origincol<0)?0:re->origincol;
520
-                }
535
+                re_fixorigin(re);
521 536
                 re->headerdirty=1;
522 537
                 re->contentsdirty=1;
523 538
         } else if(event->key.keysym.sym==SDLK_BACKSPACE && re->cursorpos>0) {
... ...
@@ -733,12 +748,7 @@ fprintf(stderr,"MOVING from cursorpos:%li line:%i col:%i\n",re->cursorpos,re->cu
733 748
                 }
734 749
                 re->cursorpos=realstart;
735 750
                 re->curline+=inc;
736
-                if(re->curline<(re->originline+LINEFORCESCROLL)) {
737
-                        re->originline-=LINEFORCESCROLL;
738
-                        re->originline=(re->originline<0)?0:re->originline;
739
-                }
740
-                if(re->curline>(re->originline+re->maxrow-LINEFORCESCROLL))
741
-                        re->originline+=LINEFORCESCROLL;
751
+                re_fixorigin(re);
742 752
 #if 0
743 753
 fprintf(stderr,"MOVING   to cursorpos:%li line:%i col:%i\n",re->cursorpos,re->curline,re->curcol);
744 754
 #endif