zorder.c

00001 /***************************************************************************
00002                           zorder.c  -  description
00003                              -------------------
00004     begin                : Sat Jan 31 2004
00005     copyright            : (C) 2004 by Dynacube Team
00006     email                : 
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  *                                                                         *
00011  *   This program is free software; you can redistribute it and/or modify  *
00012  *   it under the terms of the GNU General Public License as published by  *
00013  *   the Free Software Foundation; either version 2 of the License, or     *
00014  *   (at your option) any later version.                                   *
00015  *                                                                         *
00016  ***************************************************************************/
00017 
00018  #include "gui/zorder.h"
00019  
00020 
00021   ZORDER zorder[MAX_PROC * WINDOW_MAX];
00022 
00023   DD z_endptr = 0;
00024 
00025   DW max_gtask = 0;
00026 
00027   DB gtask_avl[MAX_PROC * WINDOW_MAX] = {1};
00028 
00029 
00030   void z_init()
00031   {
00032    DD i;
00033 
00034    for(i=0 ; i < MAX_PROC * WINDOW_MAX ; i++)
00035       zorder[i].pid = MAX_PROC;
00036   }
00037 
00038   void z_enq(DW _pid, DW _window_id,DW _task_id)
00039   {
00040     DD i;
00041 
00042     for(i = 0 ; i < z_endptr ; i++)
00043     {
00044       if(zorder[i].pid == _pid && zorder[i].window_id == _window_id)
00045       {
00046         return;
00047       }
00048     }
00049 
00050     zorder[z_endptr].pid = _pid;
00051     zorder[z_endptr].window_id = _window_id;
00052     zorder[z_endptr].task_id = _task_id;
00053     z_endptr++;
00054   }
00055 
00056 
00057   SDB z_remove(DW _pid, DW _window_id)
00058   {
00059     DD i;
00060     DB task_id;
00061 
00062     for(i = 0 ; i < z_endptr ; i++)
00063     {
00064       if(zorder[i].pid == _pid && zorder[i].window_id == _window_id)
00065       {
00066         gtask_avl[zorder[i].task_id] = AVL;
00067         task_id = zorder[i].task_id;
00068         z_move(i);
00069         return (task_id);
00070       }
00071     }
00072 
00073     return -1;
00074   }
00075 
00076   void z_removeAll(DW _pid)
00077   {
00078     DD i;
00079 
00080     for(i = 0 ; i < z_endptr ; )
00081     {
00082       if(zorder[i].pid == _pid)
00083       {
00084  //change
00085         gtask_avl[zorder[i].task_id] = AVL;
00086         z_move(i);
00087         i--;
00088       }
00089       i++;
00090     }
00091 
00092   }
00093 
00094   void z_moveTop(DW _pid, DW _window_id)
00095   {
00096     SDW task_id;
00097     if(zorder[z_endptr-1].pid == _pid && zorder[z_endptr-1].window_id == _window_id)
00098       return;
00099       
00100     if((task_id = z_remove(_pid,_window_id)) != -1)
00101     {
00102       gtask_avl[task_id] = AVL;
00103       z_enq(_pid,_window_id,task_id);
00104     }
00105   }
00106 
00107 
00108   void z_move(DW dest)
00109   {
00110     DD i;
00111 
00112     if(dest >= z_endptr)
00113       return;
00114 
00115     for(i = dest ; i < z_endptr-1 ; i++)
00116     {
00117       zorder[i] = zorder[i+1];
00118     }
00119 
00120     z_endptr--;
00121 //    printf("\n ep %d ",z_endptr);
00122 //    delay(0x5FF);
00123   }
00124 
00125   void printZ()
00126   {
00127    SDD i;
00128 
00129    printf("\n");
00130    for(i=z_endptr-1 ; i >= 0 ; i--)
00131       printf("\n %d %d ",zorder[i].pid,zorder[i].window_id);
00132   }
00133 
00134   SDW z_get_max()
00135   {
00136     DW *max2 = &max_gtask;
00137     DW max1 = MAX_PROC * WINDOW_MAX;
00138     DW i;
00139     
00140     if(*max2 < max1)
00141      {
00142       gtask_avl[*max2] = UNAVL;
00143       *max2 = *max2 + 1;
00144       return (*max2-1);
00145      }
00146      else
00147       {
00148        for(i = 0 ; i < max1 ; i++)
00149          {
00150           if(gtask_avl == AVL)
00151           {
00152            gtask_avl[i] = UNAVL;
00153            return i;
00154           }
00155          }
00156        if( i == max1)
00157         return -1;
00158      }   
00159   }

Generated on Thu Jul 27 23:52:28 2006 for Dynacube by  doxygen 1.4.7