Cleanups, preparing to fix desktop stacking with composite enabled.

SVN revision: 12673
This commit is contained in:
Kim Woelders 2005-01-01 17:58:46 +00:00
parent 8cd9eb8f7a
commit 614ab4597b
5 changed files with 173 additions and 231 deletions

21
src/E.h
View File

@ -563,8 +563,9 @@ struct _eobj
#define EOBJ_TYPE_EWIN 0
#define EOBJ_TYPE_BUTTON 1
#define EOBJ_TYPE_OVERR 2
#define EOBJ_TYPE_OTHER 3
#define EOBJ_TYPE_DESK 2
#define EOBJ_TYPE_OVERR 3
#define EOBJ_TYPE_OTHER 4
#define EoGetWin(eo) ((eo)->o.win)
#define EoGetType(eo) ((eo)->o.type)
@ -1447,20 +1448,12 @@ int DesksGetTotal(void);
int DesksGetCurrent(void);
void DesksSetCurrent(int desk);
void DesktopsInit(void);
void ChangeNumberOfDesktops(int quantity);
void InitDesktopControls(void);
void ShowDesktopControls(void);
void ShowDesktopTabs(void);
void HideDesktopTabs(void);
void ShowDesktopButtons(void);
void MoveToDeskTop(int num);
void MoveToDeskBottom(int num);
void SlideWindowTo(Window win, int fx, int fy, int tx, int ty,
int speed);
void RefreshCurrentDesktop(void);
void RefreshDesktop(int num);
void DesktopsRefresh(void);
void InitDesktopControls(void);
void DesktopSetBg(int desk, Background * bg, int refresh);
int DesktopAt(int x, int y);
void GotoDesktop(int num);
@ -1471,11 +1464,9 @@ void HideDesktop(int num);
void ShowDesktop(int num);
void StackDesktops(void);
void StackDesktop(int num);
void UncoverDesktop(int num);
void DesktopAddEwinToBottom(EWin * ewin);
void DesktopAddEwinToTop(EWin * ewin);
void GotoDesktopByEwin(EWin * ewin);
void FloatEwinAboveDesktops(EWin * ewin);
void DesktopsEventsConfigure(int mode);
void DeskDragStart(int desk);
void DeskDragMotion(void);
@ -1597,9 +1588,9 @@ void EdgeWindowsHide(void);
void EobjInit(EObj * eo, int type, int x, int y, int w, int h);
#if USE_COMPOSITE
EObj *EobjCreate(Window win);
EObj *EobjCreate(Window win, int type);
void EobjDestroy(EObj * eo);
EObj *EobjRegister(Window win);
EObj *EobjRegister(Window win, int type);
void EobjUnregister(Window win);
Pixmap EobjGetPixmap(const EObj * eo);
void EobjChangeOpacity(EObj * eo, unsigned int opacity);

View File

@ -174,25 +174,23 @@ DesktopInit(unsigned int dsk)
{
d->win =
ECreateWindow(VRoot.win, -VRoot.w, -VRoot.h, VRoot.w, VRoot.h, 0);
#if 0 /* FIXME - TBD */
XSelectInput(disp, d->win, EDESK_EVENT_MASK);
#if 0 /* USE_COMPOSITE */
EobjRegister(d->win, EOBJ_TYPE_DESK);
#endif
}
EventCallbackRegister(d->win, 0, DesktopHandleEvents, d);
}
void
static void
DesktopsInit(void)
{
int i;
for (i = 0; i < ENLIGHTENMENT_CONF_NUM_DESKTOPS; i++)
{
DesktopInit(i);
}
DesktopInit(i);
}
void
static void
ChangeNumberOfDesktops(int quantity)
{
int pnum, i, num;
@ -247,7 +245,8 @@ ShowDesktopControls(void)
}
}
void
#if 0 /* Unused */
static void
ShowDesktopTabs(void)
{
Button **blst;
@ -263,7 +262,7 @@ ShowDesktopTabs(void)
}
}
void
static void
HideDesktopTabs(void)
{
Button **blst;
@ -278,8 +277,9 @@ HideDesktopTabs(void)
StackDesktops();
}
}
#endif
void
static void
ShowDesktopButtons(void)
{
Button **blst;
@ -297,12 +297,11 @@ ShowDesktopButtons(void)
}
}
void
static void
MoveToDeskTop(int num)
{
int i, j;
EDBUG(6, "MoveToDeskTop");
j = -1;
i = 0;
while ((j < 0) && (i < ENLIGHTENMENT_CONF_NUM_DESKTOPS))
@ -312,22 +311,20 @@ MoveToDeskTop(int num)
i++;
}
if (j < 0)
EDBUG_RETURN_;
return;
if (j > 0)
{
for (i = j - 1; i >= 0; i--)
desks.order[i + 1] = desks.order[i];
desks.order[0] = num;
}
EDBUG_RETURN_;
}
void
static void
MoveToDeskBottom(int num)
{
int i, j;
EDBUG(6, "MoveToDeskBottom");
j = -1;
i = 0;
while ((j < 0) && (i < ENLIGHTENMENT_CONF_NUM_DESKTOPS))
@ -337,14 +334,13 @@ MoveToDeskBottom(int num)
i++;
}
if (j < 0)
EDBUG_RETURN_;
return;
if (j < ENLIGHTENMENT_CONF_NUM_DESKTOPS - 1)
{
for (i = j; i < ENLIGHTENMENT_CONF_NUM_DESKTOPS - 1; i++)
desks.order[i] = desks.order[i + 1];
desks.order[ENLIGHTENMENT_CONF_NUM_DESKTOPS - 1] = num;
}
EDBUG_RETURN_;
}
void
@ -352,8 +348,6 @@ SlideWindowTo(Window win, int fx, int fy, int tx, int ty, int speed)
{
int k, x, y;
EDBUG(5, "SlideWindowTo");
ecore_x_grab();
ETimedLoopInit(0, 1024, speed);
@ -369,16 +363,6 @@ SlideWindowTo(Window win, int fx, int fy, int tx, int ty, int speed)
EMoveWindow(disp, win, tx, ty);
ecore_x_ungrab();
EDBUG_RETURN_;
}
void
RefreshCurrentDesktop(void)
{
EDBUG(5, "RefreshCurrentDesktop");
RefreshDesktop(DesksGetCurrent());
EDBUG_RETURN_;
}
void
@ -386,24 +370,20 @@ RefreshDesktop(int desk)
{
Background *bg;
EDBUG(4, "RefreshDesktop");
desk = desk % ENLIGHTENMENT_CONF_NUM_DESKTOPS;
if (!desks.desk[desk].viewable)
EDBUG_RETURN_;
return;
if (EventDebug(EDBUG_TYPE_DESKS))
Eprintf("RefreshDesktop %d\n", desk);
bg = desks.desk[desk].bg;
if (!bg)
EDBUG_RETURN_;
return;
BackgroundApply(bg, desks.desk[desk].win, 1);
HintsSetRootInfo(desks.desk[desk].win,
BackgroundGetPixmap(bg), BackgroundGetColor(bg));
EDBUG_RETURN_;
}
void
@ -430,8 +410,6 @@ InitDesktopControls(void)
char s[512];
const char *t;
EDBUG(6, "InitDesktopControls");
for (i = 0; i < ENLIGHTENMENT_CONF_NUM_DESKTOPS; i++)
{
Esnprintf(s, sizeof(s), "DRAGBAR_DESKTOP_%i", i);
@ -659,16 +637,13 @@ InitDesktopControls(void)
else
desks.desk[i].tag = NULL;
}
EDBUG_RETURN_;
}
void
DesktopSetBg(int desk, Background * bg, int refresh)
{
EDBUG(5, "DesktopSetBg");
if (desk < 0 || desk >= ENLIGHTENMENT_CONF_NUM_DESKTOPS)
EDBUG_RETURN_;
return;
if (refresh)
BackgroundPixmapFree(desks.desk[desk].bg);
@ -690,8 +665,6 @@ DesktopSetBg(int desk, Background * bg, int refresh)
RefreshDesktop(desk);
ModulesSignal(ESIGNAL_BACKGROUND_CHANGE, (void *)desk);
EDBUG_RETURN_;
}
int
@ -699,18 +672,15 @@ DesktopAt(int x, int y)
{
int i;
EDBUG(3, "DesktopAt");
for (i = 0; i < ENLIGHTENMENT_CONF_NUM_DESKTOPS; i++)
{
if ((x >= desks.desk[desks.order[i]].x)
&& (x < (desks.desk[desks.order[i]].x + VRoot.w))
&& (y >= desks.desk[desks.order[i]].y)
&& (y < (desks.desk[desks.order[i]].y + VRoot.h)))
EDBUG_RETURN(desks.order[i]);
return desks.order[i];
}
EDBUG_RETURN(0);
return 0;
}
static void
@ -758,8 +728,6 @@ GotoDesktop(int desk)
static int pdesk = -1;
int x, y;
EDBUG(2, "GotoDesktop");
if (Conf.desks.wraparound)
{
if (desk >= Conf.desks.num)
@ -768,7 +736,7 @@ GotoDesktop(int desk)
desk = Conf.desks.num - 1;
}
if (desk < 0 || desk >= Conf.desks.num || desk == pdesk)
EDBUG_RETURN_;
return;
if (EventDebug(EDBUG_TYPE_DESKS))
Eprintf("GotoDesktop %d\n", desk);
@ -850,8 +818,6 @@ GotoDesktop(int desk)
HandleDrawQueue();
pdesk = DesksGetCurrent();
EDBUG_RETURN_;
}
void
@ -861,15 +827,12 @@ MoveDesktop(int desk, int x, int y)
EWin *const *lst;
int n, v, dx, dy;
EDBUG(3, "MoveDesktop");
if (desk < 0)
EDBUG_RETURN_;
if (desk >= Conf.desks.num)
EDBUG_RETURN_;
if (desk == 0)
EDBUG_RETURN_;
if (desk <= 0 || desk >= Conf.desks.num)
return;
dx = x - desks.desk[desk].x;
dy = y - desks.desk[desk].y;
if ((x == 0) && (y == 0))
{
n = -1;
@ -949,8 +912,18 @@ MoveDesktop(int desk, int x, int y)
for (i = 0; i < n; i++)
if (EoGetDesk(lst[i]) == desk)
ICCCM_Configure(lst[i]);
}
EDBUG_RETURN_;
static void
UncoverDesktop(int desk)
{
if (desk < 0 || desk >= Conf.desks.num)
return;
desks.desk[desk].viewable = 1;
RefreshDesktop(desk);
if (desk != 0)
EMapWindow(disp, desks.desk[desk].win);
}
void
@ -958,10 +931,11 @@ RaiseDesktop(int desk)
{
int i;
EDBUG(3, "RaiseDesktop");
if (desk < 0 || desk >= Conf.desks.num)
return;
if ((desk < 0) || (desk >= Conf.desks.num))
EDBUG_RETURN_;
if (EventDebug(EDBUG_TYPE_DESKS))
Eprintf("RaiseDesktop %d\n", desk);
FocusNewDeskBegin();
desks.desk[desk].viewable = 1;
@ -988,17 +962,13 @@ RaiseDesktop(int desk)
HintsSetCurrentDesktop();
EMapWindow(disp, desks.desk[desk].win);
ecore_x_sync();
EDBUG_RETURN_;
}
void
LowerDesktop(int desk)
{
EDBUG(3, "LowerDesktop");
if ((desk <= 0) || (desk >= Conf.desks.num))
EDBUG_RETURN_;
return;
FocusNewDeskBegin();
MoveToDeskBottom(desk);
@ -1016,26 +986,18 @@ LowerDesktop(int desk)
HandleDrawQueue();
HintsSetCurrentDesktop();
ecore_x_sync();
EDBUG_RETURN_;
}
void
HideDesktop(int desk)
{
EDBUG(3, "HideDesktop");
if ((desk < 0) || (desk >= Conf.desks.num))
EDBUG_RETURN_;
if (desk == 0)
EDBUG_RETURN_;
if (desk <= 0 || desk >= Conf.desks.num)
return;
if (desks.desk[desk].viewable)
BackgroundTouch(desks.desk[desk].bg);
desks.desk[desk].viewable = 0;
EMoveWindow(disp, desks.desk[desk].win, VRoot.w, 0);
EDBUG_RETURN_;
}
void
@ -1043,12 +1005,8 @@ ShowDesktop(int desk)
{
int i;
EDBUG(3, "ShowDesktop");
if (desk < 0)
EDBUG_RETURN_;
if (desk >= Conf.desks.num)
EDBUG_RETURN_;
if (desk < 0 || desk >= Conf.desks.num)
return;
desks.desk[desk].viewable = 1;
RefreshDesktop(desk);
@ -1064,18 +1022,12 @@ ShowDesktop(int desk)
StackDesktops();
EMapWindow(disp, desks.desk[desk].win);
}
EDBUG_RETURN_;
}
void
StackDesktops(void)
{
EDBUG(2, "StackDesktops");
StackDesktop(0);
EDBUG_RETURN_;
}
#define _APPEND_TO_WIN_LIST(win) \
@ -1094,7 +1046,6 @@ StackDesktop(int desk)
int i, num, tot;
EObj *const *lst, *eo;
EDBUG(2, "StackDesktop");
tot = 0;
wl = NULL;
@ -1154,7 +1105,11 @@ StackDesktop(int desk)
for (i = 0; i < num; i++)
{
eo = lst[i];
#if 0 /* USE_COMPOSITE */
if (eo->floating || eo->type == EOBJ_TYPE_DESK)
#else
if (eo->floating)
#endif
continue;
_APPEND_TO_WIN_LIST(eo->win);
@ -1180,23 +1135,6 @@ StackDesktop(int desk)
if (wl)
Efree(wl);
EDBUG_RETURN_;
}
void
UncoverDesktop(int desk)
{
EDBUG(3, "UncoverDesktop");
if (desk < 0)
EDBUG_RETURN_;
if (desk >= Conf.desks.num)
EDBUG_RETURN_;
desks.desk[desk].viewable = 1;
RefreshDesktop(desk);
if (desk != 0)
EMapWindow(disp, desks.desk[desk].win);
EDBUG_RETURN_;
}
void

View File

@ -1489,6 +1489,109 @@ ECompMgrCheckAlphaMask(ECmWinInfo * w)
0, 0, 0);
}
static void
ECompMgrRepaintObj(Picture pbuf, EObj * eo)
{
Display *dpy = disp;
ECmWinInfo *w;
/* Atm we first hook up when mapped */
/* Maybe do it at init/create? */
if (!eo->cmhook)
return;
w = eo->cmhook;
if (!w->visible)
return;
#if CAN_DO_USABLE
if (!w->usable)
return;
#endif
if (!w->damaged)
return;
if (!w->picture)
return;
#if 0
ECompMgrWinSetPicts(eo);
#endif
D2printf("ECompMgrRepaintObj %#lx %d %#lx\n", eo->win, w->mode, w->picture);
/* Region of shaped window in screen coordinates */
if (!w->borderSize)
w->borderSize = border_size(eo);
if (EventDebug(EDBUG_TYPE_COMPMGR3))
ERegionShow("Window borderSize", w->borderSize);
/* Region of window in screen coordinates */
if (!w->extents)
w->extents = win_extents(dpy, eo);
if (EventDebug(EDBUG_TYPE_COMPMGR3))
ERegionShow("Window extents", w->extents);
#if 0
if (!w->borderClip)
{
w->borderClip = XFixesCreateRegion(dpy, 0, 0);
XFixesCopyRegion(dpy, w->borderClip, region);
}
XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, w->borderClip);
#endif
#if ENABLE_SHADOWS
switch (Conf_compmgr.shadow)
{
case ECM_SHADOWS_OFF:
break;
case ECM_SHADOWS_SHARP:
if (w->opacity != OPAQUE && !w->shadowPict)
w->shadowPict = EPictureCreateSolid(True,
(double)w->opacity /
OPAQUE * 0.3, 0, 0, 0);
XRenderComposite(dpy, PictOpOver,
w->shadowPict ? w->shadowPict : transBlackPicture,
w->picture, pbuf, 0, 0, 0, 0,
w->a.x + w->shadow_dx, w->a.y + w->shadow_dy,
w->shadow_width, w->shadow_height);
break;
case ECM_SHADOWS_BLURRED:
if (w->shadow)
{
XRenderComposite(dpy, PictOpOver, blackPicture, w->shadow,
pbuf, 0, 0, 0, 0,
w->a.x + w->shadow_dx, w->a.y + w->shadow_dy,
w->shadow_width, w->shadow_height);
}
break;
}
#endif
switch (w->mode)
{
default:
case WINDOW_SOLID:
#if 0
XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, region);
XFixesSubtractRegion(dpy, region, region, w->borderSize);
#endif
XRenderComposite(dpy, PictOpSrc, w->picture, None, pbuf,
0, 0, 0, 0, w->rcx, w->rcy, w->rcw, w->rch);
case WINDOW_TRANS:
ECompMgrCheckAlphaMask(w);
XRenderComposite(dpy, PictOpOver, w->picture, w->alphaPict, pbuf,
0, 0, 0, 0, w->rcx, w->rcy, w->rcw, w->rch);
break;
case WINDOW_ARGB:
ECompMgrCheckAlphaMask(w);
XRenderComposite(dpy, PictOpOver, w->picture, w->alphaPict, pbuf,
0, 0, 0, 0, w->rcx, w->rcy, w->rcw, w->rch);
break;
}
XFixesDestroyRegion(dpy, w->borderClip);
w->borderClip = None;
}
static void
ECompMgrRepaint(void)
{
@ -1496,7 +1599,6 @@ ECompMgrRepaint(void)
XserverRegion region = allDamage;
EObj *const *lst, *eo;
int i, num;
ECmWinInfo *w;
Picture pict, pbuf;
D2printf("ECompMgrRepaint rootBuffer=%#lx rootPicture=%#lx\n",
@ -1517,109 +1619,17 @@ ECompMgrRepaint(void)
XRenderComposite(dpy, PictOpSrc, pict, None, pbuf,
0, 0, 0, 0, 0, 0, VRoot.w, VRoot.h);
#if 1
lst = EobjListStackGetForDesk(&num, 0 /*desk */ );
#else
lst = EobjListStackGet(&num);
#endif
/* Normal objects */
for (i = num - 1; i >= 0; i--)
{
eo = lst[i];
if (!eo->cmhook)
{
/* Atm we first hook up when mapped */
/* Maybe do it at init/create? */
continue;
}
w = eo->cmhook;
if (!w->visible)
continue;
#if CAN_DO_USABLE
if (!w->usable)
continue;
#endif
if (!w->damaged)
continue;
if (!w->picture)
continue;
#if 0
ECompMgrWinSetPicts(eo);
#endif
D2printf("ECompMgrRepaint paint %#lx %d %#lx\n", eo->win, w->mode,
w->picture);
/* Region of shaped window in screen coordinates */
if (!w->borderSize)
w->borderSize = border_size(eo);
if (EventDebug(EDBUG_TYPE_COMPMGR3))
ERegionShow("Window borderSize", w->borderSize);
/* Region of window in screen coordinates */
if (!w->extents)
w->extents = win_extents(dpy, eo);
if (EventDebug(EDBUG_TYPE_COMPMGR3))
ERegionShow("Window extents", w->extents);
#if 0
if (!w->borderClip)
{
w->borderClip = XFixesCreateRegion(dpy, 0, 0);
XFixesCopyRegion(dpy, w->borderClip, region);
}
XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, w->borderClip);
#endif
#if ENABLE_SHADOWS
switch (Conf_compmgr.shadow)
{
case ECM_SHADOWS_OFF:
break;
case ECM_SHADOWS_SHARP:
if (w->opacity != OPAQUE && !w->shadowPict)
w->shadowPict = EPictureCreateSolid(True,
(double)w->opacity /
OPAQUE * 0.3, 0, 0, 0);
XRenderComposite(dpy, PictOpOver,
w->shadowPict ? w->shadowPict : transBlackPicture,
w->picture, pbuf, 0, 0, 0, 0,
w->a.x + w->shadow_dx, w->a.y + w->shadow_dy,
w->shadow_width, w->shadow_height);
break;
case ECM_SHADOWS_BLURRED:
if (w->shadow)
{
XRenderComposite(dpy, PictOpOver, blackPicture, w->shadow,
pbuf, 0, 0, 0, 0,
w->a.x + w->shadow_dx, w->a.y + w->shadow_dy,
w->shadow_width, w->shadow_height);
}
break;
}
#endif
switch (w->mode)
{
default:
case WINDOW_SOLID:
#if 0
XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, region);
XFixesSubtractRegion(dpy, region, region, w->borderSize);
#endif
XRenderComposite(dpy, PictOpSrc, w->picture, None, pbuf,
0, 0, 0, 0, w->rcx, w->rcy, w->rcw, w->rch);
case WINDOW_TRANS:
ECompMgrCheckAlphaMask(w);
XRenderComposite(dpy, PictOpOver, w->picture, w->alphaPict, pbuf,
0, 0, 0, 0, w->rcx, w->rcy, w->rcw, w->rch);
break;
case WINDOW_ARGB:
ECompMgrCheckAlphaMask(w);
XRenderComposite(dpy, PictOpOver, w->picture, w->alphaPict, pbuf,
0, 0, 0, 0, w->rcx, w->rcy, w->rcw, w->rch);
break;
}
XFixesDestroyRegion(dpy, w->borderClip);
w->borderClip = None;
ECompMgrRepaintObj(pbuf, eo);
}
if (pbuf != rootPicture)
@ -1837,6 +1847,9 @@ ECompMgrConfigGet(cfg_composite * cfg)
void
ECompMgrConfigSet(const cfg_composite * cfg)
{
if (Conf_compmgr.mode == ECM_MODE_OFF)
return;
if (cfg->enable != Conf_compmgr.enable)
{
Conf_compmgr.enable = cfg->enable;
@ -1951,7 +1964,7 @@ ECompMgrHandleRootEvent(XEvent * ev, void *prm)
case MapNotify:
eo = EobjListStackFind(ev->xmap.window);
if (!eo)
eo = EobjRegister(ev->xmap.window);
eo = EobjRegister(ev->xmap.window, EOBJ_TYPE_OVERR);
if (eo)
ECompMgrWinMap(eo, ev->xmap.serial, True);
break;

View File

@ -146,7 +146,7 @@ EobjInit(EObj * eo, int type, int x, int y, int w, int h)
#if USE_COMPOSITE
EObj *
EobjCreate(Window win)
EobjCreate(Window win, int type)
{
EObj *eo;
XWindowAttributes attr;
@ -160,7 +160,7 @@ EobjCreate(Window win)
eo->win = win;
EobjInit(eo, EOBJ_TYPE_OVERR, attr.x, attr.y, attr.width, attr.height);
EobjInit(eo, type, attr.x, attr.y, attr.width, attr.height);
return eo;
}
@ -173,7 +173,7 @@ EobjDestroy(EObj * eo)
}
EObj *
EobjRegister(Window win)
EobjRegister(Window win, int type)
{
EObj *eo;
@ -181,7 +181,7 @@ EobjRegister(Window win)
if (eo)
return eo;
eo = EobjCreate(win);
eo = EobjCreate(win, type);
if (!eo)
return eo;

View File

@ -85,7 +85,7 @@ TooltipCreate(const char *name, ImageClass * ic0, ImageClass * ic1,
tt->win = ECreateWindow(VRoot.win, -10, -100, 1, 1, 1);
tt->iwin = ECreateWindow(tt->win, -10, -100, 1, 1, 1);
#if USE_COMPOSITE
eo = EobjRegister(tt->win);
eo = EobjRegister(tt->win, EOBJ_TYPE_OVERR);
eo->opacity = OpacityExt(Conf_tooltips.opacity);
#endif
@ -101,7 +101,7 @@ TooltipCreate(const char *name, ImageClass * ic0, ImageClass * ic1,
win = ECreateWindow(VRoot.win, -10, -100, wh, wh, 1);
tt->s_iclass[i]->ref_count++;
#if USE_COMPOSITE
eo = EobjRegister(win);
eo = EobjRegister(win, EOBJ_TYPE_OVERR);
eo->opacity = OpacityExt(Conf_tooltips.opacity);
#endif
}