...
|
...
|
@@ -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
|
}
|