...
|
...
|
@@ -103,10 +103,12 @@ int re_moveleftright(re_t *re, int totalinc);
|
103
|
103
|
int re_changefontsize(re_t *re, int direction);
|
104
|
104
|
int re_sel_setstart(re_t *re, int line, int col);
|
105
|
105
|
int re_sel_setend(re_t *re, int line, int col);
|
|
106
|
+int re_sel_resize(re_t *re,int oldcol,int oldline,int direction);
|
106
|
107
|
int re_sel_toggle(re_t *re);
|
107
|
108
|
int re_sel_lincolisinside(re_t *re, int line, int col);
|
108
|
109
|
int re_sel_lincolisbefore(re_t *re, int line, int col);
|
109
|
110
|
int re_sel_lincolisafter(re_t *re, int line, int col);
|
|
111
|
+int re_sel_lincolisend(re_t *re, int line, int col);
|
110
|
112
|
int re_selectbuf_resize(re_t *re,long size);
|
111
|
113
|
int re_selectbuf_fill(re_t *re,long frompos,long size, int nadditionalspaces);
|
112
|
114
|
int re_selectbuf_replace(re_t *re,char *newdata);
|
...
|
...
|
@@ -356,7 +358,7 @@ re_free(re_t *re)
|
356
|
358
|
if(re->data!=NULL)
|
357
|
359
|
redata_free(re->data),re->data=NULL;
|
358
|
360
|
if(re->selectbuf!=NULL)
|
359
|
|
- free(re->selectbuf),re->selectbuf=NULL,re->usedselectbuf=re->sizeselectbuf=NULL;
|
|
361
|
+ free(re->selectbuf),re->selectbuf=NULL,re->usedselectbuf=re->sizeselectbuf=0;
|
360
|
362
|
free(re),re=NULL;
|
361
|
363
|
return;
|
362
|
364
|
}
|
...
|
...
|
@@ -547,32 +549,37 @@ fprintf(stderr,"SDL_TEXTEDITING: composition:\"%s\" start:%i len:%i\n",event->ed
|
547
|
549
|
#if 0
|
548
|
550
|
fprintf(stderr,"SDL_KEYDOWN: sym:%i\n",event->key.keysym.sym);
|
549
|
551
|
#endif
|
550
|
|
- if(event->key.keysym.sym==SDLK_DOWN || event->key.keysym.sym==SDLK_UP) {
|
551
|
|
-#warning #error BUG: Played with selections a bit, resized font twice, go down a lot of lines, when after about last line previously displayed it segfaulted
|
552
|
|
- int oldcol=re->curline,oldline=re->curcol;
|
|
552
|
+ if((SDL_GetModState()&KMOD_ALT)!=0 && re->selactive && (event->key.keysym.sym==SDLK_LEFT || event->key.keysym.sym==SDLK_RIGHT)) {
|
|
553
|
+ int l;
|
|
554
|
+ int is_del;
|
|
555
|
+ int tolinefix;
|
|
556
|
+ long pos,pos2;
|
|
557
|
+ is_del=(event->key.keysym.sym==SDLK_LEFT)?1:0;
|
|
558
|
+ redata_undo_groupinit(re->data,NULL);
|
|
559
|
+ tolinefix=(re->selcolto==0)?1:0;
|
|
560
|
+ for(l=re->sellinefrom;l<=(re->sellineto-tolinefix);l++) {
|
|
561
|
+ if(redata_linecol2pos(re->data,l,0,&pos,NULL)!=0)
|
|
562
|
+ continue;
|
|
563
|
+ if(is_del==1 && redata_linecol2pos(re->data,l,1,&pos2,NULL)!=0)
|
|
564
|
+ continue;
|
|
565
|
+ if(!is_del)
|
|
566
|
+ redata_op_add(re->data,pos," ",1,NULL);
|
|
567
|
+ else if(pos!=pos2)
|
|
568
|
+ redata_op_del(re->data,pos,pos2-pos,NULL);
|
|
569
|
+ }
|
|
570
|
+ redata_undo_groupcommit(re->data,NULL);
|
|
571
|
+ redata_linecol2pos(re->data,re->curline,re->curcol,&(re->cursorpos),NULL);
|
|
572
|
+ re->headerdirty=1;
|
|
573
|
+ re->contentsdirty=1;
|
|
574
|
+ } else if(event->key.keysym.sym==SDLK_DOWN || event->key.keysym.sym==SDLK_UP) {
|
|
575
|
+ int oldcol=re->curcol,oldline=re->curline;
|
553
|
576
|
if(re_moveupdown(re,(event->key.keysym.sym==SDLK_UP)?-1:1)==0 && (SDL_GetModState()&KMOD_SHIFT)!=0 && (re->curcol!=oldcol || re->curline!=oldline)) {
|
554
|
|
- if(event->key.keysym.sym==SDLK_UP) {
|
555
|
|
- if(re->selactive==0 || re_sel_lincolisafter(re,oldcol,oldline))
|
556
|
|
- re_sel_setend(re,oldcol,oldline);
|
557
|
|
- re_sel_setstart(re,re->curline,re->curcol);
|
558
|
|
- } else {
|
559
|
|
- if(re->selactive==0 || re_sel_lincolisbefore(re,oldcol,oldline))
|
560
|
|
- re_sel_setstart(re,oldcol,oldline);
|
561
|
|
- re_sel_setend(re,re->curline,re->curcol);
|
562
|
|
- }
|
|
577
|
+ re_sel_resize(re,oldcol,oldline,(event->key.keysym.sym==SDLK_UP)?-1:1);
|
563
|
578
|
}
|
564
|
579
|
} else if(event->key.keysym.sym==SDLK_LEFT || event->key.keysym.sym==SDLK_RIGHT) {
|
565
|
|
- int oldcol=re->curline,oldline=re->curcol;
|
|
580
|
+ int oldcol=re->curcol,oldline=re->curline;
|
566
|
581
|
if(re_moveleftright(re,(event->key.keysym.sym==SDLK_LEFT)?-1:1)==0 && (SDL_GetModState()&KMOD_SHIFT)!=0 && (re->curcol!=oldcol || re->curline!=oldline)) {
|
567
|
|
- if(event->key.keysym.sym==SDLK_LEFT) {
|
568
|
|
- if(re->selactive==0 || re_sel_lincolisafter(re,oldcol,oldline))
|
569
|
|
- re_sel_setend(re,oldcol,oldline);
|
570
|
|
- re_sel_setstart(re,re->curline,re->curcol);
|
571
|
|
- } else {
|
572
|
|
- if(re->selactive==0 || re_sel_lincolisbefore(re,oldcol,oldline))
|
573
|
|
- re_sel_setstart(re,oldcol,oldline);
|
574
|
|
- re_sel_setend(re,re->curline,re->curcol);
|
575
|
|
- }
|
|
582
|
+ re_sel_resize(re,oldcol,oldline,(event->key.keysym.sym==SDLK_LEFT)?-1:1);
|
576
|
583
|
}
|
577
|
584
|
} else if((SDL_GetModState()&KMOD_CTRL)!=0 && (event->key.keysym.sym==SDLK_PAGEDOWN || event->key.keysym.sym==SDLK_PAGEUP)) {
|
578
|
585
|
re->cursorpos=(event->key.keysym.sym==SDLK_PAGEDOWN)?(redata_getused(re->data)-1):0;
|
...
|
...
|
@@ -702,7 +709,8 @@ fprintf(stderr,"re_processkey(): received Control+'0'\n");
|
702
|
709
|
re_changefontsize(re, 0);
|
703
|
710
|
re->ignorenkeys++;
|
704
|
711
|
} else if((event->key.keysym.sym==SDLK_c || event->key.keysym.sym==SDLK_x) && (SDL_GetModState()&KMOD_CTRL)!=0) {
|
705
|
|
- long frompos,topos,coldone;
|
|
712
|
+ long frompos,topos;
|
|
713
|
+ int coldone;
|
706
|
714
|
int is_cut=(event->key.keysym.sym==SDLK_x)?1:0;
|
707
|
715
|
fprintf(stderr,"re_processkey(): received Control+%c\n",is_cut?'x':'c');
|
708
|
716
|
/* CUA92-style copy (ctrl+c) / cut (ctrl+x) */
|
...
|
...
|
@@ -782,7 +790,8 @@ re_processkey_commandwait(re_t *re, SDL_Event *event)
|
782
|
790
|
re->command=NULL;
|
783
|
791
|
re->headerdirty=1;
|
784
|
792
|
} else if(re->command_first_key=='k' && event->key.keysym.sym==SDLK_y) {
|
785
|
|
- long frompos,topos,coldone;
|
|
793
|
+ long frompos,topos;
|
|
794
|
+ int coldone;
|
786
|
795
|
/* wordstar-style blockdel (ctrl+k+y) */
|
787
|
796
|
if(re->selactive
|
788
|
797
|
&& redata_linecol2pos(re->data,re->sellinefrom,re->selcolfrom,&frompos,NULL)==0
|
...
|
...
|
@@ -1163,6 +1172,35 @@ re_sel_setend(re_t *re, int line, int col)
|
1163
|
1172
|
return(0);
|
1164
|
1173
|
}
|
1165
|
1174
|
|
|
1175
|
+int
|
|
1176
|
+re_sel_resize(re_t *re,int oldcol,int oldline,int direction)
|
|
1177
|
+{
|
|
1178
|
+ if(re==NULL || oldcol<0 || oldline<0 || (direction!=-1 && direction!=1))
|
|
1179
|
+ return(-1);
|
|
1180
|
+ if(direction==-1) {
|
|
1181
|
+ if(re->selactive==0) {
|
|
1182
|
+ re_sel_setstart(re,re->curline,re->curcol);
|
|
1183
|
+ re_sel_setend(re,oldline,oldcol);
|
|
1184
|
+ } else if(re_sel_lincolisafter(re,re->curline,re->curcol) || re_sel_lincolisinside(re,re->curline,re->curcol)) {
|
|
1185
|
+ re_sel_setend(re,re->curline,re->curcol);
|
|
1186
|
+ } else {
|
|
1187
|
+ re_sel_setstart(re,re->curline,re->curcol);
|
|
1188
|
+ }
|
|
1189
|
+ } else {
|
|
1190
|
+ if(re->selactive==0 || re_sel_lincolisbefore(re,oldline,oldcol)) {
|
|
1191
|
+ re_sel_setstart(re,oldline,oldcol);
|
|
1192
|
+ re_sel_setend(re,re->curline,re->curcol);
|
|
1193
|
+ } else if(re_sel_lincolisinside(re,oldline,oldcol)) {
|
|
1194
|
+ re_sel_setstart(re,re->curline,re->curcol);
|
|
1195
|
+ } else {
|
|
1196
|
+ re_sel_setend(re,re->curline,re->curcol);
|
|
1197
|
+ }
|
|
1198
|
+ }
|
|
1199
|
+ if(re->sellinefrom==re->sellineto && re->selcolfrom==re->selcolto)
|
|
1200
|
+ re->selactive=0;
|
|
1201
|
+ return(0);
|
|
1202
|
+}
|
|
1203
|
+
|
1166
|
1204
|
int
|
1167
|
1205
|
re_sel_toggle(re_t *re)
|
1168
|
1206
|
{
|
...
|
...
|
@@ -1216,6 +1254,17 @@ re_sel_lincolisafter(re_t *re, int line, int col)
|
1216
|
1254
|
return(0);
|
1217
|
1255
|
}
|
1218
|
1256
|
|
|
1257
|
+int
|
|
1258
|
+re_sel_lincolisend(re_t *re, int line, int col)
|
|
1259
|
+{
|
|
1260
|
+ if(re==NULL || line<0 || col<0)
|
|
1261
|
+ return(0);
|
|
1262
|
+ if(line==re->sellineto && col==re->selcolto)
|
|
1263
|
+ return(1);
|
|
1264
|
+ return(0);
|
|
1265
|
+}
|
|
1266
|
+
|
|
1267
|
+
|
1219
|
1268
|
int
|
1220
|
1269
|
re_selectbuf_resize(re_t *re,long size)
|
1221
|
1270
|
{
|