File: [Platon] / tucniak / cuchar / cc_key.c (download)
Revision 1.7, Sat Dec 10 21:24:54 2005 UTC (18 years, 4 months ago) by misosud
Changes since 1.6: +8 -6
lines
Changed calling conventions for standard dialog boxes functions.
|
/*
Name: cc_key.c
Author: Michal Sudolsky <michals@sulysoft.com>
Date: 22.09.2005 14:45
*/
// modified by Juraj Kolesar <koli@koli.sk>
#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;i<len+line;i++)
edit->text[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<len;i++)
{
if(c[i]=='&')
{
s=c[i+1];
if((s>='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<len;i++)
{
if(c[i]=='&')
{
s=c[i+1];
if((s>='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->curpos<len){edit->curpos++;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->curpos<len-1){edit->curpos++;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->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;
}
actline=edit->maskpos-edit->curpos+1;
}
else actline=1;
for(i=edit->curpos;i<len-actline;i++)
edit->text[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);i<len-actline;i++)
edit->text[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->pos<hscroll->maxpos)
{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->activeline<vscroll->pos)
{
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((old<menu->activeline)&&(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 <term.h>
#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;
}
Platon Group <platon@platon.org> http://platon.org/
|