Browse code

Implement TAB: insert spaces until next tabstop. Implement DEL: erase to the right.

Dario Rodriguez authored on 07/10/2020 21:08:18
Showing 2 changed files
... ...
@@ -507,7 +507,8 @@ redata_unsaved_commit(redata_t *redata, redata_plugin_t *slot,char *filename)
507 507
         if(redata==NULL || slot==NULL || unsaved==NULL || unsaved->unsavedfd==-1)
508 508
                 return(-1);
509 509
 #if 1
510
-fprintf(stderr,"UNSAVED_COMMITTED\n");
510
+if(unsaved->usedbuf>0)
511
+        fprintf(stderr,"UNSAVED_COMMITTED\n");
511 512
 #endif
512 513
         for(nwritten=0;nwritten<unsaved->usedbuf;nwritten+=n) {
513 514
                 if((n=write(unsaved->unsavedfd,unsaved->buf+nwritten,unsaved->usedbuf-nwritten))<0) {
... ...
@@ -295,22 +295,63 @@ re_setfilename(re_t *re, char *filename)
295 295
 int
296 296
 re_processkey_editing(re_t *re, SDL_Event *event)
297 297
 {
298
-        SDL_Event returnevent;
298
+        SDL_Event fakeevent;
299 299
         if(re==NULL || event==NULL)
300 300
                 return(-1); /* sanity check failed */
301 301
         /* convert RETURN KEYDOWN to TEXTINPUT */
302
+#warning XXX TODO: If the "\n" of end-of-file is deleted using DEL, the editor bugs
302 303
         if(event->type==SDL_KEYDOWN && event->key.keysym.sym==SDLK_RETURN) {
303
-                memset(&returnevent,0,sizeof(SDL_Event));
304
-                event=&returnevent;
304
+                memset(&fakeevent,0,sizeof(SDL_Event));
305
+                event=&fakeevent;
305 306
                 event->type=SDL_TEXTINPUT;
306 307
                 strncpy(event->text.text,"\n",sizeof(event->text.text));
307 308
                 event->text.text[sizeof(event->text.text)-1]='\0';
309
+        } else if(event->type==SDL_KEYDOWN && event->key.keysym.sym==SDLK_TAB) {
310
+                static char spaces[8]={"        "};
311
+                memset(&fakeevent,0,sizeof(SDL_Event));
312
+                event=&fakeevent;
313
+                event->type=SDL_TEXTINPUT;
314
+                strncpy(event->text.text,spaces+(re->curcol%8),sizeof(event->text.text));
315
+                event->text.text[sizeof(event->text.text)-1]='\0';
316
+        } else if(event->type==SDL_KEYDOWN && event->key.keysym.sym==SDLK_DELETE) {
317
+#if 1
318
+fprintf(stderr,"SDL_KEYDOWN: DELETE\n");
319
+#endif
320
+                long realend;
321
+                int at_end;
322
+                if(re->cursorpos==redata_getused(re->data))
323
+                        return(0); /* already at end, nothing to delete */
324
+                if(redata_line_realend(re->data,re->cursorpos,&realend)==-1)
325
+                        return(-1); /* couldn't get current line info */
326
+                at_end=(re->cursorpos==realend)?1:0;
327
+                memset(&fakeevent,0,sizeof(SDL_Event));
328
+                event=&fakeevent;
329
+                event->type=SDL_KEYDOWN;
330
+                event->key.keysym.sym=SDLK_BACKSPACE;
331
+                redata_undo_groupinit(re->data,NULL);
332
+                if(at_end) {
333
+                        int col;
334
+                        if(redata_pos2linecol(re->data,re->cursorpos,NULL,&col)==-1)
335
+                                return(-1); /* couldn't get line info */
336
+                        if(redata_op_addn(re->data,re->cursorpos,' ',re->curcol-col,NULL)!=0)
337
+                                return(-1); /* couldn't add spaces up to current displayed pos */
338
+                        re->cursorpos+=re->curcol-col;
339
+                        re->cursorpos++;
340
+                        re->curline++;
341
+                        re->curcol=0;
342
+                } else {
343
+                        re_moveleftright(re,1);
344
+                }
345
+#if 1
346
+fprintf(stderr,"SDL_KEYDOWN: fake setup ok\n");
347
+#endif
308 348
         }
309 349
         /* special case: text editing event */
310 350
         if(event->type==SDL_TEXTINPUT) {
311 351
                 int len;
312 352
                 long realend;
313 353
                 int at_end;
354
+                int nspaces;
314 355
                 if(re->ignorenkeys>0) {
315 356
                         re->ignorenkeys--;
316 357
                         return(0); /* this is an already processed key, ignore it */
... ...
@@ -321,13 +362,15 @@ fprintf(stderr,"SDL_TEXTINPUT:\"%s\"\n",event->text.text);
321 362
                 if(redata_line_realend(re->data,re->cursorpos,&realend)==-1)
322 363
                         return(-1); /* couldn't get current line info */
323 364
                 at_end=(re->cursorpos==realend)?1:0;
324
-                if(event->text.text[0]==' ' && event->text.text[1]=='\0' && at_end) {
325
-                        /* instead of adding a space at the end of the line, we move the cursor to the right */
326
-                        re_moveleftright(re,1);
365
+                for(nspaces=0;event->text.text[nspaces]==' ';nspaces++)
366
+                        ;
367
+                if(nspaces>0 && event->text.text[nspaces]=='\0' && at_end) {
368
+                        /* instead of adding spaces at the end of the line, we move the cursor to the right */
369
+                        re_moveleftright(re,nspaces);
327 370
                         return(0); /* no need to add spaces at the end of the line */
328 371
                 }
329 372
                 redata_undo_groupinit(re->data,NULL);
330
-                if(event!=&returnevent && at_end) {
373
+                if(!(event->text.text[0]=='\n' && event->text.text[1]=='\0') && at_end) {
331 374
                         int col;
332 375
                         if(redata_pos2linecol(re->data,re->cursorpos,NULL,&col)==-1)
333 376
                                 return(-1); /* couldn't get line info */
... ...
@@ -340,7 +383,7 @@ fprintf(stderr,"SDL_TEXTINPUT:\"%s\"\n",event->text.text);
340 383
                 if(redata_op_add(re->data,re->cursorpos,event->text.text,len,NULL)!=0)
341 384
                         return(-1); /* couldn't add requested text */
342 385
                 re->cursorpos+=len;
343
-                if(event==&returnevent) {
386
+                if(event->text.text[0]=='\n' && event->text.text[1]=='\0') {
344 387
                         int trimmed;
345 388
                         if(re_rtrim(re,re->cursorpos-len,&trimmed))
346 389
                                 re->cursorpos-=trimmed;
... ...
@@ -363,7 +406,7 @@ fprintf(stderr,"SDL_TEXTEDITING: composition:\"%s\" start:%i len:%i\n",event->ed
363 406
         /* default case: keydown event */
364 407
         if(event->type!=SDL_KEYDOWN)
365 408
                 return(0); /* Ignore other possible events */
366
-#if 0
409
+#if 1
367 410
 fprintf(stderr,"SDL_KEYDOWN: sym:%i\n",event->key.keysym.sym);
368 411
 #endif
369 412
         if(event->key.keysym.sym==SDLK_DOWN || event->key.keysym.sym==SDLK_UP) {
... ...
@@ -398,13 +441,17 @@ fprintf(stderr,"SDL_KEYDOWN: sym:%i\n",event->key.keysym.sym);
398 441
                 int len;
399 442
                 int trimmed;
400 443
                 int doneinc;
444
+#if 0
445
+fprintf(stderr,"SDL_KEYDOWN: BACKSPACE%s\n",(event==&fakeevent)?" (fake)":"");
446
+#endif
401 447
                 if(redata_pos2linecol(re->data,re->cursorpos,&line,&col)==-1)
402 448
                         return(-1); /* couldn't get current line data */
403 449
                 if(col<re->curcol) {
404 450
                         re_moveleftright(re,-1);
405 451
                         return(0); /* were hovering to the right of last char, only had to move left */
406 452
                 }
407
-                redata_undo_groupinit(re->data,NULL);
453
+                if(event!=&fakeevent)
454
+                        redata_undo_groupinit(re->data,NULL);
408 455
                 /* delete the last character */
409 456
                 if(col>0) {
410 457
                         if(redata_line_realstart(re->data,re->cursorpos,&realstart)==-1)
... ...
@@ -846,7 +893,7 @@ re_drawcontents(re_t *re)
846 893
                                         drawn_cursor=1;
847 894
                                         curptr=redata_generic_utf8col(ptr,len-has_nl,re->curcol-tmpcol);
848 895
                                         curptrlen=(curptr==NULL)?0:(len-has_nl)-(curptr-ptr);
849
-                                        reui_write(re->ui,re->x+re->ui->fontwidth*(re->curcol-re->origincol),y,"\xff\xff\xff\xff",curptr,redata_generic_utf8charlen(ptr,curptrlen));
896
+                                        reui_write(re->ui,re->x+re->ui->fontwidth*(re->curcol-re->origincol),y,"\xff\xff\xff\xff",curptr,redata_generic_utf8charlen(curptr,curptrlen));
850 897
                                 }
851 898
 #warning TODO: if it is one of  '[','{','<','>','}',']', highlight the matching bracket/parens/anglebracket.
852 899
                         }