Chinaunix首页 | 论坛 | 博客

分类: LINUX

2011-06-01 13:13:36


  1. void
  2. AG_WindowCycleFocus(AG_Window *win, int reverse)
  3. {
  4.     AG_List *Lfoc, *Luniq;
  5.     int i, j;

  6.     /* Generate a list of focusable widgets; eliminate duplicates. */
  7.     Lfoc = AG_ListNew();
  8.     Luniq = AG_ListNew();
  9.     ListFocusableWidgets(Lfoc, WIDGET(win));
  10.     for (i = 0; i < Lfoc->n; i++) {
  11.         for (j = 0; j < Luniq->n; j++) {
  12.             if (Lfoc->v[i].data.p == Luniq->v[j].data.p)
  13.                         {
  14.                                  break;
  15.                         }
  16.         }
  17.         if (j == Luniq->n)
  18.             AG_ListAppend(Luniq, &Lfoc->v[i]);
  19.     }
  20.     if (Luniq->n == 0)
  21.         goto out;

  22.     /* Move focus after/before the currently focused widget. */

  23.     if (reverse) {
  24.         for (i = 0; i < Luniq->n; i++) {
  25.             if (WIDGET(Luniq->v[i].data.p)->flags & AG_WIDGET_FOCUSED)
  26.                 break;
  27.         }
  28.         if (i == -1) {
  29.             AG_WidgetFocus(Luniq->v[0].data.p);
  30.         } else {
  31.             if (i-1 < 0) {
  32.                 AG_WidgetFocus(Luniq->v[Luniq->n - 1].data.p);
  33.             } else {
  34.                 AG_WidgetFocus(Luniq->v[i - 1].data.p);
  35.             }
  36.         }
  37.         }
  38.     } else {
  39.         for (i = Luniq->n-1; i >= 0; i--) {
  40.             if (WIDGET(Luniq->v[i].data.p)->flags & AG_WIDGET_FOCUSED)
  41.                 break;
  42.         }
  43.         if (i == Luniq->n) {
  44.             AG_WidgetFocus(Luniq->v[0].data.p);
  45.         } else {
  46.             if (i+1 < Luniq->n) {
  47.                 AG_WidgetFocus(Luniq->v[i + 1].data.p);
  48.             } else {
  49.                 AG_WidgetFocus(Luniq->v[0].data.p);
  50.             }
  51.         }
  52.     }
  53. out:
  54.     AG_ListDestroy(Lfoc);
  55.     AG_ListDestroy(Luniq);
  56. }

对于AGAR中的AG_WindowcycleFocus()函数的分析

AG_WindowCycleFocus(AG_Window *win, int reverse)

{

    见代码附件

}

Lfoc = AG_ListNew(); //分配一个事件列表,现为空

Luniq = AG_ListNew(); // 同上 分配一个事件列表,现为空

ListFocusableWidgets(Lfoc,WIDGET(win)); // lfoc列表填充一个在window内按顺序排列可设置焦点的列表

通过两个循环把刚才Lfoc列表里的数据拷贝至Luniq

至此,Luniq 列表获取到win上的各个控件信息.Luniq->v[i].data.p保存了具体的控件Id


/---------------------------------------------------------------------------------------/

        需要叙述的一段代码在AG_WindowEvent()中,

 if (tabCycle && ev->key.keysym.sym

== SDLK_TAB && ev->type == SDL_KEYUP)

{

     AG_WindowCycleFocus(win,(ev->key.keysym.mod & KMOD_SHIFT));

     rv = 1;

}

/*---------------------------------兴趣是良师,功夫在诗外-----------------------*/


然后进入到一个判断 if (reverse){

}

else{

} 判断当前点击的是哪个按钮。当reverse为真是就输入的为SHIFT+TAB的组合建。else 为一个TaB键。



然后通过一个for循环在

for(i = 0 ;i n;i++)

{

     if(WIDGET(Luniq->v[i].data.p)->flags & AG_WIDGET_FOCUSED)

     break; //此代码实现的功能是判断当前focuswidget为哪一个控件。

}



1

2

3


而后进入到一个判断代码断;

if ( i== -1)

{

    即当此时动作状态为:focus 处于图示中的顺序排列的控件(即2)按下组合键(向上),

    跳转到第一个控件

}

else

{

     if (i-1<0)

     {

         即当此时动作状态为:focus处于图示中的最顶层控件(即1)按下组合键(向上),跳转到最后一个控件

     }

    else

    {

          当前动作状态为: focus处于图示中的控件3,按下组合键(向上),跳转到上一个控件

    }


}


ps: 据搜索引擎所知agar的资源较少,本着分享的目的交流。若有疏忽或错误恳请网友批评指正,赐教。

                                                                                                                        --by 甘甘 agumgum@live.com

阅读(2038) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~