Another attempt to fix some window placement and saved settings issues.

SVN revision: 10541
This commit is contained in:
Kim Woelders 2004-06-18 20:12:10 +00:00
parent f33bbc8441
commit f6e8774706
9 changed files with 113 additions and 157 deletions

View File

@ -1789,9 +1789,7 @@ void EwinBorderUpdateState(EWin * ewin);
void EwinEventDestroy(EWin * ewin);
void EwinEventMap(EWin * ewin);
void EwinEventUnmap(EWin * ewin);
void EwinSetArea(EWin * ewin, int ax, int ay);
void MoveEwinToArea(EWin * ewin, int ax, int ay);
void SetEwinToCurrentArea(EWin * ewin);
int EwinGetDesk(const EWin * ewin);
const char *EwinGetTitle(const EWin * ewin);
const char *EwinGetIconName(const EWin * ewin);
@ -2065,6 +2063,7 @@ void EdgeHandleMotion(XEvent * ev);
#define EDBUG_TYPE_RAISELOWER 132
#define EDBUG_TYPE_MOVERESIZE 133
#define EDBUG_TYPE_SESSION 134
#define EDBUG_TYPE_SNAPS 135
int EventDebug(unsigned int type);
#else
#define EventDebug(type) 0
@ -2537,8 +2536,6 @@ void SetSMUserThemePath(const char *path);
char *GetSMFile(void);
char *GetGenericSMFile(void);
void MatchEwinToSM(EWin * ewin);
void MatchToSnapInfoPager(Pager * p);
void MatchToSnapInfoIconbox(Iconbox * ib);
void SaveSession(int shutdown);
void autosave(void);
int EExit(int exitcode);
@ -2616,7 +2613,6 @@ void LoadSnapInfo(void);
void MatchEwinToSnapInfo(EWin * ewin);
void UnmatchEwinToSnapInfo(EWin * ewin);
void RememberImportantInfoForEwin(EWin * ewin);
void RememberImportantInfoForEwins(EWin * ewin);
/* sound.c */
SoundClass *SclassCreate(const char *name, const char *file);

View File

@ -670,6 +670,7 @@ AddInternalToFamily(Window win, const char *bname, int type, void *ptr,
ICCCM_Configure(ewin);
EwinBorderDraw(ewin, 1, 1);
DetermineEwinArea(ewin);
UngrabX();
EDBUG_RETURN(ewin);
@ -1121,6 +1122,17 @@ HonorIclass(char *s, int id)
EDBUG_RETURN_;
}
static void
EwinGetSize(EWin * ewin)
{
ewin->x = ewin->client.x - ewin->border->border.left;
ewin->y = ewin->client.y - ewin->border->border.top;
ewin->w = ewin->client.w +
ewin->border->border.left + ewin->border->border.right;
ewin->h = ewin->client.h +
ewin->border->border.top + ewin->border->border.bottom;
}
static EWin *
Adopt(Window win)
{
@ -1151,6 +1163,8 @@ Adopt(Window win)
ICCCM_MatchSize(ewin);
ICCCM_Adopt(ewin);
EwinGetSize(ewin);
EwinEventsConfigure(ewin, 0);
UngrabX();
@ -1189,11 +1203,13 @@ AdoptInternal(Window win, Border * border, int type)
ewin->skipfocus = 1;
break;
case EWIN_TYPE_ICONBOX:
ewin->sticky = 1;
ewin->skiptask = 1;
ewin->skip_ext_pager = 1;
ewin->skipfocus = 1;
break;
case EWIN_TYPE_PAGER:
ewin->sticky = 1;
ewin->skiptask = 1;
ewin->skip_ext_pager = 1;
ewin->skipfocus = 1;
@ -1205,6 +1221,15 @@ AdoptInternal(Window win, Border * border, int type)
ICCCM_GetInfo(ewin, 0);
ICCCM_GetShapeInfo(ewin);
ICCCM_GetGeoms(ewin, 0);
switch (type)
{
case EWIN_TYPE_DIALOG:
case EWIN_TYPE_MENU:
ewin->client.width.min = ewin->client.width.max = ewin->client.w;
ewin->client.height.min = ewin->client.height.max = ewin->client.h;
ewin->client.no_resize_h = ewin->client.no_resize_v = 1;
break;
}
MatchEwinToSnapInfo(ewin);
if (!ewin->border)
@ -1213,6 +1238,8 @@ AdoptInternal(Window win, Border * border, int type)
ICCCM_MatchSize(ewin);
ICCCM_Adopt(ewin);
EwinGetSize(ewin);
EwinEventsConfigure(ewin, 0);
UngrabX();
@ -1714,7 +1741,7 @@ EwinUpdateAfterMoveResize(EWin * ewin, int resize)
}
void
EwinFixPosition(EWin * ewin __UNUSED__)
EwinFixPosition(EWin * ewin)
{
int x, y;
@ -1734,10 +1761,6 @@ EwinFixPosition(EWin * ewin __UNUSED__)
if (x != ewin->x || y != ewin->y)
MoveEwin(ewin, x, y);
#if 0
RememberImportantInfoForEwin(ewin);
#endif
}
#define MR_FLAGS_MOVE 1
@ -1804,6 +1827,8 @@ doMoveResizeEwin(EWin * ewin, int x, int y, int w, int h, int flags)
move = 1;
ewin->x = x;
ewin->y = y;
ewin->client.x += dx;
ewin->client.y += dy;
}
if (flags & MR_FLAGS_RESIZE)
@ -2122,8 +2147,6 @@ ShowEwin(EWin * ewin)
if (ewin->win)
EMapWindow(disp, ewin->win);
SetEwinToCurrentArea(ewin);
if (Mode.mode == MODE_NONE)
{
PagerEwinOutsideAreaUpdate(ewin);
@ -3147,7 +3170,7 @@ EwinSetFullscreen(EWin * ewin, int on)
HintsSetWindowState(ewin);
}
void
static void
EwinSetArea(EWin * ewin, int ax, int ay)
{
if (ax == ewin->area_x && ay == ewin->area_y)
@ -3184,17 +3207,9 @@ MoveEwinToArea(EWin * ewin, int ax, int ay)
AreaFix(&ax, &ay);
MoveEwin(ewin, ewin->x + (VRoot.w * (ax - ewin->area_x)),
ewin->y + (VRoot.h * (ay - ewin->area_y)));
EwinSetArea(ewin, ax, ay);
EDBUG_RETURN_;
}
void
SetEwinToCurrentArea(EWin * ewin)
{
EwinSetArea(ewin, desks.desk[ewin->desktop].current_area_x,
desks.desk[ewin->desktop].current_area_y);
}
int
EwinGetDesk(const EWin * ewin)
{

View File

@ -881,7 +881,6 @@ EWMH_ProcessClientMessage(XClientMessageEvent * event)
ewin->toggle = 0;
func(ewin, "available");
RememberImportantInfoForEwin(ewin);
EWMH_SetWindowState(ewin);
}
else if (atom == _NET_WM_STATE_FULLSCREEN)

View File

@ -356,8 +356,8 @@ ICCCM_Configure(EWin * ewin)
ev.xconfigure.display = disp;
ev.xconfigure.event = ewin->client.win;
ev.xconfigure.window = ewin->client.win;
ev.xconfigure.x = desks.desk[d].x + ewin->x + ewin->border->border.left;
ev.xconfigure.y = desks.desk[d].y + ewin->y + ewin->border->border.top;
ev.xconfigure.x = desks.desk[d].x + ewin->client.x;
ev.xconfigure.y = desks.desk[d].y + ewin->client.y;
ev.xconfigure.width = ewin->client.w;
ev.xconfigure.height = ewin->client.h;
ev.xconfigure.border_width = 0;
@ -395,12 +395,6 @@ ICCCM_Adopt(EWin * ewin)
c[0] = (ewin->client.start_iconified) ? IconicState : NormalState;
XChangeProperty(disp, win, E_XA_WM_STATE, E_XA_WM_STATE, 32, PropModeReplace,
(unsigned char *)c, 2);
ewin->x = ewin->client.x;
ewin->y = ewin->client.y;
ewin->w = ewin->client.w +
ewin->border->border.left + ewin->border->border.right;
ewin->h = ewin->client.h +
ewin->border->border.top + ewin->border->border.bottom;
EDBUG_RETURN_;
}
@ -538,6 +532,7 @@ ICCCM_GetGeoms(EWin * ewin, Atom atom_change)
ewin->client.w = w;
ewin->client.h = h;
ewin->client.bw = bw;
if (XGetWMNormalHints(disp, ewin->client.win, &hint, &mask))
{
if (!(ewin->client.already_placed))
@ -589,6 +584,7 @@ ICCCM_GetGeoms(EWin * ewin, Atom atom_change)
ewin->client.y = 0;
ewin->client.already_placed = 0;
}
if (hint.flags & PMinSize)
{
ewin->client.width.min = hint.min_width;
@ -599,6 +595,7 @@ ICCCM_GetGeoms(EWin * ewin, Atom atom_change)
ewin->client.width.min = 0;
ewin->client.height.min = 0;
}
if (hint.flags & PMaxSize)
{
ewin->client.width.max = hint.max_width;
@ -613,6 +610,7 @@ ICCCM_GetGeoms(EWin * ewin, Atom atom_change)
ewin->client.width.max = 65535;
ewin->client.height.max = 65535;
}
if (hint.flags & PResizeInc)
{
ewin->client.w_inc = hint.width_inc;
@ -627,6 +625,7 @@ ICCCM_GetGeoms(EWin * ewin, Atom atom_change)
ewin->client.w_inc = 1;
ewin->client.h_inc = 1;
}
if (hint.flags & PAspect)
{
if ((hint.min_aspect.y > 0.0) && (hint.min_aspect.x > 0.0))
@ -653,6 +652,7 @@ ICCCM_GetGeoms(EWin * ewin, Atom atom_change)
ewin->client.aspect_min = 0.0;
ewin->client.aspect_max = 65535.0;
}
if (hint.flags & PBaseSize)
{
ewin->client.base_w = hint.base_width;
@ -663,21 +663,13 @@ ICCCM_GetGeoms(EWin * ewin, Atom atom_change)
ewin->client.base_w = ewin->client.width.min;
ewin->client.base_h = ewin->client.height.min;
}
if (ewin->client.width.min < ewin->client.base_w)
ewin->client.width.min = ewin->client.base_w;
if (ewin->client.height.min < ewin->client.base_h)
ewin->client.height.min = ewin->client.base_h;
}
if (ewin->client.width.min == 0)
{
if (ewin->internal)
{
ewin->client.width.min = w;
ewin->client.height.min = h;
ewin->client.width.max = w;
ewin->client.height.max = h;
}
}
ewin->client.no_resize_h = 0;
ewin->client.no_resize_v = 0;
if (ewin->client.width.min == ewin->client.width.max)
@ -685,6 +677,11 @@ ICCCM_GetGeoms(EWin * ewin, Atom atom_change)
if (ewin->client.height.min == ewin->client.height.max)
ewin->client.no_resize_v = 1;
if (EventDebug(EDBUG_TYPE_SNAPS))
Eprintf("Snap get icccm %#lx: %4d+%4d %4dx%4d: %s\n",
ewin->client.win, ewin->client.x, ewin->client.y,
ewin->client.w, ewin->client.h, EwinGetTitle(ewin));
EDBUG_RETURN_;
}
@ -1070,8 +1067,8 @@ ICCCM_SetEInfo(EWin * ewin)
aa = XInternAtom(disp, "ENL_INTERNAL_DATA_BORDER", False);
c[0] = ewin->desktop;
c[1] = ewin->sticky;
c[2] = ewin->x;
c[3] = ewin->y;
c[2] = ewin->client.x;
c[3] = ewin->client.y;
c[4] = ewin->iconified;
if (ewin->iconified)
ICCCM_DeIconify(ewin);
@ -1083,6 +1080,10 @@ ICCCM_SetEInfo(EWin * ewin)
XChangeProperty(disp, ewin->client.win, aa, XA_STRING, 8, PropModeReplace,
(unsigned char *)ewin->border->name,
strlen(ewin->border->name) + 1);
if (EventDebug(EDBUG_TYPE_SNAPS))
Eprintf("Snap set einf %#lx: %4d+%4d %4dx%4d: %s\n",
ewin->client.win, ewin->client.x, ewin->client.y,
ewin->client.w, ewin->client.h, EwinGetTitle(ewin));
EDBUG_RETURN_;
}
@ -1117,7 +1118,7 @@ ICCCM_GetMainEInfo(void)
a = XInternAtom(disp, "ENL_INTERNAL_AREA_DATA", False);
puc = NULL;
XGetWindowProperty(disp, VRoot.win, a, 0, 10, False, XA_CARDINAL, &a2,
XGetWindowProperty(disp, VRoot.win, a, 0, 0xffff, False, XA_CARDINAL, &a2,
&dummy, &lnum, &ldummy, &puc);
c = (CARD32 *) puc;
num = (int)lnum;
@ -1136,7 +1137,7 @@ ICCCM_GetMainEInfo(void)
a = XInternAtom(disp, "ENL_INTERNAL_DESK_DATA", False);
puc = NULL;
XGetWindowProperty(disp, VRoot.win, a, 0, 10, False, XA_CARDINAL, &a2,
XGetWindowProperty(disp, VRoot.win, a, 0, 1, False, XA_CARDINAL, &a2,
&dummy, &lnum, &ldummy, &puc);
c = (CARD32 *) puc;
num = (int)lnum;
@ -1200,6 +1201,10 @@ ICCCM_GetEInfo(EWin * ewin)
if ((num > 0) && (str))
EwinSetBorderByName(ewin, str, 0);
XFree(str);
if (EventDebug(EDBUG_TYPE_SNAPS))
Eprintf("Snap get einf %#lx: %4d+%4d %4dx%4d: %s\n",
ewin->client.win, ewin->client.x, ewin->client.y,
ewin->client.w, ewin->client.h, EwinGetTitle(ewin));
}
EDBUG_RETURN(0);
}

View File

@ -546,6 +546,8 @@ IconboxEwinMoveResize(EWin * ewin, int resize __UNUSED__)
return;
call_depth++;
RememberImportantInfoForEwin(ewin);
if (!Conf.theme.transparency &&
ib->w == ewin->client.w && ib->h == ewin->client.h)
goto done;
@ -602,8 +604,6 @@ IconboxShow(Iconbox * ib)
HintsSetWindowName(ib->win, "Iconbox");
HintsSetWindowClass(ib->win, ib->name, "Enlightenment_IconBox");
MatchToSnapInfoIconbox(ib);
ewin = AddInternalToFamily(ib->win, "ICONBOX", EWIN_TYPE_ICONBOX, ib,
IconboxEwinInit);
if (ewin)
@ -615,7 +615,6 @@ IconboxShow(Iconbox * ib)
IB_Reconfigure(ib);
sn = FindSnapshot(ewin);
ConformEwinToDesktop(ewin);
w = ewin->client.w;
h = ewin->client.h;
@ -623,7 +622,7 @@ IconboxShow(Iconbox * ib)
ewin->client.h = 1;
if (sn)
{
ResizeEwin(ewin, w, h);
MoveResizeEwin(ewin, ewin->x, ewin->y, w, h);
}
else
{
@ -2082,7 +2081,6 @@ IconboxRedraw(Iconbox * ib)
EResizeWindow(disp, ib->win, w, h);
EFreePixmap(disp, ib->pmap);
ib->pmap = ECreatePixmap(disp, ib->icon_win, w, h, VRoot.depth);
RememberImportantInfoForEwins(ib->ewin);
ib->force_update = 0;
}

View File

@ -159,7 +159,6 @@ ActionMoveEnd(EWin * ewin)
FX_Pause();
UngrabX();
}
RememberImportantInfoForEwins(ewin);
if (wasresize)
ForceUpdatePagersForDesktop(desks.current);
Efree(gwins);
@ -358,7 +357,6 @@ ActionResizeEnd(EWin * ewin)
UngrabX();
}
ForceUpdatePagersForDesktop(desks.current);
RememberImportantInfoForEwin(ewin);
EwinUpdateAfterMoveResize(ewin, 1);

View File

@ -235,6 +235,8 @@ PagerEwinMoveResize(EWin * ewin, int resize)
if (!Conf.pagers.enable || !p)
return;
RememberImportantInfoForEwin(ewin);
w = ewin->client.w;
h = ewin->client.h;
if ((w == p->w) && (h == p->h))
@ -334,8 +336,6 @@ PagerShow(Pager * p)
pq = Mode.queue_up;
Mode.queue_up = 0;
MatchToSnapInfoPager(p);
ewin = AddInternalToFamily(p->win, (p->border_name) ? p->border_name :
"PAGER", EWIN_TYPE_PAGER, p, PagerEwinInit);
if (ewin)
@ -344,11 +344,9 @@ PagerShow(Pager * p)
Snapshot *sn;
double aspect;
#if 1 /* Do we need this? */
ewin->client.event_mask |=
ButtonPressMask | ButtonReleaseMask | PointerMotionMask;
XSelectInput(disp, p->win, ewin->client.event_mask);
#endif
aspect = ((double)VRoot.w) / ((double)VRoot.h);
GetAreaSize(&ax, &ay);
@ -384,9 +382,6 @@ PagerShow(Pager * p)
/* show the pager ewin */
ShowEwin(ewin);
if (((sn) && (sn->use_sticky) && (sn->sticky)) || (!sn))
EwinStick(ewin);
RememberImportantInfoForEwin(ewin);
if (Conf.pagers.snap)
{
Esnprintf(s, sizeof(s), "__.%x", (unsigned)p->win);

View File

@ -236,7 +236,7 @@ SaveWindowStates(void)
y = desks.desk[ewin->desktop].current_area_y * VRoot.h;
}
fprintf(f, "[CLIENT] %i %i %i %i %i %i %i %i %i\n",
ewin->x + x, ewin->y + y, ewin->client.w,
ewin->client.x + x, ewin->client.y + y, ewin->client.w,
ewin->client.h, ewin->desktop, ewin->iconified,
ewin->shaded, ewin->sticky, ewin->layer);
if (ewin->session_id)
@ -418,6 +418,10 @@ MatchEwinToSM(EWin * ewin)
ewin->client.y, ewin->client.w,
ewin->client.h);
}
if (EventDebug(EDBUG_TYPE_SNAPS))
Eprintf("Snap get sess %#lx: %4d+%4d %4dx%4d: %s\n",
ewin->client.win, ewin->client.x, ewin->client.y,
ewin->client.w, ewin->client.h, EwinGetTitle(ewin));
break;
}
}

View File

@ -629,10 +629,17 @@ SnapshotEwinLocation(EWin * ewin)
if (!sn)
return;
sn->use_xy = 1;
sn->x = ewin->x;
sn->y = ewin->y;
sn->x = ewin->client.x;
sn->y = ewin->client.y;
sn->area_x = ewin->area_x;
sn->area_y = ewin->area_y;
if (!ewin->sticky)
{
sn->x +=
((desks.desk[ewin->desktop].current_area_x - sn->area_x) * VRoot.w);
sn->y +=
((desks.desk[ewin->desktop].current_area_y - sn->area_y) * VRoot.h);
}
}
void
@ -1146,64 +1153,65 @@ MatchEwinToSnapInfo(EWin * ewin)
ewin->snap = sn;
sn->used = 1;
ListChangeItemID(LIST_TYPE_SNAPSHOT, ewin->snap, 1);
if (sn->use_desktop)
ewin->desktop = sn->desktop;
if (sn->use_sticky)
ewin->sticky = sn->sticky;
if (sn->use_desktop && !ewin->sticky)
ewin->desktop = DESKTOPS_WRAP_NUM(sn->desktop);
else
ewin->desktop = desks.current;
if (sn->use_wh)
{
ewin->client.w = sn->w;
ewin->client.h = sn->h;
}
if (sn->use_xy)
{
ewin->client.already_placed = 1;
ewin->client.x = sn->x;
ewin->client.y = sn->y;
if ((!((sn->use_sticky) && (sn->sticky))) && (!ewin->sticky))
ewin->area_x = sn->area_x;
ewin->area_y = sn->area_y;
if (!ewin->sticky)
{
if (sn->use_desktop)
{
ewin->client.x +=
((sn->area_x - desks.desk[ewin->desktop].current_area_x) *
VRoot.w);
ewin->client.y +=
((sn->area_y - desks.desk[ewin->desktop].current_area_y) *
VRoot.h);
}
else
{
ewin->client.x +=
((sn->area_x - desks.desk[desks.current].current_area_x) *
VRoot.w);
ewin->client.y +=
((sn->area_y - desks.desk[desks.current].current_area_y) *
VRoot.h);
}
ewin->client.x +=
((sn->area_x - desks.desk[ewin->desktop].current_area_x) *
VRoot.w);
ewin->client.y +=
((sn->area_y - desks.desk[ewin->desktop].current_area_y) *
VRoot.h);
}
ewin->x = ewin->client.x;
ewin->y = ewin->client.y;
EMoveResizeWindow(disp, ewin->client.win, ewin->client.x,
ewin->client.y, ewin->client.w, ewin->client.h);
}
if (sn->use_layer)
ewin->layer = sn->layer;
if (sn->use_sticky)
ewin->sticky = sn->sticky;
if (sn->use_skiplists)
{
ewin->skipfocus = sn->skipfocus;
ewin->skiptask = sn->skiptask;
ewin->skipwinlist = sn->skipwinlist;
}
if (sn->use_neverfocus)
ewin->neverfocus = sn->neverfocus;
if (sn->use_shade)
ewin->shaded = sn->shade;
if (sn->iclass_name)
{
/* FIXME: fill this in */
}
if (sn->border_name)
EwinSetBorderByName(ewin, sn->border_name, 0);
if (sn->groups)
{
for (i = 0; i < sn->num_groups; i++)
@ -1224,6 +1232,11 @@ MatchEwinToSnapInfo(EWin * ewin)
AddEwinToGroup(ewin, g);
}
}
if (EventDebug(EDBUG_TYPE_SNAPS))
Eprintf("Snap get snap %#lx: %4d+%4d %4dx%4d: %s\n",
ewin->client.win, ewin->client.x, ewin->client.y,
ewin->client.w, ewin->client.h, EwinGetTitle(ewin));
}
/* make a client window conform to snapshot info */
@ -1241,67 +1254,15 @@ UnmatchEwinToSnapInfo(EWin * ewin)
ListChangeItemID(LIST_TYPE_SNAPSHOT, sn, 0);
}
void
MatchToSnapInfoPager(Pager * p)
{
XClassHint hint;
char buf[1024];
Snapshot *sn = NULL;
Window win = PagerGetWin(p);
if ((!XGetClassHint(disp, win, &hint)))
return;
if ((hint.res_name) && (hint.res_class))
{
Esnprintf(buf, sizeof(buf), "%s.%s", hint.res_name, hint.res_class);
sn = FindItem(buf, 0, LIST_FINDBY_BOTH, LIST_TYPE_SNAPSHOT);
}
if (hint.res_name)
XFree(hint.res_name);
if (hint.res_class)
XFree(hint.res_class);
if (!sn)
return;
if (sn->use_xy)
EMoveWindow(disp, win, sn->x, sn->y);
if (sn->use_wh)
EResizeWindow(disp, win, sn->w, sn->h);
}
void
MatchToSnapInfoIconbox(Iconbox * ib)
{
XClassHint hint;
char buf[1024];
Snapshot *sn = NULL;
Window win = IconboxGetWin(ib);
if ((!XGetClassHint(disp, win, &hint)))
return;
if ((hint.res_name) && (hint.res_class))
{
Esnprintf(buf, sizeof(buf), "%s.%s", hint.res_name, hint.res_class);
sn = FindItem(buf, 0, LIST_FINDBY_BOTH, LIST_TYPE_SNAPSHOT);
}
if (hint.res_name)
XFree(hint.res_name);
if (hint.res_class)
XFree(hint.res_class);
if (!sn)
return;
if (sn->use_xy)
EMoveWindow(disp, win, sn->x, sn->y);
if (sn->use_wh)
EResizeWindow(disp, win, sn->w, sn->h);
}
void
RememberImportantInfoForEwin(EWin * ewin)
{
if ((ewin->pager) || (ewin->ibox))
{
if (EventDebug(EDBUG_TYPE_SNAPS))
Eprintf("RememberImportantInfoForEwin %#lx %s\n",
ewin->client.win, EwinGetTitle(ewin));
SnapshotEwinBorder(ewin);
SnapshotEwinDesktop(ewin);
SnapshotEwinSize(ewin);
@ -1315,18 +1276,3 @@ RememberImportantInfoForEwin(EWin * ewin)
SaveSnapInfo();
}
}
void
RememberImportantInfoForEwins(EWin * ewin)
{
int i, num;
EWin **gwins;
gwins = ListWinGroupMembersForEwin(ewin, ACTION_MOVE, Mode.nogroup, &num);
if (gwins)
{
for (i = 0; i < num; i++)
RememberImportantInfoForEwin(gwins[i]);
Efree(gwins);
}
}