Simplify ewin unmap/destroy handling (fixes "losing windows" bug).

SVN revision: 9641
This commit is contained in:
Kim Woelders 2004-04-07 21:50:19 +00:00
parent f73f0c4e4c
commit 7a95ff3a9a
8 changed files with 135 additions and 133 deletions

View File

@ -963,6 +963,7 @@ struct _ewin
} ewmh;
void (*MoveResize) (EWin * ewin, int resize);
void (*Refresh) (EWin * ewin);
void (*Close) (EWin * ewin);
};
typedef struct _groupconfig
@ -1703,8 +1704,10 @@ int DrawEwinWinpart(EWin * ewin, int i);
int ChangeEwinWinpart(EWin * ewin, int i);
void DrawEwin(EWin * ewin);
int ChangeEwinWinpartContents(EWin * ewin, int i);
EWin *CreateEwin(void);
void FreeEwin(EWin * ewin);
EWin *EwinCreate(void);
void EwinDestroy(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);

View File

@ -1158,7 +1158,7 @@ Adopt(Window win)
EDBUG(4, "Adopt");
GrabX();
ewin = CreateEwin();
ewin = EwinCreate();
ewin->client.win = win;
ICCCM_AdoptStart(ewin);
ICCCM_GetTitle(ewin, 0);
@ -1188,6 +1188,7 @@ Adopt(Window win)
InstantShadeEwin(ewin, 1);
HintsSetWindowState(ewin);
HintsSetClientList();
EDBUG_RETURN(ewin);
}
@ -1199,7 +1200,7 @@ AdoptInternal(Window win, Border * border, int type)
EDBUG(4, "AdoptInternal");
GrabX();
ewin = CreateEwin();
ewin = EwinCreate();
ewin->client.win = win;
ewin->border = border;
ewin->internal = 1;
@ -1249,17 +1250,18 @@ AdoptInternal(Window win, Border * border, int type)
InstantShadeEwin(ewin, 1);
HintsSetWindowState(ewin);
HintsSetClientList();
EDBUG_RETURN(ewin);
}
EWin *
CreateEwin()
EwinCreate(void)
{
EWin *ewin;
XSetWindowAttributes att;
EDBUG(5, "CreateEwin");
EDBUG(5, "EwinCreate");
ewin = Emalloc(sizeof(EWin));
memset(ewin, 0, sizeof(EWin));
ewin->x = -1;
@ -1327,7 +1329,7 @@ CreateEwin()
}
void
FreeEwin(EWin * ewin)
EwinDestroy(EWin * ewin)
{
EWin *ewin2;
int i, num_groups;
@ -1341,45 +1343,11 @@ FreeEwin(EWin * ewin)
HintsSetClientList();
if (GetZoomEWin() == ewin)
Zoom(NULL);
UnmatchEwinToSnapInfo(ewin);
PagerEwinOutsideAreaUpdate(ewin);
PagerHideAllHi();
if (ewin->iconified > 0)
RemoveMiniIcon(ewin);
ActionsEnd(ewin);
if (ewin == GetContextEwin())
SlideoutsHide();
if (Mode.doingslide)
{
DrawEwinShape(ewin, Conf.slidemode, ewin->x, ewin->y,
ewin->client.w, ewin->client.h, 2);
Mode.doingslide = 0;
}
/* hide any menus this ewin has brought up if they are still up when we */
/* destroy this ewin */
if (ewin->shownmenu)
MenusHideByWindow(ewin->shownmenu);
FocusToEWin(ewin, FOCUS_EWIN_GONE);
if (ewin->docked)
DockDestroy(ewin);
if (ewin->pager)
PagerDestroy(ewin->pager);
if (ewin->ibox)
IconboxDestroy(ewin->ibox);
if (ewin == Mode.mouse_over_win)
Mode.mouse_over_win = NULL;
HintsDelWindowHints(ewin);
if (ewin->client.transient)
@ -1432,6 +1400,70 @@ FreeEwin(EWin * ewin)
EDBUG_RETURN_;
}
void
EwinEventMap(EWin * ewin)
{
ewin->mapped = 1;
}
void
EwinEventUnmap(EWin * ewin)
{
Window win;
ewin->mapped = 0;
if (GetZoomEWin() == ewin)
Zoom(NULL);
ActionsEnd(ewin);
if (ewin->pager)
PagerEventUnmap(ewin->pager);
if (Conf.dockapp_support && ewin->docked)
DockDestroy(ewin);
if (ewin == GetContextEwin())
SlideoutsHide();
if (ewin == Mode.focuswin)
FocusToEWin(ewin, FOCUS_EWIN_GONE);
if (ewin == Mode.mouse_over_win)
Mode.mouse_over_win = NULL;
/* hide any menus this ewin has brought up if they are still up when we */
/* destroy this ewin */
if (ewin->shownmenu)
MenusHideByWindow(ewin->shownmenu);
if (Mode.doingslide)
{
DrawEwinShape(ewin, Conf.slidemode, ewin->x, ewin->y,
ewin->client.w, ewin->client.h, 2);
Mode.doingslide = 0;
}
HideEwin(ewin);
if (!ewin->internal)
return;
if (ewin->Close)
ewin->Close(ewin);
/* Park the client window on the root so we can use it again later */
XTranslateCoordinates(disp, ewin->client.win, root.win,
-ewin->border->border.left,
-ewin->border->border.top, &ewin->client.x,
&ewin->client.y, &win);
EReparentWindow(disp, ewin->client.win, root.win, ewin->client.x,
ewin->client.y);
ICCCM_Withdraw(ewin);
RemoveItem(NULL, ewin->client.win, LIST_FINDBY_ID, LIST_TYPE_EWIN);
EwinDestroy(ewin);
}
static void
EwinSetBorderInit(EWin * ewin)
{
@ -2064,7 +2096,7 @@ HideEwin(EWin * ewin)
{
EDBUG(3, "HideEwin");
if (!ewin->visible)
if (!ewin->mapped || !ewin->visible)
EDBUG_RETURN_;
ewin->visible = 0;

View File

@ -566,7 +566,7 @@ DialogRedraw(Dialog * d)
}
static void
DialogMoveResize(EWin * ewin, int resize)
DialogEwinMoveResize(EWin * ewin, int resize)
{
Dialog *d = ewin->dialog;
@ -580,17 +580,25 @@ DialogMoveResize(EWin * ewin, int resize)
}
static void
DialogRefresh(EWin * ewin)
DialogEwinRefresh(EWin * ewin)
{
DialogMoveResize(ewin, 0);
DialogEwinMoveResize(ewin, 0);
}
static void
DialogEwinClose(EWin * ewin)
{
DialogClose(ewin->dialog);
ewin->dialog = NULL;
}
static void
DialogEwinInit(EWin * ewin, void *ptr)
{
ewin->dialog = (Dialog *) ptr;
ewin->MoveResize = DialogMoveResize;
ewin->Refresh = DialogRefresh;
ewin->MoveResize = DialogEwinMoveResize;
ewin->Refresh = DialogEwinRefresh;
ewin->Close = DialogEwinClose;
}
void
@ -711,23 +719,13 @@ ShowDialog(Dialog * d)
void
DialogClose(Dialog * d)
{
EWin *ewin;
XEvent ev;
if (!d)
return;
ewin = FindEwinByDialog(d);
EDestroyWindow(disp, d->win);
if (ewin)
{
HideEwin(ewin);
ev.xunmap.window = d->win;
HandleUnmap(&ev);
}
if (d->exit_func)
(d->exit_func) (d->exit_val, d->exit_data);
RemoveItem(NULL, d->win, LIST_FINDBY_ID, LIST_TYPE_DIALOG);
DialogDestroy(d);
}
DItem *

View File

@ -666,7 +666,7 @@ HandleDestroy(XEvent * ev)
ewin = RemoveItem(NULL, win, LIST_FINDBY_ID, LIST_TYPE_EWIN);
if (ewin)
{
FreeEwin(ewin);
EwinDestroy(ewin);
EDBUG_RETURN_;
}
@ -690,41 +690,8 @@ HandleUnmap(XEvent * ev)
ewin = FindItem(NULL, win, LIST_FINDBY_ID, LIST_TYPE_EWIN);
if (ewin)
{
ewin->mapped = 0;
EwinEventUnmap(ewin);
if (ewin->pager)
PagerEventUnmap(ewin->pager);
if (Conf.dockapp_support && ewin->docked)
DockDestroy(ewin);
ActionsEnd(ewin);
if (ewin == GetContextEwin())
SlideoutsHide();
if (ewin == Mode.focuswin)
FocusToEWin(ewin, FOCUS_EWIN_GONE);
if (ewin == Mode.mouse_over_win)
Mode.mouse_over_win = NULL;
if (!ewin->iconified)
{
XTranslateCoordinates(disp, ewin->client.win, root.win,
-ewin->border->border.left,
-ewin->border->border.top, &ewin->client.x,
&ewin->client.y, &win);
EReparentWindow(disp, ewin->client.win, root.win, ewin->client.x,
ewin->client.y);
ICCCM_Withdraw(ewin);
RemoveItem(NULL, ewin->client.win, LIST_FINDBY_ID, LIST_TYPE_EWIN);
FreeEwin(ewin);
}
else
{
HideEwin(ewin);
}
}
EDBUG_RETURN_;
}
@ -735,23 +702,22 @@ HandleMap(XEvent * ev)
EWin *ewin;
EDBUG(5, "HandleMap");
ewin = FindItem(NULL, win, LIST_FINDBY_ID, LIST_TYPE_EWIN);
if (ewin)
{
ewin->mapped = 1;
}
EwinEventMap(ewin);
EDBUG_RETURN_;
}
void
HandleMapRequest(XEvent * ev)
{
Window win;
Window win = ev->xconfigurerequest.window;
EWin *ewin;
EDBUG(5, "HandleMapRequest");
win = ev->xconfigurerequest.window;
ewin = FindItem(NULL, win, LIST_FINDBY_ID, LIST_TYPE_EWIN);
if (ewin && ewin->iconified)
{
@ -760,7 +726,6 @@ HandleMapRequest(XEvent * ev)
else
{
AddToFamily(ev->xmap.window);
HintsSetClientList();
}
EDBUG_RETURN_;

View File

@ -167,24 +167,7 @@ ICCCM_Delete(EWin * ewin)
if (ewin->internal)
{
XEvent xev;
if (ewin->menu)
MenuHide(ewin->menu);
if (ewin->pager)
{
HideEwin(ewin);
xev.xunmap.window = PagerGetWin(ewin->pager);
HandleUnmap(&xev);
}
if (ewin->ibox)
{
HideEwin(ewin);
xev.xunmap.window = IconboxGetWin(ewin->ibox);
HandleUnmap(&xev);
}
if (ewin->dialog)
DialogClose(ewin->dialog);
EUnmapWindow(disp, ewin->client.win);
EDBUG_RETURN_;
}

View File

@ -523,7 +523,7 @@ IB_Reconfigure(Iconbox * ib)
}
static void
IconboxMoveResize(EWin * ewin, int resize)
IconboxEwinMoveResize(EWin * ewin, int resize)
{
static int call_depth = 0; /* Ugly! */
Iconbox *ib = ewin->ibox;
@ -546,7 +546,7 @@ IconboxMoveResize(EWin * ewin, int resize)
}
static void
IconboxRefresh(EWin * ewin)
IconboxEwinRefresh(EWin * ewin)
{
Iconbox *ib = ewin->ibox;
@ -560,12 +560,20 @@ IconboxRefresh(EWin * ewin)
IconboxRedraw(ib);
}
static void
IconboxEwinClose(EWin * ewin)
{
IconboxDestroy(ewin->ibox);
ewin->ibox = NULL;
}
static void
IconboxEwinInit(EWin * ewin, void *ptr)
{
ewin->ibox = (Iconbox *) ptr;
ewin->MoveResize = IconboxMoveResize;
ewin->Refresh = IconboxRefresh;
ewin->MoveResize = IconboxEwinMoveResize;
ewin->Refresh = IconboxEwinRefresh;
ewin->Close = IconboxEwinClose;
}
void

View File

@ -119,9 +119,7 @@ MenuHide(Menu * m)
ewin = FindEwinByMenu(m);
if (ewin)
{
HideEwin(ewin);
}
HideEwin(ewin);
if (m->sel_item)
{
@ -137,7 +135,7 @@ MenuHide(Menu * m)
}
static void
MenuMoveResize(EWin * ewin, int resize)
MenuEwinMoveResize(EWin * ewin, int resize)
{
Menu *m = ewin->menu;
@ -152,17 +150,24 @@ MenuMoveResize(EWin * ewin, int resize)
}
static void
MenuRefresh(EWin * ewin)
MenuEwinRefresh(EWin * ewin)
{
MenuMoveResize(ewin, 0);
MenuEwinMoveResize(ewin, 0);
}
static void
MenuEwinClose(EWin * ewin)
{
ewin->menu = NULL;
}
static void
MenuEwinInit(EWin * ewin, void *ptr)
{
ewin->menu = (Menu *) ptr;
ewin->MoveResize = MenuMoveResize;
ewin->Refresh = MenuRefresh;
ewin->MoveResize = MenuEwinMoveResize;
ewin->Refresh = MenuEwinRefresh;
ewin->Close = MenuEwinClose;
}
void

View File

@ -222,7 +222,7 @@ PagerCreate(void)
}
static void
PagerMoveResize(EWin * ewin, int resize)
PagerEwinMoveResize(EWin * ewin, int resize)
{
Pager *p = ewin->pager;
int w, h;
@ -286,7 +286,7 @@ PagerMoveResize(EWin * ewin, int resize)
}
static void
PagerRefresh(EWin * ewin)
PagerEwinRefresh(EWin * ewin)
{
/* This doesn't do anything anymore apparently
* --Mandrake
@ -296,12 +296,20 @@ PagerRefresh(EWin * ewin)
ewin = NULL;
}
static void
PagerEwinClose(EWin * ewin)
{
PagerDestroy(ewin->pager);
ewin->pager = NULL;
}
static void
PagerEwinInit(EWin * ewin, void *ptr)
{
ewin->pager = (Pager *) ptr;
ewin->MoveResize = PagerMoveResize;
ewin->Refresh = PagerRefresh;
ewin->MoveResize = PagerEwinMoveResize;
ewin->Refresh = PagerEwinRefresh;
ewin->Close = PagerEwinClose;
}
void