00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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
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
00122
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 }