...
|
...
|
@@ -48,6 +48,8 @@ void re_free(re_t *re);
|
48
|
48
|
|
49
|
49
|
int re_setfilename(re_t *re, char *filename);
|
50
|
50
|
int re_processkey(re_t *re, SDL_Event *event);
|
|
51
|
+int re_moveupdown(re_t *re, int totalinc);
|
|
52
|
+int re_moveleftright(re_t *re, int totalinc);
|
51
|
53
|
int re_drawheader(re_t *re);
|
52
|
54
|
int re_drawcontents(re_t *re);
|
53
|
55
|
|
...
|
...
|
@@ -209,27 +211,61 @@ re_setfilename(re_t *re, char *filename)
|
209
|
211
|
int
|
210
|
212
|
re_processkey(re_t *re, SDL_Event *event)
|
211
|
213
|
{
|
212
|
|
- long newpos,newpos2;
|
213
|
|
- char *ptr,*ptr2;
|
|
214
|
+ long newpos;
|
|
215
|
+ char *ptr;
|
214
|
216
|
int len;
|
215
|
217
|
int has_nl;
|
216
|
|
- int maxcol;
|
217
|
|
- int inc;
|
218
|
218
|
if(re==NULL || event==NULL || event->type!=SDL_KEYDOWN)
|
219
|
219
|
return(-1); /* sanity check failed */
|
220
|
220
|
if(event->key.keysym.sym==SDLK_DOWN || event->key.keysym.sym==SDLK_UP) {
|
|
221
|
+ re_moveupdown(re,(event->key.keysym.sym==SDLK_UP)?-1:1);
|
|
222
|
+ } else if(event->key.keysym.sym==SDLK_LEFT || event->key.keysym.sym==SDLK_RIGHT) {
|
|
223
|
+ re_moveleftright(re,(event->key.keysym.sym==SDLK_LEFT)?-1:1);
|
|
224
|
+ } else if(event->key.keysym.sym==SDLK_PAGEDOWN || event->key.keysym.sym==SDLK_PAGEUP) {
|
|
225
|
+ re_moveupdown(re,(event->key.keysym.sym==SDLK_PAGEUP)?-(re->maxrow):re->maxrow);
|
|
226
|
+ } else if(event->key.keysym.sym==SDLK_HOME || event->key.keysym.sym==SDLK_END) {
|
221
|
227
|
if(redata_line_info(re->data,re->cursorpos,&newpos,&ptr,&len)==-1)
|
222
|
228
|
return(-1); /* couldn't get current line data */
|
223
|
|
- if(event->key.keysym.sym==SDLK_UP && newpos==0)
|
224
|
|
- return(-1); /* going up but already at top */
|
225
|
|
-#if 0
|
226
|
|
- maxcol=redata_generic_utf8len(ptr,len);
|
227
|
|
- if(maxcol<re->curcol)
|
228
|
|
- re->cursorpos=newpos+len;
|
229
|
|
- else
|
230
|
|
- re->cursorpos=newpos+(redata_generic_utf8col(ptr,len,re->curcol)-ptr);
|
231
|
|
-#endif
|
232
|
|
- if(redata_line_info(re->data,(event->key.keysym.sym==SDLK_DOWN)?(newpos+len):(newpos-1),&newpos2,&ptr,&len)==-1)
|
|
229
|
+ has_nl=((len>0 && ptr[len-1]=='\n')?1:0);
|
|
230
|
+ re->cursorpos=(event->key.keysym.sym==SDLK_HOME)?newpos:newpos+len-has_nl;
|
|
231
|
+ redata_pos2linecol(re->data,re->cursorpos,&(re->curline),&(re->curcol));
|
|
232
|
+ if(re->curcol<re->origincol) {
|
|
233
|
+ re->origincol=re->curcol;
|
|
234
|
+ re->origincol=(re->origincol<0)?0:re->origincol;
|
|
235
|
+ }
|
|
236
|
+ if(re->curcol>(re->origincol+re->maxcol-COLFORCESCROLL)) {
|
|
237
|
+ re->origincol=re->curcol+COLFORCESCROLL-re->maxcol;
|
|
238
|
+ re->origincol=(re->origincol<0)?0:re->origincol;
|
|
239
|
+ }
|
|
240
|
+ re->contentsdirty=1;
|
|
241
|
+ re_drawheader(re);
|
|
242
|
+ } else if(event->key.keysym.sym==SDLK_a) {
|
|
243
|
+ ;
|
|
244
|
+ }
|
|
245
|
+ return(-1);
|
|
246
|
+}
|
|
247
|
+
|
|
248
|
+int
|
|
249
|
+re_moveupdown(re_t *re, int totalinc)
|
|
250
|
+{
|
|
251
|
+ long newpos,newpos2;
|
|
252
|
+ char *ptr;
|
|
253
|
+ int len;
|
|
254
|
+ int has_nl;
|
|
255
|
+ int maxcol;
|
|
256
|
+ int inc,doneinc;
|
|
257
|
+
|
|
258
|
+ if(re==NULL)
|
|
259
|
+ return(-1); /* sanity check failed */
|
|
260
|
+ if(totalinc==0)
|
|
261
|
+ return(0); /* nothing to do */
|
|
262
|
+ inc=(totalinc<0)?-1:1;
|
|
263
|
+ for(doneinc=0;doneinc!=totalinc;doneinc+=inc) {
|
|
264
|
+ if(redata_line_info(re->data,re->cursorpos,&newpos,&ptr,&len)==-1)
|
|
265
|
+ return(-1); /* couldn't get current line data */
|
|
266
|
+ if(inc==-1 && newpos==0)
|
|
267
|
+ return(0); /* going up but already at top; nothing to do */
|
|
268
|
+ if(redata_line_info(re->data,(inc==1)?(newpos+len):(newpos-1),&newpos2,&ptr,&len)==-1)
|
233
|
269
|
return(-1); /* couldn't get next line data */
|
234
|
270
|
has_nl=((len>0 && ptr[len-1]=='\n')?1:0);
|
235
|
271
|
maxcol=redata_generic_utf8len(ptr,len)-has_nl;
|
...
|
...
|
@@ -237,22 +273,40 @@ re_processkey(re_t *re, SDL_Event *event)
|
237
|
273
|
re->cursorpos=newpos2+len-has_nl;
|
238
|
274
|
else
|
239
|
275
|
re->cursorpos=newpos2+(redata_generic_utf8col(ptr,len,re->curcol)-ptr);
|
240
|
|
- re->curline+=(event->key.keysym.sym==SDLK_DOWN)?1:-1;
|
|
276
|
+ re->curline+=inc;
|
241
|
277
|
if(re->curline<(re->originline+LINEFORCESCROLL)) {
|
242
|
278
|
re->originline-=LINEFORCESCROLL;
|
243
|
279
|
re->originline=(re->originline<0)?0:re->originline;
|
244
|
280
|
}
|
245
|
281
|
if(re->curline>(re->originline+re->maxrow-LINEFORCESCROLL))
|
246
|
282
|
re->originline+=LINEFORCESCROLL;
|
247
|
|
- re_drawheader(re);
|
248
|
283
|
re->contentsdirty=1;
|
249
|
|
- } else if(event->key.keysym.sym==SDLK_LEFT || event->key.keysym.sym==SDLK_RIGHT) {
|
|
284
|
+ }
|
|
285
|
+ re_drawheader(re);
|
|
286
|
+ return(0);
|
|
287
|
+}
|
|
288
|
+
|
|
289
|
+int
|
|
290
|
+re_moveleftright(re_t *re, int totalinc)
|
|
291
|
+{
|
|
292
|
+ long newpos;
|
|
293
|
+ char *ptr,*ptr2;
|
|
294
|
+ int len;
|
|
295
|
+ int has_nl;
|
|
296
|
+ int maxcol;
|
|
297
|
+ int inc,doneinc;
|
|
298
|
+
|
|
299
|
+ if(re==NULL)
|
|
300
|
+ return(-1); /* sanity check failed */
|
|
301
|
+ if(totalinc==0)
|
|
302
|
+ return(0); /* nothing to do */
|
|
303
|
+ inc=(totalinc<0)?-1:1;
|
|
304
|
+ for(doneinc=0;doneinc!=totalinc;doneinc+=inc) {
|
250
|
305
|
if(redata_line_info(re->data,re->cursorpos,&newpos,&ptr,&len)==-1)
|
251
|
306
|
return(-1); /* couldn't get current line data */
|
252
|
|
- if(event->key.keysym.sym==SDLK_LEFT && re->cursorpos==0)
|
|
307
|
+ if(inc==-1 && re->cursorpos==0)
|
253
|
308
|
return(-1); /* going left but already at leftmost char */
|
254
|
309
|
maxcol=redata_generic_utf8len(ptr,len);
|
255
|
|
- inc=(event->key.keysym.sym==SDLK_LEFT)?-1:1;
|
256
|
310
|
has_nl=((len>0 && ptr[len-1]=='\n')?1:0);
|
257
|
311
|
if(re->curcol<=maxcol)
|
258
|
312
|
ptr2=redata_generic_utf8col(ptr,len,re->curcol+inc);
|
...
|
...
|
@@ -270,15 +324,12 @@ re_processkey(re_t *re, SDL_Event *event)
|
270
|
324
|
}
|
271
|
325
|
if(re->curcol>(re->origincol+re->maxcol-COLFORCESCROLL))
|
272
|
326
|
re->origincol+=COLFORCESCROLL;
|
273
|
|
- re_drawheader(re);
|
274
|
327
|
re->contentsdirty=1;
|
275
|
|
- } else if(event->key.keysym.sym==SDLK_a) {
|
276
|
|
- ;
|
277
|
328
|
}
|
278
|
|
- return(-1);
|
|
329
|
+ re_drawheader(re);
|
|
330
|
+ return(0);
|
279
|
331
|
}
|
280
|
332
|
|
281
|
|
-
|
282
|
333
|
int
|
283
|
334
|
re_drawheader(re_t *re)
|
284
|
335
|
{
|