Simplify ewin unmap/destroy handling (fixes "losing windows" bug).
SVN revision: 9641
This commit is contained in:
parent
f73f0c4e4c
commit
7a95ff3a9a
7
src/E.h
7
src/E.h
|
@ -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);
|
||||
|
|
112
src/borders.c
112
src/borders.c
|
@ -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;
|
||||
|
||||
|
|
30
src/dialog.c
30
src/dialog.c
|
@ -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 *
|
||||
|
|
|
@ -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_;
|
||||
|
|
19
src/icccm.c
19
src/icccm.c
|
@ -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_;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
21
src/menus.c
21
src/menus.c
|
@ -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
|
||||
|
|
16
src/pager.c
16
src/pager.c
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue