Prepare to fix various issues related to background pixmap handling.

SVN revision: 18577
This commit is contained in:
Kim Woelders 2005-11-21 17:48:44 +00:00
parent c8c8574e19
commit 85639edc22
7 changed files with 55 additions and 62 deletions

View File

@ -274,22 +274,17 @@ BackgroundCreate(const char *name, XColor * solid, const char *bgn, char tile,
{
Background *bg;
bg = Emalloc(sizeof(Background));
bg = Ecalloc(1, sizeof(Background));
if (!bg)
return NULL;
bg->name = Estrdup(name);
bg->pmap = 0;
bg->last_viewed = 0;
ESetColor(&(bg->bg_solid), 160, 160, 160);
if (solid)
bg->bg_solid = *solid;
bg->bg.file = NULL;
if (bgn)
bg->bg.file = Estrdup(bgn);
bg->bg.real_file = NULL;
bg->bg.im = NULL;
bg->bg_tile = tile;
bg->bg.keep_aspect = keep_aspect;
bg->bg.xjust = xjust;
@ -297,23 +292,14 @@ BackgroundCreate(const char *name, XColor * solid, const char *bgn, char tile,
bg->bg.xperc = xperc;
bg->bg.yperc = yperc;
bg->top.file = NULL;
if (top)
bg->top.file = Estrdup(top);
bg->top.real_file = NULL;
bg->top.im = NULL;
bg->top.keep_aspect = tkeep_aspect;
bg->top.xjust = txjust;
bg->top.yjust = tyjust;
bg->top.xperc = txperc;
bg->top.yperc = typerc;
#if ENABLE_COLOR_MODIFIERS
bg->cmclass = NULL;
#endif
bg->keepim = 0;
bg->ref_count = 0;
AddItem(bg, bg->name, 0, LIST_TYPE_BACKGROUND);
return bg;
@ -397,11 +383,7 @@ BackgroundModify(Background * bg, XColor * solid, const char *bgn, char tile,
bg->top.yperc = typerc;
if (updated)
{
if (bg->pmap)
imlib_free_pixmap_and_mask(bg->pmap);
bg->pmap = 0;
}
BackgroundPixmapFree(bg);
return updated;
}
@ -756,6 +738,13 @@ BackgroundApply(Background * bg, Drawable draw,
return pmap;
}
void
BackgroundApplyPmap(Background * bg, Drawable draw,
unsigned int w, unsigned int h)
{
BackgroundApply(bg, draw, w, h, 0);
}
/*
* Apply a background to window/pixmap.
* The (scaled) BG pixmap is stored in bg->pmap.
@ -998,7 +987,7 @@ BackgroundCacheMini(Background * bg, int keep, int nuke)
/* Create new cached bg mini image */
pmap = ECreatePixmap(VRoot.win, 64, 48, VRoot.depth);
BackgroundApply(bg, pmap, 64, 48, 0);
BackgroundApplyPmap(bg, pmap, 64, 48);
imlib_context_set_drawable(pmap);
im = imlib_create_image_from_drawable(0, 0, 0, 64, 48, 0);
imlib_context_set_image(im);
@ -1178,7 +1167,7 @@ BackgroundsConfigLoad(FILE * fs)
desk = atoi(s2);
if (desk < DesksGetNumber())
{
if ((DeskGetBackground(DeskGet(desk)) == NULL) ||
if ((DeskBackgroundGet(DeskGet(desk)) == NULL) ||
(Conf.backgrounds.user))
{
if (!ignore)
@ -1188,7 +1177,7 @@ BackgroundsConfigLoad(FILE * fs)
i3, i4, i5, i6, bg2, j1,
j2, j3, j4, j5);
}
DeskAssignBg(desk, bg);
DeskBackgroundAssign(desk, bg);
}
}
break;
@ -1352,9 +1341,9 @@ BackgroundsConfigSave(void)
{
Desk *dsk = DeskGet(j);
if (BackgroundIsNone(bglist[i]) && !DeskGetBackground(dsk))
if (BackgroundIsNone(bglist[i]) && !DeskBackgroundGet(dsk))
fprintf(fs, "564 %d\n", j);
if (DeskGetBackground(dsk) == bglist[i])
if (DeskBackgroundGet(dsk) == bglist[i])
fprintf(fs, "564 %d\n", j);
}
@ -1388,8 +1377,8 @@ BackgroundsAccounting(void)
for (j = 0; j < DesksGetNumber(); j++)
{
dsk = DeskGet(j);
if ((DeskGetBackground(dsk)) && (DeskIsViewable(dsk)))
BackgroundTouch(DeskGetBackground(dsk));
if ((DeskBackgroundGet(dsk)) && (DeskIsViewable(dsk)))
BackgroundTouch(DeskBackgroundGet(dsk));
}
lst = (Background **) ListItemType(&num, LIST_TYPE_BACKGROUND);
@ -1405,14 +1394,14 @@ BackgroundsAccounting(void)
for (j = 0; j < DesksGetNumber(); j++)
{
dsk = DeskGet(j);
if (lst[i] == DeskGetBackground(dsk) && DeskIsViewable(dsk))
if (lst[i] == DeskBackgroundGet(dsk) && DeskIsViewable(dsk))
goto next;
}
for (j = 0; j < DesksGetNumber(); j++)
{
dsk = DeskGet(j);
if (lst[i] != DeskGetBackground(dsk) || DeskIsViewable(dsk))
if (lst[i] != DeskBackgroundGet(dsk) || DeskIsViewable(dsk))
continue;
/* Unviewable desktop - update the virtual root hints */
@ -1532,8 +1521,8 @@ CB_ConfigureBG(Dialog * d __UNUSED__, int val, void *data __UNUSED__)
{
Desk *dsk = DeskGet(i);
if (DeskGetBackground(dsk) == tmp_bg)
DeskSetBg(dsk, tmp_bg, 1);
if (DeskBackgroundGet(dsk) == tmp_bg)
DeskBackgroundSet(dsk, tmp_bg, 1);
}
BackgroundCacheMini(tmp_bg, 0, 1);
@ -1572,7 +1561,7 @@ CB_DesktopMiniDisplayRedraw(Dialog * d __UNUSED__, int val, void *data)
if (val == 1)
{
ESetWindowBackgroundPixmap(win, pmap);
BackgroundApply(tmp_bg, pmap, w, h, 0);
BackgroundApplyPmap(tmp_bg, pmap, w, h);
}
else
{
@ -1587,7 +1576,7 @@ CB_DesktopMiniDisplayRedraw(Dialog * d __UNUSED__, int val, void *data)
tmp_bg->top.yjust, tmp_bg->top.xperc,
tmp_bg->top.yperc);
BackgroundApply(bg, pmap, w, h, 0);
BackgroundApplyPmap(bg, pmap, w, h);
BackgroundDestroy(bg);
}
EClearWindow(win);
@ -1689,7 +1678,7 @@ CB_ConfigureNewBG(Dialog * d __UNUSED__, int val __UNUSED__,
DialogItemSliderSetVal(bg_sel_slider, 0);
DialogDrawItems(bg_sel_dialog, bg_sel_slider, 0, 0, 99999, 99999);
DeskSetBg(DesksGetCurrent(), tmp_bg, 0);
DeskBackgroundSet(DesksGetCurrent(), tmp_bg, 0);
BG_RedrawView();
@ -1727,7 +1716,7 @@ CB_ConfigureDelBG(Dialog * d __UNUSED__, int val, void *data __UNUSED__)
}
}
DeskSetBg(DesksGetCurrent(), bg, 0);
DeskBackgroundSet(DesksGetCurrent(), bg, 0);
if (val == 0)
BackgroundDestroy(tmp_bg);
else
@ -1883,7 +1872,7 @@ CB_BGAreaEvent(int val __UNUSED__, void *data)
if ((tmp_bg_selected >= 0) && (tmp_bg_selected < num))
{
BgDialogSetNewCurrent(bglist[tmp_bg_selected]);
DeskSetBg(DesksGetCurrent(), tmp_bg, 0);
DeskBackgroundSet(DesksGetCurrent(), tmp_bg, 0);
autosave();
}
Efree(bglist);
@ -1947,7 +1936,7 @@ CB_BGPrev(Dialog * d __UNUSED__, int val __UNUSED__, void *data __UNUSED__)
if ((bglist[i] == tmp_bg) && (i > 0))
{
BGSettingsGoTo(bglist[i - 1]);
DeskSetBg(DesksGetCurrent(), bglist[i - 1], 0);
DeskBackgroundSet(DesksGetCurrent(), bglist[i - 1], 0);
break;
}
}
@ -1967,7 +1956,7 @@ CB_BGNext(Dialog * d __UNUSED__, int val __UNUSED__, void *data __UNUSED__)
if ((bglist[i] == tmp_bg) && (i < (num - 1)))
{
BGSettingsGoTo(bglist[i + 1]);
DeskSetBg(DesksGetCurrent(), bglist[i + 1], 0);
DeskBackgroundSet(DesksGetCurrent(), bglist[i + 1], 0);
break;
}
}
@ -2523,8 +2512,8 @@ BackgroundSet2(const char *name, const char *params)
{
Desk *dsk = DeskGet(i);
if (DeskGetBackground(dsk) == bg)
DeskSetBg(dsk, bg, 0);
if (DeskBackgroundGet(dsk) == bg)
DeskBackgroundSet(dsk, bg, 0);
}
}
}
@ -2557,7 +2546,7 @@ BackgroundsIpc(const char *params, Client * c __UNUSED__)
{
for (i = 0; i < (int)DesksGetNumber(); i++)
{
bg = DeskGetBackground(DeskGet(i));
bg = DeskBackgroundGet(DeskGet(i));
if (bg)
IpcPrintf("%i %s\n", i, BackgroundGetName(bg));
}
@ -2577,7 +2566,7 @@ BackgroundsIpc(const char *params, Client * c __UNUSED__)
}
else if (!strncmp(cmd, "cfg", 2))
{
SettingsBackground(DeskGetBackground(DesksGetCurrent()));
SettingsBackground(DeskBackgroundGet(DesksGetCurrent()));
}
else if (!strncmp(cmd, "del", 2))
{
@ -2632,7 +2621,7 @@ BackgroundsIpc(const char *params, Client * c __UNUSED__)
num = DesksGetCurrentNum();
sscanf(p, "%d %n", &num, &len);
DeskSetBg(DeskGet(num), bg, 1);
DeskBackgroundSet(DeskGet(num), bg, 1);
autosave();
}
else if (!strncmp(cmd, "xget", 2))
@ -2678,7 +2667,7 @@ IPC_BackgroundUse(const char *params, Client * c __UNUSED__)
if (!w[0])
break;
i = atoi(w);
DeskSetBg(DeskGet(i), bg, 1);
DeskBackgroundSet(DeskGet(i), bg, 1);
}
autosave();
}
@ -2710,9 +2699,9 @@ IPC_BackgroundColormodifierSet(const char *params, Client * c __UNUSED__)
bg->cmclass->ref_count--;
bg->cmclass = cm;
}
if (bg->pmap)
imlib_free_pixmap_and_mask(bg->pmap);
bg->pmap = 0;
BackgroundPixmapFree(bg);
for (i = 0; i < DesksGetNumber(); i++)
{
if ((desks.desk[i].bg == bg) && (desks.desk[i].viewable))

View File

@ -26,7 +26,6 @@
#define _BACKGROUNDS_H_
/* backgrounds.c */
int BackgroundsConfigLoad(FILE * fs);
char *BackgroundGetUniqueString(Background * bg);
void BackgroundPixmapFree(Background * bg);
void BackgroundImagesFree(Background * bg, int free_pmap);
@ -34,6 +33,8 @@ void BackgroundDestroyByName(const char *name);
Pixmap BackgroundApply(Background * bg, Drawable draw,
unsigned int rw, unsigned int rh,
int is_win);
void BackgroundApplyPmap(Background * bg, Drawable draw,
unsigned int rw, unsigned int rh);
void BackgroundSet(Background * bg, Window win, unsigned int rw,
unsigned int rh);
void BackgroundIncRefcount(Background * bg);
@ -47,4 +48,6 @@ Background *BrackgroundCreateFromImage(const char *bgid,
const char *file, char *thumb,
int thlen);
int BackgroundsConfigLoad(FILE * fs);
#endif /* _BACKGROUNDS_H_ */

View File

@ -406,7 +406,7 @@ DeskConfigure(Desk * dsk)
Efree(lst);
}
}
DeskSetBg(dsk, bg, 0);
DeskBackgroundSet(dsk, bg, 0);
if (dsk->num > 0)
{
@ -527,7 +527,7 @@ DeskGetRelative(Desk * dsk, int inc)
}
Background *
DeskGetBackground(const Desk * dsk)
DeskBackgroundGet(const Desk * dsk)
{
return (dsk) ? dsk->bg : NULL;
}
@ -855,7 +855,7 @@ DeskRefresh(Desk * dsk)
}
void
DeskAssignBg(unsigned int desk, Background * bg)
DeskBackgroundAssign(unsigned int desk, Background * bg)
{
if (desk >= ENLIGHTENMENT_CONF_NUM_DESKTOPS)
return;
@ -864,7 +864,7 @@ DeskAssignBg(unsigned int desk, Background * bg)
}
void
DeskSetBg(Desk * dsk, Background * bg, int refresh)
DeskBackgroundSet(Desk * dsk, Background * bg, int refresh)
{
if (!dsk)
return;
@ -2116,9 +2116,9 @@ CB_DesktopDisplayRedraw(Dialog * d __UNUSED__, int val, void *data)
pmap = ECreatePixmap(wins[i], 64, 48, VRoot.depth);
ESetWindowBackgroundPixmap(wins[i], pmap);
bg = DeskGetBackground(DeskGet(i));
bg = DeskBackgroundGet(DeskGet(i));
if (bg)
BackgroundApply(bg, pmap, 64, 48, 0);
BackgroundApplyPmap(bg, pmap, 64, 48);
else
{
ic = ImageclassFind("SETTINGS_DESKTOP_AREA", 0);

View File

@ -53,18 +53,19 @@ struct _desk
/* desktops.c */
Desk *DeskGet(unsigned int desk);
Desk *DeskGetRelative(Desk * dsk, int inc);
Background *DeskGetBackground(const Desk * dsk);
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, EObj * eo);
void DeskRefresh(Desk * dsk);
void DeskAssignBg(unsigned int desk, Background * bg);
void DeskSetBg(Desk * dsk, Background * bg, int refresh);
void DeskGoto(Desk * dsk);
void DeskGotoNum(unsigned int desk);
void DeskRestack(Desk * dsk);
void DeskBackgroundAssign(unsigned int desk, Background * bg);
Background *DeskBackgroundGet(const Desk * dsk);
void DeskBackgroundSet(Desk * dsk, Background * bg, int refresh);
void DeskCurrentGetArea(int *ax, int *ay);
void DeskCurrentGotoArea(int ax, int ay);
void DeskCurrentMoveAreaBy(int ax, int ay);

View File

@ -498,7 +498,7 @@ DeskBackgroundPictureGet(Desk * dsk)
}
fill = False;
pmap = BackgroundGetPixmap(DeskGetBackground(dsk));
pmap = BackgroundGetPixmap(DeskBackgroundGet(dsk));
if (pmap == None)
{
if (cw->pixmap && cw->picture)

View File

@ -170,7 +170,7 @@ TransparencySet(int transparency)
for (i = 0; i < num; i++)
{
dsk = DeskGet(i);
BackgroundPixmapFree(DeskGetBackground(dsk));
BackgroundPixmapFree(DeskBackgroundGet(dsk));
DeskRefresh(dsk);
}
}
@ -934,7 +934,7 @@ ImagestateMakePmapMask(ImageState * is, Drawable win, PmapMask * pmm,
Drawable bg;
int xx, yy;
bg = BackgroundGetPixmap(DeskGetBackground(DesksGetCurrent()));
bg = BackgroundGetPixmap(DeskBackgroundGet(DesksGetCurrent()));
if ((flags & ICLASS_ATTR_GLASS) || (bg == None))
{
cr = VRoot.win;

View File

@ -506,7 +506,7 @@ PagerUpdateBg(Pager * p)
return;
}
bg = DeskGetBackground(p->dsk);
bg = DeskBackgroundGet(p->dsk);
if (bg)
{
char s[4096];
@ -528,7 +528,7 @@ PagerUpdateBg(Pager * p)
}
else
{
BackgroundApply(bg, pmap, p->dw, p->dh, 0);
BackgroundApplyPmap(bg, pmap, p->dw, p->dh);
imlib_context_set_drawable(pmap);
im = imlib_create_image_from_drawable(0, 0, 0, p->dw, p->dh, 1);
imlib_context_set_image(im);