Browse code

Process navigation keys: PageUp/PageDown/Home/End.

Dario Rodriguez authored on 07/09/2020 22:13:24
Showing 1 changed files
... ...
@@ -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
 {