1 /*
2  *  Abuse - dark 2D side-scrolling platform game
3  *  Copyright (c) 1995 Crack dot Com
4  *  Copyright (c) 2005-2011 Sam Hocevar <sam@hocevar.net>
5  *
6  *  This software was released into the Public Domain. As with most public
7  *  domain software, no warranty is made or implied by Crack dot Com, by
8  *  Jonathan Clark, or by Sam Hocevar.
9  */
10 
11 #if defined HAVE_CONFIG_H
12 #   include "config.h"
13 #endif
14 
15 #include "common.h"
16 
17 #include "scroller.h"
18 #define HS_ICON_W 10
19 #define HS_ICON_H 8
20 
21 
22 uint8_t hs_left_arrow[10*8]={
23     0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0,
24     0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,
25     1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1,
26     1, 1, 1, 1, 2, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2,
27     0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
28     2, 0, 0, 0, 0};
29 
30 
31 uint8_t hs_right_arrow[10*8]={
32     0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
33     0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0,
34     0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1,
35     1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 0,
36     0, 0, 0, 0, 0, 2, 1, 1, 0, 0, 0, 0, 0, 0, 2,
37     1, 1, 0, 0, 0};
38 
39 
40 uint8_t vs_up_arrow[8*10]={
41     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 0,
42     0, 0, 0, 1, 1, 1, 1, 2, 0, 0, 1, 2, 1, 1, 2,
43     1, 2, 0, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 1, 1,
44     2, 0, 0, 0, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 1,
45     1, 2, 0, 0, 0, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0,
46     0, 2, 2, 0, 0};
47 
48 
49 uint8_t vs_down_arrow[8*10]={
50     0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 1, 1, 2, 0,
51     0, 0, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 1, 1, 2,
52     0, 0, 0, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 1, 1,
53     2, 0, 0, 0, 1, 2, 1, 1, 2, 1, 2, 0, 0, 1, 1,
54     1, 1, 2, 0, 0, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0,
55     0, 0, 0, 0, 0};
56 
show_icon(image * screen,int x,int y,int icw,int ich,uint8_t * buf)57 void show_icon(image *screen, int x, int y, int icw, int ich, uint8_t *buf)
58 {
59   int cx1, cy1, cx2, cy2;
60   screen->GetClip(cx1, cy1, cx2, cy2);
61   uint8_t remap[3];
62   remap[0]=wm->medium_color();
63   remap[1]=wm->bright_color();
64   remap[2]=wm->dark_color();
65 
66   screen->Lock();
67   for (int yc=ich; yc; yc--,y++)
68   {
69     if (y >= cy1 && y < cy2)
70     {
71       uint8_t *sl=screen->scan_line(y)+x;
72       for (int xc=icw,xo=x; xc; xc--,xo++,sl++,buf++)
73       {
74     if (xo >= cx1 && xo < cx2)
75       *sl=remap[*buf];
76       }
77     }
78   }
79   screen->AddDirty(x, y, x + icw, y + ich);
80   screen->Unlock();
81 }
82 
scroller(int X,int Y,int ID,int L,int H,int Vert,int Total_items,ifield * Next)83 scroller::scroller(int X, int Y, int ID, int L, int H, int Vert, int Total_items, ifield *Next)
84 {  x=X; y=Y; id=ID; next=Next;  l=L; h=H;  sx=0;  t=Total_items;  drag=-1; vert=Vert;
85 }
86 
87 
area(int & x1,int & y1,int & x2,int & y2)88 void scroller::area(int &x1, int &y1, int &x2, int &y2)
89 {
90   area_config();
91   x1=x-1; y1=y-1;
92   if (vert)
93   { x2=x+l+bw();  y2=y+h; }
94   else
95   { x2=x+l;  y2=y+h+bh(); }
96 }
97 
dragger_area(int & x1,int & y1,int & x2,int & y2)98 void scroller::dragger_area(int &x1, int &y1, int &x2, int &y2)
99 {
100   if (vert)
101   { x1=x+l; y1=y+bh(); x2=x+l+bw()-1; y2=y+h-bh()-1; }
102   else { x1=x+bw(); y1=y+h; x2=x+l-bw(); y2=y+h+bh()-1; }
103 }
104 
bh()105 int scroller::bh() { if (vert) return 15; else return 13; }
bw()106 int scroller::bw() { if (vert) return 12; else return 14; }
107 
b1()108 uint8_t *scroller::b1()
109 {
110   if (vert) return vs_up_arrow;
111   else return hs_left_arrow;
112 }
113 
b2()114 uint8_t *scroller::b2()
115 {
116   if (vert) return vs_down_arrow;
117   else return hs_right_arrow;
118 }
119 
120 
draw_first(image * screen)121 void scroller::draw_first(image *screen)
122 {
123   if (sx>=t) sx=t-1;
124   draw(0,screen);
125   screen->widget_bar(b1x(),b1y(),b1x()+bw()-1,b1y()+bh()-1,
126             wm->bright_color(),wm->medium_color(),wm->dark_color());
127   screen->widget_bar(b2x(),b2y(),b2x()+bw()-1,b2y()+bh()-1,
128             wm->bright_color(),wm->medium_color(),wm->dark_color());
129   show_icon(screen,b1x()+2,b1y()+2,bw()-4,bh()-4,b1());
130   show_icon(screen,b2x()+2,b2y()+2,bw()-4,bh()-4,b2());
131 
132   int x1,y1,x2,y2;
133   dragger_area(x1,y1,x2,y2);
134   screen->bar(x1,y1,x2,y2,wm->black());
135   screen->bar(x1+1,y1+1,x2-1,y2-1,wm->medium_color());
136   draw_widget(screen,0);
137   scroll_event(sx,screen);
138 }
139 
wig_area(int & x1,int & y1,int & x2,int & y2)140 void scroller::wig_area(int &x1, int &y1, int &x2, int &y2)
141 {
142   int sx1,sy1,sx2,sy2;
143   dragger_area(sx1,sy1,sx2,sy2);
144   if (vert)
145   {
146     x1=x+l+1;
147     if (t<2)
148       y1=y+bh()+1;
149     else
150       y1=y+bh()+1+sx*(sy2-sy1+1-bh())/(t-1);
151   } else
152   {
153     if (t<2) x1=x+bw()+1;
154     else x1=x+bw()+1+sx*(sx2-sx1+1-bw())/(t-1);
155     y1=y+h+1;
156   }
157   x2=x1+bw()-3;
158   y2=y1+bh()-3;
159 
160 }
161 
162 
draw_widget(image * screen,int erase)163 void scroller::draw_widget(image *screen, int erase)
164 {
165   int x1,y1,x2,y2;
166   wig_area(x1,y1,x2,y2);
167   if (erase)
168     screen->bar(x1,y1,x2,y2,wm->medium_color());
169   else
170     screen->widget_bar(x1,y1,x2,y2,
171               wm->bright_color(),wm->medium_color(),wm->dark_color());
172 }
173 
draw(int active,image * screen)174 void scroller::draw(int active, image *screen)
175 {
176   int x1,y1,x2,y2;
177   area(x1,y1,x2,y2);
178   screen->rectangle(x1,y1,x2,y2,active ? wm->bright_color() : wm->dark_color());
179 }
180 
181 
handle_event(event & ev,image * screen,InputManager * inm)182 void scroller::handle_event(event &ev, image *screen, InputManager *inm)
183 {
184   int mx=ev.mouse_move.x,my=ev.mouse_move.y;
185   switch (ev.type)
186   {
187     case EV_MOUSE_BUTTON :
188     {
189       if (ev.mouse_button && drag==-1)
190       {
191     if (mx>=b1x() && mx<b1x()+bw() && my>=b1y()-2 && my<b1y()+bh())
192     {
193       if (sx>0)
194       {
195         draw_widget(screen,1);
196         sx--;
197         draw_widget(screen,0);
198         scroll_event(sx,screen);
199       }
200     } else if (mx>=b2x() && mx<b2x()+bw() && my>=b2y() && my<=b2y()+bh())
201     {
202       if (sx<t-1)
203       {
204         draw_widget(screen,1);
205         sx++;
206         draw_widget(screen,0);
207         scroll_event(sx,screen);
208       }
209     }
210     else
211     {
212       int dx1,dy1,dx2,dy2;
213       dragger_area(dx1,dy1,dx2,dy2);
214       if (mx>=dx1 && mx<=dx2 && my>=dy1 && my<=dy2)
215       {
216         int x1,y1,x2,y2;
217         wig_area(x1,y1,x2,y2);
218         if (mx>=x1 && mx<=x2 && my>=y1 && my<=y2)
219         {
220           drag=sx;
221           inm->grab_focus(this);
222         }
223         else if (t>1)
224         {
225           int nx=mouse_to_drag(mx,my);
226           if (nx!=sx && nx>=0 && nx<t)
227           {
228         draw_widget(screen,1);
229         sx=nx;
230         draw_widget(screen,0);
231         scroll_event(sx,screen);
232           }
233         }
234       } else handle_inside_event(ev,screen,inm);
235     }
236       } else if (!ev.mouse_button && drag!=-1)
237       {
238     inm->release_focus();
239     drag=-1;
240       }
241     } break;
242 
243     case EV_MOUSE_MOVE :
244     {
245       if (drag!=-1)
246       {
247     int nx=mouse_to_drag(mx,my);
248     if (nx<0) nx=0; else if (nx>=t) nx=t-1;
249     if (nx!=sx)
250     {
251       draw_widget(screen,1);
252       sx=nx;
253       draw_widget(screen,0);
254       scroll_event(sx,screen);
255     }
256       } else if ( activate_on_mouse_move())
257       {
258     int x1,y1,x2,y2;
259     wig_area(x1,y1,x2,y2);
260     if (mx>=x && mx<=x+l-1 && my>=y && my<=y+h-1)
261       handle_inside_event(ev,screen,inm);
262       }
263 
264     } break;
265     case EV_KEY :
266     {
267       switch (ev.key)
268       {
269     case JK_LEFT :
270     { handle_left(screen,inm); } break;
271     case JK_RIGHT :
272     { handle_right(screen,inm); } break;
273     case JK_UP :
274     { handle_up(screen,inm); } break;
275     case JK_DOWN :
276     { handle_down(screen,inm); } break;
277 
278     default :
279       handle_inside_event(ev,screen,inm);
280       }
281     } break;
282   }
283 }
284 
285 
handle_right(image * screen,InputManager * inm)286 void scroller::handle_right(image *screen, InputManager *inm)
287 {
288   if (!vert && sx<t-1)
289   {
290     draw_widget(screen,1);
291     sx++;
292     draw_widget(screen,0);
293     scroll_event(sx,screen);
294   }
295 }
296 
handle_left(image * screen,InputManager * inm)297 void scroller::handle_left(image *screen, InputManager *inm)
298 {
299   if (!vert && sx>1)
300   {
301     draw_widget(screen,1);
302     sx--;
303     draw_widget(screen,0);
304     scroll_event(sx,screen);
305   }
306 }
307 
handle_up(image * screen,InputManager * inm)308 void scroller::handle_up(image *screen, InputManager *inm)
309 {
310   if (vert && sx>1)
311   {
312     draw_widget(screen,1);
313     sx--;
314     draw_widget(screen,0);
315     scroll_event(sx,screen);
316   }
317 }
318 
handle_down(image * screen,InputManager * inm)319 void scroller::handle_down(image *screen, InputManager *inm)
320 {
321   if (vert && sx<t-1)
322   {
323     draw_widget(screen,1);
324     sx++;
325     draw_widget(screen,0);
326     scroll_event(sx,screen);
327   }
328 }
329 
set_x(int x,image * screen)330 void scroller::set_x (int x, image *screen)
331 {
332   if (x<0) x=0;
333   if (x>=t) x=t-1;
334   if (x!=sx)
335   {
336     draw_widget(screen,1);
337     sx=x;
338     draw_widget(screen,0);
339     scroll_event(sx,screen);
340   }
341 }
342 
mouse_to_drag(int mx,int my)343 int scroller::mouse_to_drag(int mx,int my)
344 {
345   int x1,y1,x2,y2;
346   dragger_area(x1,y1,x2,y2);
347 
348   if (vert)
349   {
350     int h=(y2-y1+1-bh());
351     if (h)
352       return (my-y-bh()-bh()/2)*(t-1)/h;
353     else return 0;
354   }
355   else
356   {
357     int w=(x2-x1+1-bw());
358     if (w)
359       return (mx-x-bw()-bw()/2)*(t-1)/w;
360     else return 0;
361   }
362 }
363 
364 
scroll_event(int newx,image * screen)365 void scroller::scroll_event(int newx, image *screen)
366 {
367   screen->bar(x,y,x+l-1,y+h-1,wm->black());
368   int xa,ya,xo=0,yo;
369   if (vert) { xa=0; ya=30; yo=x+5; yo=y+5; } else { xa=30; ya=0; xo=x+5; yo=y+5; }
370   for (int i=newx,c=0; c<30 && i<100; i++,c++)
371   {
372     char st[10];
373     sprintf(st,"%d",i);
374     wm->font()->put_string(screen,xo,yo,st,wm->bright_color());
375     xo+=xa; yo+=ya;
376   }
377 }
378 
area_config()379 void pick_list::area_config()
380 {
381   l=wid*wm->font()->width();
382   h=th*(wm->font()->height()+1);
383 }
384 
lis_sort(void const * a,void const * b)385 int lis_sort(void const *a, void const *b)
386 {
387   pick_list_item *a1=(pick_list_item *)a;
388   pick_list_item *a2=(pick_list_item *)b;
389   return strcmp(a1->name,a2->name);
390 }
391 
pick_list(int X,int Y,int ID,int height,char ** List,int num_entries,int start_yoffset,ifield * Next,image * texture)392 pick_list::pick_list(int X, int Y, int ID, int height,
393         char **List, int num_entries, int start_yoffset, ifield *Next, image *texture)
394      : scroller(X,Y,ID,2,2,1,0,Next)
395 {
396   th=height;
397   tex=texture;
398   t=num_entries;
399   wid=0;
400   key_hist_total=0;
401   lis=(pick_list_item *)malloc(sizeof(pick_list_item)*num_entries);
402   int i=0;
403   for (; i<num_entries; i++)
404   {
405     lis[i].name=List[i];
406     lis[i].number=i;
407   }
408   qsort((void *)lis,num_entries,sizeof(pick_list_item),lis_sort);
409 
410   for (i=0; i<t; i++)
411     if ((int)strlen(List[i])>wid)
412       wid=strlen(List[i]);
413   cur_sel=sx=start_yoffset;
414 }
415 
handle_inside_event(event & ev,image * screen,InputManager * inm)416 void pick_list::handle_inside_event(event &ev, image *screen, InputManager *inm)
417 {
418   if (ev.type==EV_MOUSE_MOVE && activate_on_mouse_move())
419   {
420     int sel=last_sel+(ev.mouse_move.y-y)/(wm->font()->height()+1);
421     if (sel!=cur_sel && sel<t && sel>=0)
422     {
423       cur_sel=sel;
424       scroll_event(last_sel,screen);
425     }
426   }
427   else if (ev.type==EV_MOUSE_BUTTON)
428   {
429     int sel=last_sel+(ev.mouse_move.y-y)/(wm->font()->height()+1);
430     if (sel<t && sel>=0)
431     {
432       if (sel==cur_sel)
433       wm->push_event(new event(id,(char *)this));
434       else
435       {
436     cur_sel=sel;
437     scroll_event(last_sel,screen);
438       }
439     }
440   } else if (ev.type==EV_KEY && ev.key==JK_ENTER)
441     wm->push_event(new event(id,(char *)this));
442   else if (ev.type==EV_KEY)
443   {
444     int found=-1;
445     if (key_hist_total<20)
446       key_hist[(int)(key_hist_total++)]=ev.key;
447 
448     for (int i=0; i<t && found==-1; i++)
449     {
450       if ((int)strlen(lis[i].name)>=key_hist_total && memcmp(lis[i].name,key_hist,key_hist_total)==0)
451     found=i;
452     }
453     if (found!=-1)
454     {
455       sx=found;
456       cur_sel=found;
457       scroll_event(sx,screen);
458     } else key_hist_total=0;
459   }
460 }
461 
handle_up(image * screen,InputManager * inm)462 void pick_list::handle_up(image *screen, InputManager *inm)
463 {
464   if (cur_sel>0)
465     cur_sel--;
466   else return ;
467   if (cur_sel<sx)
468   {
469     draw_widget(screen,1);
470     sx=cur_sel;
471     draw_widget(screen,0);
472   }
473   scroll_event(sx,screen);
474 }
475 
handle_down(image * screen,InputManager * inm)476 void pick_list::handle_down(image *screen, InputManager *inm)
477 {
478   if (cur_sel<t-1)
479     cur_sel++;
480   else return ;
481   if (cur_sel>sx+th-1)
482   {
483     draw_widget(screen,1);
484     sx=cur_sel-th+1;
485     draw_widget(screen,0);
486   }
487   scroll_event(sx,screen);
488 }
489 
scroll_event(int newx,image * screen)490 void pick_list::scroll_event(int newx, image *screen)
491 {
492   last_sel=newx;
493   if (tex)
494   {
495     int cx1, cy1, cx2, cy2;
496     screen->GetClip(cx1, cy1, cx2, cy2);
497     screen->SetClip(x,y,x+l,y+h);
498     int tw=(l+tex->Size().x-1)/tex->Size().x;
499     int th=(h+tex->Size().y-1)/tex->Size().y;
500     int dy=y;
501     for (int j=0; j<th; j++,dy+=tex->Size().y)
502       for (int i=0,dx=x; i<tw; i++,dx+=tex->Size().x)
503         tex->put_image(screen,dx,dy);
504 
505     screen->SetClip(cx1, cy1, cx2, cy2);
506   } else screen->bar(x,y,x+l-1,y+h-1,wm->black());
507 
508   int dy=y;
509   for (int i=0; i<th; i++,dy+=wm->font()->height()+1)
510   {
511     if (i+newx==cur_sel)
512       screen->bar(x,dy,x+wid*wm->font()->width()-1,dy+wm->font()->height(),wm->dark_color());
513     if (i+newx<t)
514       wm->font()->put_string(screen,x,dy,lis[i+newx].name,wm->bright_color());
515   }
516 }
517 
518 
519 
520 
spicker(int X,int Y,int ID,int Rows,int Cols,int Vert,int MultiSelect,ifield * Next)521 spicker::spicker(int X, int Y, int ID, int Rows, int Cols, int Vert, int MultiSelect,
522            ifield *Next)
523      : scroller(X,Y,ID,2,2,Vert,0,Next)
524 {
525   l=-1;
526   last_click=-1;
527   r=Rows;
528   c=Cols;
529   m=MultiSelect;
530   select=NULL;
531 }
532 
set_select(int x,int on)533 void spicker::set_select(int x, int on)
534 {
535   if (m)
536   {
537     if (on)
538       select[x/8]|=1<<(x&7);
539     else
540       select[x/8]&=(0xff-(1<<(x&7)));
541   } else cur_sel=x;
542 }
543 
get_select(int x)544 int spicker::get_select(int x)
545 {
546   if (m)
547     return select[x/8]&(1<<(x&7));
548   else return (x==cur_sel);
549 }
550 
first_selected()551 int spicker::first_selected()
552 {
553   if (m)
554   {
555     for (int i=0; i<t; i++)
556       if (get_select(i)) return i;
557     return -1;
558   } else return cur_sel;
559 }
560 
reconfigure()561 void spicker::reconfigure()
562 {
563   if (select)
564     free(select);
565   select=NULL;
566 
567 
568   t=total();
569   if (sx>t)
570     sx=t-1;
571   if (m)
572   {
573     select=(uint8_t *)malloc((t+7)/8);
574     memset(select,0,(t+7)/8);
575   } else cur_sel=0;
576 }
577 
draw_background(image * screen)578 void spicker::draw_background(image *screen)
579 {
580   screen->bar(x,y,x+l-1,y+h-1,wm->dark_color());
581 }
582 
583 
area_config()584 void spicker::area_config()
585 {
586   if (vert)
587     l=item_width()+4;
588   else
589     l=item_width()*c+4;
590 
591   if (vert)
592     h=item_height()*r+4;
593   else
594     h=item_height()+4;
595 
596 }
597 
set_x(int x,image * screen)598 void spicker::set_x(int x, image *screen)
599 {
600   cur_sel=x;
601   sx=x;
602   scroll_event(x,screen);
603 }
604 
605 
scroll_event(int newx,image * screen)606 void spicker::scroll_event(int newx, image *screen)
607 {
608   last_sel=newx;
609   int xa,ya,xo,yo;
610   xo=x+2;
611   yo=y+2;
612   if (vert) { xa=0; ya=item_height(); }
613   else { xa=item_width(); ya=0; }
614   draw_background(screen);
615 
616   for (int i=newx; i<newx+vis(); i++)
617   {
618     if (i<t)
619     {
620       if (m)
621         draw_item(screen,xo,yo,i,get_select(i));
622       else
623         draw_item(screen,xo,yo,i,i==cur_sel);
624     }
625     xo+=xa; yo+=ya;
626   }
627 }
628 
629 
handle_inside_event(event & ev,image * screen,InputManager * inm)630 void spicker::handle_inside_event(event &ev, image *screen, InputManager *inm)
631 {
632   switch (ev.type)
633   {
634     case EV_MOUSE_MOVE :
635     {
636       if (activate_on_mouse_move())
637       {
638     int me;
639     if (vert)
640       me=last_sel+(ev.mouse_move.y-y)/item_height();
641     else
642       me=last_sel+(ev.mouse_move.x-x)/item_width();
643     if (me<t && me>=0)
644     {
645       if (cur_sel!=me)
646       {
647         cur_sel=me;
648         scroll_event(last_sel,screen);
649         note_new_current(screen,inm,me);
650       }
651     }
652       }
653     } break;
654     case EV_MOUSE_BUTTON :
655     {
656       int me;
657       if (vert)
658     me=last_sel+(ev.mouse_move.y-y)/item_height();
659       else
660     me=last_sel+(ev.mouse_move.x-x)/item_width();
661       if (me<t && me>=0)
662       {
663     if (m)
664     {
665       if (ev.mouse_button)
666       {
667         if (ok_to_select(me))
668         {
669           set_select(me,!get_select(me));
670           scroll_event(last_sel,screen);
671           inm->grab_focus(this);
672         }
673       } else last_click=-1;
674 
675     } else if (ok_to_select(me))
676     {
677       if (cur_sel==me)
678         note_selection(screen,inm,me);
679       else
680       {
681         cur_sel=me;
682         scroll_event(last_sel,screen);
683         note_new_current(screen,inm,me);
684       }
685     }
686       }
687     } break;
688   }
689 }
690 
691 
692 
handle_up(image * screen,InputManager * inm)693 void spicker::handle_up(image *screen, InputManager *inm)
694 {
695   if (vert && cur_sel>0)
696   {
697     cur_sel--;
698 
699     if (cur_sel<sx)
700     {
701       draw_widget(screen,1);
702       last_sel=sx=cur_sel;
703       draw_widget(screen,0);
704     }
705     scroll_event(last_sel,screen);
706     note_new_current(screen,inm,cur_sel);
707   }
708 }
709 
handle_down(image * screen,InputManager * inm)710 void spicker::handle_down(image *screen, InputManager *inm)
711 {
712   if (vert && cur_sel<t-1)
713     cur_sel++;
714   else return ;
715   if (cur_sel>sx+r-1)
716   {
717     draw_widget(screen,1);
718     last_sel=sx=cur_sel-r+1;
719     draw_widget(screen,0);
720   }
721   scroll_event(sx,screen);
722   note_new_current(screen,inm,cur_sel);
723 }
724 
handle_left(image * screen,InputManager * inm)725 void spicker::handle_left(image *screen, InputManager *inm)
726 {
727 }
728 
handle_right(image * screen,InputManager * inm)729 void spicker::handle_right(image *screen, InputManager *inm)
730 {
731 }
732 
733 
734 
735 
736