Platon Technologies
not logged in Login Registration
EnglishSlovak
open source software development celebrating 10 years of open source development! Friday, April 19, 2024

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/
Copyright © 2002-2006 Platon Group
Site powered by Metafox CMS
Go to Top