Platon Technologies
not logged in Login Registration
EnglishSlovak
open source software development celebrating 10 years of open source development! Friday, October 16, 2026

Diff for tucniak/cuchar/cc_mouse.c between version 1.1 and 1.2

version 1.1, 2005/11/25 22:41:24 version 1.2, 2005/11/27 20:14:50
Line 1 
Line 1 
 // Copyright (c) 2005 Michal Sudolsky  /*
 // modified by Juraj Kolesár <koli@koli.sk>    Name: lc_mouse.c
 #include "cuchar.h"    Author: Michal Sudolsky
     Date: 22.09.2005 16:12
 long mousex;  */
 long mousey;  // modified by Juraj Kolesar <koli@koli.sk>
 bool aftermouseval;  
 char mouseactive=MOUSE_NONE;  #include "cc.h"
 char redrawmouse=2;  #define stat p->stat
 TIMER *mouserepeattimer=NULL,*doubletimer1=NULL,*doubletimer2=NULL;  
 bool doubleclickstate1=false,doubleclickstate2;  long mousex;
 Gpm_Event gpmev;  long mousey;
 bool eventq=false;  bool aftermouseval;
   char mouseactive=MOUSE_NONE;
   char redrawmouse=2;
   TIMER *mouserepeattimer=NULL,*doubletimer1=NULL,*doubletimer2=NULL;
   bool doubleclickstate1=false,doubleclickstate2;
   Gpm_Event gpmev;
   bool eventq=false;
 pthread_t gpmthreadp;  pthread_t gpmthreadp;
 char stat=0;  
 WIN *lastfocused=NULL;  WIN *lastfocused=NULL;
   
 void buttondoubletimer(TIMER *sender)  void buttondoubletimer(TIMER *sender)
 {  {
   redraw();    redraw();
   redraw();    redraw();
   del_timer(sender);    del_timer(sender);
 }  }
   
 bool inrect(long x1,long y1,long x2,long y2,long x,long y)  bool inrect(long x1,long y1,long x2,long y2,long x,long y)
 {  {
   return (x>=x1)&&(x<x1+x2)&&(y>=y1)&&(y<y1+y2);    return (x>=x1)&&(x<x1+x2)&&(y>=y1)&&(y<y1+y2);
 }  }
   
 bool sendmousemessage(long vx,long vy,unsigned short state)  bool sendmousemessage(long vx,long vy,unsigned short state)
 {  {
   if((hlwin==NULL)||(!mouseactive))return false;    if((hlwin==NULL)||(!mouseactive))return false;
   WIN *p=capturewin;    WIN *p=capturewin;
   if(p==NULL)p=findwin(vx,vy);    if(p==NULL)p=findwin(vx,vy);
   return runacel(p,vx,vy,state);    return runacel(p,vx,vy,state);
 }  }
   
 void doubleclickproc(TIMER *sender)  void doubleclickproc(TIMER *sender)
 {  {
   if(sender==doubletimer1)    if(sender==doubletimer1)
   {    {
     doubleclickstate1=false;      doubleclickstate1=false;
     del_timer(sender);      del_timer(sender);
     doubletimer1=NULL;      doubletimer1=NULL;
   }    }
   else if(sender==doubletimer2)    else if(sender==doubletimer2)
   {    {
     doubleclickstate2=false;      doubleclickstate2=false;
     del_timer(sender);      del_timer(sender);
     doubletimer2=NULL;      doubletimer2=NULL;
   }    }
 }  }
   
 void mouserepeatproc(TIMER *sender)  void mouserepeatproc(TIMER *sender)
 {  {
   sendmousemessage(mousex,mousey,MM_LBUTTONDOWN);    sendmousemessage(gpmev.x,gpmev.y,MM_LBUTTONDOWN);
   if(!aftermouseval)    if(!aftermouseval)
   {    {
     del_timer(sender);      del_timer(sender);
     mouserepeattimer=NULL;      mouserepeattimer=NULL;
   }    }
 }  }
   
 void mousewaitproc(TIMER *sender)  void mousewaitproc(TIMER *sender)
 {  {
   del_timer(sender);    del_timer(sender);
   mouserepeattimer=set_timer(NULL,REPEATTICK,0,mouserepeatproc);    mouserepeattimer=set_timer(NULL,REPEATTICK,0,mouserepeatproc);
 }  }
   
 void *gpmthread(void *par)  void *gpmthread(void *par)
 {  {
   while(apprun)    while(apprun)
   {    {
     Gpm_DrawPointer(gpmev.x,gpmev.y,gpm_consolefd);      Gpm_DrawPointer(gpmev.x,gpmev.y,gpm_consolefd);
     if(Gpm_GetEvent(&gpmev)!=-1)      if(Gpm_GetEvent(&gpmev)!=-1)
     {      {
       eventq=true;        eventq=true;
       if(gpmev.x>screenx-1)gpmev.x=screenx-1;        if(gpmev.x>screenx-1)gpmev.x=screenx-1;
       if(gpmev.y>screeny-1)gpmev.y=screeny-1;        if(gpmev.y>screeny-1)gpmev.y=screeny-1;
       if(gpmev.x<0)gpmev.x=0;        if(gpmev.x<0)gpmev.x=0;
       if(gpmev.y<0)gpmev.y=0;        if(gpmev.y<0)gpmev.y=0;
     }      }
     if(((gpmev.type&GPM_MOVE)==0)&&((gpmev.type&GPM_DRAG)==0))while(eventq&&apprun);      if(((gpmev.type&GPM_MOVE)==0)&&((gpmev.type&GPM_DRAG)==0))while(eventq&&apprun);
   }    }
 }  }
   
 bool gpmgetevent(Gpm_Event *event)  bool gpmgetevent(Gpm_Event *event)
 {  {
   if(eventq)    if(eventq)
   {    {
     memcpy(event,&gpmev,sizeof(gpmev));      memcpy(event,&gpmev,sizeof(gpmev));
     eventq=false;      eventq=false;
     return true;      return true;
   }    }
   else return false;    else return false;
 }  }
   
 void domouseevent(MEVENT *event)  void domouseevent(MEVENT *event)
 {  {
   unsigned short mod=0;    unsigned short mod=0;
   if((event->bstate&BUTTON_SHIFT)==BUTTON_SHIFT)mod|=MD_SHIFT;    bool double1=true,double2=true;
   if((event->bstate&BUTTON_ALT)==BUTTON_ALT)mod|=MD_ALT;    if((event->bstate&BUTTON_SHIFT)==BUTTON_SHIFT)mod|=MD_SHIFT;
   if((event->bstate&BUTTON_CTRL)==BUTTON_CTRL)mod|=MD_CTRL;    if((event->bstate&BUTTON_ALT)==BUTTON_ALT)mod|=MD_ALT;
   if((event->bstate&BUTTON1_PRESSED)==BUTTON1_PRESSED)    if((event->bstate&BUTTON_CTRL)==BUTTON_CTRL)mod|=MD_CTRL;
   {    if((event->bstate&BUTTON1_PRESSED)==BUTTON1_PRESSED)
     sendmousemessage(event->x,event->y,MM_LBUTTONDOWN|mod);    {
     if(aftermouseval)      sendmousemessage(event->x,event->y,MM_LBUTTONDOWN|mod);
     {      if(aftermouseval)
       mouserepeattimer=set_timer(NULL,WAITTICK,0,mousewaitproc);      {
     }        mouserepeattimer=set_timer(NULL,WAITTICK,0,mousewaitproc);
     else      }
     {      else
       del_timer(mouserepeattimer);      {
       mouserepeattimer=NULL;        del_timer(mouserepeattimer);
     }        mouserepeattimer=NULL;
     if(doubleclickstate1)      }
     {      if(doubleclickstate1)
       sendmousemessage(event->x,event->y,MM_LBUTTONDBLCLK|mod);      {
     }        sendmousemessage(event->x,event->y,MM_LBUTTONDBLCLK|mod);
     del_timer(doubletimer1);      }
     doubleclickstate1=true;      del_timer(doubletimer1);
     doubletimer1=set_timer(NULL,DOUBLECLICK,0,doubleclickproc);      doubletimer1=!doubleclickstate1?set_timer(NULL,DOUBLECLICK,0,doubleclickproc):NULL;
   }      doubleclickstate1=!doubleclickstate1;
   if((event->bstate&BUTTON1_RELEASED)==BUTTON1_RELEASED)      double1=false;
   {    }
     del_timer(mouserepeattimer);    if((event->bstate&BUTTON1_RELEASED)==BUTTON1_RELEASED)
     mouserepeattimer=NULL;    {
     sendmousemessage(event->x,event->y,MM_LBUTTONUP|mod);      del_timer(mouserepeattimer);
   }      mouserepeattimer=NULL;
   if((event->bstate&BUTTON3_PRESSED)==BUTTON3_PRESSED)      sendmousemessage(event->x,event->y,MM_LBUTTONUP|mod);
   {      double1=false;
     sendmousemessage(event->x,event->y,MM_RBUTTONDOWN|mod);    }
     if(doubleclickstate2)    if((event->bstate&BUTTON3_PRESSED)==BUTTON3_PRESSED)
     {    {
       sendmousemessage(event->x,event->y,MM_RBUTTONDBLCLK|mod);      sendmousemessage(event->x,event->y,MM_RBUTTONDOWN|mod);
     }      if(doubleclickstate2)
     del_timer(doubletimer2);      {
     doubleclickstate2=true;        sendmousemessage(event->x,event->y,MM_RBUTTONDBLCLK|mod);
     doubletimer2=set_timer(NULL,DOUBLECLICK,0,doubleclickproc);      }
   }      del_timer(doubletimer2);
   if((event->bstate&BUTTON3_RELEASED)==BUTTON3_RELEASED|mod)      doubletimer2=!doubleclickstate2?set_timer(NULL,DOUBLECLICK,0,doubleclickproc):NULL;
   {      doubleclickstate2=!doubleclickstate2;
     sendmousemessage(event->x,event->y,MM_RBUTTONUP|mod);      double2=false;
   }    }
   gpmev.x=mousex=event->x;    if((event->bstate&BUTTON3_RELEASED)==BUTTON3_RELEASED|mod)
   gpmev.y=mousey=event->y;    {
   sendmousemessage(mousex,mousey,MM_MOUSEMOVE|mod);      sendmousemessage(event->x,event->y,MM_RBUTTONUP|mod);
 }      double2=false;
     }
     if(double1)
     {
       del_timer(doubletimer1);
       doubleclickstate1=false;
       doubletimer1=NULL;
     }
     if(double2)
     {
       del_timer(doubletimer2);
       doubleclickstate2=false;
       doubletimer2=NULL;
     }
     gpmev.x=mousex=event->x;
     gpmev.y=mousey=event->y;
     sendmousemessage(mousex,mousey,MM_MOUSEMOVE|mod);
   }
   
 bool dosendmousemessage(WIN *p,long vx,long vy,unsigned short state)  bool dosendmousemessage(WIN *p,long vx,long vy,unsigned short state)
 {  {
   if(p==NULL)return false;    if(p==NULL)return false;
   bool result=true;    bool result=true;
   WIN *found=findwin(vx,vy);    WIN *found=findwin(vx,vy);
   EDIT *edit;    EDIT *edit;
   BUTTON *button;    BUTTON *button;
   SCROLL *scroll,*vscroll,*hscroll;    SCROLL *scroll,*vscroll,*hscroll;
   LIST *list;    LIST *list;
   COMBO *combo;    COMBO *combo;
   MENU *menu;    MENU *menu;
   DIALOG *dialog;    DIALOG *dialog;
   GList *lines;    GList *lines;
   long x=vx,y=vy,actline;    long x=vx,y=vy,actline;
   unsigned short statemd=state&MDMASK;    unsigned short statemd=state&MDMASK;
   bool chang=false;    bool chang=false;
   static long stlen;    static long stlen;
   long len,height,old,maxpoz,minpoz,actpoz;    long i,len,height,old,maxpoz,minpoz,actpoz;
   static long mx,my,nx,ny;    static long mx,my,nx,ny,cecnt=0;
   static bool freesendnext=true;    static bool freesendnext=true;
   bool sendnext=false;    bool sendnext=false;
   bool setfocus=true;    bool setfocus=true;
   aftermouseval=false;    aftermouseval=false;
   screen_to_client(p,&x,&y);    screen_to_client(p,&x,&y);
   state&=KKMASK;    state&=KKMASK;
   if((focuswin==NULL)||(focuswin->extra->type!=TP_MENU))lastfocused=focuswin;    if((focuswin==NULL)||(focuswin->extra->type!=TP_MENU))lastfocused=focuswin;
   if((state==MM_LBUTTONDOWN)&&p->hasmodal){set_focus(findchild(p));return true;}    if((state==MM_LBUTTONDOWN)&&p->hasmodal){set_focus(findchild(p));return true;}
   switch(p->extra->type)    switch(p->extra->type)
   {    {
     case TP_EDIT:      case TP_EDIT:
     switch(state)      edit=&p->extra->edit;
     {      switch(state)
       case MM_MOUSEMOVE:      {
       if(capturewin!=p)break;        case MM_MOUSEMOVE:
       chang=true;        if(capturewin!=p)break;
       case MM_LBUTTONDOWN:        if(cecnt>0)
       capturewin=p;        {
           if(cecnt==2)edit->maskpos=mx;
           cecnt++;
         }
         chang=true;
         case MM_LBUTTONDOWN:
         if(capturewin!=p)
         {
           edit->maskpos=-1;
           mx=x+edit->scroll;
           cecnt=1;
         }
         capturewin=p;
       usekeys=false;        usekeys=false;
       edit=&p->extra->edit;        if(cecnt>=0)
       edit->curpos=x+edit->scroll;        {
       len=strlen(edit->text);          edit->curpos=x+edit->scroll;
       if(edit->curpos<0)edit->curpos=0;          len=strlen(edit->text);
       if(edit->curpos>len)edit->curpos=len;          if(edit->curpos<0)edit->curpos=0;
       if(edit->curpos-edit->scroll<0)edit->scroll=edit->curpos;          if(edit->maskpos==-1)
       if(edit->curpos-edit->scroll>p->vx-1)edit->scroll=edit->curpos-p->vx+1;          {
       break;            if(edit->curpos>len)edit->curpos=len;
       case MM_LBUTTONUP:          }
           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 MM_LBUTTONUP:
         cecnt=0;
       usekeys=true;        usekeys=true;
       capturewin=NULL;        capturewin=NULL;
     }        break;
     break;        case MM_LBUTTONDBLCLK:
     case TP_BUTTON:        len=strlen(edit->text);
     button=&p->extra->button;        actpoz=x+edit->scroll;
     switch(state)        if(actpoz<0)actpoz=0;
     {        if(actpoz>len-1)actpoz=len-1;
       case MM_MOUSEMOVE:        if(edit->text[actpoz]!=' ')
       if(stat==1)        {
       {          for(i=actpoz;i>=0;i--)
         if(found==p)button->status=TS_HIGH;          {
         else {button->status=TS_UP;capturewin=NULL;stat=0;}            if(edit->text[i]==' ')break;
       }          }
       else if(stat==2)          edit->maskpos=i+1;
       {          for(i=actpoz;i<len;i++)
         if(found==p)button->status=TS_DOWN;          {
         else button->status=TS_UP;            if(edit->text[i]==' ')break;
       }          }
       else          edit->curpos=i-1;
       {          cecnt=-1;
         button->status=TS_HIGH;        }
         capturewin=p;        break;
         stat=1;        case MM_RBUTTONDOWN:
       }          set_parent(clipboardmenu,p);
       chang=true;          track_popup_menu(clipboardmenu,vx,vy);
       break;        break;
       case MM_LBUTTONDOWN:      }
       if(found==p)      break;
       {      case TP_BUTTON:
         capturewin=p;      button=&p->extra->button;
       switch(state)
       {
         case MM_MOUSEMOVE:
         if(stat==1)
         {
           if(found==p)button->status=TS_HIGH;
           else {button->status=TS_UP;capturewin=NULL;stat=0;sendnext=true;}
         }
         else if(stat==2)
         {
           if(found==p)button->status=TS_DOWN;
           else button->status=TS_UP;
         }
         else
         {
           button->status=TS_HIGH;
           capturewin=p;
           stat=1;
         }
         chang=true;
         break;
         case MM_LBUTTONDOWN:
         if(found==p)
         {
           capturewin=p;
         usekeys=false;          usekeys=false;
         button->status=TS_DOWN;          button->status=TS_DOWN;
         stat=2;          stat=2;
       }        }
       else        else
       {        {
         setfocus=false;          setfocus=false;
         sendmousemessage(vx,vy,MM_MOUSEMOVE);          sendmousemessage(vx,vy,MM_MOUSEMOVE);
         sendmousemessage(vx,vy,MM_LBUTTONDOWN);          sendmousemessage(vx,vy,MM_LBUTTONDOWN);
       }        }
       if(!button->hasfocus)chang=true;        if(!button->hasfocus)chang=true;
       break;        break;
       case MM_LBUTTONUP:        case MM_LBUTTONUP:
       usekeys=true;        usekeys=true;
       capturewin=NULL;        capturewin=NULL;
       if(found==p)        if(found==p)
       {        {
         capturewin=p;          capturewin=p;
         if(stat==2)          if(stat==2)
         {          {
           button->status=TS_EXPUSH;            button->status=TS_EXPUSH;
           if(button->push!=NULL)button->push(p);            stat=1;
         }            if(button->push!=NULL)button->push(p);
         else button->status=TS_HIGH;          }
         stat=1;          else
       }          {
       else            button->status=TS_HIGH;
       {              stat=1;
         stat=0;          }
         button->status=TS_UP;        }
       }        else
       chang=true;        {
     }          stat=0;
     break;          button->status=TS_UP;
     case TP_SCROLL:        }
     scroll=&p->extra->scroll;        chang=true;
     switch(state)      }
     {      break;
       case MM_MOUSEMOVE:      case TP_SCROLL:
       if(scroll->vert)      scroll=&p->extra->scroll;
       {      switch(state)
         len=(p->vy-2-1)*(scroll->pos-scroll->minpos)/(scroll->maxpos-scroll->minpos);      {
         if(stat==1)scroll->sup=inrect(0,0,p->vx,1,x,y)?SC_DOWN:SC_UP;        case MM_MOUSEMOVE:
         else if(stat==2)scroll->spageup=inrect(0,1,p->vx,len,x,y)?SC_DOWN:SC_UP;        if(scroll->vert)
         else if(stat==3)        {
         {          len=(p->vy-2-1)*(scroll->pos-scroll->minpos)/(scroll->maxpos-scroll->minpos);
           scroll->smooth=true;          if(stat==1)scroll->sup=inrect(0,0,p->vx,1,x,y)?SC_DOWN:SC_UP;
           old=scroll->pos;          else if(stat==2)scroll->spageup=inrect(0,1,p->vx,len,x,y)?SC_DOWN:SC_UP;
           height=(y+stlen-1)*(scroll->maxpos-scroll->minpos);          else if(stat==3)
           scroll->pos=scroll->minpos+height/(p->vy-2-1)+((height%(p->vy-2-1)==0)?0:1);          {
           scroll->smoothpos=y+stlen-1;            scroll->smooth=true;
           if(scroll->smoothpos<0)scroll->smoothpos=0;            old=scroll->pos;
           if(scroll->smoothpos>p->vy-2-1)scroll->smoothpos=p->vy-2-1;            height=(y+stlen-1)*(scroll->maxpos-scroll->minpos);
           if(scroll->pos<scroll->minpos)scroll->pos=scroll->minpos;            scroll->pos=scroll->minpos+height/(p->vy-2-1)+((height%(p->vy-2-1)==0)?0:1);
           if(scroll->pos>scroll->maxpos)scroll->pos=scroll->maxpos;            scroll->smoothpos=y+stlen-1;
           if((old!=scroll->pos)&&(scroll->change!=NULL))scroll->change(p);            if(scroll->smoothpos<0)scroll->smoothpos=0;
         }            if(scroll->smoothpos>p->vy-2-1)scroll->smoothpos=p->vy-2-1;
         else if(stat==4)scroll->spagedown=inrect(0,1+len+1,p->vx,p->vy-2-1-len,x,y)?SC_DOWN:SC_UP;            if(scroll->pos<scroll->minpos)scroll->pos=scroll->minpos;
         else if(stat==5)scroll->sdown=inrect(0,p->vy-1,p->vx,1,x,y)?SC_DOWN:SC_UP;            if(scroll->pos>scroll->maxpos)scroll->pos=scroll->maxpos;
       }            if((old!=scroll->pos)&&(scroll->change!=NULL))scroll->change(p);
       else          }
       {          else if(stat==4)scroll->spagedown=inrect(0,1+len+1,p->vx,p->vy-2-1-len,x,y)?SC_DOWN:SC_UP;
         len=(p->vx-2-1)*(scroll->pos-scroll->minpos)/(scroll->maxpos-scroll->minpos);          else if(stat==5)scroll->sdown=inrect(0,p->vy-1,p->vx,1,x,y)?SC_DOWN:SC_UP;
         if(stat==1)scroll->sup=inrect(0,0,1,p->vy,x,y)?SC_DOWN:SC_UP;        }
         else if(stat==2)scroll->spageup=inrect(1,0,len,p->vy,x,y)?SC_DOWN:SC_UP;        else
         else if(stat==3)        {
         {          len=(p->vx-2-1)*(scroll->pos-scroll->minpos)/(scroll->maxpos-scroll->minpos);
           scroll->smooth=true;          if(stat==1)scroll->sup=inrect(0,0,1,p->vy,x,y)?SC_DOWN:SC_UP;
           old=scroll->pos;          else if(stat==2)scroll->spageup=inrect(1,0,len,p->vy,x,y)?SC_DOWN:SC_UP;
           height=(x+stlen-1)*(scroll->maxpos-scroll->minpos);          else if(stat==3)
           scroll->pos=scroll->minpos+height/(p->vx-2-1)+((height%(p->vx-2-1)==0)?0:1);          {
           scroll->smoothpos=x+stlen-1;            scroll->smooth=true;
           if(scroll->smoothpos<0)scroll->smoothpos=0;            old=scroll->pos;
           if(scroll->smoothpos>p->vx-2-1)scroll->smoothpos=p->vx-2-1;            height=(x+stlen-1)*(scroll->maxpos-scroll->minpos);
           if(scroll->pos<scroll->minpos)scroll->pos=scroll->minpos;            scroll->pos=scroll->minpos+height/(p->vx-2-1)+((height%(p->vx-2-1)==0)?0:1);
           if(scroll->pos>scroll->maxpos)scroll->pos=scroll->maxpos;            scroll->smoothpos=x+stlen-1;
           if((old!=scroll->pos)&&(scroll->change!=NULL))scroll->change(p);            if(scroll->smoothpos<0)scroll->smoothpos=0;
         }            if(scroll->smoothpos>p->vx-2-1)scroll->smoothpos=p->vx-2-1;
         else if(stat==4)scroll->spagedown=inrect(1+len+1,0,p->vx-2-1-len,p->vy,x,y)?SC_DOWN:SC_UP;            if(scroll->pos<scroll->minpos)scroll->pos=scroll->minpos;
         else if(stat==5)scroll->sdown=inrect(p->vx-1,0,1,p->vy,x,y)?SC_DOWN:SC_UP;            if(scroll->pos>scroll->maxpos)scroll->pos=scroll->maxpos;
       }            if((old!=scroll->pos)&&(scroll->change!=NULL))scroll->change(p);
       chang=true;          }
       break;          else if(stat==4)scroll->spagedown=inrect(1+len+1,0,p->vx-2-1-len,p->vy,x,y)?SC_DOWN:SC_UP;
       case MM_LBUTTONDOWN:          else if(stat==5)scroll->sdown=inrect(p->vx-1,0,1,p->vy,x,y)?SC_DOWN:SC_UP;
       capturewin=p;        }
         chang=true;
         break;
         case MM_LBUTTONDOWN:
         capturewin=p;
       usekeys=false;        usekeys=false;
       scroll->sup=SC_UP;        scroll->sup=SC_UP;
       scroll->spageup=SC_UP;        scroll->spageup=SC_UP;
       scroll->sdown=SC_UP;        scroll->sdown=SC_UP;
       scroll->spagedown=SC_UP;        scroll->spagedown=SC_UP;
       if(scroll->vert)        if(scroll->vert)
       {        {
         len=(p->vy-2-1)*(scroll->pos-scroll->minpos)/(scroll->maxpos-scroll->minpos);          len=(p->vy-2-1)*(scroll->pos-scroll->minpos)/(scroll->maxpos-scroll->minpos);
         if(inrect(0,0,p->vx,1,x,y)&&((stat==0)||(stat==1))){stat=1;scroll->sup=SC_DOWN;}          if(inrect(0,0,p->vx,1,x,y)&&((stat==0)||(stat==1))&&(p->vy>1)){stat=1;scroll->sup=SC_DOWN;}
         else if(inrect(0,1,p->vx,len,x,y)&&((stat==0)||(stat==2))){stat=2;scroll->spageup=SC_DOWN;}          else if(inrect(0,1,p->vx,len,x,y)&&((stat==0)||(stat==2))){stat=2;scroll->spageup=SC_DOWN;}
         else if(inrect(0,1+len,p->vx,1,x,y)&&((stat==0)||(stat==3))){stat=3;stlen=1+len-y;}          else if(inrect(0,1+len,p->vx,1,x,y)&&((stat==0)||(stat==3))&&(p->vy>3)){stat=3;stlen=1+len-y;}
         else if(inrect(0,1+len+1,p->vx,p->vy-2-1-len,x,y)&&((stat==0)||(stat==4))){stat=4;scroll->spagedown=SC_DOWN;}          else if(inrect(0,1+len+1,p->vx,p->vy-2-1-len,x,y)&&((stat==0)||(stat==4))){stat=4;scroll->spagedown=SC_DOWN;}
         else if(inrect(0,p->vy-1,p->vx,1,x,y)&&((stat==0)||(stat==5))){stat=5;scroll->sdown=SC_DOWN;}          else if(inrect(0,p->vy-1,p->vx,1,x,y)&&((stat==0)||(stat==5))){stat=5;scroll->sdown=SC_DOWN;}
       }        }
       else        else
       {        {
         len=(p->vx-2-1)*(scroll->pos-scroll->minpos)/(scroll->maxpos-scroll->minpos);          len=(p->vx-2-1)*(scroll->pos-scroll->minpos)/(scroll->maxpos-scroll->minpos);
         if((y>=0)&&(y<p->vy))          if((y>=0)&&(y<p->vy))
         {          {
           if(inrect(0,0,1,p->vy,x,y)&&((stat==0)||(stat==1))){stat=1;scroll->sup=SC_DOWN;}            if(inrect(0,0,1,p->vy,x,y)&&((stat==0)||(stat==1))&&(p->vy>1)){stat=1;scroll->sup=SC_DOWN;}
           else if(inrect(1,0,len,p->vy,x,y)&&((stat==0)||(stat==2))){stat=2;scroll->spageup=SC_DOWN;}            else if(inrect(1,0,len,p->vy,x,y)&&((stat==0)||(stat==2))){stat=2;scroll->spageup=SC_DOWN;}
           else if(inrect(1+len,0,1,p->vy,x,y)&&((stat==0)||(stat==3))){stat=3;stlen=1+len-x;}            else if(inrect(1+len,0,1,p->vy,x,y)&&((stat==0)||(stat==3))&&(p->vx>3)){stat=3;stlen=1+len-x;}
           else if(inrect(1+len+1,0,p->vx-2-1-len,p->vy,x,y)&&((stat==0)||(stat==4))){stat=4;scroll->spagedown=SC_DOWN;}            else if(inrect(1+len+1,0,p->vx-2-1-len,p->vy,x,y)&&((stat==0)||(stat==4))){stat=4;scroll->spagedown=SC_DOWN;}
           else if(inrect(p->vx-1,0,1,p->vy,x,y)&&((stat==0)||(stat==5))){stat=5;scroll->sdown=SC_DOWN;}            else if(inrect(p->vx-1,0,1,p->vy,x,y)&&((stat==0)||(stat==5))){stat=5;scroll->sdown=SC_DOWN;}
         }          }
       }        }
       old=scroll->pos;        old=scroll->pos;
       if(scroll->sup!=SC_UP)scroll->pos-=scroll->cnt;        if(scroll->sup!=SC_UP)scroll->pos-=scroll->cnt;
       if(scroll->spageup!=SC_UP)scroll->pos-=scroll->pagecnt;        if(scroll->spageup!=SC_UP)scroll->pos-=scroll->pagecnt;
       if(scroll->sdown!=SC_UP)scroll->pos+=scroll->cnt;        if(scroll->sdown!=SC_UP)scroll->pos+=scroll->cnt;
       if(scroll->spagedown!=SC_UP)scroll->pos+=scroll->pagecnt;        if(scroll->spagedown!=SC_UP)scroll->pos+=scroll->pagecnt;
       if(scroll->pos<scroll->minpos)scroll->pos=scroll->minpos;        if(scroll->pos<scroll->minpos)scroll->pos=scroll->minpos;
       if(scroll->pos>scroll->maxpos)scroll->pos=scroll->maxpos;        if(scroll->pos>scroll->maxpos)scroll->pos=scroll->maxpos;
       if((old!=scroll->pos)&&(scroll->change!=NULL))scroll->change(p);        if((old!=scroll->pos)&&(scroll->change!=NULL))scroll->change(p);
       if(stat!=3)aftermouseval=true;        if(stat!=3)aftermouseval=true;
       chang=true;        chang=true;
       break;        break;
       case MM_LBUTTONUP:        case MM_LBUTTONUP:
       if(scroll->vert)        if(scroll->vert)
       {        {
         len=(p->vy-2-1)*(scroll->pos-scroll->minpos)/(scroll->maxpos-scroll->minpos);          len=(p->vy-2-1)*(scroll->pos-scroll->minpos)/(scroll->maxpos-scroll->minpos);
         if(stat==1)scroll->sup=inrect(0,0,p->vx,1,x,y)?SC_PUSH:SC_UP;          if(stat==1)scroll->sup=inrect(0,0,p->vx,1,x,y)?SC_PUSH:SC_UP;
         else if(stat==2)scroll->spageup=inrect(0,1,p->vx,len,x,y)?SC_PUSH:SC_UP;          else if(stat==2)scroll->spageup=inrect(0,1,p->vx,len,x,y)?SC_PUSH:SC_UP;
         else if(stat==3)scroll->smooth=false;          else if(stat==3)scroll->smooth=false;
         else if(stat==4)scroll->spagedown=inrect(0,1+len+1,p->vx,p->vy-2-1-len,x,y)?SC_PUSH:SC_UP;          else if(stat==4)scroll->spagedown=inrect(0,1+len+1,p->vx,p->vy-2-1-len,x,y)?SC_PUSH:SC_UP;
         else if(stat==5)scroll->sdown=inrect(0,p->vy-1,p->vx,1,x,y)?SC_PUSH:SC_UP;          else if(stat==5)scroll->sdown=inrect(0,p->vy-1,p->vx,1,x,y)?SC_PUSH:SC_UP;
       }        }
       else        else
       {        {
         len=(p->vx-2-1)*(scroll->pos-scroll->minpos)/(scroll->maxpos-scroll->minpos);          len=(p->vx-2-1)*(scroll->pos-scroll->minpos)/(scroll->maxpos-scroll->minpos);
         if(stat==1)scroll->sup=inrect(0,0,1,p->vy,x,y)?SC_PUSH:SC_UP;          if(stat==1)scroll->sup=inrect(0,0,1,p->vy,x,y)?SC_PUSH:SC_UP;
         else if(stat==2)scroll->spageup=inrect(1,0,len,p->vy,x,y)?SC_PUSH:SC_UP;          else if(stat==2)scroll->spageup=inrect(1,0,len,p->vy,x,y)?SC_PUSH:SC_UP;
         else if(stat==3)scroll->smooth=false;          else if(stat==3)scroll->smooth=false;
         else if(stat==4)scroll->spagedown=inrect(1+len+1,0,p->vx-2-1-len,p->vy,x,y)?SC_PUSH:SC_UP;          else if(stat==4)scroll->spagedown=inrect(1+len+1,0,p->vx-2-1-len,p->vy,x,y)?SC_PUSH:SC_UP;
         else if(stat==5)scroll->sdown=inrect(p->vx-1,0,1,p->vy,x,y)?SC_PUSH:SC_UP;          else if(stat==5)scroll->sdown=inrect(p->vx-1,0,1,p->vy,x,y)?SC_PUSH:SC_UP;
       }        }
       capturewin=NULL;        capturewin=NULL;
       usekeys=true;        usekeys=true;
       stat=0;        stat=0;
       chang=true;        chang=true;
       set_timer(p,BUTTONCLICK,0,buttontimer);        set_timer(p,BUTTONCLICK,0,buttontimer);
     }      }
     break;      break;
     case TP_LIST:      case TP_LIST:
     list=&p->extra->list;      list=&p->extra->list;
     vscroll=&list->vscroll->extra->scroll;      vscroll=&list->vscroll->extra->scroll;
     minpoz=vscroll->pos;      minpoz=vscroll->pos;
     maxpoz=p->vy-2+vscroll->pos-1;      maxpoz=p->vy-2+vscroll->pos-1;
     switch(state)      switch(state)
     {      {
       case MM_MOUSEMOVE:        case MM_MOUSEMOVE:
       if(capturewin==p)        if(capturewin==p)
       {        {
         long actline=list->activeline;          long actline=list->activeline;
         if(!list->combotyp||(list->combotyp&&(stat==1)))list->activeline=y-1+vscroll->pos;          if((list->combotyp!=CT_COMBO)||((list->combotyp==CT_COMBO)&&(stat==1)))list->activeline=y-1+vscroll->pos;
         list->exvscroll=EX_NONE;          list->exvscroll=EX_NONE;
         list->exhscroll=EX_NONE;          list->exhscroll=EX_NONE;
         if(!list->combotyp||(list->combotyp&&(stat==1)))          if((list->combotyp!=CT_COMBO)||((list->combotyp==CT_COMBO)&&(stat==1)))
         {            {
           if(list->activeline<minpoz){list->activeline=minpoz;if(stat>=1)list->exvscroll=EX_UP;}            if(list->activeline<minpoz){list->activeline=minpoz;if(stat>=1)list->exvscroll=EX_UP;}
           if(list->activeline>maxpoz){list->activeline=maxpoz;if(stat>=1)list->exvscroll=EX_DOWN;}            if(list->activeline>maxpoz){list->activeline=maxpoz;if(stat>=1)list->exvscroll=EX_DOWN;}
           if(x<1)if(stat>=1)list->exhscroll=EX_UP;            if(x<1)if(stat>=1)list->exhscroll=EX_UP;
           if(x>=p->vx-2)if(stat>=1)list->exhscroll=EX_DOWN;            if(x>=p->vx-2)if(stat>=1)list->exhscroll=EX_DOWN;
         }          }
         if((list->activeline!=actline)&&(list->change!=NULL))list->change(p);          if((list->activeline!=actline)&&(list->change!=NULL))list->change(p);
         chang=true;          chang=true;
       }        }
       break;        break;
       case MM_LBUTTONDOWN:        case MM_LBUTTONDOWN:
       list->exvscroll=EX_NONE;        list->exvscroll=EX_NONE;
       list->exhscroll=EX_NONE;        list->exhscroll=EX_NONE;
       if(!list->combotyp)        if(list->combotyp!=CT_COMBO)
       {        {
         capturewin=p;          if((found==p)&&inrect(1,1,p->vx-2,p->vy-2,x,y))
         usekeys=false;          {
         stat=1;            capturewin=p;
         if((found==p)&&inrect(1,1,p->vx-2,p->vy-2,x,y))            usekeys=false;
         {              stat=1;
           list->activeline=y-1+vscroll->pos;            list->activeline=y-1+vscroll->pos;
           if(list->activeline<minpoz)list->activeline=minpoz;            if(list->activeline<minpoz)list->activeline=minpoz;
           if(list->activeline>maxpoz)list->activeline=maxpoz;            if(list->activeline>maxpoz)list->activeline=maxpoz;
         }          }
       }        }
       else        else
       {        {
         if((found==p)||(found==list->vscroll)||(found==list->hscroll))          if((found==p)||(found==list->vscroll)||(found==list->hscroll))
         {          {
           if(!(inrect(p->vx-list->vscroll->vx,1,list->vscroll->vx,p->vy-2,x,y)||            if(!((inrect(p->vx-list->vscroll->vx,1,list->vscroll->vx,p->vy-2,x,y)&&
                inrect(1,p->vy-list->hscroll->vy,p->vx-2,list->hscroll->vy,x,y)))                 (list->vscroll->active))||
           {                 inrect(1,p->vy-list->hscroll->vy,p->vx-2,list->hscroll->vy,x,y)&&
             if(inrect(1,1,p->vx-2,p->vy-2,x,y))                 (list->hscroll->active)))
             {              {
               if(inrect(1,1,p->vx-2,p->vy-2,x,y))
               {
               stat=1;                stat=1;
               usekeys=false;                usekeys=false;
               list->activeline=y-1+vscroll->pos;                list->activeline=y-1+vscroll->pos;
               if(list->activeline<minpoz)list->activeline=minpoz;                if(list->activeline<minpoz)list->activeline=minpoz;
               if(list->activeline>maxpoz)list->activeline=maxpoz;                if(list->activeline>maxpoz)list->activeline=maxpoz;
             }              }
           }            }
           else            else
           {            {
             capturewin=NULL;              capturewin=NULL;
             usekeys=true;              usekeys=true;
             aftermouseval=sendmousemessage(vx,vy,state);              aftermouseval=sendmousemessage(vx,vy,state);
           }            }
         }          }
         else          else
         {          {
           capturewin=NULL;            capturewin=NULL;
           usekeys=true;            usekeys=true;
           set_focus(p->parent);            set_focus(p->parent);
           show_win(p,false);            show_win(p,false);
         }          }
       }        }
       break;        break;
       case MM_LBUTTONUP:        case MM_LBUTTONUP:
       if(list->combotyp)        if(list->combotyp==CT_COMBO)
       {        {
         long act;          long act;
         if(stat>=1)          if(stat>=1)
         if((found==p)&&inrect(1,1,p->vx-2,p->vy-2,x,y))          if((found==p)&&inrect(1,1,p->vx-2,p->vy-2,x,y))
         {            {
           act=y-1+vscroll->pos;            act=y-1+vscroll->pos;
           if((act>=minpoz)&&(act<=maxpoz))list->activeline=act;            if((act>=minpoz)&&(act<=maxpoz))list->activeline=act;
         }          }
         else          else
         {          {
           stat=2;            stat=2;
         }          }
       }        }
       if(capturewin==p)        if(capturewin==p)
       {        {
         if(stat>=1)          if(stat>=1)
         {          {
           stat=0;            stat=0;
           list->exvscroll=EX_NONE;            list->exvscroll=EX_NONE;
           list->exhscroll=EX_NONE;            list->exhscroll=EX_NONE;
           capturewin=NULL;            capturewin=NULL;
           usekeys=true;            usekeys=true;
           void (*change)()=list->change;            void (*change)()=list->change;
           if(list->combotyp)            if(list->combotyp==CT_COMBO)
           {            {
             set_focus(p->parent);              set_focus(p->parent);
             show_win(p,false);              show_win(p,false);
             if((found==p)&&inrect(1,1,p->vx-2,p->vy-2,x,y))if(list->dblclk!=NULL)list->dblclk(p);              if((found==p)&&inrect(1,1,p->vx-2,p->vy-2,x,y))
           }              {
           if(change!=NULL)change(p);                if((list->combotyp==CT_COMBO)&&(p->parent!=NULL)&&
         }                   (p->parent->extra->type==TP_COMBO))
       }                {
       chang=true;                  combo=&p->parent->extra->combo;
       break;                  char *data=g_list_nth_data(list->lines,list->activeline);
       case MM_LBUTTONDBLCLK:                  set_text(combo->edit,data);
         if((found==p)&&inrect(1,1,p->vx-2,p->vy-2,x,y))                }
         {                  if(list->dblclk!=NULL)list->dblclk(p);
           if(list->dblclk!=NULL)list->dblclk(p);              }
         }            }
     }            if(change!=NULL)change(p);
     break;          }
     case TP_COMBO:        }
     combo=&p->extra->combo;        chang=true;
     switch(state)        break;
     {        case MM_LBUTTONDBLCLK:
       case MM_MOUSEMOVE:          if((found==p)&&inrect(1,1,p->vx-2,p->vy-2,x,y))
       if(capturewin==p)          {
       if((!(found==p))||(!inrect(0,0,p->vx,p->vy,x,y)))            if((list->combotyp==CT_COMBO)&&(p->parent!=NULL)&&
       {               (p->parent->extra->type==TP_COMBO))
         combo->pushed=SC_PUSH;            {
         capturewin=combo->list;              combo=&p->parent->extra->combo;
               char *data=g_list_nth_data(list->lines,list->activeline);
               set_text(combo->edit,data);
             }
             if(list->dblclk!=NULL)list->dblclk(p);
           }
       }
       break;
       case TP_COMBO:
       combo=&p->extra->combo;
       switch(state)
       {
         case MM_MOUSEMOVE:
         if(capturewin==p)
         if((!(found==p))||(!inrect(0,0,p->vx,p->vy,x,y)))
         {
           combo->pushed=SC_PUSH;
           capturewin=combo->list;
         usekeys=false;          usekeys=false;
         stat=1;          stat=1;
       }        }
       break;        break;
       case MM_LBUTTONDOWN:        case MM_LBUTTONDOWN:
       capturewin=p;        capturewin=p;
       usekeys=false;        usekeys=false;
       combo->pushed=SC_DOWN;        combo->pushed=SC_DOWN;
       list=&combo->list->extra->list;        list=&combo->list->extra->list;
       vscroll=&list->vscroll->extra->scroll;        vscroll=&list->vscroll->extra->scroll;
       list->activeline=combo->activeline;        list->activeline=combo->activeline;
       if(list->activeline<vscroll->pos)vscroll->pos=list->activeline;        if(list->activeline<vscroll->pos)vscroll->pos=list->activeline;
       if(list->activeline-combo->list->vy+3>vscroll->pos)vscroll->pos=list->activeline-combo->list->vy+3;        if(list->activeline-combo->list->vy+3>vscroll->pos)vscroll->pos=list->activeline-combo->list->vy+3;
       show_win(combo->list,true);        show_win(combo->list,true);
       break;        break;
       case MM_LBUTTONUP:        case MM_LBUTTONUP:
       if(capturewin==p)        if(capturewin==p)
       {        {
         set_timer(p,BUTTONCLICK,0,buttondoubletimer);          set_timer(p,BUTTONCLICK,0,buttondoubletimer);
         combo->pushed=SC_PUSH;          combo->pushed=SC_PUSH;
         capturewin=combo->list;          capturewin=combo->list;
         usekeys=true;          usekeys=true;
       }        }
     }      }
     break;      break;
     case TP_MENU:      case TP_MENU:
     menu=&p->extra->menu;      menu=&p->extra->menu;
     minpoz=0;      minpoz=0;
     actline=menu->activeline;      actline=menu->activeline;
     if(menu->vert)      if(menu->vert)
     {      {
Line 551  bool dosendmousemessage(WIN *p,long vx,l
Line 640  bool dosendmousemessage(WIN *p,long vx,l
         }          }
         if(old>0)actpoz=-1;          if(old>0)actpoz=-1;
       }        }
     }      }
     if(actpoz!=-1)      if(actpoz!=-1)
     {      {
       if(menu->lines!=NULL)lines=g_list_nth(menu->lines,actpoz);else lines=NULL;        if(menu->lines!=NULL)lines=g_list_nth(menu->lines,actpoz);else lines=NULL;
       if(lines!=NULL)        if(lines!=NULL)
         if(strcmp(((CMENU*)lines->data)->text,"-")==0)actpoz=-1;          if(strcmp(((CMENU*)lines->data)->text,"-")==0)actpoz=-1;
     }      }
     switch(state)      switch(state)
     {      {
       case MM_MOUSEMOVE:        case MM_MOUSEMOVE:
       if(((focuswin==p)&&(found==p)&&(capturewin==NULL))||(menu->vert&&(actpoz!=-1)))        if(((focuswin==p)&&(found==p)&&(capturewin==NULL))||(menu->vert&&(actpoz!=-1)))
       {        {
         capturewin=p;          capturewin=p;
Line 570  bool dosendmousemessage(WIN *p,long vx,l
Line 659  bool dosendmousemessage(WIN *p,long vx,l
          (found==p)&&(inrect(0,0,p->vx,p->vy,x,y)))           (found==p)&&(inrect(0,0,p->vx,p->vy,x,y)))
       {        {
         stat=3;          stat=3;
         menu->activeline=actpoz;          menu->activeline=actpoz;
         if(menu->activeline<minpoz)menu->activeline=minpoz;          if(menu->activeline<minpoz)menu->activeline=minpoz;
         if(menu->activeline>maxpoz)menu->activeline=maxpoz;          if(menu->activeline>maxpoz)menu->activeline=maxpoz;
         WIN *submenu=((CMENU*)g_list_nth(menu->lines,actpoz)->data)->submenu;          WIN *submenu=((CMENU*)g_list_nth(menu->lines,actpoz)->data)->submenu;
         if(submenu!=NULL)          if(submenu!=NULL)
Line 598  bool dosendmousemessage(WIN *p,long vx,l
Line 687  bool dosendmousemessage(WIN *p,long vx,l
         }          }
         else focuswin=p;          else focuswin=p;
       }        }
       if((capturewin==p)&&(!menu->vert))        if((capturewin==p)&&(!menu->vert))
       if((found!=p)||(!inrect(0,0,p->vx,p->vy,x,y)))        if((found!=p)||(!inrect(0,0,p->vx,p->vy,x,y)))
       {        {
         if((stat==3)&&(!menu->vert))          if((stat==3)&&(!menu->vert))
         {          {
           GList *l=g_list_nth(menu->lines,menu->activeline);            GList *l=g_list_nth(menu->lines,menu->activeline);
Line 610  bool dosendmousemessage(WIN *p,long vx,l
Line 699  bool dosendmousemessage(WIN *p,long vx,l
             if(submenu!=NULL)capturewin=submenu;              if(submenu!=NULL)capturewin=submenu;
             usekeys=true;              usekeys=true;
             stat=1;              stat=1;
           }            }
         }          }
       }        }
       if(capturewin==p)        if(capturewin==p)
       {        {
         if((!menu->vert&&(actpoz!=-1)&&inrect(0,0,p->vx,p->vy,x,y))||          if((!menu->vert&&(actpoz!=-1)&&inrect(0,0,p->vx,p->vy,x,y))||
            (menu->vert&&(stat==1)))             (menu->vert&&(stat==1)))
         {            {
           menu->activeline=actpoz;            menu->activeline=actpoz;
           if(actpoz==-1)stat=2;            if(actpoz==-1)stat=2;
           if(!menu->vert)            if(!menu->vert)
           {            {
             if(menu->activeline<minpoz)menu->activeline=minpoz;              if(menu->activeline<minpoz)menu->activeline=minpoz;
             if(menu->activeline>maxpoz)menu->activeline=maxpoz;              if(menu->activeline>maxpoz)menu->activeline=maxpoz;
           }            }
         }          }
         chang=true;          chang=true;
       }        }
       if(nextcapturewin!=NULL)capturewin=nextcapturewin;        if(nextcapturewin!=NULL)capturewin=nextcapturewin;
       break;        break;
       case MM_RBUTTONDOWN:        case MM_RBUTTONDOWN:
       case MM_LBUTTONDOWN:        case MM_LBUTTONDOWN:
       if(!menu->vert)        if(!menu->vert)
       {        {
         if((actpoz!=-1)&&(stat==0))          if((actpoz!=-1)&&(stat==0))
         {          {
           capturewin=p;            capturewin=p;
           usekeys=false;            usekeys=false;
         }          }
         if((stat==0)&&(found==p)&&inrect(0,0,p->vx,p->vy,x,y))          if((stat==0)&&(found==p)&&inrect(0,0,p->vx,p->vy,x,y))
         {            {
           if(actpoz!=-1)            if(actpoz!=-1)
           {            {
             stat=3;              stat=3;
             menu->activeline=actpoz;              menu->activeline=actpoz;
             if(menu->activeline<minpoz)menu->activeline=minpoz;              if(menu->activeline<minpoz)menu->activeline=minpoz;
             if(menu->activeline>maxpoz)menu->activeline=maxpoz;              if(menu->activeline>maxpoz)menu->activeline=maxpoz;
             if(menu->select!=NULL)menu->select(p,getmenucellid(menu));              if(menu->select!=NULL)menu->select(p,getmenucellid(menu));
             WIN *submenu=((CMENU*)g_list_nth(menu->lines,actpoz)->data)->submenu;              WIN *submenu=((CMENU*)g_list_nth(menu->lines,actpoz)->data)->submenu;
Line 656  bool dosendmousemessage(WIN *p,long vx,l
Line 745  bool dosendmousemessage(WIN *p,long vx,l
               focuswin=submenu;                focuswin=submenu;
             }              }
           }            }
           else setfocus=false;            else setfocus=false;
         }          }
         else if((menu->activeline==actpoz)||(actpoz==-1))          else if((menu->activeline==actpoz)||(actpoz==-1))
         {          {
Line 672  bool dosendmousemessage(WIN *p,long vx,l
Line 761  bool dosendmousemessage(WIN *p,long vx,l
               if(freesendnext)sendnext=true;                if(freesendnext)sendnext=true;
                 else freesendnext=true;                  else freesendnext=true;
           }            }
         }          }
       }        }
       else        else
       {        {
         if(actpoz!=-1)          if(actpoz!=-1)
         {          {
           stat=1;            stat=1;
           usekeys=false;            usekeys=false;
           menu->activeline=actpoz;            menu->activeline=actpoz;
           result=true;            result=true;
           freesendnext=false;            freesendnext=false;
Line 695  bool dosendmousemessage(WIN *p,long vx,l
Line 784  bool dosendmousemessage(WIN *p,long vx,l
           setfocus=false;            setfocus=false;
           sendnext=true;            sendnext=true;
           result=true;            result=true;
         }            }
       }        }
       break;        break;
       case MM_RBUTTONUP:        case MM_RBUTTONUP:
       case MM_LBUTTONUP:        case MM_LBUTTONUP:
       if(menu->vert)        if(menu->vert)
       {        {
         long act=-1;          long act=-1;
         if(stat>=1)          if(stat>=1)
         if((inrect(1,1,p->vx-2,p->vy-2,x,y))&&(actpoz!=-1))          if((inrect(1,1,p->vx-2,p->vy-2,x,y))&&(actpoz!=-1))
         {          {
           act=y-1;            act=y-1;
           maxpoz=g_list_length(menu->lines)-1;            maxpoz=g_list_length(menu->lines)-1;
           if(act<minpoz)act=minpoz;            if(act<minpoz)act=minpoz;
Line 715  bool dosendmousemessage(WIN *p,long vx,l
Line 804  bool dosendmousemessage(WIN *p,long vx,l
         else          else
         {          {
           stat=2;            stat=2;
         }          }
         if(stat>=1)          if(stat>=1)
         {          {
           WIN *submenu=NULL;            WIN *submenu=NULL;
           if(act!=-1)submenu=((CMENU*)g_list_nth(menu->lines,act)->data)->submenu;            if(act!=-1)submenu=((CMENU*)g_list_nth(menu->lines,act)->data)->submenu;
           if(submenu!=NULL)result=true;            if(submenu!=NULL)result=true;
Line 730  bool dosendmousemessage(WIN *p,long vx,l
Line 819  bool dosendmousemessage(WIN *p,long vx,l
               usekeys=true;                usekeys=true;
               capturewin=NULL;                capturewin=NULL;
               show_win(p,false);                show_win(p,false);
               set_focus(((p->parent!=NULL)&&(p->parent->extra->type==TP_MENU))?lastfocused:p->parent);                set_focus(((p->parent!=NULL)&&(p->parent->extra->type==TP_MENU))?lastfocused:p->parent);
             }              }
             if(menu->select!=NULL)menu->select(p,getmenucellid(menu));              if(menu->select!=NULL)menu->select(p,getmenucellid(menu));
           }            }
         }          }
           if((found!=p)&&((p->parent==NULL)||(p->parent->extra->type!=TP_MENU)))            if((found!=p)&&((p->parent==NULL)||(p->parent->extra->type!=TP_MENU)))
           {            {
Line 745  bool dosendmousemessage(WIN *p,long vx,l
Line 834  bool dosendmousemessage(WIN *p,long vx,l
             setfocus=false;              setfocus=false;
             sendnext=true;              sendnext=true;
             result=true;              result=true;
           }            }
         if((actpoz==-1)&&(found==p))result=true;          if((actpoz==-1)&&(found==p))result=true;
       }        }
       else        else
Line 756  bool dosendmousemessage(WIN *p,long vx,l
Line 845  bool dosendmousemessage(WIN *p,long vx,l
           if((l!=NULL)&&(((CMENU*)l->data)->submenu!=NULL))            if((l!=NULL)&&(((CMENU*)l->data)->submenu!=NULL))
           {            {
             WIN *submenu=((CMENU*)l->data)->submenu;              WIN *submenu=((CMENU*)l->data)->submenu;
             if(submenu!=NULL)capturewin=submenu;              if(submenu!=NULL)capturewin=submenu;
             usekeys=true;              usekeys=true;
             stat=1;              stat=1;
           }            }
         }          }
         if(capturewin==p)          if(capturewin==p)
         {          {
           if(stat>=1)            if(stat>=1)
           {            {
             usekeys=true;              usekeys=true;
             void (*change)()=menu->change;              void (*change)()=menu->change;
             if(change!=NULL)change(p);              if(change!=NULL)change(p);
           }            }
         }          }
         if(!inrect(0,0,p->vx,p->vy,x,y))          if(!inrect(0,0,p->vx,p->vy,x,y))
         {            {
           stat=0;            stat=0;
           usekeys=true;            usekeys=true;
           capturewin=NULL;            capturewin=NULL;
           set_focus(lastfocused);            set_focus(lastfocused);
         }          }
       }        }
       chang=true;        chang=true;
       break;        break;
     }      }
     if((menu->activeline!=actline)&&(menu->change!=NULL))menu->change(p);      if((menu->activeline!=actline)&&(menu->change!=NULL))menu->change(p);
     break;      break;
     case TP_DIALOG:      case TP_DIALOG:
     dialog=&p->extra->dialog;      dialog=&p->extra->dialog;
     switch(state)      switch(state)
     {      {
       case MM_MOUSEMOVE:        case MM_MOUSEMOVE:
       if(capturewin!=p)break;        if(capturewin!=p)break;
       switch(stat)        switch(stat)
       {        {
         case 0:move_win(p,vx+mx,vy+my,NOCHANGE,NOCHANGE,NOCHANGE);break;          case 0:move_win(p,vx+mx,vy+my,NOCHANGE,NOCHANGE,NOCHANGE);break;
         case 1:if(vy>ny-1-my)vy=ny-1-my;move_win(p,NOCHANGE,vy+my,NOCHANGE,ny-vy-my,NOCHANGE);break;          case 1:if(vy>ny-1-my)vy=ny-1-my;move_win(p,NOCHANGE,vy+my,NOCHANGE,ny-vy-my,NOCHANGE);break;
         case 2:if(vy>ny-1-my)vy=ny-1-my;move_win(p,NOCHANGE,vy+my,nx-2*p->x+vx+mx,ny-vy-my,NOCHANGE);break;          case 2:if(vy>ny-1-my)vy=ny-1-my;move_win(p,NOCHANGE,vy+my,nx-2*p->x+vx+mx,ny-vy-my,NOCHANGE);break;
         case 3:move_win(p,NOCHANGE,NOCHANGE,nx-2*p->x+vx+mx,NOCHANGE,NOCHANGE);break;          case 3:move_win(p,NOCHANGE,NOCHANGE,nx-2*p->x+vx+mx,NOCHANGE,NOCHANGE);break;
         case 4:move_win(p,NOCHANGE,NOCHANGE,nx-2*p->x+vx+mx,ny-2*p->y+vy+my,NOCHANGE);break;          case 4:move_win(p,NOCHANGE,NOCHANGE,nx-2*p->x+vx+mx,ny-2*p->y+vy+my,NOCHANGE);break;
         case 5:move_win(p,NOCHANGE,NOCHANGE,NOCHANGE,ny-2*p->y+vy+my,NOCHANGE);break;          case 5:move_win(p,NOCHANGE,NOCHANGE,NOCHANGE,ny-2*p->y+vy+my,NOCHANGE);break;
         case 6:if(vx>nx-10-mx)vx=nx-10-mx;move_win(p,vx+mx,NOCHANGE,nx-vx-mx,ny-2*p->y+vy+my,NOCHANGE);break;          case 6:if(vx>nx-10-mx)vx=nx-10-mx;move_win(p,vx+mx,NOCHANGE,nx-vx-mx,ny-2*p->y+vy+my,NOCHANGE);break;
         case 7:if(vx>nx-10-mx)vx=nx-10-mx;move_win(p,vx+mx,NOCHANGE,nx-vx-mx,NOCHANGE,NOCHANGE);break;          case 7:if(vx>nx-10-mx)vx=nx-10-mx;move_win(p,vx+mx,NOCHANGE,nx-vx-mx,NOCHANGE,NOCHANGE);break;
         case 8:if(vx>nx-10-mx)vx=nx-10-mx;if(vy>ny-1-my)vy=ny-1-my;move_win(p,vx+mx,vy+my,nx-vx-mx,ny-vy-my,NOCHANGE);          case 8:if(vx>nx-10-mx)vx=nx-10-mx;if(vy>ny-1-my)vy=ny-1-my;move_win(p,vx+mx,vy+my,nx-vx-mx,ny-vy-my,NOCHANGE);
       }              }
       break;        break;
       case MM_LBUTTONDBLCLK:        case MM_LBUTTONDBLCLK:
         if(((dialog->style&ST_DI_HASMAXIMIZE)==ST_DI_HASMAXIMIZE)&&(inrect(0,0,p->vx,1,x,y)))          if(((dialog->style&ST_DI_HASMAXIMIZE)==ST_DI_HASMAXIMIZE)&&(inrect(0,0,p->vx,1,x,y)))
         {          {
           capturewin=NULL;            capturewin=NULL;
           usekeys=true;            usekeys=true;
           dialog->bmaximize->extra->button.push(dialog->bmaximize);            dialog->bmaximize->extra->button.push(dialog->bmaximize);
         }          }
       break;        break;
       case MM_LBUTTONDOWN:        case MM_LBUTTONDOWN:
       if(inrect(0,0,p->vx,p->vy,x,y)&&(!inrect(1,1,p->vx-2,p->vy-2,x,y)))        if(inrect(0,0,p->vx,p->vy,x,y)&&(!inrect(1,1,p->vx-2,p->vy-2,x,y)))
       {          {
         if((statemd&MD_CTRL)!=MD_CTRL)          if((statemd&MD_CTRL)!=MD_CTRL)
         {          {
           if(inrect(0,0,p->vx,1,x,y))stat=0;else stat=-1;            if(inrect(0,0,p->vx,1,x,y))stat=0;else stat=-1;
           if(((dialog->style&ST_DI_SIZEABLE)==ST_DI_SIZEABLE)&&(dialog->state!=SV_MAXIMIZED))            if(((dialog->style&ST_DI_SIZEABLE)==ST_DI_SIZEABLE)&&(dialog->state!=SV_MAXIMIZED))
           {              {
             if((inrect(1,0,1,1,x,y)||(inrect(p->vx-2,0,1,1,x,y)&&(p->vx>4)))&&(dialog->state==SV_NORMAL))stat=1;              if((((inrect(1,0,1,1,x,y)||(inrect(p->vx-2,0,1,1,x,y)&&(p->vx>4)))&&
             else if(inrect(p->vx-2,p->vy-2,2,2,x,y)&&(dialog->state==SV_NORMAL))stat=4;                 (dialog->state==SV_NORMAL)))&&!(p->style&ST_AU_FIXED))stat=1;
             else if(inrect(2,p->vy-1,p->vx-4,1,x,y)&&(p->vy>1)&&(dialog->state==SV_NORMAL))stat=5;              else if(inrect(p->vx-2,p->vy-2,2,2,x,y)&&(dialog->state==SV_NORMAL)&&
             else if(inrect(0,p->vy-2,2,2,x,y)&&(dialog->state==SV_NORMAL))stat=6;                      !(p->style&ST_AR_FIXED)&&!(p->style&ST_AD_FIXED))stat=4;
             else if(inrect(p->vx-1,0,1,2,x,y)&&(dialog->state==SV_NORMAL))stat=2;              else if(inrect(2,p->vy-1,p->vx-4,1,x,y)&&(p->vy>1)&&(dialog->state==SV_NORMAL)&&
             else if(inrect(0,0,1,2,x,y)&&(dialog->state==SV_NORMAL))stat=8;                      !(p->style&ST_AD_FIXED))stat=5;
             else if(inrect(p->vx-1,0,1,p->vy,x,y))stat=3;              else if(inrect(0,p->vy-2,2,2,x,y)&&(dialog->state==SV_NORMAL)&&
             else if(inrect(0,0,1,p->vy,x,y))stat=7;                      !(p->style&ST_AL_FIXED)&&!(p->style&ST_AD_FIXED))stat=6;
           }              else if(inrect(p->vx-1,0,1,2,x,y)&&(dialog->state==SV_NORMAL)&&
           if(stat==-1){stat=0;break;}                      !(p->style&ST_AU_FIXED)&&!(p->style&ST_AR_FIXED))stat=2;
         }              else if(inrect(0,0,1,2,x,y)&&(dialog->state==SV_NORMAL)&&
         else stat=0;                      !(p->style&ST_AU_FIXED)&&!(p->style&ST_AL_FIXED))stat=8;
               else if(inrect(p->vx-1,0,1,p->vy,x,y)&&!(p->style&ST_AR_FIXED))stat=3;
               else if(inrect(0,0,1,p->vy,x,y)&&!(p->style&ST_AL_FIXED))stat=7;
             }
             if(stat==-1){stat=0;break;}
           }
           else stat=0;
         capturewin=p;          capturewin=p;
         usekeys=false;          usekeys=false;
         mx=p->x-vx;          mx=p->x-vx;
         my=p->y-vy;          my=p->y-vy;
         nx=p->x+p->vx;          nx=p->x+p->vx;
         ny=p->y+p->vy;          ny=p->y+p->vy;
       }        }
       break;        break;
       case MM_LBUTTONUP:        case MM_LBUTTONUP:
       if(capturewin!=p)break;        if(capturewin!=p)break;
       sendmousemessage(vx,vy,MM_MOUSEMOVE);        sendmousemessage(vx,vy,MM_MOUSEMOVE);
       stat=0;        stat=0;
       capturewin=NULL;        capturewin=NULL;
       usekeys=true;        usekeys=true;
     }      }
   }    }
   if((state==MM_LBUTTONDOWN)&&setfocus)set_focus(findchild(p));    if(((state==MM_LBUTTONDOWN)||(state==MM_RBUTTONDOWN))&&setfocus)set_focus(findchild(p));
   if(chang)redraw();    if(chang)redraw();
   if(sendnext)sendmousemessage(vx,vy,state);    if(sendnext)sendmousemessage(vx,vy,state);
   return result;    return result;
 }  }

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.2

Platon Group <platon@platon.org> http://platon.org/
Copyright © 2002-2006 Platon Group
Site powered by Metafox CMS
Go to Top