Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.         libGUI main part of code
  3. */
  4.  
  5. //---------------------------------------------------------------------------------
  6. //                              destroy_control for libGUI
  7. //---------------------------------------------------------------------------------
  8. void DestroyControl(void *control_ptr)
  9. {
  10.         struct HEADER *Parent;
  11.         struct HEADER *control;
  12.         struct HEADER *seek_control;
  13.         struct HEADER *exchange_control;
  14.         struct HEADER *last_control;
  15.         struct HEADER *next_control;
  16.  
  17.         if (control_ptr==NULL) return;
  18.  
  19.         control=control_ptr;
  20.         Parent=(struct HEADER *)control->parent;
  21.  
  22.         if (Parent->child_bk==Parent->child_fd)
  23.         {
  24.                 //parent have got alone child control
  25.                 if (Parent->child_bk==(DWORD*)control)
  26.                 {
  27.                         //current control is child control of parent
  28. #ifdef  DEBUG
  29.                         printf("\ndestroyed control=%d parent=%d ID=%d",(int)control,(int)Parent,(int)control->ctrl_ID);
  30. #endif
  31.                         free(control);
  32.                         Parent->child_bk=(DWORD*)NULL;
  33.                         Parent->child_fd=(DWORD*)NULL;
  34.                 }
  35.                 return;
  36.         }
  37.  
  38.         seek_control=(struct HEADER*)Parent->child_bk;
  39.         while(seek_control!=(struct HEADER*)NULL)
  40.         {
  41.                 if (seek_control==control)
  42.                 {
  43.                         //delete control from control's stack
  44.                         last_control=(struct HEADER*)seek_control->ctrl_bk;
  45.                         next_control=(struct HEADER*)seek_control->ctrl_fd;
  46.  
  47.                         if ((last_control!=Parent) && (next_control!=NULL))
  48.                         {//deliting control isn't first control and isn't endest of parent
  49.                                 next_control->ctrl_bk=(DWORD*)last_control;
  50.                                 last_control->ctrl_fd=(DWORD*)next_control;
  51.                         }
  52.                         else
  53.                         {
  54.                                 if (last_control==Parent)
  55.                                 {//deliting control is first control of Parend
  56.                                         Parent->child_bk=(DWORD*)next_control;
  57.                                         next_control->ctrl_bk=(DWORD*)Parent;
  58.                                         if (next_control->ctrl_fd==(DWORD*)NULL)
  59.                                         {
  60.                                                 Parent->child_fd=(DWORD*)next_control;
  61.                                                 Parent->child_bk=(DWORD*)next_control;
  62.                                         }
  63.                                 }
  64.  
  65.                                 if (next_control==(struct HEADER*)NULL)
  66.                                 {
  67.                                         //there isn't next controls
  68.                                         last_control->ctrl_fd=(DWORD*)NULL;
  69.                                         Parent->ctrl_fd=(DWORD*)last_control;
  70.                                 }
  71.                         }
  72. #ifdef  DEBUG
  73.                         printf("\ndestroyed control=%d parent=%d ID=%d",(int)control,(int)Parent,(int)control->ctrl_ID);
  74. #endif
  75.                         free(control);
  76.                         break;
  77.                 }
  78.                 exchange_control=(struct HEADER*)seek_control->ctrl_fd;
  79.                 seek_control=exchange_control;
  80.         }
  81. }
  82.  
  83. //---------------------------------------------------------------------------------
  84. //                      create new timer for parent window
  85. //---------------------------------------------------------------------------------
  86. void    *CreateTimerForParentWindow(parent_t *parent)
  87. {
  88.         struct  TIMER           *timer;
  89.         struct  TIMER           *backward_timer;
  90.  
  91.         timer=malloc(sizeof(struct      TIMER));
  92.         timer->tmr_parent=(DWORD*)parent;
  93.  
  94.         if (parent->timer_bk==(DWORD*)NULL)
  95.         {//not yet timers
  96.                 parent->timer_bk=(DWORD*)timer;
  97.                 parent->timer_fd=(DWORD*)timer;
  98.                 timer->tmr_bk=(DWORD*)parent;
  99.                 timer->tmr_fd=(DWORD*)NULL;
  100.         }
  101.         else
  102.         {
  103.                 backward_timer=(struct TIMER*)parent->timer_fd;
  104.                 parent->timer_fd=(DWORD*)timer;
  105.                 backward_timer->tmr_fd=(DWORD*)timer;
  106.                 timer->tmr_bk=(DWORD*)backward_timer;
  107.                 timer->tmr_fd=(DWORD*)NULL;
  108.         }
  109.         return(timer);
  110. }
  111.  
  112. //---------------------------------------------------------------------------------
  113. //                              destroy timer for parent window
  114. //---------------------------------------------------------------------------------
  115. void DestroyTimerCallbackForFunction(struct TIMER *timer)
  116. {
  117.         struct  HEADERPARENT    *Parent;
  118.         struct TIMER            *seek_timer;
  119.         struct TIMER            *exchange_timer;
  120.         struct TIMER            *last_timer;
  121.         struct TIMER            *next_timer;
  122.  
  123.         if (timer==(struct TIMER*)NULL) return;
  124.  
  125.         Parent=(struct HEADERPARENT *)timer->tmr_parent;
  126.  
  127.         if (Parent->timer_bk==Parent->timer_fd)
  128.         {
  129.                 //parent have got alone timer
  130.                 if (Parent->timer_bk==(DWORD*)timer)
  131.                 {
  132.                         Parent->timer_bk=(DWORD*)NULL;
  133.                         Parent->timer_fd=(DWORD*)NULL;
  134. #ifdef  DEBUG
  135.                         printf("\ndestroyed timer %d parent window %d",(int)timer,(int)timer->tmr_parent);
  136. #endif
  137.                         free(timer);
  138.                         return;
  139.                 }
  140.                 return;
  141.         }
  142.  
  143.         seek_timer=(struct TIMER*)Parent->timer_bk;
  144.         while(seek_timer!=(struct TIMER*)NULL)
  145.         {
  146.                 if (seek_timer==timer)
  147.                 {
  148.                         //delete timer from timers's stack
  149.                         last_timer=(struct TIMER*)seek_timer->tmr_bk;
  150.                         next_timer=(struct TIMER*)seek_timer->tmr_fd;
  151.  
  152.                         if ((last_timer!=(struct TIMER*)Parent) && (next_timer!=(struct TIMER*)NULL))
  153.                         {//deliting timer isn't first timer and isn't endest
  154.                                 next_timer->tmr_bk=(DWORD*)last_timer;
  155.                                 last_timer->tmr_fd=(DWORD*)next_timer;
  156.                         }
  157.                         else
  158.                         {
  159.                                 if (last_timer==(struct TIMER*)Parent)
  160.                                 {//deliting timer is first timer of Parend
  161.                                         Parent->timer_bk=(DWORD*)next_timer;
  162.                                         next_timer->tmr_bk=(DWORD*)Parent;
  163.                                         if (next_timer->tmr_fd==(DWORD*)NULL)
  164.                                         {
  165.                                                 Parent->timer_fd=(DWORD*)next_timer;
  166.                                                 Parent->timer_bk=(DWORD*)next_timer;
  167.                                         }
  168.                                 }
  169.  
  170.                                 if (next_timer==(struct TIMER*)NULL)
  171.                                 {
  172.                                         //there isn't next controls
  173.                                         last_timer->tmr_fd=(DWORD*)NULL;
  174.                                         Parent->timer_fd=(DWORD*)last_timer;
  175.                                 }
  176.                         }
  177. #ifdef  DEBUG
  178.                         printf("\ndestroyed timer %d parent window %d",(int)timer,(int)timer->tmr_parent);
  179. #endif
  180.                         free(timer);
  181.                         break;
  182.                 }
  183.                 exchange_timer=(struct TIMER*)seek_timer->tmr_fd;
  184.                 seek_timer=exchange_timer;
  185.         }
  186. }
  187.  
  188. //---------------------------------------------------------------------------------
  189. //                      create timer for function of parent window
  190. //---------------------------------------------------------------------------------
  191. void    *SetTimerCallbackForFunction(parent_t *parent_window,int time_tick,void *func,void *func_data)
  192. {
  193.         struct  TIMER           *timer;
  194.  
  195.         timer=CreateTimerForParentWindow(parent_window);
  196.         timer->func=(DWORD*)func;
  197.         timer->func_data=(DWORD*)func_data;
  198.         timer->time_tick=(DWORD)time_tick;
  199.         timer->last_time=gui_ksys_get_ticks();
  200.         timer->flags=timer->flags | FLAG_TIMER_ON;
  201.  
  202.         return(timer);
  203. }
  204.  
  205. //---------------------------------------------------------------------------------
  206. //                              create timer for control
  207. //---------------------------------------------------------------------------------
  208. void    *SetTimerCallbackForControl(int time_tick,void *func,void *func_data)
  209. {
  210.         struct  TIMER           *timer;
  211.  
  212.         timer=malloc(sizeof(struct TIMER));
  213.         timer->func=(DWORD*)func;
  214.         timer->func_data=(DWORD*)func_data;
  215.         timer->time_tick=(DWORD)time_tick;
  216.         timer->last_time=gui_ksys_get_ticks();
  217.         timer->flags=timer->flags & FLAG_TIMER_OFF;
  218.  
  219.         return(timer);
  220. }
  221.  
  222. //---------------------------------------------------------------------------------
  223. //                                      call timer
  224. //---------------------------------------------------------------------------------
  225. void    Timer(struct TIMER *timer)
  226. {
  227.         DWORD   time,delta_time;
  228.  
  229.         time=gui_ksys_get_ticks();
  230.         delta_time=time-timer->last_time;
  231.         if (delta_time>=timer->time_tick)
  232.         {
  233.                 TimerCallbackFunction=(void(*)(void *data))timer->func;
  234.                 TimerCallbackFunction(timer->func_data);
  235.                 timer->last_time=gui_ksys_get_ticks();
  236.         }
  237. }
  238.  
  239. //---------------------------------------------------------------------------------
  240. //                      create new callback for event
  241. //---------------------------------------------------------------------------------
  242. void    *CreateCallbackForEvent(parent_t *parent)
  243. {
  244.         gui_callbackevent_t     *calev;
  245.         gui_callbackevent_t     *backward_calev;
  246.  
  247.         calev=malloc(sizeof(gui_callbackevent_t));
  248.         calev->calev_parent=(DWORD*)parent;
  249.  
  250.         if (parent->calev_bk==(DWORD*)NULL)
  251.         {//not yet timers
  252.                 parent->calev_bk=(DWORD*)calev;
  253.                 parent->calev_fd=(DWORD*)calev;
  254.                 calev->calev_bk=(DWORD*)parent;
  255.                 calev->calev_fd=(DWORD*)NULL;
  256.         }
  257.         else
  258.         {
  259.                 backward_calev=(gui_callbackevent_t*)parent->calev_fd;
  260.                 parent->calev_fd=(DWORD*)calev;
  261.                 backward_calev->calev_fd=(DWORD*)calev;
  262.                 calev->calev_bk=(DWORD*)backward_calev;
  263.                 calev->calev_fd=(DWORD*)NULL;
  264.         }
  265.         return(calev);
  266. }
  267.  
  268. //---------------------------------------------------------------------------------
  269. //                      destroy callback function for eventcalev
  270. //---------------------------------------------------------------------------------
  271. void DestroyCallbackFunctionForEvent(gui_callbackevent_t *calev)
  272. {
  273.         struct  HEADERPARENT    *Parent;
  274.         struct CALLBACKEVENT    *seek_calev;
  275.         struct CALLBACKEVENT    *exchange_calev;
  276.         struct CALLBACKEVENT    *last_calev;
  277.         struct CALLBACKEVENT    *next_calev;
  278.  
  279.         if (calev==(gui_callbackevent_t*)NULL)  return;
  280.  
  281.         Parent=(parent_t*)calev->calev_parent;
  282.  
  283.         if (Parent->calev_bk==Parent->calev_fd)
  284.         {
  285.                 //parent have got alone timer
  286.                 if (Parent->calev_bk==(DWORD*)calev)
  287.                 {
  288.                         free(calev);
  289.                         Parent->calev_bk=(DWORD*)NULL;
  290.                         Parent->calev_fd=(DWORD*)NULL;
  291.                 }
  292.                 return;
  293.         }
  294.  
  295.         seek_calev=(struct CALLBACKEVENT*)Parent->calev_bk;
  296.         while(seek_calev!=(struct CALLBACKEVENT*)NULL)
  297.         {
  298.                 if (seek_calev==calev)
  299.                 {
  300.                         //delete timer from timers's stack
  301.                         last_calev=(struct CALLBACKEVENT*)seek_calev->calev_bk;
  302.                         next_calev=(struct CALLBACKEVENT*)seek_calev->calev_fd;
  303.  
  304.                         if ((last_calev!=(struct CALLBACKEVENT*)Parent) && (next_calev!=(struct CALLBACKEVENT*)NULL))
  305.                         {//deliting timer isn't first timer and isn't endest
  306.                                 next_calev->calev_bk=(DWORD*)last_calev;
  307.                                 last_calev->calev_fd=(DWORD*)next_calev;
  308.                         }
  309.                         else
  310.                         {
  311.                                 if (last_calev==(struct CALLBACKEVENT*)Parent)
  312.                                 {//deliting timer is first timer of Parend
  313.                                         Parent->calev_bk=(DWORD*)next_calev;
  314.                                         next_calev->calev_bk=(DWORD*)Parent;
  315.                                         if (next_calev->calev_fd==(DWORD*)NULL)
  316.                                         {
  317.                                                 Parent->calev_fd=(DWORD*)next_calev;
  318.                                                 Parent->calev_bk=(DWORD*)next_calev;
  319.                                         }
  320.                                 }
  321.  
  322.                                 if (next_calev==(struct CALLBACKEVENT*)NULL)
  323.                                 {
  324.                                         //there isn't next controls
  325.                                         last_calev->calev_fd=(DWORD*)NULL;
  326.                                         Parent->calev_fd=(DWORD*)last_calev;
  327.                                 }
  328.                         }
  329.                         free(calev);
  330.                         break;
  331.                 }
  332.                 exchange_calev=(struct CALLBACKEVENT*)seek_calev->calev_fd;
  333.                 seek_calev=exchange_calev;
  334.         }
  335. }
  336.  
  337. //---------------------------------------------------------------------------------
  338. //              create callback for messenger of events
  339. //---------------------------------------------------------------------------------
  340. void    *SetCallbackFunctionForEvent(parent_t *parent_window,int event_type,void *func,void *func_data)
  341. {
  342.         gui_callbackevent_t     *calev;
  343.  
  344.         calev=CreateCallbackForEvent(parent_window);
  345.         calev->func=(DWORD*)func;
  346.         calev->func_data=(DWORD*)func_data;
  347.         calev->event_type=(DWORD)event_type;
  348.  
  349.         return(calev);
  350. }
  351.  
  352. //---------------------------------------------------------------------------------
  353. //                              check cross control and mouse
  354. //---------------------------------------------------------------------------------
  355. char CheckCrossBox(struct HEADER *control,int mouse_x,int mouse_y)
  356. {
  357.         struct FINITION *fin;
  358.         int                     x,y,x2,y2;
  359.         int                     xmin,xmax,ymin,ymax,sx,sy;
  360.  
  361.         fin=(struct FINITION*)control->finition;
  362.  
  363.         if (fin->flags & FINITION_ON)
  364.         {
  365.                 xmin=fin->x;
  366.                 xmax=fin->x+fin->sizex-1;
  367.                 ymin=fin->y;
  368.                 ymax=fin->y+fin->sizey-1;
  369.  
  370.                 x=control->ctrl_x;
  371.                 y=control->ctrl_y;
  372.                 x2=x+control->ctrl_sizex-1;
  373.                 y2=y+control->ctrl_sizey-1;
  374.  
  375.                 if (x2<xmin) return(FALSE);
  376.                 if (x>xmax) return(FALSE);
  377.                 if (y2<ymin) return(FALSE);
  378.                 if (y>ymax) return(FALSE);
  379.  
  380.                 //finit x coordinates and sizex
  381.                 sx=x-xmin;
  382.  
  383.                 if (sx>=0)
  384.                 {
  385.                         if (x2>xmax) x2=xmax;
  386.                 }
  387.                 else
  388.                 {
  389.                         x=xmin;
  390.                         if (x2>xmax) x2=xmax;
  391.                 }
  392.  
  393.                 //finit y coordinates and sizey
  394.                 sy=y-ymin;
  395.  
  396.                 if (sy>=0)
  397.                 {
  398.                         if (y2>ymax) y2=ymax;
  399.                 }
  400.                 else
  401.                 {
  402.                         y=ymin;
  403.                         if (y2>ymax) y2=ymax;
  404.                 }
  405.                 //check cross finited control with mouse
  406.                 if ((mouse_x>=x) && (mouse_x<=x2) && (mouse_y>=y) && (mouse_y<=y2))
  407.                 return(TRUE);
  408.                 else
  409.                 return(FALSE);
  410.         }
  411.         else
  412.         {
  413.                 if ((mouse_x>=control->ctrl_x) && (mouse_x<=control->ctrl_x+control->ctrl_sizex) &&
  414.                         (mouse_y>=control->ctrl_y) && (mouse_y<=control->ctrl_y+control->ctrl_sizey))
  415.                 return(TRUE);
  416.                 else
  417.                 return(FALSE);
  418.         }
  419. }
  420.  
  421. //---------------------------------------------------------------------------------
  422. //                              check cross two rectaangles
  423. //---------------------------------------------------------------------------------
  424. char    CheckCrossRectangles(int x1,int y1,int sizex1,int sizey1,int x2,int y2,int sizex2,int sizey2)
  425. {
  426.         int     s;
  427.         int     xmax,ymax;
  428.  
  429.         xmax=x1+sizex1-1;
  430.         ymax=y1+sizey1-1;
  431.  
  432.         //check x cross
  433.         s=x2-x1;
  434.         if (s>0)
  435.         {//second rectangle have right position
  436.                 if (x2>xmax) return(FALSE);
  437.         }
  438.         if (s<0)
  439.         {//second rectangle have left position
  440.                 s=-s;
  441.                 if (s>=sizex2) return(FALSE);
  442.         }
  443.  
  444.         //check y cross
  445.         s=y2-y1;
  446.         if (s>0)
  447.         {//second rectangle have down position
  448.                 if (y2>ymax) return(FALSE);
  449.         }
  450.         if (s<0)
  451.         {//second rectangle have up position
  452.                 s=-s;
  453.                 if (s>=sizey2) return(FALSE);
  454.         }
  455.         return(TRUE);
  456. }
  457.  
  458. //---------------------------------------------------------------------------------
  459. //                              check full cross two rectaangles
  460. //---------------------------------------------------------------------------------
  461. char    CheckFullCrossRectangles(int x1,int y1,int sizex1,int sizey1,int x2,int y2,int sizex2,int sizey2)
  462. {
  463.         int     s;
  464.         int     xmax,ymax;
  465.  
  466.         xmax=x1+sizex1-1;
  467.         ymax=y1+sizey1-1;
  468.  
  469.         if (x2>=x1 && x2+sizex2-1<=xmax && y2>=y1 && y2+sizey2-1<=ymax) return(TRUE);
  470.                 else    return(FALSE);
  471. }
  472.  
  473. //---------------------------------------------------------------------------------
  474. //                              send message to controls
  475. //---------------------------------------------------------------------------------
  476. void    SendMessage(struct HEADER *Parent,struct MESSAGE *message)
  477. {
  478.         struct  HEADER          *seek_control;
  479.         struct  HEADER          *exchange_control;
  480.         struct  HEADER          *parent;
  481.         struct  HEADERPARENT    *main_parent;
  482.         struct  MESSAGE local_service_message;
  483.         struct  HEADER          *active_control_for_keys;
  484.         struct  HEADER          *active_control_for_mouse;
  485.         char                    cross;
  486.  
  487.         //Parent haven't got child controls
  488.         if ((Parent->child_bk==NULL) && (Parent->child_fd==NULL)) return;
  489.  
  490.         //load main parent
  491.         main_parent=(struct HEADERPARENT*)Parent->main_parent;
  492.  
  493.         //load active controls from Parent
  494.         active_control_for_keys=(struct HEADER*)Parent->active_control_for_keys;
  495.         active_control_for_mouse=(struct HEADER*)Parent->active_control_for_mouse;
  496.  
  497.         //Parent have got alon child control
  498.         if (Parent->child_bk==Parent->child_fd)
  499.         {
  500.                 seek_control=(struct HEADER *)Parent->child_bk;
  501.                 ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc;
  502.  
  503.                 switch(message->type)
  504.                 {
  505.                         case MESSAGE_FULL_REDRAW_ALL:
  506.                         {
  507.                                 //send message redraw to all child controls
  508.                                 if (seek_control->flags & FLAG_SHOW_CONTROL)    ControlProc(seek_control,message);
  509.                                 break;
  510.                         }
  511.                         case MESSAGE_FULL_REDRAW_ALL_WITH_FINITION:
  512.                         {
  513.                                 //send message finited redraw to all child controls
  514.                                 if (seek_control->flags & FLAG_SHOW_CONTROL)    ControlProc(seek_control,message);
  515.                                 break;
  516.                         }
  517.                         case MESSAGE_KEYS_EVENT:
  518.                         {       //change active control for keyboard by TAB press
  519.                                 if ((message->arg1==KEY_DOWN) && (message->arg2==SC_TAB))
  520.                                 {
  521.                                         if (seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE)
  522.                                         {
  523.                                                 if (active_control_for_keys==seek_control)
  524.                                                 {//focuse of input set for current control
  525.                                                         ControlProc=(void (*)(void *Control,struct MESSAGE *message))active_control_for_keys->ctrl_proc;
  526.                                                         local_service_message.type=MESSAGE_CHANGE_FOCUSE;
  527.                                                         local_service_message.arg1=FALSE;
  528.                                                         active_control_for_keys->flags=active_control_for_keys->flags & FLAG_FOCUSE_INPUT_OFF;
  529.                                                         ControlProc(active_control_for_keys,&local_service_message);
  530.  
  531.                                                         parent=(struct HEADER*)active_control_for_keys->parent;
  532.                                                        
  533.                                                         seek_control=parent;
  534.                                                         do
  535.                                                         {
  536.                                                                 if (parent==(struct HEADER*)main_parent) break;
  537.                                                                 //if next control NULL go to parent
  538.                                                                 if (seek_control==(struct HEADER*)NULL) seek_control=parent;
  539.  
  540.                                                                 exchange_control=(struct HEADER *)seek_control->ctrl_fd;
  541.                                                                 seek_control=exchange_control;
  542.                                                                 if (seek_control==(struct HEADER*)NULL)
  543.                                                                                                         parent=(struct HEADER*)parent->parent;
  544.                                                         }
  545.                                                         while((seek_control==(struct HEADER*)NULL) ||
  546.                                                                                 ((seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE)==FALSE));
  547.  
  548.                                                         if (parent==(struct HEADER*)main_parent)
  549.                                                         {
  550.                                                                 //find first control of main parent with focuse of input supporote
  551.                                                                 seek_control=(struct HEADER *)main_parent->child_bk;
  552.                                                                 while(seek_control!=(struct HEADER*)NULL)
  553.                                                                 {
  554.                                                                         if (seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE)  break;
  555.                                                                         exchange_control=(struct HEADER *)seek_control->ctrl_fd;
  556.                                                                         seek_control=exchange_control;
  557.                                                                 }
  558.                                                                 main_parent->active_control_for_keys=(DWORD*)seek_control;
  559.                                                                 main_parent->global_active_control_for_keys=(DWORD*)seek_control;
  560.  
  561.                                                                 //send message enable focuse of input to control
  562.                                                                 ControlProc=(void (*)(void *Control,struct MESSAGE *message))
  563.                                                                                                 seek_control->ctrl_proc;
  564.                                                                 local_service_message.type=MESSAGE_SET_FOCUSE;
  565.                                                                 local_service_message.arg1=FALSE;
  566.                                                                 seek_control->flags=seek_control->flags | FLAG_FOCUSE_INPUT_ON;
  567.                                                                 ControlProc(seek_control,&local_service_message);
  568.  
  569.                                                                 active_control_for_keys=(struct HEADER*)NULL;
  570.                                                                 break;
  571.                                                         }
  572.                                                         if (seek_control!=(struct HEADER*)NULL)
  573.                                                         {
  574.                                                                 parent=(struct HEADER*)seek_control->parent;
  575.                                                                 parent->active_control_for_keys=(DWORD*)seek_control;
  576.                                                                 main_parent->global_active_control_for_keys=(DWORD*)seek_control;
  577.  
  578.                                                                 //send message enable focuse of input to control
  579.                                                                 ControlProc=(void (*)(void *Control,struct MESSAGE *message))
  580.                                                                                                 seek_control->ctrl_proc;
  581.                                                                 local_service_message.type=MESSAGE_SET_FOCUSE;
  582.                                                                 local_service_message.arg1=FALSE;
  583.                                                                 seek_control->flags=seek_control->flags | FLAG_FOCUSE_INPUT_ON;
  584.                                                                 ControlProc(seek_control,&local_service_message);
  585.  
  586.                                                                 active_control_for_keys=(struct HEADER*)NULL;
  587.                                                                 Parent->active_control_for_keys=(DWORD*)active_control_for_keys;
  588.                                                                 break;
  589.                                                         }
  590.                                                 }
  591.                                                 else
  592.                                                 {
  593.                                                         ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc;
  594.                                                         local_service_message.type=MESSAGE_SET_FOCUSE;
  595.                                                         local_service_message.arg1=FALSE;
  596.                                                         seek_control->flags=seek_control->flags | FLAG_FOCUSE_INPUT_ON;
  597.                                                         ControlProc(seek_control,&local_service_message);
  598.  
  599.                                                         active_control_for_keys=seek_control;
  600.                                                         Parent->active_control_for_keys=(DWORD*)active_control_for_keys;
  601.                                                         main_parent->global_active_control_for_keys=(DWORD*)seek_control;
  602.                                                 }
  603.                                         }
  604.                                 }
  605.  
  606.                                 //send message of keys only to active control
  607.                                 if (active_control_for_keys!=NULL)
  608.                                 {
  609.                                         ControlProc=(void (*)(void *Control,struct MESSAGE *message))active_control_for_keys->ctrl_proc;
  610.                                         ControlProc(active_control_for_keys,message);
  611.                                 }
  612.                                 break;
  613.                         }
  614.                         case MESSAGE_SPECIALIZED:
  615.                         {
  616.                                 //send specialized message to all child controls
  617.                                 ControlProc(seek_control,message);
  618.                                 break;
  619.                         }
  620.                         case MESSAGE_MOUSE_EVENT:
  621.                         {
  622.                                 if (seek_control->flags & FLAG_MOUSE_BLOCKED_ON) break;
  623.  
  624.                                 if (message->arg3==MOUSE_LEFT_BUTTON_DOWN)
  625.                                 {
  626.                                         if (active_control_for_mouse!=NULL)
  627.                                         {
  628.                                                 ControlProc=(void (*)(void *Control,struct MESSAGE *message))active_control_for_mouse->ctrl_proc;
  629.                                                 ControlProc(active_control_for_mouse,message);
  630.                                                 break;
  631.                                         }
  632.                                 }
  633.                                 else
  634.                                 {
  635.                                         if (active_control_for_mouse!=NULL) {active_control_for_mouse=NULL;}
  636.                                 }
  637.  
  638.                                 cross=FALSE;
  639.                                 if (CheckCrossBox(seek_control,message->arg1,message->arg2)==TRUE)
  640.                                 {
  641.                                         if (message->arg3==MOUSE_LEFT_BUTTON_DOWN)
  642.                                         {
  643.                                                 cross=TRUE;
  644.                                                 active_control_for_mouse=seek_control;
  645.  
  646.                                                 if (seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE)
  647.                                                 {
  648.                                                         parent=(struct HEADER*)seek_control->parent;
  649.                                                         if (parent->flags & FLAG_FOCUSE_INPUT_SUPPOROTE)
  650.                                                         {
  651.                                                                 active_control_for_keys=(struct HEADER*)main_parent->global_active_control_for_keys;
  652.                                                                 if (active_control_for_keys!=(struct HEADER*)NULL)
  653.                                                                 {
  654.                                                                         ControlProc=(void (*)(void *Control,struct MESSAGE *message))
  655.                                                                                                 active_control_for_keys->ctrl_proc;
  656.  
  657.                                                                         local_service_message.type=MESSAGE_CHANGE_FOCUSE;
  658.                                                                         active_control_for_keys->flags=
  659.                                                                                 active_control_for_keys->flags & FLAG_FOCUSE_INPUT_OFF;
  660.                                                                         ControlProc(active_control_for_keys,&local_service_message);
  661.                                                                 }
  662.  
  663.                                                                 ControlProc=(void (*)(void *Control,struct MESSAGE *message))
  664.                                                                         seek_control->ctrl_proc;
  665.                                                                 local_service_message.type=MESSAGE_SET_FOCUSE;
  666.                                                                 seek_control->flags=seek_control->flags | FLAG_FOCUSE_INPUT_ON;
  667.                                                                 ControlProc(seek_control,&local_service_message);
  668.  
  669.                                                                 main_parent->global_active_control_for_keys=(DWORD*)seek_control;
  670.                                                                 Parent->active_control_for_keys=(DWORD*)seek_control;
  671.                                                         }
  672.                                                 }
  673.                                         }
  674.                                 }
  675.  
  676.                                 if ((cross==FALSE) && (message->arg3==MOUSE_LEFT_BUTTON_DOWN))
  677.                                 {
  678.                                         if (active_control_for_keys!=NULL)
  679.                                         {//disable focuse of input for active control of keys
  680.                                                 ControlProc=(void (*)(void *Control,struct MESSAGE *message))active_control_for_keys->ctrl_proc;
  681.  
  682.                                                 local_service_message.type=MESSAGE_CHANGE_FOCUSE;
  683.                                                 active_control_for_keys->flags=active_control_for_keys->flags & FLAG_FOCUSE_INPUT_OFF;
  684.                                                 ControlProc(active_control_for_keys,&local_service_message);
  685.                                         }
  686.                                 }
  687.  
  688.                                 ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc;
  689.                                 ControlProc(seek_control,message);
  690.                                 break;
  691.                         }
  692.                         case MESSAGE_CHANGE_POSITION_EVENT:
  693.                         {
  694.                                 ControlProc(seek_control,message);
  695.                                 break;
  696.                         }
  697.                         case MESSAGE_CALL_TIMER_EVENT:
  698.                         {
  699.                                 ControlProc(seek_control,message);
  700.                                 break;
  701.                         }
  702.                         case MESSAGE_DESTROY_CONTROL:
  703.                         {
  704.                                 //send message to control for destroing child controls
  705.                                 ControlProc(seek_control,message);
  706.                                 DestroyControl(seek_control);
  707.                                 break;
  708.                         }
  709.                         case MESSAGE_SET_MAIN_PARENT:
  710.                         {
  711.                                 ControlProc(seek_control,message);
  712.                                 break;
  713.                         }
  714.                         default:break;
  715.                 }
  716.         }
  717.         else
  718.         {
  719.                 switch(message->type)
  720.                 {
  721.                         case MESSAGE_FULL_REDRAW_ALL:
  722.                         {
  723.                                 //send message redraw to all child controls of Parent
  724.                                 seek_control=(struct HEADER *)Parent->child_bk;
  725.                                 while(seek_control!=(struct HEADER*)NULL)
  726.                                 {
  727.                                         if (seek_control->flags & FLAG_SHOW_CONTROL)
  728.                                         {
  729.                                                 ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc;
  730.                                                 ControlProc(seek_control,message);
  731.                                         }
  732.  
  733.                                         exchange_control=(struct HEADER *)seek_control->ctrl_fd;
  734.                                         seek_control=exchange_control;
  735.                                 }
  736.                                 break;
  737.                         }
  738.                         case MESSAGE_FULL_REDRAW_ALL_WITH_FINITION:
  739.                         {
  740.                                 //send message redraw to all child controls of Parent
  741.                                 seek_control=(struct HEADER *)Parent->child_bk;
  742.                                 while(seek_control!=(struct HEADER*)NULL)
  743.                                 {
  744.                                         if (seek_control->flags & FLAG_SHOW_CONTROL)
  745.                                         {
  746.                                                 ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc;
  747.                                                 ControlProc(seek_control,message);
  748.                                         }
  749.  
  750.                                         exchange_control=(struct HEADER *)seek_control->ctrl_fd;
  751.                                         seek_control=exchange_control;
  752.                                 }
  753.                                 break;
  754.                         }
  755.                         case MESSAGE_KEYS_EVENT:
  756.                         {
  757.                                 if ((message->arg1==KEY_DOWN) && (message->arg2==SC_TAB))
  758.                                 {       //change active control for keyboard by TAB press
  759.                                         if (active_control_for_keys==NULL)
  760.                                         {
  761.                                                 seek_control=(struct HEADER *)Parent->child_bk;
  762.  
  763.                                                 if ((seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE)==FALSE)
  764.                                                 {       //find first control of parend with supporote of input
  765.                                                         while(seek_control->ctrl_fd!=(DWORD*)NULL)
  766.                                                         {
  767.                                                                 exchange_control=(struct HEADER *)seek_control->ctrl_fd;
  768.                                                                 seek_control=exchange_control;
  769.                                                                 if (seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE)
  770.                                                                 {
  771.                                                                         active_control_for_keys=seek_control;
  772.                                                                         main_parent->global_active_control_for_keys=
  773.                                                                                         (DWORD*)active_control_for_keys;
  774.                                                                         Parent->active_control_for_keys=(DWORD*)active_control_for_keys;
  775.                                                                         break;
  776.                                                                 }
  777.                                                         }
  778.                                                         if (active_control_for_keys!=NULL)
  779.                                                         {
  780.                                                                 ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc;
  781.                                                                 local_service_message.type=MESSAGE_SET_FOCUSE;
  782.                                                                 seek_control->flags=seek_control->flags | FLAG_FOCUSE_INPUT_ON;
  783.                                                                 ControlProc(seek_control,&local_service_message);
  784.                                                         }
  785.                                                 }
  786.                                                 else
  787.                                                 {
  788.                                                         ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc;
  789.                                                         local_service_message.type=MESSAGE_SET_FOCUSE;
  790.                                                         seek_control->flags=seek_control->flags | FLAG_FOCUSE_INPUT_ON;
  791.                                                         ControlProc(seek_control,&local_service_message);
  792.  
  793.                                                         active_control_for_keys=seek_control;
  794.                                                         main_parent->global_active_control_for_keys=(DWORD*)active_control_for_keys;
  795.                                                         Parent->active_control_for_keys=(DWORD*)active_control_for_keys;
  796.                                                 }
  797.                                         }
  798.                                         else
  799.                                         {
  800.                                                 if (active_control_for_keys==(struct HEADER*)main_parent->global_active_control_for_keys)
  801.                                                 {
  802.                                                         seek_control=active_control_for_keys;
  803.                                                         while(seek_control!=(struct HEADER*)NULL)
  804.                                                         {
  805.                                                                 exchange_control=(struct HEADER *)seek_control->ctrl_fd;
  806.                                                                 seek_control=exchange_control;
  807.  
  808.                                                                 if (seek_control==(struct HEADER*)NULL)
  809.                                                                 {       //send message disable focuse of input to current control
  810.                                                                         ControlProc=(void (*)(void *Control,struct MESSAGE *message))
  811.                                                                                         active_control_for_keys->ctrl_proc;
  812.                                                                         local_service_message.type=MESSAGE_CHANGE_FOCUSE;
  813.                                                                         active_control_for_keys->flags=
  814.                                                                                 active_control_for_keys->flags & FLAG_FOCUSE_INPUT_OFF;
  815.                                                                         ControlProc(active_control_for_keys,&local_service_message);
  816.  
  817.                                                                         //back into main parent of tree and find next not NULL control
  818.                                                                         parent=(struct HEADER*)active_control_for_keys->parent;
  819.                                                                         do
  820.                                                                         {
  821.                                                                                 if (parent==(struct HEADER*)main_parent) break;
  822.  
  823.                                                                                 //if next control NULL go to parent
  824.                                                                                 if (seek_control==(struct HEADER*)NULL) seek_control=parent;
  825.  
  826.                                                                                 exchange_control=(struct HEADER *)seek_control->ctrl_fd;
  827.                                                                                 seek_control=exchange_control;
  828.                                                                                 if (seek_control==(struct HEADER*)NULL)
  829.                                                                                                         parent=(struct HEADER*)parent->parent;
  830.  
  831.                                                                         }
  832.                                                                         while((seek_control==(struct HEADER*)NULL) ||
  833.                                                                                 ((seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE)==FALSE));
  834.  
  835.                                                                         if (parent==(struct HEADER*)main_parent)
  836.                                                                         {
  837.                                                                         //find first control of main parent with focuse of input supporote
  838.                                                                                 seek_control=(struct HEADER *)main_parent->child_bk;
  839.                                                                                 while(seek_control!=(struct HEADER*)NULL)
  840.                                                                                 {
  841.                                                                                         if (seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE)
  842.                                                                                                 break;
  843.                                                                                         exchange_control=(struct HEADER *)seek_control->ctrl_fd;
  844.                                                 seek_control=exchange_control;
  845.                                                                                 }
  846.  
  847.                                                                                 main_parent->active_control_for_keys=(DWORD*)seek_control;
  848.                                                                                 main_parent->global_active_control_for_keys=(DWORD*)seek_control;
  849.  
  850.                                                                                 //send message enable focuse of input to control
  851.                                                                                 ControlProc=(void (*)(void *Control,struct MESSAGE *message))
  852.                                                                                                 seek_control->ctrl_proc;
  853.                                                                                 local_service_message.type=MESSAGE_SET_FOCUSE;
  854.                                                                                 seek_control->flags=seek_control->flags | FLAG_FOCUSE_INPUT_ON;
  855.                                                                                 ControlProc(seek_control,&local_service_message);
  856.  
  857.                                                                                 active_control_for_keys=(struct HEADER*)NULL;
  858.                                                                                 break;
  859.  
  860.                                                                         }
  861.                                                                         if (seek_control!=(struct HEADER*)NULL)
  862.                                                                         {
  863.                                                                                 parent=(struct HEADER*)seek_control->parent;
  864.                                                                                 parent->active_control_for_keys=(DWORD*)seek_control;
  865.                                                                                 main_parent->global_active_control_for_keys=(DWORD*)seek_control;
  866.  
  867.                                                                                 //send message enable focuse of input to control
  868.                                                                                 ControlProc=(void (*)(void *Control,struct MESSAGE *message))
  869.                                                                                                 seek_control->ctrl_proc;
  870.                                                                                 local_service_message.type=MESSAGE_SET_FOCUSE;
  871.                                                                                 seek_control->flags=seek_control->flags | FLAG_FOCUSE_INPUT_ON;
  872.                                                                                 ControlProc(seek_control,&local_service_message);
  873.  
  874.                                                                                 active_control_for_keys=(struct HEADER*)NULL;
  875.                                                                                 Parent->active_control_for_keys=(DWORD*)active_control_for_keys;
  876.                                                                                 break;
  877.                                                                         }
  878.                                                                 }
  879.                                                                 if (seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE)
  880.                                                                 {
  881.                                                                         ControlProc=(void (*)(void *Control,struct MESSAGE *message))
  882.                                                                                         active_control_for_keys->ctrl_proc;
  883.                                                                         local_service_message.type=MESSAGE_CHANGE_FOCUSE;
  884.                                                                         active_control_for_keys->flags=
  885.                                                                                 active_control_for_keys->flags & FLAG_FOCUSE_INPUT_OFF;
  886.                                                                         ControlProc(active_control_for_keys,&local_service_message);
  887.  
  888.                                                                         ControlProc=(void (*)(void *Control,struct MESSAGE *message))
  889.                                                                                         seek_control->ctrl_proc;
  890.                                                                         local_service_message.type=MESSAGE_SET_FOCUSE;
  891.                                                                         seek_control->flags=seek_control->flags | FLAG_FOCUSE_INPUT_ON;
  892.                                                                         ControlProc(seek_control,&local_service_message);
  893.  
  894.                                                                         active_control_for_keys=seek_control;
  895.                                                                         main_parent->global_active_control_for_keys=
  896.                                                                         (DWORD*)active_control_for_keys;
  897.                                                                         Parent->active_control_for_keys=(DWORD*)active_control_for_keys;
  898.                                                                         break;
  899.                                                                 }
  900.                                                         }
  901.                                                 }
  902.                                         }
  903.                                 }
  904.  
  905.                                 //send message of keys only to active control
  906.                                 if (active_control_for_keys!=NULL)
  907.                                 {
  908.                                         ControlProc=(void (*)(void *Control,struct MESSAGE *message))active_control_for_keys->ctrl_proc;
  909.                                         ControlProc(active_control_for_keys,message);
  910.                                 }
  911.                                 break;
  912.                         }
  913.                         case MESSAGE_SPECIALIZED:
  914.                         {
  915.                                 //send specialized message to all child controls
  916.                                 seek_control=(struct HEADER *)Parent->child_bk;
  917.                                 while(seek_control!=(struct HEADER*)NULL)
  918.                                 {
  919.                                         ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc;
  920.                                         ControlProc(seek_control,message);
  921.                                         exchange_control=(struct HEADER *)seek_control->ctrl_fd;
  922.                                         seek_control=exchange_control;
  923.                                 }
  924.                                 break;
  925.                         }
  926.                         case MESSAGE_MOUSE_EVENT:
  927.                         {
  928.                                 if (message->arg3==MOUSE_LEFT_BUTTON_DOWN)
  929.                                 {
  930.                                         if (active_control_for_mouse!=NULL)
  931.                                         {
  932.                                                 if (active_control_for_mouse->flags & FLAG_MOUSE_BLOCKED_ON) break;
  933.  
  934.                                                 ControlProc=(void (*)(void *Control,struct MESSAGE *message))active_control_for_mouse->ctrl_proc;
  935.                                                 ControlProc(active_control_for_mouse,message);
  936.                                                 break;
  937.                                         }
  938.                                 }
  939.                                 else
  940.                                 {
  941.                                         if (active_control_for_mouse!=NULL) {active_control_for_mouse=NULL;}
  942.                                 }
  943.  
  944.                                 cross=FALSE;
  945.                                 seek_control=(struct HEADER*)Parent->child_bk;
  946.                                 while(seek_control!=(struct HEADER*)NULL)
  947.                                 {
  948.                                         if (CheckCrossBox(seek_control,message->arg1,message->arg2)==TRUE &&
  949.                                                 (seek_control->flags & FLAG_MOUSE_BLOCKED_ON)==FALSE)
  950.                                         {
  951.                                                 if (message->arg3==MOUSE_LEFT_BUTTON_DOWN)
  952.                                                 {
  953.                                                         cross=TRUE;
  954.                                                         active_control_for_mouse=seek_control;
  955.  
  956.                                                         if (active_control_for_mouse->flags & FLAG_FOCUSE_INPUT_SUPPOROTE)
  957.                                                         {
  958.                                                                 //set focuse of input for new active control
  959.                                                                 active_control_for_mouse->flags=active_control_for_mouse->flags | FLAG_FOCUSE_INPUT_ON;
  960.  
  961.                                                                 if (active_control_for_keys!=NULL)
  962.                                                                 {
  963.                                                                         if (active_control_for_keys!=seek_control)
  964.                                                                         {
  965.                                                                                 //check seek control for supporote focuse of input
  966.                                                                                 if (seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE)
  967.                                                                                 {
  968.                                                                                         //check parent for supporote focuse of input
  969.                                                                                         parent=(struct HEADER*)seek_control->parent;
  970.                                                                                         if (parent->flags & FLAG_FOCUSE_INPUT_SUPPOROTE)
  971.                                                                                         {
  972.  
  973.                                                                                                 ControlProc=(void (*)(void *Control,struct MESSAGE *message))
  974.                                                                                                                         active_control_for_keys->ctrl_proc;
  975.  
  976.                                                                                                 local_service_message.type=MESSAGE_CHANGE_FOCUSE;
  977.                                                                                                 local_service_message.arg1=FALSE;
  978.                                                                                                 active_control_for_keys->flags=
  979.                                                                                                 active_control_for_keys->flags &
  980.                                                                                                                 FLAG_FOCUSE_INPUT_OFF;
  981.                                                                                                 ControlProc(active_control_for_keys,&local_service_message);
  982.  
  983.                                                                                                 ControlProc=(void (*)(void *Control,struct MESSAGE *message))
  984.                                                                                                                         seek_control->ctrl_proc;
  985.                                                                                                 local_service_message.type=MESSAGE_SET_FOCUSE;
  986.                                                                                                 local_service_message.arg1=FALSE;
  987.                                                                                                 seek_control->flags=seek_control->flags | FLAG_FOCUSE_INPUT_ON;
  988.                                                                                                 ControlProc(seek_control,&local_service_message);
  989.  
  990.                                                                                                 active_control_for_keys=seek_control;
  991.                                                                                                 main_parent->global_active_control_for_keys=
  992.                                                                                                                 (DWORD*)active_control_for_keys;
  993.                                                                                                 Parent->active_control_for_keys=
  994.                                                                                                                 (DWORD*)active_control_for_keys;
  995.                                                                                         }
  996.                                                                                 }
  997.                                                                         }
  998.                                                                 }
  999.                                                                 else
  1000.                                                                 {
  1001.                                                                         //check seek control for supporote focuse of input
  1002.                                                                         if (seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE)
  1003.                                                                         {
  1004.                                                                                 //check parent for supporote focuse of input
  1005.                                                                                 parent=(struct HEADER*)seek_control->parent;
  1006.                                                                                 if (parent->flags & FLAG_FOCUSE_INPUT_SUPPOROTE)
  1007.                                                                                 {
  1008.                                                                                         active_control_for_keys=(struct HEADER*)main_parent->global_active_control_for_keys;
  1009.                                                                                         if (active_control_for_keys!=NULL)
  1010.                                                                                         {
  1011.                                                                                                 ControlProc=(void (*)(void *Control,struct MESSAGE *message))
  1012.                                                                                                                 active_control_for_keys->ctrl_proc;
  1013.  
  1014.                                                                                                 local_service_message.type=MESSAGE_CHANGE_FOCUSE;
  1015.                                                                                                 active_control_for_keys->flags=
  1016.                                                                                                         active_control_for_keys->flags & FLAG_FOCUSE_INPUT_OFF;
  1017.                                                                                                 ControlProc(active_control_for_keys,&local_service_message);
  1018.                                                                                         }
  1019.  
  1020.                                                                                         ControlProc=(void (*)(void *Control,struct MESSAGE *message))
  1021.                                                                                                         seek_control->ctrl_proc;
  1022.                                                                                         local_service_message.type=MESSAGE_SET_FOCUSE;
  1023.                                                                                         seek_control->flags=seek_control->flags | FLAG_FOCUSE_INPUT_ON;
  1024.                                                                                         ControlProc(seek_control,&local_service_message);
  1025.  
  1026.                                                                                         main_parent->global_active_control_for_keys=(DWORD*)seek_control;
  1027.                                                                                         Parent->active_control_for_keys=(DWORD*)seek_control;
  1028.                                                                                 }
  1029.                                                                         }
  1030.                                                                 }
  1031.                                                         }
  1032.                                                 }
  1033.                                         }
  1034.  
  1035.                                         if ((seek_control->flags & FLAG_MOUSE_BLOCKED_ON)==FALSE)
  1036.                                         {
  1037.                                                 ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc;
  1038.                                                 ControlProc(seek_control,message);
  1039.                                         }
  1040.  
  1041.                                         exchange_control=(struct HEADER *)seek_control->ctrl_fd;
  1042.                                         seek_control=exchange_control;
  1043.                                 }
  1044.  
  1045.                                 if ((cross==FALSE) && (message->arg3==MOUSE_LEFT_BUTTON_DOWN))
  1046.                                 {
  1047.                                         if (active_control_for_keys!=NULL)
  1048.                                         {//disable focuse of input for active control of keys
  1049.                                                 ControlProc=(void (*)(void *Control,struct MESSAGE *message))active_control_for_keys->ctrl_proc;
  1050.  
  1051.                                                 local_service_message.type=MESSAGE_CHANGE_FOCUSE;
  1052.                                                 active_control_for_keys->flags=active_control_for_keys->flags & FLAG_FOCUSE_INPUT_OFF;
  1053.                                                 ControlProc(active_control_for_keys,&local_service_message);
  1054.  
  1055.                                                 main_parent->global_active_control_for_keys=(DWORD*)NULL;
  1056.                                                 Parent->active_control_for_keys=(DWORD*)NULL;
  1057.                                         }
  1058.                                 }
  1059.  
  1060.                                 break;
  1061.                         }
  1062.                         case MESSAGE_CHANGE_POSITION_EVENT:
  1063.                         {
  1064.                                 seek_control=(struct HEADER *)Parent->child_bk;
  1065.                                 while(seek_control!=(struct HEADER*)NULL)
  1066.                                 {
  1067.                                         ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc;
  1068.                                         ControlProc(seek_control,message);
  1069.  
  1070.                                         exchange_control=(struct HEADER *)seek_control->ctrl_fd;
  1071.                                         seek_control=exchange_control;
  1072.                                 }
  1073.                                 break;
  1074.                         }
  1075.                         case MESSAGE_CALL_TIMER_EVENT:
  1076.                         {
  1077.                                 seek_control=(struct HEADER *)Parent->child_bk;
  1078.                                 while(seek_control!=(struct HEADER*)NULL)
  1079.                                 {
  1080.                                         ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc;
  1081.                                         ControlProc(seek_control,message);
  1082.  
  1083.                                         exchange_control=(struct HEADER *)seek_control->ctrl_fd;
  1084.                                         seek_control=exchange_control;
  1085.                                 }
  1086.                                 break;
  1087.                         }
  1088.                         case MESSAGE_SET_FOCUSE:
  1089.                         {
  1090.                                 seek_control=(struct HEADER *)Parent->child_bk;
  1091.                                 while(seek_control!=(struct HEADER*)NULL)
  1092.                                 {
  1093.                                         if (seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE)
  1094.                                         {
  1095.                                                 ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc;
  1096.                                                 ControlProc(seek_control,message);
  1097.                                                 break;
  1098.                                         }
  1099.  
  1100.                                         exchange_control=(struct HEADER *)seek_control->ctrl_fd;
  1101.                                         seek_control=exchange_control;
  1102.                                 }
  1103.                                 break;
  1104.                         }
  1105.                         case MESSAGE_CHANGE_FOCUSE:
  1106.                         {
  1107.                                 seek_control=(struct HEADER *)Parent->child_bk;
  1108.                                 while(seek_control!=(struct HEADER*)NULL)
  1109.                                 {
  1110.                                         if (seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE)
  1111.                                         {
  1112.                                                 ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc;
  1113.                                                 ControlProc(seek_control,message);
  1114.                                                 break;
  1115.                                         }
  1116.  
  1117.                                         exchange_control=(struct HEADER *)seek_control->ctrl_fd;
  1118.                                         seek_control=exchange_control;
  1119.                                 }
  1120.                                 break;
  1121.                         }
  1122.                         case MESSAGE_DESTROY_CONTROL:
  1123.                         {
  1124.                                 seek_control=(struct HEADER *)Parent->child_bk;
  1125.                                 while(seek_control!=(struct HEADER*)NULL)
  1126.                                 {       //befor delet control get next control of parent
  1127.                                         exchange_control=(struct HEADER *)seek_control->ctrl_fd;
  1128.  
  1129.                                         ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc;
  1130.                                         //send message to control for destroyng child controls
  1131.                                         ControlProc(seek_control,message);
  1132.                                         DestroyControl(seek_control);
  1133.  
  1134.                                         seek_control=exchange_control;
  1135.                                 }
  1136.                                 break;
  1137.                         }
  1138.                         case MESSAGE_SET_MAIN_PARENT:
  1139.                         {
  1140.                                 seek_control=(struct HEADER *)Parent->child_bk;
  1141.                                 while(seek_control!=(struct HEADER*)NULL)
  1142.                                 {
  1143.                                         ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc;
  1144.                                         //send message to control for destroyng child controls
  1145.                                         ControlProc(seek_control,message);
  1146.  
  1147.                                         seek_control->main_parent=(DWORD*)message->arg1;
  1148.  
  1149.                                         exchange_control=(struct HEADER *)seek_control->ctrl_fd;
  1150.                                         seek_control=exchange_control;
  1151.                                 }
  1152.                                 break;
  1153.                         }
  1154.                         default:break;
  1155.                 }
  1156.         }
  1157.         Parent->active_control_for_mouse=(DWORD*)active_control_for_mouse;
  1158. }
  1159.  
  1160. //---------------------------------------------------------------------------------
  1161. //                              pack control_child in control_parent for libGUI
  1162. //---------------------------------------------------------------------------------
  1163. //add new control for Parent
  1164. void PackControls(void *parent,void *Control)
  1165. {
  1166.         struct HEADER   *Parent;
  1167.         struct HEADER   *last_control;
  1168.         struct HEADER   *control;
  1169.         struct  MESSAGE message;
  1170.  
  1171.         Parent=(struct HEADER *)parent;
  1172.         control=(struct HEADER *)Control;
  1173.         //set control's dependeces
  1174.  
  1175.         if (Parent->child_bk==NULL)
  1176.         {
  1177.                 //create first child control for parent
  1178.                 Parent->child_bk=(DWORD*)control;
  1179.                 Parent->child_fd=(DWORD*)control;
  1180.  
  1181.                 //init control
  1182.                 control->parent=(DWORD*)Parent;
  1183.                 control->ctrl_bk=(DWORD*)Parent;//last control is parent
  1184.                 control->ctrl_fd=(DWORD*)NULL;//haven't next control
  1185.         }
  1186.         else
  1187.         {
  1188.                 //set new control as endest child control of parent
  1189.                 last_control=(struct HEADER*)Parent->child_fd;
  1190.                 Parent->child_fd=(DWORD*)control;
  1191.  
  1192.                 last_control->ctrl_fd=(DWORD*)control;
  1193.                 control->ctrl_bk=(DWORD*)last_control;
  1194.                 control->ctrl_fd=(DWORD*)NULL;
  1195.                 control->parent=(DWORD*)Parent;
  1196.         }
  1197.  
  1198.         //finite control's coordinates and size
  1199.         control->ctrl_x=control->ctrl_x+Parent->ctrl_x;
  1200.         control->ctrl_y=control->ctrl_y+Parent->ctrl_y;
  1201.  
  1202.         if (control->ctrl_sizex<=1) {control->ctrl_sizex=1;}
  1203.         if (control->ctrl_sizey<=1) {control->ctrl_sizey=1;}
  1204.  
  1205.         message.type=(DWORD)MESSAGE_CHANGE_POSITION_EVENT;
  1206.         message.arg1=Parent->ctrl_x;
  1207.         message.arg2=Parent->ctrl_y;
  1208.         //send message change position to child controls
  1209.         SendMessage(control,&message);
  1210.  
  1211.         if (Parent->main_parent!=(DWORD*)NULL)
  1212.         {
  1213.                 //tell all child controls of main parent who is main parent
  1214.                 message.type=MESSAGE_SET_MAIN_PARENT;
  1215.                 message.arg1=(DWORD)Parent->main_parent;
  1216.                 SendMessage((struct HEADER *)Parent,&message);
  1217.         }
  1218. }
  1219.  
  1220. //---------------------------------------------------------------------------------
  1221. //                              show/hide controls
  1222. //---------------------------------------------------------------------------------
  1223. void    ShowControl(void *Control)
  1224. {
  1225.         struct  HEADER  *control;
  1226.         control=(struct HEADER  *)Control;
  1227.         control->flags=control->flags | FLAG_SHOW_CONTROL;
  1228. }
  1229.  
  1230. void    HideControl(void *Control)
  1231. {
  1232.         struct  HEADER  *control;
  1233.         control=(struct HEADER  *)Control;
  1234.         control->flags=control->flags & FLAG_HIDE_CONTROL;
  1235. }
  1236.  
  1237. //---------------------------------------------------------------------------------
  1238. //                              redraw control
  1239. //---------------------------------------------------------------------------------
  1240. void    RedrawControl(void *Control)
  1241. {
  1242.         struct  HEADER  *control;
  1243.         struct MESSAGE message;
  1244.  
  1245.         control=(struct HEADER*)Control;
  1246.         ControlProc=(void (*)(void *Control,struct MESSAGE *message))control->ctrl_proc;
  1247.         message.type=MESSAGE_FULL_REDRAW_ALL;
  1248.         ControlProc(control,&message);
  1249. }
  1250.  
  1251. //---------------------------------------------------------------------------------
  1252. //                              special redraw of control
  1253. //---------------------------------------------------------------------------------
  1254. void    SpecialRedrawControl(void *Control)
  1255. {
  1256.         struct  HEADER          *control;
  1257.         struct MESSAGE  message;
  1258.         struct  HEADERPARENT    *main_parent;
  1259.  
  1260.         control=(struct HEADER*)Control;
  1261.         main_parent=(struct     HEADERPARENT*)control->main_parent;
  1262.         control->flags=control->flags | FLAG_GET_SPECIALIZED_MESSAGE_ON;
  1263.  
  1264.         ControlProc=(void (*)(void *Control,struct MESSAGE *message))control->ctrl_proc;
  1265.  
  1266.         message.type=MESSAGE_SPECIALIZED;
  1267.         ControlProc((struct HEADER*)main_parent,&message);
  1268. }
  1269.  
  1270. //---------------------------------------------------------------------------------
  1271. //                              set new size for control
  1272. //---------------------------------------------------------------------------------
  1273. void    SetControlSizeRequest(void *Control,int new_size_x,int new_size_y)
  1274. {
  1275.         struct  HEADER  *control;
  1276.         struct  HEADER  *Parent;
  1277.  
  1278.         control=(struct HEADER*)Control;
  1279.         Parent=(struct  HEADER*)control->parent;
  1280.  
  1281.         control->ctrl_sizex=(DWORD)new_size_x;
  1282.         control->ctrl_sizey=(DWORD)new_size_y;
  1283.  
  1284.         if ((control->ctrl_x+control->ctrl_sizex)>Parent->ctrl_sizex)
  1285.         {control->ctrl_sizex=Parent->ctrl_sizex-control->ctrl_x;}
  1286.  
  1287.         if ((control->ctrl_y+control->ctrl_sizey)>Parent->ctrl_sizey)
  1288.         {control->ctrl_sizey=Parent->ctrl_sizey-control->ctrl_y;}
  1289.  
  1290.         if (control->ctrl_sizex<=1) {control->ctrl_sizex=1;}
  1291.         if (control->ctrl_sizey<=1) {control->ctrl_sizey=1;}
  1292.  
  1293. }
  1294.  
  1295. //---------------------------------------------------------------------------------
  1296. //                              get size x of control
  1297. //---------------------------------------------------------------------------------
  1298. int     GetControlSizeX(void *Control)
  1299. {
  1300.         struct  HEADER  *control;
  1301.  
  1302.         control=(struct HEADER *)Control;
  1303.  
  1304.         return ((int)control->ctrl_sizex);
  1305. }
  1306.  
  1307. //---------------------------------------------------------------------------------
  1308. //                              get size y of control
  1309. //---------------------------------------------------------------------------------
  1310. int     GetControlSizeY(void *Control)
  1311. {
  1312.         struct  HEADER  *control;
  1313.  
  1314.         control=(struct HEADER *)Control;
  1315.  
  1316.         return ((int)control->ctrl_sizey);
  1317. }
  1318.  
  1319. //---------------------------------------------------------------------------------
  1320. //                              set new size for control
  1321. //---------------------------------------------------------------------------------
  1322. void    SetControlNewPosition(void *Control,int new_x,int new_y)
  1323. {
  1324.         struct  HEADER          *control;
  1325.         struct  HEADER          *Parent;
  1326.         struct MESSAGE   message;
  1327.         parent_t                *main_parent;
  1328.         int             old_x;
  1329.         int             old_y;
  1330.  
  1331.         control=(struct HEADER*)Control;
  1332.         /*
  1333.         main_parent=(parent_t*)control->main_parent;
  1334.         if (control->parent==(DWORD*)main_parent)
  1335.         {//check position of child control of main parent
  1336.                 if (new_x+control->ctrl_sizex-1>screen.size_x) return;
  1337.                 if (new_y+control->ctrl_sizey-1>screen.size_y) return;
  1338.         }*/
  1339.  
  1340.         message.type=(DWORD)MESSAGE_CHANGE_POSITION_EVENT;
  1341.         message.arg1=(DWORD)(new_x-control->ctrl_x);
  1342.         message.arg2=(DWORD)(new_y-control->ctrl_y);
  1343.  
  1344.         ControlProc=(void (*)(void *Control,struct MESSAGE *message))control->ctrl_proc;
  1345.         ControlProc(control,&message);
  1346. }
  1347.  
  1348. //---------------------------------------------------------------------------------
  1349. //                              get x position of control
  1350. //---------------------------------------------------------------------------------
  1351. int     GetControlPositionX(void *Control)
  1352. {
  1353.         struct  HEADER  *control;
  1354.  
  1355.         control=(struct HEADER *)Control;
  1356.  
  1357.         return ((int)control->ctrl_x);
  1358. }
  1359.  
  1360. //---------------------------------------------------------------------------------
  1361. //                              get y position of control
  1362. //---------------------------------------------------------------------------------
  1363. int     GetControlPositionY(void *Control)
  1364. {
  1365.         struct  HEADER  *control;
  1366.  
  1367.         control=(struct HEADER *)Control;
  1368.  
  1369.         return ((int)control->ctrl_y);
  1370. }
  1371.  
  1372. //---------------------------------------------------------------------------------
  1373. //                      set focuse of input for control
  1374. //---------------------------------------------------------------------------------
  1375. void    *SetFocuse(void *Control)
  1376. {
  1377.         struct  HEADER          *control;
  1378.         struct  HEADERPARENT    *main_parent;
  1379.         struct  HEADER          *old_control;
  1380.         struct  MESSAGE *message;
  1381.  
  1382.         //new active control with focuse
  1383.         control=(struct HEADER*)Control;
  1384.         main_parent=(struct HEADERPARENT*)control->main_parent;
  1385.  
  1386.         if (main_parent==(struct HEADERPARENT*)NULL) return;
  1387.  
  1388.         //old control with focuse
  1389.         old_control=(struct HEADER*)main_parent->global_active_control_for_keys;
  1390.  
  1391.         if (old_control!=(struct HEADER*)NULL)
  1392.         {
  1393.                 message->type=MESSAGE_CHANGE_FOCUSE;
  1394.                 message->arg1=FALSE;
  1395.                 message->arg2=FALSE;
  1396.                 message->arg3=FALSE;
  1397.                 ControlProc=(void (*)(void *Control,struct MESSAGE *message))old_control->ctrl_proc;
  1398.                 ControlProc(old_control,message);
  1399.         }
  1400.  
  1401.         message->type=MESSAGE_SET_FOCUSE;
  1402.         message->arg1=FALSE;
  1403.         message->arg2=FALSE;
  1404.         message->arg3=FALSE;;
  1405.         ControlProc=(void (*)(void *Control,struct MESSAGE *message))control->ctrl_proc;
  1406.         ControlProc(control,message);
  1407.  
  1408.         return(old_control);
  1409. }
  1410.  
  1411. //---------------------------------------------------------------------------------
  1412. //                      set callback function for control
  1413. //---------------------------------------------------------------------------------
  1414. void *SetCallbackFunction(void *Control,int event_name,void *callback_func,void *callback_func_data)
  1415. {
  1416.         struct  HEADER          *control;
  1417.         struct  CALLBACK        *seek_callback;
  1418.         struct  CALLBACK        *exchange_callback;
  1419.         struct  CALLBACK        *new_callback;
  1420.  
  1421.         control=(struct HEADER *)Control;
  1422.         seek_callback=(struct CALLBACK*)control->callback;
  1423.  
  1424.         if (seek_callback==(struct CALLBACK *)NULL)
  1425.         {       //callback function creating at first
  1426.                 new_callback=malloc(sizeof(struct CALLBACK));
  1427.                 control->callback=(DWORD*)new_callback;
  1428.                 new_callback->clb_bk=(DWORD*)control;
  1429.                 new_callback->clb_fd=(DWORD*)NULL;
  1430.                 new_callback->clb_control=(DWORD*)control;
  1431.                 new_callback->connect_event=(DWORD)event_name;
  1432.                 new_callback->func=(DWORD*)callback_func;
  1433.                 new_callback->func_data=(DWORD*)callback_func_data;
  1434.                 new_callback->flags=0x0;
  1435.         }
  1436.         else
  1437.         {
  1438.                 while(seek_callback!=(struct CALLBACK*)NULL)
  1439.                 {
  1440.                         if (seek_callback->clb_fd==(DWORD*)NULL)
  1441.                         {//create new callback control for callback function
  1442.                                 new_callback=malloc(sizeof(struct CALLBACK));
  1443.                                 seek_callback->clb_fd=(DWORD*)new_callback;
  1444.                                 new_callback->clb_bk=(DWORD*)seek_callback;
  1445.                                 new_callback->clb_fd=(DWORD*)NULL;
  1446.                                 new_callback->clb_control=(DWORD*)control;
  1447.                                 new_callback->connect_event=(DWORD)event_name;
  1448.                                 new_callback->func=(DWORD*)callback_func;
  1449.                                 new_callback->func_data=(DWORD*)callback_func_data;
  1450.                                 new_callback->flags=0x0;
  1451.                                 break;
  1452.                         }
  1453.                         exchange_callback=(struct CALLBACK*)seek_callback->clb_fd;
  1454.                         seek_callback=exchange_callback;
  1455.                 }
  1456.         }
  1457. #ifdef DEBUG
  1458.        printf("\ncreated callback %d for function %d data %d",
  1459.                         (DWORD)new_callback,
  1460.                         (DWORD)callback_func,
  1461.                         (DWORD)callback_func_data);
  1462. #endif
  1463.  
  1464.         return(new_callback);
  1465. }
  1466.  
  1467. //---------------------------------------------------------------------------------
  1468. //                      block current  callback function for control
  1469. //---------------------------------------------------------------------------------
  1470. void    BlockCallbackFunction(void *Control,void *callback_ID)
  1471. {
  1472.         struct  HEADER          *control;
  1473.         struct  CALLBACK        *seek_callback;
  1474.         struct  CALLBACK        *exchange_callback;
  1475.         struct  CALLBACK        *unknown_callback;
  1476.  
  1477.         control=(struct HEADER *)Control;
  1478.  
  1479.         seek_callback=(struct CALLBACK *)control->callback;
  1480.         unknown_callback=(struct CALLBACK*)callback_ID;
  1481.  
  1482.         while(seek_callback!=(struct CALLBACK*)NULL)
  1483.         {
  1484.                 if (seek_callback==unknown_callback)
  1485.                 {
  1486.                         unknown_callback->flags=unknown_callback->flags | FLAG_BLOCK_CALLBACK_ON;
  1487.                         break;
  1488.                 }
  1489.                 exchange_callback=(struct CALLBACK*)seek_callback->clb_fd;
  1490.                 seek_callback=exchange_callback;
  1491.         }
  1492.  
  1493. }
  1494.  
  1495. //---------------------------------------------------------------------------------
  1496. //                      unblock current  callback function for control
  1497. //---------------------------------------------------------------------------------
  1498. void    UnblockCallbackFunction(void *Control,void *callback_ID)
  1499. {
  1500.         struct  HEADER          *control;
  1501.         struct  CALLBACK        *seek_callback;
  1502.         struct  CALLBACK        *exchange_callback;
  1503.         struct  CALLBACK        *unknown_callback;
  1504.  
  1505.         control=(struct HEADER *)Control;
  1506.  
  1507.         seek_callback=(struct CALLBACK *)control->callback;
  1508.         unknown_callback=(struct CALLBACK*)callback_ID;
  1509.  
  1510.         while(seek_callback!=(struct CALLBACK*)NULL)
  1511.         {
  1512.                 if (seek_callback==unknown_callback)
  1513.                 {
  1514.                         unknown_callback->flags=unknown_callback->flags & FLAG_BLOCK_CALLBACK_OFF;
  1515.                         break;
  1516.                 }
  1517.                 exchange_callback=(struct CALLBACK*)seek_callback->clb_fd;
  1518.                 seek_callback=exchange_callback;
  1519.         }
  1520. }
  1521.  
  1522. //---------------------------------------------------------------------------------
  1523. //                      check callback event for control
  1524. //---------------------------------------------------------------------------------
  1525. void    *ControlCheckCallbackEvent(void *Control,DWORD event)
  1526. {
  1527.         struct  HEADER          *control;
  1528.         struct  CALLBACK        *seek_callback;
  1529.         struct  CALLBACK        *exchange_callback;
  1530.  
  1531.         control=(struct HEADER *)Control;
  1532.         seek_callback=(struct CALLBACK *)control->callback;
  1533.  
  1534.         while(seek_callback!=(struct CALLBACK*)NULL)
  1535.         {
  1536.                 if ((seek_callback->flags & FLAG_BLOCK_CALLBACK_ON)==FALSE)
  1537.                 {
  1538.                         if (seek_callback->connect_event==event)        return (seek_callback);
  1539.                 }
  1540.                 exchange_callback=(struct CALLBACK*)seek_callback->clb_fd;
  1541.                 seek_callback=exchange_callback;
  1542.         }
  1543.         return(NULL);
  1544. }
  1545.  
  1546. //---------------------------------------------------------------------------------
  1547. //                      set IDL function for libGUI
  1548. //---------------------------------------------------------------------------------
  1549. void    SetIDL_Function(parent_t *parent,void *function,void *function_data)
  1550. {
  1551.         parent->IDL_func=(DWORD*)function;
  1552.         parent->IDL_func_data=(DWORD*)function_data;
  1553. }
  1554.  
  1555. //---------------------------------------------------------------------------------
  1556. //                      destroy IDL function for libGUI
  1557. //---------------------------------------------------------------------------------
  1558. void    DestroyIDL_Function(parent_t *parent)
  1559. {
  1560.         parent->IDL_func=(DWORD*)NULL;
  1561. }
  1562.  
  1563. //---------------------------------------------------------------------------------
  1564. //                                      initialize libGUI
  1565. //---------------------------------------------------------------------------------
  1566. char    InitLibGUI()
  1567. {
  1568.         font_t  *font;
  1569. //---------------------------------------------------------------------------------
  1570. //---------------------------platform depended part of code------------------------
  1571. //---------------------------------------------------------------------------------
  1572.         //set new events mask
  1573.         gui_ksys_set_events_mask(119);
  1574.         //set scan codes input mode for keyboard
  1575.         gui_ksys_set_keyboard_input_mode(1);
  1576. //------------------------------------------------------------------------------------
  1577.         FontsMeneger.fnt_fd=(DWORD*)NULL;
  1578.         FontsMeneger.fnt_bk=(DWORD*)NULL;
  1579.         FontsMeneger.number_fonts=0;
  1580.         //load default fonts
  1581.         font=LoadFont("CHAR.MT");
  1582.  
  1583.         if (font==NULL) return (TRUE);
  1584.                 else    FontsMeneger.default_font=(DWORD*)font;
  1585.  
  1586.         font->flags=font->flags | FONT_FLAG_DEFAULT_FONT_ON;
  1587.  
  1588.         return(FALSE);
  1589. }
  1590.  
  1591. //---------------------------------------------------------------------------------
  1592. //                      quit from libGUI loop and destroy all GUI objects
  1593. //---------------------------------------------------------------------------------
  1594. void    QuitLibGUI(parent_t *window)
  1595. {
  1596.         font_t                  *font,*seek_font,*exchange_font;
  1597.         gui_timer_t             *seek_timer,*exchange_timer;
  1598.         gui_message_t           message;
  1599.  
  1600. #ifdef DEBUG
  1601.         printf("\nbegin free libGUI...");
  1602. #endif
  1603.  
  1604.         //destroy controls of parent window
  1605.         message.type=MESSAGE_DESTROY_CONTROL;
  1606.         SendMessage((header_t*)window,&message);
  1607. #ifdef DEBUG
  1608.         printf("\ncontrols destroyed");
  1609. #endif
  1610.         //destroy timers for callback functions
  1611.         seek_timer=(gui_timer_t*)window->timer_bk;
  1612.         while(seek_timer!=(gui_timer_t*)NULL)
  1613.         {
  1614.                 exchange_timer=(gui_timer_t*)seek_timer->tmr_fd;
  1615.  
  1616.                 DestroyTimerCallbackForFunction(seek_timer);
  1617.  
  1618.                 seek_timer=exchange_timer;
  1619.         }
  1620. #ifdef DEBUG
  1621.         printf("\ntimers destroyed");
  1622. #endif
  1623.         //free arrays of parent window
  1624.         free(window->message);
  1625.         free(window->control_for_callback_function);
  1626.         free(window->callback_for_control_callback);
  1627. #ifdef DEBUG
  1628.         printf("\narrays destroyed");
  1629. #endif
  1630.         //destroy parent window
  1631.         free(window);
  1632. #ifdef DEBUG
  1633.         printf("\nparent window destroyed");
  1634. #endif
  1635.         //destroy fonts cash
  1636.  
  1637.         seek_font=(font_t*)FontsMeneger.fnt_bk;
  1638.         while(seek_font!=(font_t*)NULL)
  1639.         {
  1640.                 exchange_font=(font_t*)seek_font->fnt_fd;
  1641.  
  1642.                 free(seek_font->font);
  1643.                 DestroyFont(seek_font);
  1644.  
  1645.                 seek_font=exchange_font;
  1646.         }
  1647. #ifdef DEBUG
  1648.         printf("\nfonts destroyed");
  1649.         printf("\nexit program...");
  1650. #endif
  1651.         exit(0);
  1652. }
  1653.  
  1654. DWORD   LibGUIversion(void)
  1655. {       //25.10.09
  1656.         return(91025);
  1657. }
  1658.