Enlightenment CVS committal Author : kwo Project : e16 Module : e
Dir : e16/e/src Modified Files: E.h backgrounds.c desktops.c ecompmgr.c hints.c main.c mod-misc.c Log Message: Preparations for composite manager changes. =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/E.h,v retrieving revision 1.399 retrieving revision 1.400 diff -u -3 -r1.399 -r1.400 --- E.h 28 Mar 2005 18:20:27 -0000 1.399 +++ E.h 30 Mar 2005 22:50:50 -0000 1.400 @@ -549,6 +549,22 @@ #define EoGetShadow(eo) 0 #endif +typedef struct +{ + EObj o; + int num; + char viewable; + char dirty_stack; + Background *bg; + Button *tag; + int current_area_x; + int current_area_y; + long event_mask; +#if USE_COMPOSITE + void *cmhook; +#endif +} Desk; + typedef struct _constraints { int min, max; @@ -1357,6 +1373,7 @@ void ECsrApply(int which, Window win); /* desktops.c */ +Desk *DeskGet(int desk); Window DeskGetWin(int desk); int DeskGetX(int desk); int DeskGetY(int desk); @@ -1377,6 +1394,7 @@ int speed); void DeskRefresh(int num); void DesksRefresh(void); +void DeskAssignBg(int desk, Background * bg); void DeskSetBg(int desk, Background * bg, int refresh); int DesktopAt(int x, int y); void DeskGoto(int num); @@ -1824,8 +1842,8 @@ void EHintsSetInfo(const EWin * ewin); int EHintsGetInfo(EWin * ewin); -void EHintsSetMainInfo(void); -void EHintsGetMainInfo(void); +void EHintsSetDeskInfo(void); +void EHintsGetDeskInfo(void); void EHintsSetInfoOnAll(void); /* icccm.c */ =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/backgrounds.c,v retrieving revision 1.22 retrieving revision 1.23 diff -u -3 -r1.22 -r1.23 --- backgrounds.c 20 Mar 2005 23:28:59 -0000 1.22 +++ backgrounds.c 30 Mar 2005 22:51:01 -0000 1.23 @@ -402,37 +402,19 @@ } static void -BgFindImageSize(BgPart * bgp, int rw, int rh, int *pw, int *ph, int setbg) +BgFindImageSize(BgPart * bgp, int rw, int rh, int *pw, int *ph) { int w, h; if (bgp->xperc > 0) - { - w = (rw * bgp->xperc) >> 10; - } + w = (rw * bgp->xperc) >> 10; else - { - if (!setbg) - w = (imlib_image_get_width() * rw) / VRoot.w; - else - w = imlib_image_get_width(); - } + w = (imlib_image_get_width() * rw) / VRoot.w; if (bgp->yperc > 0) - { - h = (rh * bgp->yperc) >> 10; - } + h = (rh * bgp->yperc) >> 10; else - { - if (!setbg) - { - h = (imlib_image_get_height() * rh) / VRoot.h; - } - else - { - h = imlib_image_get_height(); - } - } + h = (imlib_image_get_height() * rh) / VRoot.h; if (w <= 0) w = 1; @@ -559,7 +541,7 @@ { imlib_context_set_image(bg->bg.im); - BgFindImageSize(&(bg->bg), rw, rh, &w, &h, setbg); + BgFindImageSize(&(bg->bg), rw, rh, &w, &h); x = ((rw - w) * bg->bg.xjust) >> 10; y = ((rh - h) * bg->bg.yjust) >> 10; @@ -607,7 +589,7 @@ imlib_context_set_image(bg->top.im); - BgFindImageSize(&(bg->top), rw, rh, &ww, &hh, setbg); + BgFindImageSize(&(bg->top), rw, rh, &ww, &hh); x = ((rw - ww) * bg->top.xjust) >> 10; y = ((rh - hh) * bg->top.yjust) >> 10; @@ -1023,7 +1005,7 @@ bg = BackgroundCreate(name, &xclr, bg1, i1, i2, i3, i4, i5, i6, bg2, j1, j2, j3, j4, j5); - DeskSetBg(atoi(s2), bg, 0); + DeskAssignBg(atoi(s2), bg); } } } @@ -1035,7 +1017,7 @@ (Conf.backgrounds.user)) { if (bg) - DeskSetBg(atoi(s2), bg, 0); + DeskAssignBg(atoi(s2), bg); } } } =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/desktops.c,v retrieving revision 1.134 retrieving revision 1.135 diff -u -3 -r1.134 -r1.135 --- desktops.c 25 Mar 2005 18:11:52 -0000 1.134 +++ desktops.c 30 Mar 2005 22:51:01 -0000 1.135 @@ -29,19 +29,6 @@ EnterWindowMask | LeaveWindowMask | PointerMotionMask | ButtonMotionMask | \ SubstructureNotifyMask | SubstructureRedirectMask | PropertyChangeMask) -typedef struct -{ - EObj o; - int num; - char viewable; - char dirty_stack; - Background *bg; - Button *tag; - int current_area_x; - int current_area_y; - long event_mask; -} Desk; - #define ENLIGHTENMENT_CONF_NUM_DESKTOPS 32 typedef struct _desktops @@ -50,6 +37,7 @@ int previous; Desk *desk[ENLIGHTENMENT_CONF_NUM_DESKTOPS]; int order[ENLIGHTENMENT_CONF_NUM_DESKTOPS]; + Background *bg[ENLIGHTENMENT_CONF_NUM_DESKTOPS]; } Desktops; @@ -375,8 +363,37 @@ ESelectInput(EoGetWin(d), event_mask); } +static void +DeskConfigure(Desk * d) +{ + Background **lst, *bg; + int num; + unsigned int rnd; + + DeskControlsCreate(d); + DeskControlsShow(d); + + bg = desks.bg[d->num]; + if (bg) + bg = FindItem((char *)bg, 0, LIST_FINDBY_POINTER, LIST_TYPE_BACKGROUND); + if (!bg) + { + lst = (Background **) ListItemType(&num, LIST_TYPE_BACKGROUND); + if (lst) + { + rnd = rand(); + rnd %= num; + bg = lst[rnd]; + Efree(lst); + } + } + DeskSetBg(d->num, bg, 0); + + ModulesSignal(ESIGNAL_DESK_ADDED, (void *)(d->num)); +} + static Desk * -DeskCreate(int desk, int add_controls) +DeskCreate(int desk, int configure) { Desk *d; Window win; @@ -410,50 +427,34 @@ } EventCallbackRegister(win, 0, DesktopHandleEvents, d); - if (add_controls) - { - DeskControlsCreate(d); - DeskControlsShow(d); - } - - { - Background **lst; - int num; - unsigned int rnd; - - lst = (Background **) ListItemType(&num, LIST_TYPE_BACKGROUND); - if (lst) - { - rnd = rand(); - rnd %= num; - DeskSetBg(desk, lst[rnd], 0); - Efree(lst); - } - } - HintsSetRootHints(EoGetWin(d)); /* Set the _XROOT... atoms so apps will find them even before the bg is set */ HintsSetRootInfo(EoGetWin(d), None, 0); + if (configure) + DeskConfigure(d); + return d; } static void -DeskDestroy(int desk) +DeskDestroy(Desk * d) { - Desk *d; Button **blst; int num, i; - d = _DeskGet(desk); + if (d->num <= 0) + return; + + ModulesSignal(ESIGNAL_DESK_REMOVED, (void *)(d->num)); EventCallbackUnregister(EoGetWin(d), 0, DesktopHandleEvents, d); blst = (Button **) ListItemTypeID(&num, LIST_TYPE_BUTTON, 1); for (i = 0; i < num; i++) { - if (ButtonGetDesk(blst[i]) == desk) + if (ButtonGetDesk(blst[i]) == d->num) ButtonDestroy(blst[i]); } if (blst) @@ -462,7 +463,7 @@ blst = (Button **) ListItemTypeID(&num, LIST_TYPE_BUTTON, 2); for (i = 0; i < num; i++) { - if (ButtonGetDesk(blst[i]) == desk) + if (ButtonGetDesk(blst[i]) == d->num) ButtonDestroy(blst[i]); } if (blst) @@ -471,13 +472,12 @@ if (d->bg) BackgroundDecRefcount(d->bg); - if (desk > 0) - EobjListStackDel(&d->o); + EobjListStackDel(&d->o); EDestroyWindow(EoGetWin(d)); + desks.desk[d->num] = NULL; Efree(d); - desks.desk[desk] = NULL; } static void @@ -500,6 +500,15 @@ DeskControlsShow(d); } +Desk * +DeskGet(int desk) +{ + if (desk < 0 || desk >= Conf.desks.num) + return NULL; + + return _DeskGet(desk); +} + Window DeskGetWin(int desk) { @@ -600,19 +609,6 @@ desks.current = desk; } -static void -DesksInit(void) -{ - int i; - - desks.previous = -1; - - for (i = 0; i < Conf.desks.num; i++) - DeskCreate(i, 0); - - HintsSetDesktopConfig(); -} - void DesksResize(int w, int h) { @@ -636,7 +632,7 @@ static void ChangeNumberOfDesktops(int quantity) { - int pnum, i, num; + int i, num; EWin *const *lst; if (quantity >= ENLIGHTENMENT_CONF_NUM_DESKTOPS) @@ -645,36 +641,33 @@ if (quantity <= 0 || quantity == Conf.desks.num) return; - pnum = Conf.desks.num; - for (i = quantity; i < Conf.desks.num; i++) DeskLower(i); - Conf.desks.num = quantity; - - if (Conf.desks.num > pnum) + if (quantity > Conf.desks.num) { - for (i = pnum; i < Conf.desks.num; i++) + while (Conf.desks.num < quantity) { - DeskCreate(i, 1); - ModulesSignal(ESIGNAL_DESK_ADDED, (void *)i); + Conf.desks.num++; + DeskCreate(Conf.desks.num - 1, 1); } } - else if (Conf.desks.num < pnum) + else if (quantity < Conf.desks.num) { lst = EwinListGetAll(&num); for (i = 0; i < num; i++) { - if (EoGetDesk(lst[i]) >= Conf.desks.num) - MoveEwinToDesktop(lst[i], Conf.desks.num - 1); + if (EoGetDesk(lst[i]) >= quantity) + MoveEwinToDesktop(lst[i], quantity - 1); } - for (i = Conf.desks.num; i < pnum; i++) + while (Conf.desks.num > quantity) { - DeskDestroy(i); - ModulesSignal(ESIGNAL_DESK_REMOVED, (void *)i); + DeskDestroy(_DeskGet(Conf.desks.num - 1)); + Conf.desks.num--; } } + if (DesksGetCurrent() >= Conf.desks.num) DeskGoto(Conf.desks.num - 1); @@ -893,6 +886,15 @@ } void +DeskAssignBg(int desk, Background * bg) +{ + if (desk < 0 || desk >= ENLIGHTENMENT_CONF_NUM_DESKTOPS) + return; + + desks.bg[desk] = bg; +} + +void DeskSetBg(int desk, Background * bg, int refresh) { Desk *d; @@ -1624,6 +1626,37 @@ } #endif +static void +DesksInit(void) +{ + int i; + + memset(&desks, 0, sizeof(desks)); + + desks.previous = -1; + + for (i = 0; i < Conf.desks.num; i++) + DeskCreate(i, 0); + + SetAreaSize(Conf.desks.areas_nx, Conf.desks.areas_ny); + + /* Retreive stuff from last time we were loaded if we're restarting */ + EHintsGetDeskInfo(); + + HintsSetDesktopConfig(); +} + +static void +DesksConfigure(void) +{ + int i; + + for (i = 0; i < Conf.desks.num; i++) + DeskConfigure(_DeskGet(i)); + + UncoverDesktop(0); +} + /* * Desktops Module */ @@ -1638,13 +1671,7 @@ break; case ESIGNAL_CONFIGURE: - SetAreaSize(Conf.desks.areas_nx, Conf.desks.areas_ny); - - UncoverDesktop(0); - - /* toss down the dragbar and related */ - DesksControlsCreate(); - DesksControlsShow(); + DesksConfigure(); break; case ESIGNAL_START: =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/ecompmgr.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -3 -r1.15 -r1.16 --- ecompmgr.c 30 Mar 2005 18:28:32 -0000 1.15 +++ ecompmgr.c 30 Mar 2005 22:51:02 -0000 1.16 @@ -106,9 +106,7 @@ #define INV_GEOM (INV_POS | INV_SIZE) #define INV_ALL (INV_POS | INV_SIZE | INV_OPACITY | INV_SHADOW) -typedef struct _ecmwininfo ECmWinInfo; /* TBD */ - -struct _ecmwininfo +typedef struct { EObj *next; /* Paint order */ EObj *prev; /* Paint order */ @@ -141,8 +139,16 @@ unsigned int opacity; unsigned long damage_sequence; /* sequence when damage was created */ -}; +} ECmWinInfo; + +typedef struct +{ + Picture bgpict; /* The background picture */ +} ECmDeskInfo; +/* + * Configuration + */ #if ENABLE_SHADOWS #define ECM_SHADOWS_OFF 0 #define ECM_SHADOWS_SHARP 1 /* use window alpha for shadow; sharp, but precise */ @@ -159,6 +165,9 @@ int shadow_radius; } Conf_compmgr; +/* + * State + */ #define ECM_MODE_OFF 0 #define ECM_MODE_ROOT 1 #define ECM_MODE_WINDOW 2 @@ -322,29 +331,23 @@ /* * Desktops (move to desktops.c?) */ -typedef struct -{ - Picture bgpict; /* The background picture */ -} EcmDeskInfo; - -static EcmDeskInfo desks[32]; static Picture -DeskBackgroundPictureGet(int desk) +DeskBackgroundPictureGet(Desk * d) { + ECmDeskInfo *cmdi = d->cmhook; Picture pict; Pixmap pmap; Bool fill; XRenderPictFormat *pictfmt; XRenderPictureAttributes pa; - pict = desks[desk].bgpict; - if (pict != None) - return pict; + if (cmdi->bgpict != None) + return cmdi->bgpict; fill = False; - pmap = BackgroundGetPixmap(DeskGetBackground(desk)); - D1printf("DeskBackgroundPictureGet: Desk %d: using pixmap %#lx\n", desk, + pmap = BackgroundGetPixmap(DeskGetBackground(d->num)); + D1printf("DeskBackgroundPictureGet: Desk %d: using pixmap %#lx\n", d->num, pmap); if (!pmap) { @@ -369,24 +372,25 @@ /* New background, all must be repainted */ ECompMgrDamageAll(); - desks[desk].bgpict = pict; + cmdi->bgpict = pict; return pict; } static void -DeskBackgroundPictureFree(int desk) +DeskBackgroundPictureFree(Desk * d) { + ECmDeskInfo *cmdi = d->cmhook; Picture pict; - pict = desks[desk].bgpict; + pict = cmdi->bgpict; if (pict == None) return; - XClearArea(disp, DeskGetWin(desk), 0, 0, 0, 0, True); + XClearArea(disp, EoGetWin(d), 0, 0, 0, 0, True); XRenderFreePicture(disp, pict); - desks[desk].bgpict = None; + cmdi->bgpict = None; } /* @@ -1655,7 +1659,7 @@ pbuf = rootBuffer; /* Draw desktop background picture */ - pict = DeskBackgroundPictureGet(0); + pict = DeskBackgroundPictureGet(DeskGet(0)); D1printf("ECompMgrRepaint desk picture=%#lx\n", pict); XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, region); XRenderComposite(dpy, PictOpSrc, pict, None, pbuf, @@ -1751,11 +1755,47 @@ } static void +ECompMgrDeskAdd(int desk) +{ + Desk *d = DeskGet(desk); + + if (!d || d->cmhook) + return; + + D1printf("ECompMgrDeskAdd: desk=%d\n", desk); + + d->cmhook = Emalloc(sizeof(ECmDeskInfo)); + if (!d->cmhook) + return; + + ((ECmDeskInfo *) d->cmhook)->bgpict = None; +} + +static void +ECompMgrDeskDel(int desk) +{ + Desk *d = DeskGet(desk); + + if (!d || !d->cmhook) + return; + + D1printf("ECompMgrDeskDel: desk=%d\n", desk); + + DeskBackgroundPictureFree(d); + Efree(d->cmhook); +} + +static void ECompMgrDeskChanged(int desk) { + Desk *d = DeskGet(desk); + + if (!d || !d->cmhook) + return; + D1printf("ECompMgrDeskChanged: desk=%d\n", desk); - DeskBackgroundPictureFree(desk); + DeskBackgroundPictureFree(d); } #if ENABLE_SHADOWS @@ -1864,7 +1904,7 @@ XRenderFreePicture(disp, rootBuffer); rootBuffer = None; - DeskBackgroundPictureFree(0); + DeskBackgroundPictureFree(DeskGet(0)); ECompMgrShadowsInit(ECM_SHADOWS_OFF, 0); @@ -2113,6 +2153,13 @@ ECompMgrStart(); break; + case ESIGNAL_DESK_ADDED: + ECompMgrDeskAdd((int)(prm)); + break; + case ESIGNAL_DESK_REMOVED: + ECompMgrDeskDel((int)(prm)); + break; + case ESIGNAL_BACKGROUND_CHANGE: ECompMgrDeskChanged((int)prm); break; =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/hints.c,v retrieving revision 1.38 retrieving revision 1.39 diff -u -3 -r1.38 -r1.39 --- hints.c 24 Mar 2005 23:38:09 -0000 1.38 +++ hints.c 30 Mar 2005 22:51:02 -0000 1.39 @@ -393,7 +393,7 @@ } void -EHintsSetMainInfo(void) +EHintsSetDeskInfo(void) { Atom a; int i, ax, ay, n_desks; @@ -425,7 +425,7 @@ } void -EHintsGetMainInfo(void) +EHintsGetDeskInfo(void) { Atom a; unsigned int *c; @@ -473,5 +473,5 @@ if (!EwinIsInternal(lst[i])) EHintsSetInfo(lst[i]); - EHintsSetMainInfo(); + EHintsSetDeskInfo(); } =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/main.c,v retrieving revision 1.119 retrieving revision 1.120 diff -u -3 -r1.119 -r1.120 --- main.c 19 Mar 2005 16:40:06 -0000 1.119 +++ main.c 30 Mar 2005 22:51:02 -0000 1.120 @@ -237,9 +237,6 @@ ModulesSignal(ESIGNAL_INIT, NULL); - /* retreive stuff from last time we were loaded if we're restarting */ - EHintsGetMainInfo(); - /* Load the theme */ ThemeConfigLoad(); =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/mod-misc.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -3 -r1.13 -r1.14 --- mod-misc.c 28 Mar 2005 13:39:32 -0000 1.13 +++ mod-misc.c 30 Mar 2005 22:51:02 -0000 1.14 @@ -55,10 +55,10 @@ extern EModule ModWindowMatch; const EModule *p_modules[] = { - &ModDesktops, &ModAclass, &ModBackgrounds, &ModButtons, + &ModDesktops, #if USE_COMPOSITE &ModCompMgr, #endif ------------------------------------------------------- This SF.net email is sponsored by Demarc: A global provider of Threat Management Solutions. Download our HomeAdmin security software for free today! http://www.demarc.com/info/Sentarus/hamr30 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs