/* Name: cc_key.c Author: Michal Sudolsky Date: 22.09.2005 14:45 */ // modified by Juraj Kolesar #include "cc.h" pthread_t _cc__cc_getchthreadp; bool _cc_usekeys=true; bool _cc_findmenukey(Cc_Win *win,unsigned short key) { MENU *menu=&win->extra->menu; GList *lines=menu->lines; bool gets=false; while(lines!=NULL) { unsigned short sc=((Cc_Menu_I*)lines->data)->shortcut; if(((sc&CC_MASK_KEY)>='a')&&((sc&CC_MASK_KEY)<='z'))sc+='A'-'a'; if((sc==key)&&(menu->select!=NULL)) { menu->select(win,((Cc_Menu_I*)lines->data)->id); gets=true; return gets; } Cc_Win *submenu=((Cc_Menu_I*)lines->data)->submenu; if(submenu!=NULL)if(_cc_findmenukey(submenu,key))gets=true; lines=g_list_next(lines); } return gets; } bool _cc_sendkeymessage(unsigned short key) { if(!_cc_usekeys)return true; return _cc_runacel(_cc_focuswin,0,0,key); } bool _cc_dosendkeymessage(Cc_Win *spcfocus,unsigned short key) { if(spcfocus==NULL)return false; EDIT *edit; BUTTON *button; MENU *menu; GList *lines; bool chang=false,gets=false; long len,i,line; char *er,*c,s; unsigned short kk=key&CC_MASK_KEY; Cc_Win *p; switch(spcfocus->extra->type) { case CC_TP_EDIT: if((key==(CC_MOD_CTRL|'c'))||(key==(CC_MOD_CTRL|'C'))) {cc_edit_copy(spcfocus);gets=true;break;} if((key==(CC_MOD_CTRL|'v'))||(key==(CC_MOD_CTRL|'V'))) {cc_edit_paste(spcfocus);gets=true;break;} if((key==(CC_MOD_CTRL|'x'))||(key==(CC_MOD_CTRL|'X'))) {cc_edit_cut(spcfocus);gets=true;break;} if((key&(CC_MASK_MOD-CC_MOD_SHIFT)))break; edit=&spcfocus->extra->edit; if(edit->style==CC_ED_READONLY)break; len=strlen(edit->text); if(edit->curpos>len)edit->curpos=len; if(edit->maskpos!=-1) { if(edit->curpos>len-1)edit->curpos=len-1; if(edit->maskpos>len-1)edit->maskpos=len-1; if(edit->curpos>edit->maskpos) { i=edit->curpos; edit->curpos=edit->maskpos; edit->maskpos=i; } line=edit->curpos-edit->maskpos; } else line=1; er=(unsigned char*)realloc(edit->text,len+line+1); if(er==NULL)return false; edit->text=er; if(line>0)for(i=len;i>edit->curpos;i--)edit->text[i]=edit->text[i-1]; else if(line<0)for(i=edit->curpos+1;itext[i]=edit->text[i-line]; edit->text[edit->curpos]=key; len+=line; edit->text[len]='\0'; edit->curpos++; edit->maskpos=-1; if(edit->curpos-edit->scroll>spcfocus->vx-1) edit->scroll+=(spcfocus->vx/2>10)?10:spcfocus->vx/2; if(edit->change!=NULL)edit->change(spcfocus); chang=true; gets=true; break; case CC_TP_BUTTON: button=&spcfocus->extra->button; if((key&~CC_MOD_SHIFT)==' ') { if(button->status==TS_HIGH)button->status=TS_EXPUSH; else button->status=TS_PUSH; chang=true; if(button->push!=NULL)button->push(spcfocus); gets=true; } break; case CC_TP_MENU: if((kk>='a')&&(kk<='z')){key+='A'-'a';kk=key&CC_MASK_KEY;} menu=&spcfocus->extra->menu; if(spcfocus==_cc_focuswin) { gets=true; lines=menu->lines; line=0; while(lines!=NULL) { c=((Cc_Menu_I*)lines->data)->text; len=strlen(c); for(i=0;i='a')&&(s<='z'))s+='A'-'a'; if(s==kk) { menu->activeline=line; _cc_dosendsyskeymessage(spcfocus,CC_KEY_ENTER); } i++; } } lines=g_list_next(lines); line++; } } if((!menu->vert)|| (spcfocus->parent==NULL)|| (spcfocus->parent->extra->type!=CC_TP_MENU)) gets|=_cc_findmenukey(spcfocus,key); break; case CC_TP_DIALOG: if((kk>='a')&&(kk<='z'))kk+='A'-'a'; for(p=spcfocus->child;p!=NULL;p=p->next) if(p->extra->type==CC_TP_BUTTON) { button=&p->extra->button; c=button->text; len=strlen(c); for(i=0;i='a')&&(s<='z'))s+='A'-'a'; if(s==kk) { _cc_dosendsyskeymessage(p,CC_KEY_ENTER); gets=true; return gets; } i++; } } } break; } if(chang)_cc_redrawclientwin(spcfocus); return gets; } bool _cc_dosendsyskeymessage(Cc_Win *spcfocus,unsigned short key) { EDIT *edit; BUTTON *button; LIST *list; SCROLL *vscroll,*hscroll; COMBO *combo; MENU *menu; DIALOG *dialog; GList *lines,*start; bool chang=false,gets=false; long len,i,actline,x,y,numlines; char *er; void (*change)()=NULL; if(spcfocus!=NULL) switch(spcfocus->extra->type) { case CC_TP_EDIT: edit=&spcfocus->extra->edit; len=strlen(edit->text); switch(key) { case CC_KEY_UP: cc_set_focus(_cc_findprevwin(spcfocus)); spcfocus->stat=0; break; case CC_KEY_DOWN: cc_set_focus(_cc_findnextwin(spcfocus)); spcfocus->stat=0; break; case CC_KEY_POPUP: x=0; y=1; cc_client_to_screen(spcfocus,&x,&y); cc_set_parent(_cc_clipboardmenu,spcfocus); cc_track_popup_menu(_cc_clipboardmenu,x,y); break; case CC_KEY_INS|CC_MOD_CTRL:cc_edit_copy(spcfocus);gets=true;break; case CC_KEY_INS|CC_MOD_SHIFT:cc_edit_paste(spcfocus);gets=true;break; case CC_KEY_DEL|CC_MOD_SHIFT:cc_edit_cut(spcfocus);gets=true;break; case CC_KEY_LEFT: if(edit->curpos>0){edit->curpos--;chang=true;} if(edit->maskpos!=-1){edit->maskpos=-1;chang=true;} gets=true;break; case CC_KEY_LEFT|CC_MOD_SHIFT: if(len!=0)if(edit->maskpos==-1) {edit->maskpos=edit->curpos;chang=true;} if(edit->curpos>0){edit->curpos--;chang=true;} gets=true;break; case CC_KEY_RIGHT: if(edit->curposcurpos++;chang=true;} if(edit->maskpos!=-1){edit->maskpos=-1;chang=true;} gets=true;break; case CC_KEY_RIGHT|CC_MOD_SHIFT: if(len!=0)if(edit->maskpos==-1) {edit->maskpos=edit->curpos;chang=true;} if(edit->curposcurpos++;chang=true;} gets=true;break; case CC_KEY_HOME:edit->curpos=0;edit->maskpos=-1;chang=true;gets=true; break; case CC_KEY_HOME|CC_MOD_SHIFT: if(len!=0)edit->maskpos=edit->curpos;edit->curpos=0;chang=true; gets=true;break; case CC_KEY_END:edit->curpos=len;edit->maskpos=-1;chang=true;gets=true; break; case CC_KEY_END|CC_MOD_SHIFT: if(len!=0)edit->maskpos=edit->curpos;edit->curpos=len-1;chang=true; gets=true;break; case CC_KEY_DEL:; if(edit->style==CC_ED_READONLY)break; if(edit->curposmaskpos!=-1) { if(edit->curpos>len-1)edit->curpos=len-1; if(edit->maskpos>len-1)edit->maskpos=len-1; if(edit->curpos>edit->maskpos) { i=edit->curpos; edit->curpos=edit->maskpos; edit->maskpos=i; } actline=edit->maskpos-edit->curpos+1; } else actline=1; for(i=edit->curpos;itext[i]=edit->text[i+actline]; len-=actline; er=(unsigned char*)realloc(edit->text,len+1); edit->maskpos=-1; if(er==NULL)return; edit->text=er; edit->text[len]='\0'; chang=true; change=edit->change; } gets=true; break; case CC_KEY_BACK: if(edit->style==CC_ED_READONLY)break; if((edit->curpos>0)||((edit->maskpos!=-1)&&(edit->curpos>=0))) { if(edit->maskpos!=-1) { if(edit->curpos>len-1)edit->curpos=len-1; if(edit->maskpos>len-1)edit->maskpos=len-1; if(edit->curpos>edit->maskpos) { i=edit->curpos; edit->curpos=edit->maskpos; edit->maskpos=i; } actline=edit->maskpos-edit->curpos+1; } else actline=1; for(i=edit->curpos-(edit->maskpos==-1?1:0);itext[i]=edit->text[i+actline]; len-=actline; if(edit->maskpos==-1)edit->curpos--; edit->text=(unsigned char*)realloc(edit->text,len+1); edit->maskpos=-1; edit->text[len]='\0'; if(edit->curpos-edit->scroll<0) edit->scroll-=(spcfocus->vx/2>10)?10:spcfocus->vx/2; chang=true; change=edit->change; } gets=true; break; } if(edit->curpos-edit->scroll<0) { edit->scroll=edit->curpos; chang=true; } if(edit->curpos-edit->scroll>spcfocus->vx-1) { edit->scroll=edit->curpos-spcfocus->vx+1; chang=true; } if(change!=NULL)change(spcfocus); break; case CC_TP_BUTTON: button=&spcfocus->extra->button; if(key==CC_KEY_ENTER) { if(button->status==TS_HIGH)button->status=TS_EXPUSH; else button->status=TS_PUSH; chang=true; if(button->push!=NULL)button->push(spcfocus); gets=true; } else if((key==CC_KEY_LEFT)||(key==CC_KEY_UP)) { cc_set_focus(_cc_findprevwin(spcfocus)); gets=true; spcfocus->stat=0; } else if((key==CC_KEY_RIGHT)||(key==CC_KEY_DOWN)) { cc_set_focus(_cc_findnextwin(spcfocus)); gets=true; spcfocus->stat=0; } break; case CC_TP_LIST: list=&spcfocus->extra->list; vscroll=&list->vscroll->extra->scroll; hscroll=&list->hscroll->extra->scroll; actline=list->activeline; numlines=list->numlines; switch(key) { case CC_KEY_LEFT:if(hscroll->pos>hscroll->minpos) {hscroll->pos--;chang=true; _cc_redrawclientwin(list->hscroll);}gets=true;break; case CC_KEY_RIGHT:if(hscroll->posmaxpos) {hscroll->pos++;chang=true; _cc_redrawclientwin(list->hscroll);}gets=true;break; case CC_KEY_UP:list->activeline--;gets=true;break; case CC_KEY_DOWN:list->activeline++;gets=true;break; case CC_KEY_PGUP:list->activeline-=vscroll->pagecnt;gets=true;break; case CC_KEY_PGDOWN:list->activeline+=vscroll->pagecnt;gets=true;break; case CC_KEY_HOME:list->activeline=0;gets=true;break; case CC_KEY_END:list->activeline=numlines-1;gets=true;break; case CC_KEY_ENTER: if(list->combotyp==CC_LI_COMBO) { _cc_capturewin=NULL; _cc_sendmousemessage(_cc_mousex,_cc_mousey,CC_MOUSE_L_UP); cc_set_focus(spcfocus->parent); cc_show_win(spcfocus,false); gets=true; } if(list->dblclk!=NULL) { if((list->combotyp==CC_LI_COMBO)&&(spcfocus->parent!=NULL)&& (spcfocus->parent->extra->type==CC_TP_COMBO)&& (list->activeitem!=NULL)) { combo=&spcfocus->parent->extra->combo; char *data=list->activeitem->data; cc_set_text(combo->edit,data); cc_edit_select(combo->edit,0,CC_MAXLONG); } list->dblclk(spcfocus); chang=true; } break; case CC_KEY_ESC: if(list->combotyp==CC_LI_COMBO) { _cc_capturewin=NULL; _cc_sendmousemessage(_cc_mousex,_cc_mousey,CC_MOUSE_L_UP); cc_set_focus(spcfocus->parent); cc_show_win(spcfocus,false); gets=true; } break; } if(list->activeline<0)list->activeline=0; if(list->activeline>numlines-1)list->activeline=numlines-1; if(list->activelinepos) { vscroll->pos=list->activeline; _cc_redrawclientwin(list->vscroll); } if(list->activeline-spcfocus->vy+3>vscroll->pos) { vscroll->pos=list->activeline-spcfocus->vy+3; _cc_redrawclientwin(list->vscroll); } if(actline!=list->activeline) { _cc_setlistactiveitem(list,actline,list->activeline); if(list->change!=NULL)list->change(spcfocus); chang=true; } break; case CC_TP_COMBO: combo=&spcfocus->extra->combo; list=&combo->list->extra->list; vscroll=&list->vscroll->extra->scroll; actline=combo->activeline; numlines=list->numlines; x=spcfocus->vx-1; y=0; cc_client_to_screen(spcfocus,&x,&y); switch(key) { case CC_KEY_LEFT:combo->scroll--;chang=true;gets=true;break; case CC_KEY_RIGHT:combo->scroll++;chang=true;gets=true;break; case CC_KEY_UP: if((combo->edit==NULL)|| (strcmp(combo->edit->extra->edit.text,combo->activeitem->data)==0)) combo->activeline--; else {combo->activeline=0;actline=-1;} gets=true; break; case CC_KEY_DOWN: if((combo->edit==NULL)|| (strcmp(combo->edit->extra->edit.text,combo->activeitem->data)==0)) combo->activeline++; else {combo->activeline=0;actline=-1;} gets=true; break; case CC_KEY_PGUP: if((combo->edit==NULL)|| (strcmp(combo->edit->extra->edit.text,combo->activeitem->data)==0)) combo->activeline-=vscroll->pagecnt; else {combo->activeline=0;actline=-1;} gets=true; break; case CC_KEY_PGDOWN: if((combo->edit==NULL)|| (strcmp(combo->edit->extra->edit.text,combo->activeitem->data)==0)) combo->activeline+=vscroll->pagecnt; else {combo->activeline=numlines-1;actline=-1;} gets=true; break; case CC_KEY_HOME:combo->activeline=0;gets=true;break; case CC_KEY_END:combo->activeline=numlines-1;gets=true;break; case CC_KEY_ENTER: if(_cc_capturewin!=spcfocus)_cc_capturewin=NULL; _cc_sendmousemessage(x,y,CC_MOUSE_L_DOWN); _cc_sendmousemessage(x,y,CC_MOUSE_L_UP); gets=true; break; } if(combo->activeline<0)combo->activeline=0; if(combo->activeline>numlines-1)combo->activeline=numlines-1; if(actline!=combo->activeline) { chang=true; _cc_setcomboactiveitem(combo,actline,combo->activeline); char *data=combo->activeitem->data; cc_set_text(combo->edit,data); cc_edit_select(combo->edit,0,CC_MAXLONG); if(combo->change!=NULL)combo->change(spcfocus); } break; case CC_TP_MENU: menu=&spcfocus->extra->menu; actline=menu->activeline; if(menu->lines!=NULL)numlines=g_list_length(menu->lines);else numlines=0; switch(key) { case CC_KEY_LEFT: if(!_cc_isfocused(spcfocus))return gets; if(menu->lines==NULL)return gets; if(!menu->vert) { GList *start,*lines; start=lines=g_list_nth(menu->lines,menu->activeline); if(menu->activeline==-1)menu->activeline=numlines-1; else do { if(menu->activeline>=0) { menu->activeline--; if(menu->activeline<0)menu->activeline=numlines-1; } lines=g_list_previous(lines); if(lines==start){break;menu->activeline=-1;} if(lines==NULL)lines=g_list_last(menu->lines); } while(strcmp(((Cc_Menu_I*)lines->data)->text,"-")==0); if(_cc_focuswin!=spcfocus) { _cc_dosendsyskeymessage(spcfocus,CC_KEY_ENTER); chang=false; } gets=true; } else { if(spcfocus->parent!=NULL) { Cc_Win *parent=spcfocus->parent; if(parent->extra->type==CC_TP_MENU) { MENU *menus=&parent->extra->menu; if(menus->vert) { menu->activeline=-1; Cc_Win *capt=_cc_capturewin; cc_show_win(spcfocus,false); cc_set_focus(spcfocus->parent); if(capt==spcfocus)_cc_capturewin=spcfocus->parent; gets=true; } } } } break; case CC_KEY_RIGHT: if(!_cc_isfocused(spcfocus))return gets; if(menu->lines==NULL)return gets; if(!menu->vert) { GList *start,*lines; start=lines=g_list_nth(menu->lines,menu->activeline); if(menu->activeline==-1)menu->activeline=0; else do { menu->activeline++; if(menu->activeline>numlines-1)menu->activeline=0; lines=g_list_next(lines); if(lines==start){break;menu->activeline=-1;} if(lines==NULL)lines=menu->lines; } while(strcmp(((Cc_Menu_I*)lines->data)->text,"-")==0); if(_cc_focuswin!=spcfocus) { _cc_dosendsyskeymessage(spcfocus,CC_KEY_ENTER); chang=false; } gets=true; } else { if((menu->activeline!=-1)&&(_cc_focuswin==spcfocus)) { Cc_Win *submenu=((Cc_Menu_I*) g_list_nth(menu->lines, menu->activeline)->data)->submenu; if(submenu!=NULL) { x=1; y=menu->activeline+1; cc_client_to_screen(spcfocus,&x,&y); if(_cc_capturewin!=spcfocus)_cc_capturewin=NULL; _cc_sendmousemessage(x,y,CC_MOUSE_MOVE); if(submenu!=NULL) { spcfocus->stat=2; if(submenu->extra->menu.activeline==-1) submenu->extra->menu.activeline=0; _cc_redrawclientwin(submenu); } gets=true; } } } break; case CC_KEY_UP: if(!_cc_isfocused(spcfocus))return gets; if(menu->lines==NULL)return gets; start=lines=g_list_nth(menu->lines,menu->activeline); if(menu->activeline==-1)menu->activeline=numlines-1; else do { if(menu->activeline>=0) { menu->activeline--; if(menu->activeline<0)menu->activeline=numlines-1; } lines=g_list_previous(lines); if(lines==start){break;menu->activeline=-1;} if(lines==NULL)lines=g_list_last(menu->lines); } while(strcmp(((Cc_Menu_I*)lines->data)->text,"-")==0); gets=true; break; case CC_KEY_DOWN: if(!_cc_isfocused(spcfocus))return gets; if(menu->lines==NULL)return gets; if(menu->vert) { start=lines=g_list_nth(menu->lines,menu->activeline); if(menu->activeline==-1)menu->activeline=0; else do { menu->activeline++; if(menu->activeline>numlines-1)menu->activeline=0; lines=g_list_next(lines); if(lines==start){break;menu->activeline=-1;} if(lines==NULL)lines=menu->lines; } while(strcmp(((Cc_Menu_I*)lines->data)->text,"-")==0); gets=true; } else { _cc_dosendsyskeymessage(spcfocus,CC_KEY_ENTER); chang=false; gets=true; } break; case CC_KEY_ENTER: if(!_cc_isfocused(spcfocus))return gets; if(menu->lines==NULL)return gets; if(menu->vert) { if(menu->activeline!=-1) { x=1; y=menu->activeline+1; cc_client_to_screen(spcfocus,&x,&y); if(_cc_capturewin!=spcfocus)_cc_capturewin=NULL; Cc_Win *submenu=((Cc_Menu_I*) g_list_nth(menu->lines, menu->activeline)->data)->submenu; _cc_sendmousemessage(x,y,submenu!=NULL?CC_MOUSE_MOVE:CC_MOUSE_L_DOWN); if(submenu==NULL)_cc_sendmousemessage(x,y,CC_MOUSE_L_UP); if(submenu!=NULL) { if(submenu->extra->menu.activeline==-1) submenu->extra->menu.activeline=0; spcfocus->stat=2; _cc_redrawclientwin(submenu); } else _cc_sendmousemessage(_cc_gpmev.x,_cc_gpmev.y,CC_MOUSE_MOVE); gets=true; } } else { if(menu->activeline!=-1) { x=0; y=0; long old=0; GList *lines=menu->lines; Cc_Win *submenu=((Cc_Menu_I*) g_list_nth(menu->lines, menu->activeline)->data)->submenu; while((oldactiveline)&&(lines!=NULL)) { if(lines->data!=NULL) if(((Cc_Menu_I*)lines->data)->text!=NULL) x+=strlen(((Cc_Menu_I*)lines->data)->text)+2; lines=g_list_next(lines); old++; } cc_client_to_screen(spcfocus,&x,&y); menu->activeline=-1; if(_cc_capturewin!=spcfocus)_cc_capturewin=NULL; _cc_sendmousemessage(x,y,CC_MOUSE_MOVE); _cc_sendmousemessage(x,y+1,CC_MOUSE_MOVE); if(submenu!=NULL) { if(submenu->extra->menu.activeline==-1) submenu->extra->menu.activeline=0; _cc_redrawclientwin(submenu); } else _cc_sendmousemessage(_cc_gpmev.x,_cc_gpmev.y,CC_MOUSE_MOVE); spcfocus->stat=2; } gets=true; } break; case CC_KEY_ESC: if(!_cc_isfocused(spcfocus))return gets; menu->activeline=-1; if(menu->vert) { if((spcfocus->parent!=NULL)&& (spcfocus->parent->extra->type==CC_TP_MENU)) { Cc_Win *capt=_cc_capturewin; cc_show_win(spcfocus,false); cc_set_focus(spcfocus->parent); if(capt==spcfocus)_cc_capturewin=spcfocus->parent; } else { cc_show_win(spcfocus,false); cc_set_focus(spcfocus->parent); spcfocus->stat=0; } } else { spcfocus->stat=0; cc_set_focus(_cc_lastfocused); _cc_sendmousemessage(_cc_gpmev.x,_cc_gpmev.y,CC_MOUSE_L_UP); } gets=true; break; case CC_KEY_LEFT|CC_MOD_ALT: case CC_KEY_F9: if((!menu->vert)&&(!_cc_isfocused(spcfocus))) { menu->activeline=0; cc_set_focus(spcfocus); } break; default: if(!menu->vert)gets=_cc_findmenukey(spcfocus,key); } if(menu->activeline<-1)menu->activeline=-1; if(menu->activeline>numlines-1)menu->activeline=numlines-1; if(actline!=menu->activeline) { if(menu->change!=NULL)menu->change(spcfocus); chang=true; } break; case CC_TP_DIALOG: dialog=&spcfocus->extra->dialog; switch(key) { case CC_KEY_LEFT|CC_MOD_CTRL: cc_move_win(spcfocus,spcfocus->x-1,CC_NOCHANGE,CC_NOCHANGE, CC_NOCHANGE,CC_NOCHANGE);gets=true;break; case CC_KEY_RIGHT|CC_MOD_CTRL: cc_move_win(spcfocus,spcfocus->x+1,CC_NOCHANGE,CC_NOCHANGE, CC_NOCHANGE,CC_NOCHANGE);gets=true;break; case CC_KEY_UP|CC_MOD_CTRL: cc_move_win(spcfocus,CC_NOCHANGE,spcfocus->y-1,CC_NOCHANGE, CC_NOCHANGE,CC_NOCHANGE);gets=true;break; case CC_KEY_DOWN|CC_MOD_CTRL: cc_move_win(spcfocus,CC_NOCHANGE,spcfocus->y+1,CC_NOCHANGE,CC_NOCHANGE, CC_NOCHANGE);gets=true;break; case CC_KEY_HOME|CC_MOD_CTRL: cc_move_win(spcfocus,spcfocus->x-1,spcfocus->y-1,CC_NOCHANGE, CC_NOCHANGE,CC_NOCHANGE);gets=true;break; case CC_KEY_PGUP|CC_MOD_CTRL: cc_move_win(spcfocus,spcfocus->x+1,spcfocus->y-1,CC_NOCHANGE, CC_NOCHANGE,CC_NOCHANGE);gets=true;break; case CC_KEY_PGDOWN|CC_MOD_CTRL: cc_move_win(spcfocus,spcfocus->x+1,spcfocus->y+1,CC_NOCHANGE, CC_NOCHANGE,CC_NOCHANGE);gets=true;break; case CC_KEY_END|CC_MOD_CTRL: cc_move_win(spcfocus,spcfocus->x-1,spcfocus->y+1,CC_NOCHANGE, CC_NOCHANGE,CC_NOCHANGE);gets=true;break; case CC_KEY_LEFT|CC_MOD_CTRL|CC_MOD_SHIFT: cc_move_win(spcfocus,CC_NOCHANGE,CC_NOCHANGE,spcfocus->vx-1, CC_NOCHANGE,CC_NOCHANGE);gets=true;break; case CC_KEY_RIGHT|CC_MOD_CTRL|CC_MOD_SHIFT: cc_move_win(spcfocus,CC_NOCHANGE,CC_NOCHANGE,spcfocus->vx+1, CC_NOCHANGE,CC_NOCHANGE);gets=true;break; case CC_KEY_UP|CC_MOD_CTRL|CC_MOD_SHIFT: cc_move_win(spcfocus,CC_NOCHANGE,CC_NOCHANGE,CC_NOCHANGE, spcfocus->vy-1,CC_NOCHANGE);gets=true;break; case CC_KEY_DOWN|CC_MOD_CTRL|CC_MOD_SHIFT: cc_move_win(spcfocus,CC_NOCHANGE,CC_NOCHANGE,CC_NOCHANGE, spcfocus->vy+1,CC_NOCHANGE);gets=true;break; case CC_KEY_HOME|CC_MOD_CTRL|CC_MOD_SHIFT: cc_move_win(spcfocus,CC_NOCHANGE,CC_NOCHANGE,spcfocus->vx-1, spcfocus->vy-1,CC_NOCHANGE);gets=true;break; case CC_KEY_PGUP|CC_MOD_CTRL|CC_MOD_SHIFT: cc_move_win(spcfocus,CC_NOCHANGE,CC_NOCHANGE,spcfocus->vx+1, spcfocus->vy-1,CC_NOCHANGE);gets=true;break; case CC_KEY_PGDOWN|CC_MOD_CTRL|CC_MOD_SHIFT: cc_move_win(spcfocus,CC_NOCHANGE,CC_NOCHANGE,spcfocus->vx+1, spcfocus->vy+1,CC_NOCHANGE);gets=true;break; case CC_KEY_END|CC_MOD_CTRL|CC_MOD_SHIFT: cc_move_win(spcfocus,CC_NOCHANGE,CC_NOCHANGE,spcfocus->vx-1, spcfocus->vy+1,CC_NOCHANGE);gets=true;break; case CC_KEY_INS|CC_MOD_CTRL|CC_MOD_SHIFT: if((dialog->style&CC_ST_DI_HASMAXIMIZE)==CC_ST_DI_HASMAXIMIZE) dialog->bmaximize->extra->button.push(dialog->bmaximize); gets=true; break; case CC_KEY_DEL|CC_MOD_CTRL|CC_MOD_SHIFT: if((dialog->style&CC_ST_DI_HASMINIMIZE)==CC_ST_DI_HASMINIMIZE) dialog->bminimize->extra->button.push(dialog->bminimize); gets=true; break; case CC_KEY_F4|CC_MOD_SHIFT: dialog->bclose->extra->button.push(dialog->bclose);gets=true;break; case CC_KEY_TAB: cc_set_focus(_cc_findchild(spcfocus)); gets=true; break; } break; } if(!gets) { if(spcfocus!=NULL) if(spcfocus->extra->type!=CC_TP_DIALOG) { if(key==CC_KEY_TAB) { spcfocus->stat=0; cc_set_focus(_cc_findnextwin(spcfocus)); gets=true; } else if(key==(CC_KEY_TAB|CC_MOD_CTRL)) { spcfocus->stat=0; cc_set_focus(_cc_findprevwin(spcfocus)); gets=true; } else if(key==(CC_KEY_TAB|CC_MOD_SHIFT)) { spcfocus->stat=0; if(spcfocus->parent!=NULL)cc_set_focus(spcfocus->parent); gets=true; } else if(key==(CC_KEY_TAB|CC_MOD_SHIFT|CC_MOD_CTRL)) { spcfocus->stat=0; Cc_Win *child=_cc_findchild(spcfocus); if(child!=NULL)cc_set_focus(child); gets=true; } } if(key==CC_KEY_F5) { spcfocus->stat=0; cc_set_focus(_cc_findchildnom(_cc_findprevdialog(spcfocus))); gets=true; } else if(key==CC_KEY_F6) { spcfocus->stat=0; cc_set_focus(_cc_findchildnom(_cc_findnextdialog(spcfocus))); gets=true; } } if(chang)_cc_redrawclientwin(spcfocus); return gets; } #include #undef buttons void *_cc_getchthread(void *par) { while(_cc_apprun) { long key,temp; unsigned char res; unsigned short mod; res=6; mod=0; key=getch(); if(!_cc_apprun)return NULL; while(_cc_waitevent); _cc_waitkeyevent=true; _cc_mousex=CC_NOCHANGE; _cc_mousey=CC_NOCHANGE; nodelay(stdscr,true); if(ioctl(0,TIOCLINUX,&res)>=0) { if((res&SHIFT_PRESSED)==SHIFT_PRESSED)mod|=CC_MOD_SHIFT; if((res&CTRL_PRESSED)==CTRL_PRESSED)mod|=CC_MOD_CTRL; if(((res&ALTL_PRESSED)==ALTL_PRESSED)|| ((res&ALTR_PRESSED)==ALTR_PRESSED)) { mod|=CC_MOD_ALT; if(key==27)key=getch(); } } if(key==27) { if((temp=getch())!=27) ungetch(temp); else { key=temp; mod|=CC_MOD_ALT; } } _cc_dokey(key,mod); nodelay(stdscr,false); if((_cc_screenx!=columns)||(_cc_screeny!=lines)) { _cc_screenx=columns; _cc_screeny=lines; _cc_mainwin.vx=_cc_screenx; _cc_mainwin.vy=_cc_screeny; _cc_mainwin.windata=realloc(_cc_mainwin.windata, _cc_screenx*_cc_screeny*sizeof(attr_t)); _cc_cmap=realloc(_cc_cmap,_cc_screenx*_cc_screeny*sizeof(CMAP)); if(_cc_resizescreen!=NULL)_cc_resizescreen(NULL); _cc_redraw(); } else _cc_doneredraw(); refresh(); _cc_waitkeyevent=false; } return NULL; }