diff --git a/src/E.h b/src/E.h index aba800e1..bf64b7f2 100644 --- a/src/E.h +++ b/src/E.h @@ -504,6 +504,7 @@ struct _eobj short desk; /* Belongs on desk */ int x, y; int w, h; + signed char stacked; char sticky; char floating; char shown; @@ -512,7 +513,7 @@ struct _eobj unsigned int opacity; void *cmhook; #endif - char *name; /* Debug only */ + char *name; }; #define EOBJ_TYPE_EWIN 0 @@ -558,7 +559,7 @@ struct _eobj #define EoGetShadow(eo) 0 #endif -#define EoMap(eo, raise) EobjMap(&((eo)->o), (raise)) +#define EoMap(eo, raise) EobjMap(&((eo)->o), raise) #define EoUnmap(eo) EobjUnmap(&((eo)->o)) #define EoMove(eo, x, y) EobjMove(&((eo)->o), x, y) #define EoResize(eo, w, h) EobjResize(&((eo)->o), w, h) @@ -1407,10 +1408,8 @@ void DeskAssignBg(int desk, Background * bg); void DeskSetBg(int desk, Background * bg, int refresh); int DesktopAt(int x, int y); void DeskGoto(int num); -void DeskMove(int num, int x, int y); void DeskHide(int num); void DeskShow(int num); -void StackDesktops(void); void StackDesktop(int num); void DeskGotoByEwin(EWin * ewin); void DesksEventsConfigure(int mode); @@ -1549,7 +1548,7 @@ void EobjChangeOpacity(EObj * eo, unsigned int opacity); #else #define EobjChangeOpacity(eo, opacity) #endif -int EobjSetDesk(EObj * eo, int desk); +void EobjSetDesk(EObj * eo, int desk); void EobjSetLayer(EObj * eo, int layer); void EobjSetFloating(EObj * eo, int floating); int EobjIsShaped(const EObj * eo); diff --git a/src/buttons.c b/src/buttons.c index 53c8134a..44c69ef4 100644 --- a/src/buttons.c +++ b/src/buttons.c @@ -132,9 +132,9 @@ ButtonCreate(const char *name, int id, ImageClass * iclass, win = ECreateWindow(DeskGetWin(desk), -100, -100, 50, 50, 0); EoSetSticky(b, sticky); EoSetDesk(b, desk); + EobjInit(&b->o, EOBJ_TYPE_BUTTON, win, -100, -100, 50, 50, name); EoSetLayer(b, ontop); EoSetShadow(b, 0); - EobjInit(&b->o, EOBJ_TYPE_BUTTON, win, -100, -100, 50, 50, name); ESelectInput(EoGetWin(b), BUTTON_EVENT_MASK); EventCallbackRegister(EoGetWin(b), 0, ButtonHandleEvents, b); @@ -635,11 +635,13 @@ ButtonEventMotion(Button * b, XEvent * ev __UNUSED__) if (b) { ButtonMoveRelative(b, dx, dy); +#if 0 /* FIXME - Not active */ if (Conf.deskmode == MODE_DESKRAY) { DeskMove(Mode.deskdrag, DeskGetX(Mode.deskdrag), DeskGetY(Mode.deskdrag) + dy); } +#endif } } } @@ -1109,7 +1111,6 @@ doHideShowButton(const char *params) } done: - StackDesktops(); autosave(); } diff --git a/src/coords.c b/src/coords.c index 685a5be3..cf6772c4 100644 --- a/src/coords.c +++ b/src/coords.c @@ -91,7 +91,7 @@ CoordsShow(EWin * ewin) EobjMoveResize(eo, cx, cy, cw, ch); if (!eo->shown) - EobjMap(eo, 1); + EobjMap(eo, 0); ImageclassApply(ic, eo->win, cw, ch, 1, 0, STATE_NORMAL, 0, ST_UNKNWN); TextclassApply(ic, eo->win, cw, ch, 0, 0, STATE_NORMAL, 0, tc, s); diff --git a/src/desktops.c b/src/desktops.c index 80c679bf..f9fbc767 100644 --- a/src/desktops.c +++ b/src/desktops.c @@ -41,6 +41,7 @@ typedef struct _desktops } Desktops; +static void DeskMove(Desk * d, int x, int y); static void DeskRaise(int num); static void DeskLower(int num); static void DesktopHandleEvents(XEvent * ev, void *prm); @@ -300,9 +301,6 @@ DeskControlsCreate(Desk * d) } #endif - /* Restack buttons - Hmmm. */ - StackDesktop(d->num); - d->tag = b; } @@ -416,11 +414,10 @@ DeskCreate(int desk, int configure) Esnprintf(buf, sizeof(buf), "Desk-%d", desk); EobjInit(&d->o, EOBJ_TYPE_DESK, win, 0, 0, VRoot.w, VRoot.h, buf); EoSetShadow(d, 0); - EoSetLayer(d, 0); if (desk > 0) { EoSetFloating(d, 1); - EobjListStackRaise(&d->o); + EoSetLayer(d, 0); #if 0 /* TBD */ d->event_mask = EDESK_EVENT_MASK; DeskEventsConfigure(d, 1); @@ -572,6 +569,8 @@ DeskSetDirtyStack(int desk) return; d->dirty_stack++; + if (EventDebug(EDBUG_TYPE_DESKS)) + Eprintf("DeskSetDirtyStack %d (%d)\n", desk, d->dirty_stack); } Window @@ -727,7 +726,6 @@ DeskShowTabs(void) for (i = 0; i < num; i++) ButtonShow(blst[i]); Efree(blst); - StackDesktops(); } } @@ -743,7 +741,6 @@ DeskHideTabs(void) for (i = 0; i < num; i++) ButtonHide(blst[i]); Efree(blst); - StackDesktops(); } } #endif @@ -994,25 +991,25 @@ DeskGoto(int desk) switch (Conf.desks.dragdir) { case 0: - DeskMove(desk, VRoot.w, 0); + DeskMove(d, VRoot.w, 0); DeskRaise(desk); EobjSlideTo(&d->o, VRoot.w, 0, 0, 0, Conf.desks.slidespeed); break; case 1: - DeskMove(desk, -VRoot.w, 0); + DeskMove(d, -VRoot.w, 0); DeskRaise(desk); EobjSlideTo(&d->o, -VRoot.w, 0, 0, 0, Conf.desks.slidespeed); break; case 2: - DeskMove(desk, 0, VRoot.h); + DeskMove(d, 0, VRoot.h); DeskRaise(desk); EobjSlideTo(&d->o, 0, VRoot.h, 0, 0, Conf.desks.slidespeed); break; case 3: - DeskMove(desk, 0, -VRoot.h); + DeskMove(d, 0, -VRoot.h); DeskRaise(desk); EobjSlideTo(&d->o, 0, -VRoot.h, 0, 0, Conf.desks.slidespeed); @@ -1027,14 +1024,12 @@ DeskGoto(int desk) Conf.desks.slidespeed); DeskRaise(desk); } - StackDesktops(); } else { DeskRaise(desk); - StackDesktops(); } - DeskMove(desk, 0, 0); + DeskMove(d, 0, 0); } else { @@ -1052,29 +1047,25 @@ DeskGoto(int desk) HandleDrawQueue(); } -void -DeskMove(int desk, int x, int y) +static void +DeskMove(Desk * d, int x, int y) { - Desk *d, *dd; + Desk *dd; int i; EWin *const *lst; int n, v, dx, dy; - if (desk <= 0 || desk >= Conf.desks.num) - return; - n = -1; i = 0; while (n < 0 && i < Conf.desks.num) { - if (desks.order[i] == desk) + if (desks.order[i] == d->num) n = i; i++; } if (n < 0) /* Should not be possible */ return; - d = _DeskGet(desk); dx = x - EoGetX(d); dy = y - EoGetY(d); @@ -1122,10 +1113,27 @@ DeskMove(int desk, int x, int y) lst = EwinListGetAll(&n); for (i = 0; i < n; i++) - if (EoGetDesk(lst[i]) == desk) + if (EoGetDesk(lst[i]) == d->num) ICCCM_Configure(lst[i]); } +static void +DesksStackingCheck(void) +{ + Desk *d; + int i; + + for (i = 0; i < Conf.desks.num; i++) + { + d = DeskGet(i); + if (i && !d->viewable) + continue; + if (!d->dirty_stack) + continue; + StackDesktop(i); + } +} + static void UncoverDesktop(int desk) { @@ -1173,10 +1181,9 @@ DeskRaise(int desk) EoMap(d, 0); } - StackDesktops(); MoveStickyWindowsToCurrentDesk(); MoveStickyButtonsToCurrentDesk(); - StackDesktop(DesksGetCurrent()); + DesksStackingCheck(); FocusNewDesk(); if (Mode.mode == MODE_NONE) { @@ -1204,10 +1211,9 @@ DeskLower(int desk) UncoverDesktop(desks.order[0]); DeskHide(desk); - StackDesktops(); MoveStickyWindowsToCurrentDesk(); MoveStickyButtonsToCurrentDesk(); - StackDesktop(DesksGetCurrent()); + DesksStackingCheck(); FocusNewDesk(); if (Mode.mode == MODE_NONE) { @@ -1256,17 +1262,10 @@ DeskShow(int desk) } else { - StackDesktops(); EoMap(d, 0); } } -void -StackDesktops(void) -{ - StackDesktop(0); -} - #define _APPEND_TO_WIN_LIST(win) \ { \ wl = Erealloc(wl, ++tot * sizeof(Window)); \ @@ -1275,6 +1274,7 @@ StackDesktops(void) void StackDesktop(int desk) { + Desk *d = DeskGet(desk); Window *wl; int i, num, tot; EObj *const *lst, *eo; @@ -1285,24 +1285,12 @@ StackDesktop(int desk) wl = NULL; lst = EobjListStackGetForDesk(&num, desk); - /* Floating objects */ - for (i = 0; i < num; i++) - { - eo = lst[i]; - if (!eo->floating) - continue; - - _APPEND_TO_WIN_LIST(eo->win); - } - /* Normal objects */ for (i = 0; i < num; i++) { eo = lst[i]; - if (eo->floating) - continue; - _APPEND_TO_WIN_LIST(eo->win); + eo->stacked = 1; } if (EventDebug(EDBUG_TYPE_STACKING)) @@ -1317,6 +1305,10 @@ StackDesktop(int desk) if (wl) Efree(wl); + + if (EventDebug(EDBUG_TYPE_DESKS)) + Eprintf("StackDesktop %d (%d)\n", d->num, d->dirty_stack); + d->dirty_stack = 0; } void @@ -1371,24 +1363,24 @@ DeskDragMotion(void) case 0: if ((EoGetX(d) + dx) < 0) dx = -EoGetX(d); - DeskMove(Mode.deskdrag, EoGetX(d) + dx, EoGetY(d)); + DeskMove(d, EoGetX(d) + dx, EoGetY(d)); break; case 1: if ((EoGetX(d) + dx) > 0) - DeskMove(Mode.deskdrag, 0, EoGetY(d)); + DeskMove(d, 0, EoGetY(d)); else - DeskMove(Mode.deskdrag, EoGetX(d) + dx, EoGetY(d)); + DeskMove(d, EoGetX(d) + dx, EoGetY(d)); break; case 2: if ((EoGetY(d) + dy) < 0) dy = -EoGetY(d); - DeskMove(Mode.deskdrag, EoGetX(d), EoGetY(d) + dy); + DeskMove(d, EoGetX(d), EoGetY(d) + dy); break; case 3: if ((EoGetY(d) + dy) > 0) - DeskMove(Mode.deskdrag, EoGetX(d), 0); + DeskMove(d, EoGetX(d), 0); else - DeskMove(Mode.deskdrag, EoGetX(d), EoGetY(d) + dy); + DeskMove(d, EoGetX(d), EoGetY(d) + dy); break; default: break; @@ -1469,9 +1461,13 @@ DeskDragdirSet(const char *params) if (pd != Conf.desks.dragdir) { int i; + Desk *d; for (i = 0; i < Conf.desks.num; i++) - DeskMove(i, 0, 0); + { + d = _DeskGet(i); + EoMove(d, (d->viewable) ? 0 : VRoot.w, 0); + } DesksControlsRefresh(); } } @@ -1619,6 +1615,10 @@ DesktopsSighan(int sig, void *prm __UNUSED__) /* Draw all the buttons that belong on the desktop */ DeskShowButtons(); break; + + case ESIGNAL_IDLE: + DesksStackingCheck(); + break; } } diff --git a/src/edge.c b/src/edge.c index 516cf0ec..336389ec 100644 --- a/src/edge.c +++ b/src/edge.c @@ -206,19 +206,19 @@ EdgeWindowsShow(void) if (cx == 0 && !Conf.desks.areas_wraparound) EobjUnmap(w1); else - EobjMap(w1, 1); + EobjMap(w1, 0); if (cx == (ax - 1) && !Conf.desks.areas_wraparound) EobjUnmap(w2); else - EobjMap(w2, 1); + EobjMap(w2, 0); if (cy == 0 && !Conf.desks.areas_wraparound) EobjUnmap(w3); else - EobjMap(w3, 1); + EobjMap(w3, 0); if (cy == (ay - 1) && !Conf.desks.areas_wraparound) EobjUnmap(w4); else - EobjMap(w4, 1); + EobjMap(w4, 0); } void diff --git a/src/eobj.c b/src/eobj.c index 1cd7f39d..b2b3b00e 100644 --- a/src/eobj.c +++ b/src/eobj.c @@ -23,14 +23,17 @@ #include "E.h" #include "ecompmgr.h" -int +void EobjSetDesk(EObj * eo, int desk) { + int pdesk = eo->desk; + switch (eo->type) { default: eo->desk = desk; break; + case EOBJ_TYPE_EWIN: if (eo->floating) eo->desk = 0; @@ -39,17 +42,17 @@ EobjSetDesk(EObj * eo, int desk) else eo->desk = desk % Conf.desks.num; break; - case EOBJ_TYPE_BUTTON: - eo->desk = desk; - break; } - return eo->desk; + if (eo->desk != pdesk && eo->stacked > 0) + DeskSetDirtyStack(eo->desk); } void EobjSetLayer(EObj * eo, int layer) { + int ilayer = eo->ilayer; + eo->layer = layer; /* * For usual EWin's the internal layer is the "old" E-layer * 10. @@ -101,6 +104,9 @@ EobjSetLayer(EObj * eo, int layer) eo->ilayer |= 512; else eo->ilayer &= ~512; + + if (eo->ilayer != ilayer) + EobjListStackRaise(eo); } void @@ -254,7 +260,6 @@ EobjRegister(Window win, int type) { EobjSetFloating(eo, 1); EobjSetLayer(eo, 4); - EobjListStackRaise(eo); } #endif @@ -283,6 +288,13 @@ EobjMap(EObj * eo, int raise) if (raise) EobjListStackRaise(eo); + if (eo->stacked <= 0) + { + if (eo->stacked < 0) + DeskSetDirtyStack(eo->desk); + StackDesktop(eo->desk); + } + EMapWindow(eo->win); #if USE_COMPOSITE ECompMgrWinMap(eo); diff --git a/src/events.c b/src/events.c index 26076bdf..8cf7e3b3 100644 --- a/src/events.c +++ b/src/events.c @@ -216,10 +216,6 @@ HandleEvent(XEvent * ev) else #endif { -#if 0 /* FIXME - TBD */ - if (ev->type == KeyPress) - PagerHideAllHi(); -#endif lst = ListItemType(&num, LIST_TYPE_ACLASS_GLOBAL); if (lst) { diff --git a/src/ewins.c b/src/ewins.c index cb79715e..b85509a1 100644 --- a/src/ewins.c +++ b/src/ewins.c @@ -108,6 +108,7 @@ EwinCreate(Window win, int type) ewin->ewmh.opacity = 0; /* If 0, ignore */ frame = ECreateWindow(VRoot.win, -10, -10, 1, 1, 1); + ewin->o.stacked = -1; /* Not placed on desk yet */ EobjInit(&ewin->o, EOBJ_TYPE_EWIN, frame, -10, -10, -1, -1, NULL); EoSetDesk(ewin, DesksGetCurrent()); EoSetLayer(ewin, 4); @@ -798,9 +799,6 @@ AddToFamily(EWin * ewin, Window win) } } - /* Force reparent if not on desk 0 */ - EoSetDesk(ewin, 0); - /* if the window asked to be iconified at the start */ if (ewin->client.start_iconified) { @@ -833,10 +831,8 @@ AddToFamily(EWin * ewin, Window win) ewin->client.already_placed = 1; x = Mode.x + 1; y = Mode.y + 1; - MoveEwinToDesktop(ewin, desk); - RaiseEwin(ewin); + MoveEwinToDesktopAt(ewin, desk, x, y); MoveEwin(ewin, x, y); - RaiseEwin(ewin); ShowEwin(ewin); GrabPointerSet(VRoot.win, ECSR_GRAB, 0); Mode.have_place_grab = 1; @@ -848,7 +844,6 @@ AddToFamily(EWin * ewin, Window win) } else if ((doslide) && (!Mode.doingslide)) { - MoveEwin(ewin, VRoot.w, VRoot.h); k = rand() % 4; if (k == 0) { @@ -870,9 +865,7 @@ AddToFamily(EWin * ewin, Window win) fx = VRoot.w; fy = (rand() % (VRoot.h)) - EoGetH(ewin); } - MoveEwinToDesktop(ewin, desk); - RaiseEwin(ewin); - MoveEwin(ewin, fx, fy); + MoveEwinToDesktopAt(ewin, desk, fx, fy); ShowEwin(ewin); SlideEwinTo(ewin, fx, fy, x, y, Conf.slidespeedmap); MoveEwinToDesktopAt(ewin, desk, x, y); @@ -880,7 +873,6 @@ AddToFamily(EWin * ewin, Window win) else { MoveEwinToDesktopAt(ewin, desk, x, y); - RaiseEwin(ewin); ShowEwin(ewin); } @@ -985,11 +977,6 @@ EwinConformToDesktop(EWin * ewin) MoveEwin(ewin, EoGetX(ewin), EoGetY(ewin)); } - /* FIXME - This should not be necessary. It is when a new window is added as - * the only one in the lowest layer (e.g. desktop type). - * In stead EobjListStackAdd() should mark the object stack dirty. */ - StackDesktop(EoGetDesk(ewin)); - EwinDetermineArea(ewin); HintsSetWindowDesktop(ewin); } diff --git a/src/menus.c b/src/menus.c index 917ac8b1..a9d772ea 100644 --- a/src/menus.c +++ b/src/menus.c @@ -988,15 +988,10 @@ MenuDrawItem(Menu * m, MenuItem * mi, char shape) } static void -MenuShowMasker(Menu * m) +MenuShowMasker(Menu * m __UNUSED__) { - EWin *ewin; EObj *eo = Mode_menus.cover_win; - ewin = FindEwinByMenu(m); - if (!ewin) - return; - if (!eo) { eo = EobjWindowCreate(EOBJ_TYPE_EVENT, 0, 0, VRoot.w, VRoot.h, 0, @@ -1010,13 +1005,11 @@ MenuShowMasker(Menu * m) ESelectInput(eo->win, ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask); EventCallbackRegister(eo->win, 0, MenuMaskerHandleEvents, NULL); -#if 1 /* FIXME - Too expensive */ - StackDesktop(EoGetDesk(ewin)); -#endif + Mode_menus.cover_win = eo; } - EobjMap(eo, 1); + EobjMap(eo, 0); } static void @@ -1769,10 +1762,6 @@ MenuItemEventMouseIn(MenuItem * mi, XEvent * ev) m = mi->menu; -#if 0 /* FIXME - TBD */ - PagerHideAllHi(); -#endif - if ((win == mi->icon_win) && (ev->xcrossing.detail == NotifyAncestor)) goto done; if ((win == mi->win) && (ev->xcrossing.detail == NotifyInferior)) diff --git a/src/moveresize.c b/src/moveresize.c index c49421a4..9f83fb23 100644 --- a/src/moveresize.c +++ b/src/moveresize.c @@ -145,7 +145,6 @@ ActionMoveEnd(EWin * ewin) EoChangeOpacity(ewin, ewin->ewmh.opacity); RaiseEwin(gwins[i]); } - StackDesktop(EoGetDesk(ewin)); /* Restack to "un-float" */ ecore_x_sync(); if (Conf.movres.mode_move > 0) diff --git a/src/pager.c b/src/pager.c index d232af11..83aa29d4 100644 --- a/src/pager.c +++ b/src/pager.c @@ -1046,10 +1046,10 @@ PagerHiwinCreate(void) return NULL; win = ECreateWindow(VRoot.win, 0, 0, 3, 3, 1); + EobjInit(&phi->o, EOBJ_TYPE_MISC, win, 0, 0, 3, 3, "HiWin"); EoSetShadow(phi, 0); EoSetFloating(phi, 1); EoSetLayer(phi, 19); - EobjInit(&phi->o, EOBJ_TYPE_MISC, win, 0, 0, 3, 3, "HiWin"); EventCallbackRegister(EoGetWin(phi), 0, PagerHiwinEvent, phi); ESelectInput(EoGetWin(phi), ButtonPressMask | ButtonReleaseMask | PointerMotionMask | @@ -1273,7 +1273,7 @@ PagerHiwinZoom(Pager * p, EWin * ewin, int x, int y, int w, int h) Mode_pagers.zoom = 2; EoMoveResize(phi, x, y, w, h); - EoMap(phi, 1); + EoMap(phi, 0); } else { diff --git a/src/progress.c b/src/progress.c index 157c9a90..08d242ab 100644 --- a/src/progress.c +++ b/src/progress.c @@ -188,9 +188,9 @@ ProgressbarShow(Progressbar * p) ImageclassApply(p->ipc, p->p_win->win, w, p->h, 1, 0, STATE_NORMAL, 0, ST_UNKNWN); - EobjMap(p->win, 1); - EobjMap(p->n_win, 1); - EobjMap(p->p_win, 1); + EobjMap(p->win, 0); + EobjMap(p->n_win, 0); + EobjMap(p->p_win, 0); ecore_x_sync(); TextclassApply(p->ic, p->win->win, p->w - (p->h * 5), p->h, 0, 0, STATE_NORMAL, 0, p->tc, p->win->name); diff --git a/src/stacking.c b/src/stacking.c index 6a7e6fc6..948675d9 100644 --- a/src/stacking.c +++ b/src/stacking.c @@ -107,8 +107,8 @@ EobjListAdd(EobjList * ewl, EObj * eo, int ontop) ewl->nwins++; EobjListLower(ewl, eo); } - - DeskSetDirtyStack(eo->desk); + if (eo->stacked == 0) + DeskSetDirtyStack(eo->desk); } else { @@ -180,14 +180,14 @@ EobjListLower(EobjList * ewl, EObj * eo) { memmove(ewl->list + i, ewl->list + i + 1, n * sizeof(EObj *)); ewl->list[j] = eo; - if (ewl->layered) + if (ewl->layered && eo->stacked > 0) DeskSetDirtyStack(eo->desk); } else if (n < 0) { memmove(ewl->list + j + 1, ewl->list + j, -n * sizeof(EObj *)); ewl->list[j] = eo; - if (ewl->layered) + if (ewl->layered && eo->stacked > 0) DeskSetDirtyStack(eo->desk); } @@ -221,14 +221,14 @@ EobjListRaise(EobjList * ewl, EObj * eo) { memmove(ewl->list + i, ewl->list + i + 1, n * sizeof(EObj *)); ewl->list[j] = eo; - if (ewl->layered) + if (ewl->layered && eo->stacked > 0) DeskSetDirtyStack(eo->desk); } else if (n < 0) { memmove(ewl->list + j + 1, ewl->list + j, -n * sizeof(EObj *)); ewl->list[j] = eo; - if (ewl->layered) + if (ewl->layered && eo->stacked > 0) DeskSetDirtyStack(eo->desk); } diff --git a/src/tooltips.c b/src/tooltips.c index 8e800ad8..7c0db9b6 100644 --- a/src/tooltips.c +++ b/src/tooltips.c @@ -557,7 +557,7 @@ TooltipShow(ToolTip * tt, const char *text, ActionClass * ac, int x, int y) for (i = 0; i < 5; i++) if (tt->win[i]) - EobjMap(tt->win[i], 1); + EobjMap(tt->win[i], 0); ecore_x_sync(); diff --git a/src/warp.c b/src/warp.c index 508fcf4d..addd2dd6 100644 --- a/src/warp.c +++ b/src/warp.c @@ -153,7 +153,7 @@ WarpFocusShow(EWin * ewin) } PropagateShapes(warpFocusWindow->win); - EobjMap(warpFocusWindow, 1); + EobjMap(warpFocusWindow, 0); /* * Grab the keyboard. The grab is automatically released when