/* Name: cc_mouse.c Author: Michal Sudolsky Date: 22.09.2005 16:12 */ // modified by Juraj Kolesar #include "cc.h" long _cc_mousex; long _cc_mousey; bool _cc_aftermouseval; char _cc_mouseactive=MOUSE_NONE; char _cc_redrawmouse=2; Cc_Timer *_cc_mouserepeattimer=NULL,*_cc_doubletimer1=NULL, *_cc_doubletimer2=NULL; bool _cc_doubleclickstate1=false,_cc_doubleclickstate2; Gpm_Event _cc_gpmev; bool _cc_eventq=false; bool _cc_waitevent=false; bool _cc_waitkeyevent=false; pthread_t _cc_gpmthreadp; Cc_Win *_cc_lastfocused=NULL; void _cc_setcomboactiveitem(COMBO *combo,long old,long new) { if(new==old)return; if(new==-1)combo->activeitem=NULL; else { if(old==-1)combo->activeitem=g_list_nth(combo->list->extra->list.lines,new); else { if(new>old) while(new>old) { combo->activeitem=g_list_next(combo->activeitem); old++; } else while(old>new) { combo->activeitem=g_list_previous(combo->activeitem); new++; } } } } void _cc_setlistactiveitem(LIST *list,long old,long new) { if(new==old)return; if(new==-1)list->activeitem=NULL; else { if(old==-1)list->activeitem=g_list_nth(list->lines,new); else { if(new>old) while(new>old) { list->activeitem=g_list_next(list->activeitem); old++; } else while(old>new) { list->activeitem=g_list_previous(list->activeitem); new++; } } } } void _cc_setlistscrollupitem(LIST *list,long old,long new) { if(new==old)return; if(new==-1)list->scrollupitem=NULL; else { if(old==-1)list->scrollupitem=g_list_nth(list->lines,new); else { if(new>old) while(new>old) { list->scrollupitem=g_list_next(list->scrollupitem); old++; } else while(old>new) { list->scrollupitem=g_list_previous(list->scrollupitem); new++; } } } } void _cc_buttondoubletimer(Cc_Timer *sender) { _cc_redrawclientwin(sender->win); _cc_redrawclientwin(sender->win); cc_del_timer(sender); } bool _cc_inrect(long x1,long y1,long x2,long y2,long x,long y) { return (x>=x1)&&(x=y1)&&(y_cc_screenx-1)_cc_gpmev.x=_cc_screenx-1; if(_cc_gpmev.y>_cc_screeny-1)_cc_gpmev.y=_cc_screeny-1; if(_cc_gpmev.x<0)_cc_gpmev.x=0; if(_cc_gpmev.y<0)_cc_gpmev.y=0; } if(((_cc_gpmev.type&GPM_MOVE)==0)&&((_cc_gpmev.type&GPM_DRAG)==0)) while(_cc_eventq&&_cc_apprun); } return NULL; } bool _cc_gpmgetevent(Gpm_Event *event) { if(_cc_eventq) { memcpy(event,&_cc_gpmev,sizeof(_cc_gpmev)); _cc_eventq=false; return true; } else return false; } void _cc_domouseevent(MEVENT *event) { unsigned short mod=0; bool double1=true,double2=true; if((event->bstate&BUTTON_SHIFT)==BUTTON_SHIFT)mod|=CC_MOD_SHIFT; if((event->bstate&BUTTON_ALT)==BUTTON_ALT)mod|=CC_MOD_ALT; if((event->bstate&BUTTON_CTRL)==BUTTON_CTRL)mod|=CC_MOD_CTRL; if((event->bstate&BUTTON1_PRESSED)==BUTTON1_PRESSED) { _cc_sendmousemessage(event->x,event->y,CC_MOUSE_L_DOWN|mod); if(_cc_aftermouseval) { _cc_mouserepeattimer=cc_set_timer(NULL,WAITTICK,0,_cc_mousewaitproc); } else { cc_del_timer(_cc_mouserepeattimer); _cc_mouserepeattimer=NULL; } if(_cc_doubleclickstate1) { _cc_sendmousemessage(event->x,event->y,CC_MOUSE_L_DBLCLK|mod); } cc_del_timer(_cc_doubletimer1); _cc_doubletimer1=!_cc_doubleclickstate1? cc_set_timer(NULL,DOUBLECLICK,0,_cc_doubleclickproc):NULL; _cc_doubleclickstate1=!_cc_doubleclickstate1; double1=false; } if((event->bstate&BUTTON1_RELEASED)==BUTTON1_RELEASED) { cc_del_timer(_cc_mouserepeattimer); _cc_mouserepeattimer=NULL; _cc_sendmousemessage(event->x,event->y,CC_MOUSE_L_UP|mod); double1=false; } if((event->bstate&BUTTON3_PRESSED)==BUTTON3_PRESSED) { _cc_sendmousemessage(event->x,event->y,CC_MOUSE_R_DOWN|mod); if(_cc_doubleclickstate2) { _cc_sendmousemessage(event->x,event->y,CC_MOUSE_R_DBLCLK|mod); } cc_del_timer(_cc_doubletimer2); _cc_doubletimer2=!_cc_doubleclickstate2? cc_set_timer(NULL,DOUBLECLICK,0,_cc_doubleclickproc):NULL; _cc_doubleclickstate2=!_cc_doubleclickstate2; double2=false; } if((event->bstate&BUTTON3_RELEASED)==BUTTON3_RELEASED|mod) { _cc_sendmousemessage(event->x,event->y,CC_MOUSE_R_UP|mod); double2=false; } if(double1) { cc_del_timer(_cc_doubletimer1); _cc_doubleclickstate1=false; _cc_doubletimer1=NULL; } if(double2) { cc_del_timer(_cc_doubletimer2); _cc_doubleclickstate2=false; _cc_doubletimer2=NULL; } _cc_mousex=event->x; _cc_mousey=event->y; if(_cc_mouseactive!=MOUSE_GPM) { _cc_gpmev.x=_cc_mousex; _cc_gpmev.y=_cc_mousey; } _cc_sendmousemessage(_cc_mousex,_cc_mousey,CC_MOUSE_MOVE|mod); } bool _cc_dosendmousemessage(Cc_Win *p,long vx,long vy,unsigned short state) { if(p==NULL)return false; bool result=true; Cc_Win *found=_cc_findwin(vx,vy); EDIT *edit; BUTTON *button; SCROLL *scroll,*vscroll,*hscroll; LIST *list; COMBO *combo; MENU *menu; DIALOG *dialog; GList *lines; long x=vx,y=vy,actline; unsigned short statemd=state&CC_MASK_MOD; bool chang=false; static long stlen; long i,len,height,old,maxpoz,minpoz,actpoz; static long mx,my,nx,ny,cecnt=0; static bool freesendnext=true; bool sendnext=false; bool setfocus=true; _cc_aftermouseval=false; cc_screen_to_client(p,&x,&y); state&=CC_MASK_KEY; if((_cc_focuswin==NULL)||(_cc_focuswin->extra->type!=CC_TP_MENU)) _cc_lastfocused=_cc_focuswin; if((state==CC_MOUSE_L_DOWN)&&p->hasmodal) { cc_set_focus(_cc_findchild(p)); return true; } switch(p->extra->type) { case CC_TP_EDIT: edit=&p->extra->edit; switch(state) { case CC_MOUSE_MOVE: if(_cc_capturewin!=p)break; if((cecnt>0)&&(strlen(edit->text)>0)) { if(cecnt==2)edit->maskpos=mx; cecnt++; } chang=true; case CC_MOUSE_L_DOWN: if(_cc_capturewin!=p) { edit->maskpos=-1; mx=x+edit->scroll; cecnt=1; } _cc_capturewin=p; _cc_usekeys=false; if(cecnt>=0) { edit->curpos=x+edit->scroll; len=strlen(edit->text); if(edit->curpos<0)edit->curpos=0; if(edit->maskpos==-1) { if(edit->curpos>len)edit->curpos=len; } else if(edit->curpos>len-1)edit->curpos=len-1; if(edit->curpos-edit->scroll<0)edit->scroll=edit->curpos; if(edit->curpos-edit->scroll>p->vx-1)edit->scroll=edit->curpos-p->vx+1; } break; case CC_MOUSE_L_UP: cecnt=0; _cc_usekeys=true; _cc_capturewin=NULL; break; case CC_MOUSE_L_DBLCLK: len=strlen(edit->text); actpoz=x+edit->scroll; if(actpoz<0)actpoz=0; if(actpoz>len-1)actpoz=len-1; if(edit->text[actpoz]!=' ') { for(i=actpoz;i>=0;i--) { if(edit->text[i]==' ')break; } edit->maskpos=i+1; for(i=actpoz;itext[i]==' ')break; } edit->curpos=i-1; cecnt=-1; } break; case CC_MOUSE_R_DOWN: cc_set_parent(_cc_clipboardmenu,p); cc_track_popup_menu(_cc_clipboardmenu,vx,vy); break; } break; case CC_TP_BUTTON: button=&p->extra->button; switch(state) { case CC_MOUSE_MOVE: if(p->stat==1) { if(found==p)button->status=TS_HIGH; else {button->status=TS_UP;_cc_capturewin=NULL;p->stat=0;sendnext=true;} } else if(p->stat==2) { if(found==p)button->status=TS_DOWN; else button->status=TS_UP; } else { button->status=TS_HIGH; _cc_capturewin=p; p->stat=1; } chang=true; break; case CC_MOUSE_L_DOWN: if(found==p) { _cc_capturewin=p; _cc_usekeys=false; button->status=TS_DOWN; p->stat=2; } else { setfocus=false; _cc_sendmousemessage(vx,vy,CC_MOUSE_MOVE); _cc_sendmousemessage(vx,vy,CC_MOUSE_L_DOWN); } if(!button->hasfocus)chang=true; break; case CC_MOUSE_L_UP: _cc_usekeys=true; _cc_capturewin=NULL; if(found==p) { _cc_capturewin=p; if(p->stat==2) { button->status=TS_EXPUSH; p->stat=1; if(button->push!=NULL)button->push(p); } else { button->status=TS_HIGH; p->stat=1; } } else { p->stat=0; button->status=TS_UP; } chang=true; } break; case CC_TP_SCROLL: scroll=&p->extra->scroll; switch(state) { case CC_MOUSE_MOVE: if(scroll->vert) { len=(p->vy-2-1)*(scroll->pos-scroll->minpos)/ (scroll->maxpos-scroll->minpos); if(p->stat==1)scroll->sup=_cc_inrect(0,0,p->vx,1,x,y)?SC_DOWN:SC_UP; else if(p->stat==2) scroll->spageup=_cc_inrect(0,1,p->vx,len,x,y)?SC_DOWN:SC_UP; else if(p->stat==3) { scroll->smooth=true; old=scroll->pos; height=(y+stlen-1)*(scroll->maxpos-scroll->minpos); scroll->pos=scroll->minpos+height/(p->vy-2-1)+ ((height%(p->vy-2-1)==0)?0:1); scroll->smoothpos=y+stlen-1; if(scroll->smoothpos<0)scroll->smoothpos=0; if(scroll->smoothpos>p->vy-2-1)scroll->smoothpos=p->vy-2-1; if(scroll->posminpos)scroll->pos=scroll->minpos; if(scroll->pos>scroll->maxpos)scroll->pos=scroll->maxpos; if((old!=scroll->pos)&&(scroll->change!=NULL))scroll->change(p); } else if(p->stat==4) scroll->spagedown=_cc_inrect(0,1+len+1,p->vx,p->vy-2-1-len,x,y)? SC_DOWN:SC_UP; else if(p->stat==5) scroll->sdown=_cc_inrect(0,p->vy-1,p->vx,1,x,y)?SC_DOWN:SC_UP; } else { len=(p->vx-2-1)*(scroll->pos-scroll->minpos)/ (scroll->maxpos-scroll->minpos); if(p->stat==1)scroll->sup=_cc_inrect(0,0,1,p->vy,x,y)?SC_DOWN:SC_UP; else if(p->stat==2) scroll->spageup=_cc_inrect(1,0,len,p->vy,x,y)?SC_DOWN:SC_UP; else if(p->stat==3) { scroll->smooth=true; old=scroll->pos; height=(x+stlen-1)*(scroll->maxpos-scroll->minpos); scroll->pos=scroll->minpos+height/(p->vx-2-1)+ ((height%(p->vx-2-1)==0)?0:1); scroll->smoothpos=x+stlen-1; if(scroll->smoothpos<0)scroll->smoothpos=0; if(scroll->smoothpos>p->vx-2-1)scroll->smoothpos=p->vx-2-1; if(scroll->posminpos)scroll->pos=scroll->minpos; if(scroll->pos>scroll->maxpos)scroll->pos=scroll->maxpos; if((old!=scroll->pos)&&(scroll->change!=NULL))scroll->change(p); } else if(p->stat==4) scroll->spagedown=_cc_inrect(1+len+1,0,p->vx-2-1-len,p->vy,x,y)? SC_DOWN:SC_UP; else if(p->stat==5) scroll->sdown=_cc_inrect(p->vx-1,0,1,p->vy,x,y)?SC_DOWN:SC_UP; } chang=true; break; case CC_MOUSE_L_DOWN: _cc_capturewin=p; _cc_usekeys=false; scroll->sup=SC_UP; scroll->spageup=SC_UP; scroll->sdown=SC_UP; scroll->spagedown=SC_UP; if(scroll->vert) { len=(p->vy-2-1)*(scroll->pos-scroll->minpos)/ (scroll->maxpos-scroll->minpos); if(_cc_inrect(0,0,p->vx,1,x,y)&&((p->stat==0)||(p->stat==1))&&(p->vy>1)) {p->stat=1;scroll->sup=SC_DOWN;} else if(_cc_inrect(0,1,p->vx,len,x,y)&&((p->stat==0)||(p->stat==2))) {p->stat=2;scroll->spageup=SC_DOWN;} else if(_cc_inrect(0,1+len,p->vx,1,x,y)&& ((p->stat==0)||(p->stat==3))&&(p->vy>3)) {p->stat=3;stlen=1+len-y;} else if(_cc_inrect(0,1+len+1,p->vx,p->vy-2-1-len,x,y)&& ((p->stat==0)||(p->stat==4))) {p->stat=4;scroll->spagedown=SC_DOWN;} else if(_cc_inrect(0,p->vy-1,p->vx,1,x,y)&&((p->stat==0)||(p->stat==5))) {p->stat=5;scroll->sdown=SC_DOWN;} } else { len=(p->vx-2-1)*(scroll->pos-scroll->minpos)/ (scroll->maxpos-scroll->minpos); if((y>=0)&&(yvy)) { if(_cc_inrect(0,0,1,p->vy,x,y)&&((p->stat==0)||(p->stat==1))&& (p->vx>1)){p->stat=1;scroll->sup=SC_DOWN;} else if(_cc_inrect(1,0,len,p->vy,x,y)&&((p->stat==0)||(p->stat==2))) {p->stat=2;scroll->spageup=SC_DOWN;} else if(_cc_inrect(1+len,0,1,p->vy,x,y)&&((p->stat==0)|| (p->stat==3))&&(p->vx>3)){p->stat=3;stlen=1+len-x;} else if(_cc_inrect(1+len+1,0,p->vx-2-1-len,p->vy,x,y)&& ((p->stat==0)||(p->stat==4))) {p->stat=4;scroll->spagedown=SC_DOWN;} else if(_cc_inrect(p->vx-1,0,1,p->vy,x,y)&&((p->stat==0)|| (p->stat==5))){p->stat=5;scroll->sdown=SC_DOWN;} } } old=scroll->pos; if(scroll->sup!=SC_UP)scroll->pos-=scroll->cnt; if(scroll->spageup!=SC_UP)scroll->pos-=scroll->pagecnt; if(scroll->sdown!=SC_UP)scroll->pos+=scroll->cnt; if(scroll->spagedown!=SC_UP)scroll->pos+=scroll->pagecnt; if(scroll->posminpos)scroll->pos=scroll->minpos; if(scroll->pos>scroll->maxpos)scroll->pos=scroll->maxpos; if((old!=scroll->pos)&&(scroll->change!=NULL))scroll->change(p); if(p->stat!=3)_cc_aftermouseval=true; chang=true; break; case CC_MOUSE_L_UP: _cc_dosendmousemessage(p,vx,vy,CC_MOUSE_MOVE); if(scroll->vert) { len=(p->vy-2-1)*(scroll->pos-scroll->minpos)/ (scroll->maxpos-scroll->minpos); if(p->stat==1)scroll->sup=_cc_inrect(0,0,p->vx,1,x,y)?SC_PUSH:SC_UP; else if(p->stat==2) scroll->spageup=_cc_inrect(0,1,p->vx,len,x,y)?SC_PUSH:SC_UP; else if(p->stat==3)scroll->smooth=false; else if(p->stat==4) scroll->spagedown=_cc_inrect(0,1+len+1,p->vx,p->vy-2-1-len,x,y)? SC_PUSH:SC_UP; else if(p->stat==5) scroll->sdown=_cc_inrect(0,p->vy-1,p->vx,1,x,y)?SC_PUSH:SC_UP; } else { len=(p->vx-2-1)*(scroll->pos-scroll->minpos)/ (scroll->maxpos-scroll->minpos); if(p->stat==1)scroll->sup=_cc_inrect(0,0,1,p->vy,x,y)?SC_PUSH:SC_UP; else if(p->stat==2) scroll->spageup=_cc_inrect(1,0,len,p->vy,x,y)?SC_PUSH:SC_UP; else if(p->stat==3)scroll->smooth=false; else if(p->stat==4) scroll->spagedown=_cc_inrect(1+len+1,0,p->vx-2-1-len,p->vy,x,y)? SC_PUSH:SC_UP; else if(p->stat==5) scroll->sdown=_cc_inrect(p->vx-1,0,1,p->vy,x,y)?SC_PUSH:SC_UP; } _cc_capturewin=NULL; _cc_usekeys=true; p->stat=0; chang=true; cc_set_timer(p,BUTTONCLICK,0,_cc_buttontimer); } break; case CC_TP_LIST: list=&p->extra->list; vscroll=&list->vscroll->extra->scroll; minpoz=vscroll->pos; maxpoz=p->vy-2+vscroll->pos-1; switch(state) { case CC_MOUSE_MOVE: if(_cc_capturewin==p) { actline=list->activeline; if((list->combotyp!=CC_LI_COMBO)||((list->combotyp==CC_LI_COMBO)&& (p->stat==1)))list->activeline=y-1+vscroll->pos; list->exvscroll=EX_NONE; list->exhscroll=EX_NONE; if((list->combotyp!=CC_LI_COMBO)||((list->combotyp==CC_LI_COMBO)&& (p->stat==1))) { if(list->activelineactiveline=minpoz;if(p->stat>=1)list->exvscroll=EX_UP;} if(list->activeline>maxpoz) {list->activeline=maxpoz;if(p->stat>=1)list->exvscroll=EX_DOWN;} if(x<1)if(p->stat>=1)list->exhscroll=EX_UP; if(x>=p->vx-2)if(p->stat>=1)list->exhscroll=EX_DOWN; } if(list->activeline!=actline) { _cc_setlistactiveitem(list,actline,list->activeline); if(list->change!=NULL)list->change(p); } chang=true; } break; case CC_MOUSE_L_DOWN: list->exvscroll=EX_NONE; list->exhscroll=EX_NONE; actline=list->activeline; if(list->combotyp!=CC_LI_COMBO) { if((found==p)&&_cc_inrect(1,1,p->vx-2,p->vy-2,x,y)) { _cc_capturewin=p; _cc_usekeys=false; p->stat=1; list->activeline=y-1+vscroll->pos; if(list->activelineactiveline=minpoz; if(list->activeline>maxpoz)list->activeline=maxpoz; _cc_setlistactiveitem(list,actline,list->activeline); } } else { if((found==p)||(found==list->vscroll)||(found==list->hscroll)) { if(!((_cc_inrect(p->vx-list->vscroll->vx,1,list->vscroll->vx, p->vy-2,x,y)&& (list->vscroll->active))||_cc_inrect(1,p->vy-list->hscroll->vy, p->vx-2,list->hscroll->vy, x,y)&& (list->hscroll->active))) { if(_cc_inrect(1,1,p->vx-2,p->vy-2,x,y)) { p->stat=1; _cc_usekeys=false; list->activeline=y-1+vscroll->pos; if(list->activelineactiveline=minpoz; if(list->activeline>maxpoz)list->activeline=maxpoz; _cc_setlistactiveitem(list,actline,list->activeline); } } else { _cc_capturewin=NULL; _cc_usekeys=true; _cc_aftermouseval=_cc_sendmousemessage(vx,vy,state); } } else { _cc_capturewin=NULL; _cc_usekeys=true; cc_set_focus(p->parent); cc_show_win(p,false); } } break; case CC_MOUSE_L_UP: actline=list->activeline; if(list->combotyp==CC_LI_COMBO) { long act; if(p->stat>=1) if((found==p)&&_cc_inrect(1,1,p->vx-2,p->vy-2,x,y)) { act=y-1+vscroll->pos; if((act>=minpoz)&&(act<=maxpoz))list->activeline=act; _cc_setlistactiveitem(list,actline,list->activeline); } else { p->stat=2; } } if(_cc_capturewin==p) { if(p->stat>=1) { p->stat=0; list->exvscroll=EX_NONE; list->exhscroll=EX_NONE; _cc_capturewin=NULL; _cc_usekeys=true; void (*change)()=list->change; if(list->combotyp==CC_LI_COMBO) { cc_set_focus(p->parent); cc_show_win(p,false); if((found==p)&&_cc_inrect(1,1,p->vx-2,p->vy-2,x,y)) { if((list->combotyp==CC_LI_COMBO)&&(p->parent!=NULL)&& (p->parent->extra->type==CC_TP_COMBO)&& (list->activeitem!=NULL)) { combo=&p->parent->extra->combo; char *data=list->activeitem->data; cc_set_text(combo->edit,data); cc_edit_select(combo->edit,0,CC_MAXLONG); } if(list->dblclk!=NULL)list->dblclk(p); } } if(change!=NULL)change(p); } } chang=true; break; case CC_MOUSE_L_DBLCLK: if((found==p)&&_cc_inrect(1,1,p->vx-2,p->vy-2,x,y)) { if((list->combotyp==CC_LI_COMBO)&&(p->parent!=NULL)&& (p->parent->extra->type==CC_TP_COMBO)&&(list->activeitem!=NULL)) { combo=&p->parent->extra->combo; char *data=list->activeitem->data; if(combo->edit!=NULL) { cc_set_text(combo->edit,data); cc_edit_select(combo->edit,0,CC_MAXLONG); } else chang=true; } if(list->dblclk!=NULL)list->dblclk(p); } } break; case CC_TP_COMBO: combo=&p->extra->combo; switch(state) { case CC_MOUSE_MOVE: if(_cc_capturewin==p) if((!(found==p))||(!_cc_inrect(0,0,p->vx,p->vy,x,y))) { combo->pushed=SC_PUSH; _cc_capturewin=combo->list; _cc_usekeys=false; combo->list->stat=1; } break; case CC_MOUSE_L_DOWN: _cc_capturewin=p; _cc_usekeys=false; combo->pushed=SC_DOWN; list=&combo->list->extra->list; vscroll=&list->vscroll->extra->scroll; long actline=list->activeline; list->activeline=combo->activeline; if(list->activelinepos)vscroll->pos=list->activeline; if(list->activeline-combo->list->vy+3>vscroll->pos) vscroll->pos=list->activeline-combo->list->vy+3; _cc_setlistactiveitem(list,actline,list->activeline); cc_show_win(combo->list,true); break; case CC_MOUSE_L_UP: if(_cc_capturewin==p) { cc_set_timer(p,BUTTONCLICK,0,_cc_buttondoubletimer); combo->pushed=SC_PUSH; _cc_capturewin=combo->list; _cc_usekeys=true; } } break; case CC_TP_MENU: menu=&p->extra->menu; minpoz=0; actline=menu->activeline; if(menu->vert) { maxpoz=p->vy-2-1; if((found==p)&&_cc_inrect(1,1,p->vx-2,p->vy-2,x,y)) actpoz=y-1;else actpoz=-1; if(menu->lines!=NULL)if(actpoz>g_list_length(menu->lines)-1)actpoz=-1; if((p->parent!=NULL)&&(p->parent->extra->type==CC_TP_MENU))result=false; } else { maxpoz=g_list_length(menu->lines)-1; actpoz=-1; old=x+1; lines=menu->lines; if(_cc_inrect(0,0,p->vx,p->vy,x,y)) { while((old>0)&&(lines!=NULL)) { if(lines->data!=NULL)if(((Cc_Menu_I*)lines->data)->text!=NULL) old-=_cc_strlenmenu(((Cc_Menu_I*)lines->data)->text)+2; lines=g_list_next(lines); actpoz++; } if(old>0)actpoz=-1; } } if(actpoz!=-1) { if(menu->lines!=NULL)lines=g_list_nth(menu->lines,actpoz);else lines=NULL; if(lines!=NULL) if(strcmp(((Cc_Menu_I*)lines->data)->text,"-")==0)actpoz=-1; } switch(state) { case CC_MOUSE_MOVE: if(((_cc_focuswin==p)&&(found==p)&&(_cc_capturewin==NULL))|| (menu->vert&&(actpoz!=-1))) { _cc_capturewin=p; p->stat=1; } if(!menu->vert&&(p->stat!=0)&&(actpoz!=-1)&&(actpoz!=menu->activeline)&& (found==p)&&(_cc_inrect(0,0,p->vx,p->vy,x,y))) { p->stat=3; menu->activeline=actpoz; if(menu->activelineactiveline=minpoz; if(menu->activeline>maxpoz)menu->activeline=maxpoz; Cc_Win *submenu=((Cc_Menu_I*) g_list_nth(menu->lines,actpoz)->data)->submenu; if(submenu!=NULL) { submenu->extra->menu.activeline=-1; cc_show_win(submenu,true); _cc_focuswin=submenu; if(menu->select!=NULL)menu->select(p,_cc_getmenucellid(menu)); } else _cc_focuswin=p; } Cc_Win *next_cc_capturewin=NULL; if(menu->vert&&(p->stat!=0)&&(actpoz!=-1)&&(found==p)) { menu->activeline=actpoz; Cc_Win *submenu=((Cc_Menu_I*) g_list_nth(menu->lines,actpoz)->data)->submenu; if(submenu!=NULL) { submenu->extra->menu.activeline=-1; cc_show_win(submenu,true); _cc_focuswin=submenu; next_cc_capturewin=submenu; if(menu->select!=NULL)menu->select(p,_cc_getmenucellid(menu)); _cc_redraw(); } else _cc_focuswin=p; } if((_cc_capturewin==p)&&(!menu->vert)) if((found!=p)||(!_cc_inrect(0,0,p->vx,p->vy,x,y))) { if((p->stat==3)&&(!menu->vert)) { GList *l=g_list_nth(menu->lines,menu->activeline); if((l!=NULL)&&(((Cc_Menu_I*)l->data)->submenu!=NULL)) { Cc_Win *submenu=((Cc_Menu_I*)l->data)->submenu; if(submenu!=NULL)_cc_capturewin=submenu; _cc_usekeys=true; p->stat=1; } } } if(_cc_capturewin==p) { if((!menu->vert&&(actpoz!=-1)&&_cc_inrect(0,0,p->vx,p->vy,x,y))|| (menu->vert&&(p->stat==1))) { menu->activeline=actpoz; if(actpoz==-1)p->stat=2; if(!menu->vert) { if(menu->activelineactiveline=minpoz; if(menu->activeline>maxpoz)menu->activeline=maxpoz; } } chang=true; } if(next_cc_capturewin!=NULL)_cc_capturewin=next_cc_capturewin; break; case CC_MOUSE_R_DOWN: case CC_MOUSE_L_DOWN: if(!menu->vert) { if((actpoz!=-1)&&(p->stat==0)) { _cc_capturewin=p; _cc_usekeys=false; } if((p->stat==0)&&(found==p)&&_cc_inrect(0,0,p->vx,p->vy,x,y)) { if(actpoz!=-1) { p->stat=3; menu->activeline=actpoz; if(menu->activelineactiveline=minpoz; if(menu->activeline>maxpoz)menu->activeline=maxpoz; if(menu->select!=NULL)menu->select(p,_cc_getmenucellid(menu)); Cc_Win *submenu=((Cc_Menu_I*) g_list_nth(menu->lines,actpoz)->data)->submenu; if(submenu!=NULL) { submenu->extra->menu.activeline=-1; cc_show_win(submenu,true); _cc_focuswin=submenu; } } else setfocus=false; } else if((menu->activeline==actpoz)||(actpoz==-1)) { _cc_capturewin=NULL; menu->activeline=-1; _cc_usekeys=true; cc_set_focus(_cc_lastfocused); setfocus=false; if(p->stat!=0) { p->stat=0; if((actpoz==-1)||(!_cc_inrect(0,0,p->vx,p->vy,x,y))) if(freesendnext)sendnext=true; else freesendnext=true; } } } else { if(actpoz!=-1) { p->stat=1; _cc_usekeys=false; menu->activeline=actpoz; result=true; freesendnext=false; } else if(found==p)result=true; else if((p->parent==NULL)||(p->parent->extra->type!=CC_TP_MENU)) { _cc_capturewin=NULL; menu->activeline=-1; p->stat=0; _cc_usekeys=true; cc_set_focus(p->parent); setfocus=false; sendnext=true; result=true; } } break; case CC_MOUSE_R_UP: case CC_MOUSE_L_UP: if(menu->vert) { long act=-1; if(p->stat>=1) if((_cc_inrect(1,1,p->vx-2,p->vy-2,x,y))&&(actpoz!=-1)) { act=y-1; maxpoz=g_list_length(menu->lines)-1; if(actmaxpoz)act=maxpoz; menu->activeline=act; } else { p->stat=2; } if(p->stat>=1) { Cc_Win *submenu=NULL; if(act!=-1)submenu=((Cc_Menu_I*) g_list_nth(menu->lines,act)->data)->submenu; if(submenu!=NULL)result=true; _cc_usekeys=true; if((menu->activeline!=-1)&&(found==p)&& _cc_inrect(1,1,p->vx-2,p->vy-2,x,y)) { if((submenu==NULL)&&(actpoz!=-1)) { p->stat=0; _cc_usekeys=true; _cc_capturewin=NULL; cc_show_win(p,false); cc_set_focus(((p->parent!=NULL)&& (p->parent->extra->type==CC_TP_MENU))? _cc_lastfocused:p->parent); } if(menu->select!=NULL)menu->select(p,_cc_getmenucellid(menu)); } } if((found!=p)&&((p->parent==NULL)|| (p->parent->extra->type!=CC_TP_MENU))) { _cc_capturewin=NULL; menu->activeline=-1; p->stat=0; _cc_usekeys=true; cc_set_focus(p->parent); setfocus=false; sendnext=true; result=true; } if((actpoz==-1)&&(found==p))result=true; } else { if(p->stat==3) { GList *l=g_list_nth(menu->lines,actpoz); if((l!=NULL)&&(((Cc_Menu_I*)l->data)->submenu!=NULL)) { Cc_Win *submenu=((Cc_Menu_I*)l->data)->submenu; if(submenu!=NULL)_cc_capturewin=submenu; _cc_usekeys=true; p->stat=1; } } if(_cc_capturewin==p) { if(p->stat>=1) { _cc_usekeys=true; if(menu->change!=NULL)menu->change(p); } } if(!_cc_inrect(0,0,p->vx,p->vy,x,y)) { p->stat=0; _cc_usekeys=true; _cc_capturewin=NULL; cc_set_focus(_cc_lastfocused); } } chang=true; break; } if((menu->activeline!=actline)&&(menu->change!=NULL))menu->change(p); break; case CC_TP_DIALOG: dialog=&p->extra->dialog; switch(state) { case CC_MOUSE_MOVE: if(_cc_capturewin!=p)break; switch(p->stat) { case 0:cc_move_win(p,vx+mx,vy+my,CC_NOCHANGE,CC_NOCHANGE,CC_NOCHANGE); break; case 1:if(vy>ny-1-my)vy=ny-1-my;cc_move_win(p,CC_NOCHANGE,vy+my, CC_NOCHANGE,ny-vy-my, CC_NOCHANGE);break; case 2:if(vy>ny-1-my)vy=ny-1-my;cc_move_win(p,CC_NOCHANGE,vy+my, nx-2*p->x+vx+mx,ny-vy-my, CC_NOCHANGE);break; case 3:cc_move_win(p,CC_NOCHANGE,CC_NOCHANGE,nx-2*p->x+vx+mx, CC_NOCHANGE,CC_NOCHANGE);break; case 4:cc_move_win(p,CC_NOCHANGE,CC_NOCHANGE, nx-2*p->x+vx+mx,ny-2*p->y+vy+my,CC_NOCHANGE);break; case 5:cc_move_win(p,CC_NOCHANGE,CC_NOCHANGE,CC_NOCHANGE, ny-2*p->y+vy+my,CC_NOCHANGE);break; case 6:if(vx>nx-10-mx)vx=nx-10-mx;cc_move_win(p,vx+mx,CC_NOCHANGE, nx-vx-mx,ny-2*p->y+vy+my, CC_NOCHANGE);break; case 7:if(vx>nx-10-mx)vx=nx-10-mx;cc_move_win(p,vx+mx,CC_NOCHANGE, nx-vx-mx,CC_NOCHANGE, CC_NOCHANGE);break; case 8:if(vx>nx-10-mx)vx=nx-10-mx;if(vy>ny-1-my)vy=ny-1-my; cc_move_win(p,vx+mx,vy+my,nx-vx-mx,ny-vy-my,CC_NOCHANGE); } break; case CC_MOUSE_L_DBLCLK: if(((dialog->style&CC_ST_DI_HASMAXIMIZE)==CC_ST_DI_HASMAXIMIZE)&& (_cc_inrect(0,0,p->vx,1,x,y))) { _cc_capturewin=NULL; _cc_usekeys=true; dialog->bmaximize->extra->button.push(dialog->bmaximize); } break; case CC_MOUSE_L_DOWN: if(_cc_inrect(0,0,p->vx,p->vy,x,y)&& (!_cc_inrect(1,1,p->vx-2,p->vy-2,x,y))) { if((statemd&CC_MOD_CTRL)!=CC_MOD_CTRL) { if(_cc_inrect(0,0,p->vx,1,x,y))p->stat=0;else p->stat=-1; if(((dialog->style&CC_ST_DI_SIZEABLE)==CC_ST_DI_SIZEABLE)&& (dialog->state!=CC_SV_MAXIMIZED)) { if((((_cc_inrect(1,0,1,1,x,y)||(_cc_inrect(p->vx-2,0,1,1,x,y)&& (p->vx>4)))&& (dialog->state==CC_SV_NORMAL)))&&!(p->style&CC_ST_AU_FIXED)) p->stat=1; else if(_cc_inrect(p->vx-2,p->vy-2,2,2,x,y)&& (dialog->state==CC_SV_NORMAL)&&!(p->style&CC_ST_AR_FIXED)&& !(p->style&CC_ST_AD_FIXED))p->stat=4; else if(_cc_inrect(2,p->vy-1,p->vx-4,1,x,y)&&(p->vy>1)&& (dialog->state==CC_SV_NORMAL)&&!(p->style&CC_ST_AD_FIXED)) p->stat=5; else if(_cc_inrect(0,p->vy-2,2,2,x,y)&& (dialog->state==CC_SV_NORMAL)&& !(p->style&CC_ST_AL_FIXED)&&!(p->style&CC_ST_AD_FIXED)) p->stat=6; else if(_cc_inrect(p->vx-1,0,1,2,x,y)&& (dialog->state==CC_SV_NORMAL)&& !(p->style&CC_ST_AU_FIXED)&&!(p->style&CC_ST_AR_FIXED)) p->stat=2; else if(_cc_inrect(0,0,1,2,x,y)&&(dialog->state==CC_SV_NORMAL)&& !(p->style&CC_ST_AU_FIXED)&&!(p->style&CC_ST_AL_FIXED)) p->stat=8; else if(_cc_inrect(p->vx-1,0,1,p->vy,x,y)&& !(p->style&CC_ST_AR_FIXED)) p->stat=3; else if(_cc_inrect(0,0,1,p->vy,x,y)&&!(p->style&CC_ST_AL_FIXED)) p->stat=7; } if(p->stat==-1){p->stat=0;break;} } else p->stat=0; _cc_capturewin=p; _cc_usekeys=false; mx=p->x-vx; my=p->y-vy; nx=p->x+p->vx; ny=p->y+p->vy; } break; case CC_MOUSE_L_UP: if(_cc_capturewin!=p)break; _cc_sendmousemessage(vx,vy,CC_MOUSE_MOVE); p->stat=0; _cc_capturewin=NULL; _cc_usekeys=true; } } if(((state==CC_MOUSE_L_DOWN)||(state==CC_MOUSE_R_DOWN))&&setfocus) cc_set_focus(_cc_findchild(p)); if(chang)_cc_redrawclientwin(p); if(sendnext)_cc_sendmousemessage(vx,vy,state); return result; }