全部博文(40)
2011年(40)
分类: LINUX
2011-06-01 13:13:36
对于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
{
if(WIDGET(Luniq->v[i].data.p)->flags & AG_WIDGET_FOCUSED)
break; //此代码实现的功能是判断当前focus的widget为哪一个控件。
}
1 |
2 |
3 |
而后进入到一个判断代码断;
if ( i== -1)
{
即当此时动作状态为:focus 处于图示中的顺序排列的控件(即2)按下组合键(向上),
跳转到第一个控件
}
else
{
if (i-1<0)
{
即当此时动作状态为:focus处于图示中的最顶层控件(即1)按下组合键(向上),跳转到最后一个控件
}
else
{
当前动作状态为: focus处于图示中的控件3,按下组合键(向上),跳转到上一个控件
}
}
ps: 据搜索引擎所知agar的资源较少,本着分享的目的交流。若有疏忽或错误恳请网友批评指正,赐教。
--by 甘甘 agumgum@live.com