Browse code

indent/unindent selection with ALT+RIGHT/ALT+LEFT

Dario Rodriguez authored on 28/11/2020 22:16:21
Showing 1 changed files
... ...
@@ -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
 {