Enlightenment CVS committal Author : kwo Project : e16 Module : e
Dir : e16/e/src Modified Files: desktops.c desktops.h eobj.c eobj.h ewins.c ipc.c stacking.c Log Message: Speed up stacking. =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/desktops.c,v retrieving revision 1.178 retrieving revision 1.179 diff -u -3 -r1.178 -r1.179 --- desktops.c 4 Sep 2005 12:43:13 -0000 1.178 +++ desktops.c 11 Sep 2005 17:20:32 -0000 1.179 @@ -553,11 +553,13 @@ } void -DeskSetDirtyStack(Desk * dsk) +DeskSetDirtyStack(Desk * dsk, EObj * eo) { - dsk->dirty_stack++; + dsk->stack.dirty++; + dsk->stack.latest = eo; if (EventDebug(EDBUG_TYPE_STACKING)) - Eprintf("DeskSetDirtyStack %d (%d)\n", dsk->num, dsk->dirty_stack); + Eprintf("DeskSetDirtyStack %d (%d): %s\n", dsk->num, dsk->stack.dirty, + EobjGetName(eo)); } void @@ -904,9 +906,9 @@ dsk = _DeskGet(i); if (i && !dsk->viewable) continue; - if (!dsk->dirty_stack) + if (!dsk->stack.dirty) continue; - StackDesktop(dsk); + DeskRestack(dsk); } } @@ -1222,20 +1224,71 @@ } #endif +static void +DeskRestackSimple(Desk * dsk) +{ + EObj *const *lst, *eo; + int i, num; + XWindowChanges xwc; + unsigned int value_mask; + + eo = dsk->stack.latest; + eo->stacked = 1; + + if (EventDebug(EDBUG_TYPE_STACKING)) + Eprintf("DeskRestackSimple %#lx %s\n", EobjGetWin(eo), EobjGetName(eo)); + + lst = EobjListStackGetForDesk(&num, dsk); + if (num < 2) + return; + + for (i = 0; i < num; i++) + if (lst[i] == eo) + break; + if (i >= num) + return; + + if (i < num - 1) + { + xwc.stack_mode = Above; + xwc.sibling = EobjGetWin(lst[i + 1]); + } + else + { + xwc.stack_mode = Below; + xwc.sibling = EobjGetWin(lst[i - 1]); + } + value_mask = CWSibling | CWStackMode; + if (EventDebug(EDBUG_TYPE_STACKING)) + Eprintf("DeskRestackSimple %#10lx %s %#10lx\n", EobjGetWin(eo), + (xwc.stack_mode == Above) ? "Above" : "Below", xwc.sibling); + XConfigureWindow(disp, EobjGetWin(eo), value_mask, &xwc); + +#if 1 /* FIXME - Should not be here */ + HintsSetClientStacking(); +#endif +} + #define _APPEND_TO_WIN_LIST(win) \ { \ wl = Erealloc(wl, ++tot * sizeof(Window)); \ wl[tot - 1] = win; \ } void -StackDesktop(Desk * dsk) +DeskRestack(Desk * dsk) { Window *wl; int i, num, tot; EObj *const *lst, *eo; - /* Build the window stack, top to bottom */ + /* Special case if only one window needs restacking */ + if (dsk->stack.dirty == 1) + { + DeskRestackSimple(dsk); + goto done; + } + /* Build the window stack, top to bottom */ tot = 0; wl = NULL; lst = EobjListStackGetForDesk(&num, dsk); @@ -1250,7 +1303,7 @@ if (EventDebug(EDBUG_TYPE_STACKING)) { - Eprintf("StackDesktop %d (%d):\n", dsk->num, dsk->dirty_stack); + Eprintf("DeskRestack %d (%d):\n", dsk->num, dsk->stack.dirty); for (i = 0; i < tot; i++) Eprintf(" win=%#10lx parent=%#10lx\n", wl[i], EWindowGetParent(wl[i])); @@ -1262,7 +1315,9 @@ if (wl) Efree(wl); - dsk->dirty_stack = 0; + done: + dsk->stack.dirty = 0; + dsk->stack.latest = NULL; } void =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/desktops.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- desktops.h 4 Sep 2005 12:43:13 -0000 1.2 +++ desktops.h 11 Sep 2005 17:20:32 -0000 1.3 @@ -33,12 +33,16 @@ EObj o; unsigned int num; char viewable; - char dirty_stack; Background *bg; struct _button *tag; int current_area_x; int current_area_y; long event_mask; + struct + { + int dirty; + EObj *latest; + } stack; }; /* desktops.c */ @@ -48,7 +52,7 @@ void DeskGetArea(const Desk * dsk, int *ax, int *ay); void DeskSetArea(Desk * dsk, int ax, int ay); int DeskIsViewable(const Desk * dsk); -void DeskSetDirtyStack(Desk * dsk); +void DeskSetDirtyStack(Desk * dsk, EObj * eo); void DeskRefresh(Desk * dsk); void DeskAssignBg(unsigned int desk, Background * bg); @@ -58,9 +62,10 @@ void DeskSwitchDone(void); void DeskGoto(Desk * dsk); void DeskGotoNum(unsigned int desk); -void StackDesktop(Desk * dsk); void DeskGotoByEwin(EWin * ewin); +void DeskRestack(Desk * dsk); + unsigned int DesksGetNumber(void); Desk *DesksGetCurrent(void); unsigned int DesksGetCurrentNum(void); =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/eobj.c,v retrieving revision 1.46 retrieving revision 1.47 diff -u -3 -r1.46 -r1.47 --- eobj.c 8 Sep 2005 20:28:44 -0000 1.46 +++ eobj.c 11 Sep 2005 17:20:32 -0000 1.47 @@ -34,7 +34,7 @@ return; if (eo->stacked > 0) - DeskSetDirtyStack(dsk); + DeskSetDirtyStack(dsk, eo); eo->desk = dsk; } @@ -292,8 +292,8 @@ if (eo->stacked <= 0 || raise > 1) { if (eo->stacked < 0) - DeskSetDirtyStack(eo->desk); - StackDesktop(eo->desk); + DeskSetDirtyStack(eo->desk, eo); + DeskRestack(eo->desk); } EMapWindow(eo->win); =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/eobj.h,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- eobj.h 4 Sep 2005 21:17:32 -0000 1.8 +++ eobj.h 11 Sep 2005 17:20:32 -0000 1.9 @@ -60,6 +60,7 @@ #define EobjGetWin(eo) ((eo)->win) #define EobjGetDesk(eo) ((eo)->desk) +#define EobjGetName(eo) ((eo)->name) #define EobjGetX(eo) ((eo)->x) #define EobjGetY(eo) ((eo)->y) #define EobjGetW(eo) ((eo)->w) =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/ewins.c,v retrieving revision 1.105 retrieving revision 1.106 diff -u -3 -r1.105 -r1.106 --- ewins.c 11 Sep 2005 09:50:46 -0000 1.105 +++ ewins.c 11 Sep 2005 17:20:32 -0000 1.106 @@ -1214,50 +1214,6 @@ EReparentWindow(_EwinGetClientWin(ewin), parent, 0, 0); } -/* - * Place particular EWin at appropriate location in the window stack - */ -static void -RestackEwin(EWin * ewin) -{ - EWin *const *lst; - int i, num; - XWindowChanges xwc; - unsigned int value_mask; - - if (EventDebug(EDBUG_TYPE_STACKING)) - Eprintf("RestackEwin %#lx %s\n", _EwinGetClientXwin(ewin), - EwinGetName(ewin)); - - lst = EwinListGetForDesk(&num, EoGetDesk(ewin)); - if (num < 2) - goto done; - - for (i = 0; i < num; i++) - if (lst[i] == ewin) - break; - if (i < num - 1) - { - xwc.stack_mode = Above; - xwc.sibling = EoGetWin(lst[i + 1]); - } - else - { - xwc.stack_mode = Below; - xwc.sibling = EoGetWin(lst[i - 1]); - } - value_mask = CWSibling | CWStackMode; - if (EventDebug(EDBUG_TYPE_STACKING)) - Eprintf("RestackEwin %#10lx %s %#10lx\n", EoGetWin(ewin), - (xwc.stack_mode == Above) ? "Above" : "Below", xwc.sibling); - XConfigureWindow(disp, EoGetWin(ewin), value_mask, &xwc); - HintsSetClientStacking(); - ModulesSignal(ESIGNAL_EWIN_CHANGE, ewin); - - done: - ; -} - void RaiseEwin(EWin * ewin) { @@ -1265,9 +1221,6 @@ EWin **lst; int i, num; - if (EoGetWin(ewin) == None) - return; - if (call_depth > 256) return; call_depth++; @@ -1288,12 +1241,7 @@ Efree(lst); if (call_depth == 1) - { - if (num > 0) - StackDesktop(EoGetDesk(ewin)); /* Do the full stacking */ - else - RestackEwin(ewin); /* Restack this one only */ - } + ModulesSignal(ESIGNAL_EWIN_CHANGE, ewin); done: call_depth--; @@ -1306,9 +1254,6 @@ EWin **lst; int i, num; - if (EoGetWin(ewin) == None) - return; - if (call_depth > 256) return; call_depth++; @@ -1329,12 +1274,7 @@ Efree(lst); if (call_depth == 1) - { - if (num > 0) - StackDesktop(EoGetDesk(ewin)); /* Do the full stacking */ - else - RestackEwin(ewin); /* Restack this one only */ - } + ModulesSignal(ESIGNAL_EWIN_CHANGE, ewin); done: call_depth--; =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/ipc.c,v retrieving revision 1.233 retrieving revision 1.234 diff -u -3 -r1.233 -r1.234 --- ipc.c 11 Sep 2005 10:39:16 -0000 1.233 +++ ipc.c 11 Sep 2005 17:20:32 -0000 1.234 @@ -1224,11 +1224,11 @@ lst = EobjListStackGet(&num); - IpcPrintf("Num window T V D S F L pos size C R Name\n"); + IpcPrintf("Num window T V D S F L pos size C R Name\n"); for (i = 0; i < num; i++) { eo = lst[i]; - IpcPrintf(" %2d %#lx %d %d %2d %d %d %3d %5d,%5d %4dx%4d %d %d %s\n", + IpcPrintf(" %2d %#9lx %d %d %2d %d %d %3d %5d,%5d %4dx%4d %d %d %s\n", i, eo->win, eo->type, eo->shown, eo->desk->num, eo->sticky, eo->floating, eo->ilayer, eo->x, eo->y, eo->w, eo->h, #if USE_COMPOSITE =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/stacking.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -3 -r1.25 -r1.26 --- stacking.c 4 Sep 2005 07:27:20 -0000 1.25 +++ stacking.c 11 Sep 2005 17:20:32 -0000 1.26 @@ -110,7 +110,7 @@ EobjListLower(ewl, eo); } if (eo->stacked == 0) - DeskSetDirtyStack(eo->desk); + DeskSetDirtyStack(eo->desk, eo); } else { @@ -183,14 +183,14 @@ memmove(ewl->list + i, ewl->list + i + 1, n * sizeof(EObj *)); ewl->list[j] = eo; if (ewl->layered && eo->stacked > 0) - DeskSetDirtyStack(eo->desk); + DeskSetDirtyStack(eo->desk, eo); } else if (n < 0) { memmove(ewl->list + j + 1, ewl->list + j, -n * sizeof(EObj *)); ewl->list[j] = eo; if (ewl->layered && eo->stacked > 0) - DeskSetDirtyStack(eo->desk); + DeskSetDirtyStack(eo->desk, eo); } EobjListShow("EobjListLower", ewl); @@ -224,14 +224,14 @@ memmove(ewl->list + i, ewl->list + i + 1, n * sizeof(EObj *)); ewl->list[j] = eo; if (ewl->layered && eo->stacked > 0) - DeskSetDirtyStack(eo->desk); + DeskSetDirtyStack(eo->desk, eo); } else if (n < 0) { memmove(ewl->list + j + 1, ewl->list + j, -n * sizeof(EObj *)); ewl->list[j] = eo; if (ewl->layered && eo->stacked > 0) - DeskSetDirtyStack(eo->desk); + DeskSetDirtyStack(eo->desk, eo); } EobjListShow("EobjListRaise", ewl); ------------------------------------------------------- SF.Net email is Sponsored by the Better Software Conference & EXPO September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs