...
|
...
|
@@ -85,6 +85,9 @@ typedef struct re_t {
|
85
|
85
|
int headerdirty;
|
86
|
86
|
int contentsdirty;
|
87
|
87
|
int command_first_key;
|
|
88
|
+ int selstartactive;
|
|
89
|
+ int selstartline;
|
|
90
|
+ int selstartcol;
|
88
|
91
|
int selactive;
|
89
|
92
|
int sellinefrom,sellineto;
|
90
|
93
|
int selcolfrom,selcolto;
|
...
|
...
|
@@ -350,6 +353,11 @@ fprintf(stderr,"RENDER\n");
|
350
|
353
|
do_exit=1;
|
351
|
354
|
}
|
352
|
355
|
break;
|
|
356
|
+ case SDL_KEYUP:
|
|
357
|
+ if(event.key.keysym.sym==SDLK_RSHIFT || event.key.keysym.sym==SDLK_LSHIFT) {
|
|
358
|
+ re->selstartactive=0;
|
|
359
|
+ }
|
|
360
|
+ break;
|
353
|
361
|
case SDL_KEYDOWN:
|
354
|
362
|
case SDL_TEXTINPUT:
|
355
|
363
|
case SDL_TEXTEDITING:
|
...
|
...
|
@@ -375,6 +383,11 @@ fprintf(stderr,"RENDER\n");
|
375
|
383
|
}
|
376
|
384
|
break;
|
377
|
385
|
}
|
|
386
|
+ if(!re->viewonly && event.type==SDL_KEYDOWN && (event.key.keysym.sym==SDLK_RSHIFT || event.key.keysym.sym==SDLK_LSHIFT)) {
|
|
387
|
+ re->selstartactive=1;
|
|
388
|
+ re->selstartline=re->curline;
|
|
389
|
+ re->selstartcol=re->curcol;
|
|
390
|
+ }
|
378
|
391
|
if(re->command==NULL || strcmp(re->command,COMMAND_WARNING)==0 || strcmp(re->command,COMMAND_INFO)==0)
|
379
|
392
|
re_processkey_editing(re,&event);
|
380
|
393
|
else if(re->command[0]=='\0')
|
...
|
...
|
@@ -843,19 +856,24 @@ fprintf(stderr,"SDL_KEYDOWN: sym:%i\n",event->key.keysym.sym);
|
843
|
856
|
}
|
844
|
857
|
} else if((event->key.keysym.sym==SDLK_LEFT || event->key.keysym.sym==SDLK_RIGHT)) {
|
845
|
858
|
int oldcol=re->curcol,oldline=re->curline;
|
846
|
|
- if(re_moveleftright(re,(event->key.keysym.sym==SDLK_LEFT)?-1:1)==0 && (SDL_GetModState()&KMOD_SHIFT)!=0 && (re->curcol!=oldcol || re->curline!=oldline)) {
|
|
859
|
+ if(re_moveleftright(re,(event->key.keysym.sym==SDLK_LEFT)?-1:1)==0 && (SDL_GetModState()&KMOD_SHIFT)!=0 && (re->curcol!=oldcol || re->curline!=oldline))
|
847
|
860
|
re_sel_resize(re,oldcol,oldline,(event->key.keysym.sym==SDLK_LEFT)?-1:1);
|
848
|
|
- }
|
849
|
861
|
} else if((SDL_GetModState()&KMOD_CTRL)!=0 && (event->key.keysym.sym==SDLK_PAGEDOWN || event->key.keysym.sym==SDLK_PAGEUP)) {
|
850
|
862
|
long cursorpos;
|
|
863
|
+ int oldcol=re->curcol,oldline=re->curline;
|
851
|
864
|
cursorpos=(event->key.keysym.sym==SDLK_PAGEDOWN)?(redata_getused(re->data)-1):0;
|
852
|
865
|
cursorpos=(cursorpos<0)?0:cursorpos;
|
853
|
866
|
redata_pos2linecol(re->data,cursorpos,&(re->curline),&(re->curcol));
|
854
|
867
|
re_fixorigin_center(re);
|
|
868
|
+ if((SDL_GetModState()&KMOD_SHIFT)!=0 && (re->curcol!=oldcol || re->curline!=oldline))
|
|
869
|
+ re_sel_resize(re,oldcol,oldline,(event->key.keysym.sym==SDLK_PAGEUP)?-1:1);
|
855
|
870
|
re->headerdirty=1;
|
856
|
871
|
re->contentsdirty=1;
|
857
|
872
|
} else if(event->key.keysym.sym==SDLK_PAGEDOWN || event->key.keysym.sym==SDLK_PAGEUP) {
|
|
873
|
+ int oldcol=re->curcol,oldline=re->curline;
|
858
|
874
|
re_moveupdown(re,(event->key.keysym.sym==SDLK_PAGEUP)?-(re->maxrow):re->maxrow);
|
|
875
|
+ if((SDL_GetModState()&KMOD_SHIFT)!=0 && (re->curcol!=oldcol || re->curline!=oldline))
|
|
876
|
+ re_sel_resize(re,oldcol,oldline,(event->key.keysym.sym==SDLK_PAGEUP)?-1:1);
|
859
|
877
|
} else if(event->key.keysym.sym==SDLK_HOME || event->key.keysym.sym==SDLK_END) {
|
860
|
878
|
long newpos;
|
861
|
879
|
long cursorpos;
|
...
|
...
|
@@ -869,9 +887,8 @@ fprintf(stderr,"SDL_KEYDOWN: sym:%i\n",event->key.keysym.sym);
|
869
|
887
|
cursorpos=newpos;
|
870
|
888
|
if(redata_pos2linecol(re->data,cursorpos,NULL,&(re->curcol))==-1)
|
871
|
889
|
return(-1); /* couldn't get col of current pos */;
|
872
|
|
- if((SDL_GetModState()&KMOD_SHIFT)!=0 && (re->curcol!=oldcol || re->curline!=oldline)) {
|
|
890
|
+ if((SDL_GetModState()&KMOD_SHIFT)!=0 && (re->curcol!=oldcol || re->curline!=oldline))
|
873
|
891
|
re_sel_resize(re,oldcol,oldline,(event->key.keysym.sym==SDLK_HOME)?-1:1);
|
874
|
|
- }
|
875
|
892
|
re_fixorigin(re);
|
876
|
893
|
re->headerdirty=1;
|
877
|
894
|
re->contentsdirty=1;
|
...
|
...
|
@@ -1632,27 +1649,40 @@ re_sel_resize(re_t *re,int oldcol,int oldline,int direction)
|
1632
|
1649
|
{
|
1633
|
1650
|
if(re==NULL || oldcol<0 || oldline<0 || (direction!=-1 && direction!=1))
|
1634
|
1651
|
return(-1);
|
1635
|
|
- if(direction==-1) {
|
1636
|
|
- if(re->selactive==0) {
|
1637
|
|
- re_sel_setstart(re,re->curline,re->curcol);
|
1638
|
|
- re_sel_setend(re,oldline,oldcol);
|
1639
|
|
- } else if(re_sel_lincolisafter(re,re->curline,re->curcol) || re_sel_lincolisinside(re,re->curline,re->curcol)) {
|
1640
|
|
- re_sel_setend(re,re->curline,re->curcol);
|
|
1652
|
+ if(re->selstartactive==0) {
|
|
1653
|
+ /* we don't know the start position, manage with the nifo we have */
|
|
1654
|
+ if(direction==-1) {
|
|
1655
|
+ if(re->selactive==0) {
|
|
1656
|
+ re_sel_setstart(re,re->curline,re->curcol);
|
|
1657
|
+ re_sel_setend(re,oldline,oldcol);
|
|
1658
|
+ } else if(re_sel_lincolisafter(re,re->curline,re->curcol) || re_sel_lincolisinside(re,re->curline,re->curcol)) {
|
|
1659
|
+ re_sel_setend(re,re->curline,re->curcol);
|
|
1660
|
+ } else {
|
|
1661
|
+ re_sel_setstart(re,re->curline,re->curcol);
|
|
1662
|
+ }
|
1641
|
1663
|
} else {
|
1642
|
|
- re_sel_setstart(re,re->curline,re->curcol);
|
|
1664
|
+ if(re->selactive==0 || re_sel_lincolisbefore(re,oldline,oldcol)) {
|
|
1665
|
+ re_sel_setstart(re,oldline,oldcol);
|
|
1666
|
+ re_sel_setend(re,re->curline,re->curcol);
|
|
1667
|
+ } else if(re_sel_lincolisinside(re,oldline,oldcol)) {
|
|
1668
|
+ re_sel_setstart(re,re->curline,re->curcol);
|
|
1669
|
+ } else {
|
|
1670
|
+ re_sel_setend(re,re->curline,re->curcol);
|
|
1671
|
+ }
|
1643
|
1672
|
}
|
1644
|
1673
|
} else {
|
1645
|
|
- if(re->selactive==0 || re_sel_lincolisbefore(re,oldline,oldcol)) {
|
1646
|
|
- re_sel_setstart(re,oldline,oldcol);
|
1647
|
|
- re_sel_setend(re,re->curline,re->curcol);
|
1648
|
|
- } else if(re_sel_lincolisinside(re,oldline,oldcol)) {
|
|
1674
|
+ /* we know the start position, try to select accordingly */
|
|
1675
|
+ if(re->curline<re->selstartline || (re->curline==re->selstartline && re->curcol<=re->selstartcol)) {
|
1649
|
1676
|
re_sel_setstart(re,re->curline,re->curcol);
|
|
1677
|
+ re_sel_setend(re,re->selstartline,re->selstartcol);
|
1650
|
1678
|
} else {
|
|
1679
|
+ re_sel_setstart(re,re->selstartline,re->selstartcol);
|
1651
|
1680
|
re_sel_setend(re,re->curline,re->curcol);
|
1652
|
1681
|
}
|
1653
|
1682
|
}
|
1654
|
1683
|
if(re->sellinefrom==re->sellineto && re->selcolfrom==re->selcolto)
|
1655
|
1684
|
re->selactive=0;
|
|
1685
|
+
|
1656
|
1686
|
return(0);
|
1657
|
1687
|
}
|
1658
|
1688
|
|