Improve on menu transparency. Avoid some unnecessary redraws.

SVN revision: 9256
This commit is contained in:
Kim Woelders 2004-03-07 08:14:24 +00:00
parent 8c3fcca71e
commit 5e2544a147
7 changed files with 115 additions and 71 deletions

11
src/E.h
View File

@ -1693,16 +1693,14 @@ void SlideEwinTo(EWin * ewin, int fx, int fy, int tx, int ty,
void SlideEwinsTo(EWin ** ewin, int *fx, int *fy, int *tx,
int *ty, int num_wins, int speed);
void AddToFamily(Window win);
EWin *AddInternalToFamily(Window win, char noshow, char *bname,
int type, void *ptr);
EWin *AddInternalToFamily(Window win, char *bname, int type,
void *ptr,
void (*init) (EWin * ewin, void *ptr));
void HonorIclass(char *s, int id);
void SyncBorderToEwin(EWin * ewin);
int ChangeEwinWinpart(EWin * ewin, int i);
void DrawEwin(EWin * ewin);
int ChangeEwinWinpartContents(EWin * ewin, int i);
EWin *Adopt(Window win);
EWin *AdoptInternal(Window win, Border * border, int type,
void *ptr);
EWin *CreateEwin(void);
void FreeEwin(EWin * ewin);
void EwinSetArea(EWin * ewin, int ax, int ay);
@ -2092,7 +2090,7 @@ EWin **ListGroupMembers(Window win, int *num);
EWin *FindEwinByDialog(Dialog * d);
Dialog *FindDialogButton(Window win, int *bnum);
Dialog *FindDialog(Window win);
char FindADialog(void);
int FindADialog(void);
EWin *FindEwinSpawningMenu(Menu * m);
Pager *FindPager(Window win);
DItem *FindDialogItem(Window win, Dialog ** dret);
@ -2317,7 +2315,6 @@ void MenuAddName(Menu * menu, const char *name);
void MenuAddTitle(Menu * menu, const char *title);
void MenuAddStyle(Menu * menu, const char *style);
void MenuRealize(Menu * m);
void MenuDrawItem(Menu * m, MenuItem * mi, char shape);
Menu *MenuCreateFromDirectory(char *name, MenuStyle * ms,
char *dir);
Menu *MenuCreateFromFlatFile(char *name, MenuStyle * ms,

View File

@ -26,6 +26,8 @@
static void EwinSetBorderInit(EWin * ewin);
static void EwinSetBorderTo(EWin * ewin, Border * b);
static void DetermineEwinArea(EWin * ewin);
EWin *Adopt(Window win);
EWin *AdoptInternal(Window win, Border * border, int type);
#if 0
#define DELETE_EWIN_REFERENCE(ew, ew_ref) \
@ -208,10 +210,8 @@ SlideEwinTo(EWin * ewin, int fx, int fy, int tx, int ty, int speed)
int dsec, dusec;
double tm;
char firstlast;
Window winid;
EDBUG(3, "SlideEwinTo");
winid = ewin->client.win;
spd = 16;
min = 2;
firstlast = 0;
@ -351,7 +351,6 @@ AddToFamily(Window win)
int i, k, num, speed, fx, fy, x, y;
char doslide, manplace;
char pq;
Window winid;
char cangrab = 0;
EDBUG(3, "AddToFamily");
@ -376,7 +375,6 @@ AddToFamily(Window win)
}
/* grab that server */
GrabX();
winid = win;
speed = conf.slidespeedmap;
doslide = conf.mapslide;
manplace = 0;
@ -687,16 +685,14 @@ AddToFamily(Window win)
}
EWin *
AddInternalToFamily(Window win, char noshow, char *bname, int type, void *ptr)
AddInternalToFamily(Window win, char *bname, int type, void *ptr,
void (*init) (EWin * ewin, void *ptr))
{
EWin *ewin;
int x, y;
char pq;
Window winid;
Border *b;
EDBUG(3, "AddInternalToFamily");
winid = win;
b = NULL;
if (bname)
@ -705,27 +701,28 @@ AddInternalToFamily(Window win, char noshow, char *bname, int type, void *ptr)
if (!b)
b = FindItem("DEFAULT", 0, LIST_FINDBY_NAME, LIST_TYPE_BORDER);
}
ewin = AdoptInternal(win, b, type, ptr);
ResizeEwin(ewin, ewin->client.w, ewin->client.h);
ewin = AdoptInternal(win, b, type);
AddItem(ewin, "EWIN", ewin->client.win, LIST_TYPE_EWIN);
if (ewin->desktop < 0)
ewin->desktop = desks.current;
else
ewin->desktop = DESKTOPS_WRAP_NUM(ewin->desktop);
x = ewin->client.x - ewin->border->border.left;
y = ewin->client.y - ewin->border->border.top;
AddItem(ewin, "EWIN", ewin->client.win, LIST_TYPE_EWIN);
DesktopAddEwinToTop(ewin);
if (init)
init(ewin, ptr); /* Type specific initialisation */
ICCCM_Configure(ewin);
pq = queue_up;
queue_up = 0;
DrawEwin(ewin);
PropagateShapes(ewin->win);
queue_up = pq;
MoveEwinToDesktopAt(ewin, ewin->desktop, x, y);
RaiseEwin(ewin);
StackDesktops();
if (!noshow)
ShowEwin(ewin);
ICCCM_Configure(ewin);
UngrabX();
EDBUG_RETURN(ewin);
}
@ -1205,7 +1202,7 @@ Adopt(Window win)
}
EWin *
AdoptInternal(Window win, Border * border, int type, void *ptr)
AdoptInternal(Window win, Border * border, int type)
{
EWin *ewin;

View File

@ -583,6 +583,14 @@ DialogRefresh(EWin * ewin)
DialogMoveResize(ewin, 0);
}
static void
DialogEwinInit(EWin * ewin, void *ptr)
{
ewin->dialog = (Dialog *) ptr;
ewin->MoveResize = DialogMoveResize;
ewin->Refresh = DialogRefresh;
}
void
ShowDialog(Dialog * d)
{
@ -665,14 +673,13 @@ ShowDialog(Dialog * d)
pq = queue_up;
queue_up = 0;
ewin = AddInternalToFamily(d->win, 1, NULL, EWIN_TYPE_DIALOG, d);
ewin = AddInternalToFamily(d->win, NULL, EWIN_TYPE_DIALOG, d,
DialogEwinInit);
XSelectInput(disp, d->win,
ExposureMask | PointerMotionMask | EnterWindowMask |
LeaveWindowMask | FocusChangeMask | KeyPressMask);
if (ewin)
{
DesktopRemoveEwin(ewin);
DesktopAddEwinToTop(ewin);
sn = FindSnapshot(ewin);
/* get the size right damnit! */
if (sn && sn->use_wh)
@ -683,16 +690,12 @@ ShowDialog(Dialog * d)
}
else
{
if (FindADialog())
if (FindADialog() > 1)
ArrangeEwin(ewin);
else
ArrangeEwinCentered(ewin, 0);
}
RestackEwin(ewin);
ShowEwin(ewin);
ewin->dialog = d;
ewin->MoveResize = DialogMoveResize;
ewin->Refresh = DialogRefresh;
}
if (!FindDialog(d->win))
@ -2306,6 +2309,7 @@ DialogEventExpose(XEvent * ev)
GetWinXY(win, &x, &y);
GetWinWH(win, (unsigned int *)&w, (unsigned int *)&h);
DialogDrawArea(d, x, y, w, h);
if (di == NULL)
goto exit;

View File

@ -436,23 +436,20 @@ FindEwinByDialog(Dialog * d)
EDBUG_RETURN(NULL);
}
char
int
FindADialog(void)
{
EWin **ewins;
int i, num;
int i, num, n;
EDBUG(6, "FindADialog");
ewins = (EWin **) ListItemType(&num, LIST_TYPE_EWIN);
for (i = 0; i < num; i++)
for (i = n = 0; i < num; i++)
{
if (ewins[i]->dialog)
{
Efree(ewins);
EDBUG_RETURN(1);
}
n++;
}
if (ewins)
Efree(ewins);
EDBUG_RETURN(0);
EDBUG_RETURN(n);
}

View File

@ -558,6 +558,14 @@ IconboxRefresh(EWin * ewin)
IconboxRedraw(ib);
}
static void
IconboxEwinInit(EWin * ewin, void *ptr)
{
ewin->ibox = (Iconbox *) ptr;
ewin->MoveResize = IconboxMoveResize;
ewin->Refresh = IconboxRefresh;
}
void
IconboxShow(Iconbox * ib)
{
@ -579,16 +587,14 @@ IconboxShow(Iconbox * ib)
XSetClassHint(disp, ib->win, xch);
XFree(xch);
MatchToSnapInfoIconbox(ib);
ewin = AddInternalToFamily(ib->win, 1, "ICONBOX", EWIN_TYPE_ICONBOX, ib);
ewin = AddInternalToFamily(ib->win, "ICONBOX", EWIN_TYPE_ICONBOX, ib,
IconboxEwinInit);
if (ewin)
{
Snapshot *sn;
int w, h;
ib->ewin = ewin;
ewin->ibox = ib;
ewin->MoveResize = IconboxMoveResize;
ewin->Refresh = IconboxRefresh;
IB_Reconfigure(ib);
sn = FindSnapshot(ewin);

View File

@ -23,6 +23,8 @@
#define DECLARE_STRUCT_MENU 1
#include "E.h"
static void MenuDrawItem(Menu * m, MenuItem * mi, char shape);
static void FileMenuUpdate(int val, void *data);
static void FillFlatFileMenu(Menu * m, MenuStyle * ms, char *name,
char *file, Menu * parent);
@ -108,6 +110,7 @@ MenuHide(Menu * m)
EWin *ewin;
EDBUG(5, "MenuHide");
if (m->win)
EUnmapWindow(disp, m->win);
@ -134,6 +137,7 @@ MenuHide(Menu * m)
EDBUG_RETURN_;
}
void MenuRedraw(Menu * m);
static void
MenuMoveResize(EWin * ewin, int resize)
{
@ -143,7 +147,7 @@ MenuMoveResize(EWin * ewin, int resize)
return;
if (conf.theme.transparency || IclassIsTransparent(m->style->bg_iclass))
MenuRealize(m);
MenuRedraw(m);
}
static void
@ -152,6 +156,14 @@ MenuRefresh(EWin * ewin)
MenuMoveResize(ewin, 0);
}
static void
MenuEwinInit(EWin * ewin, void *ptr)
{
ewin->menu = (Menu *) ptr;
ewin->MoveResize = MenuMoveResize;
ewin->Refresh = MenuRefresh;
}
void
MenuShow(Menu * m, char noshow)
{
@ -301,29 +313,21 @@ MenuShow(Menu * m, char noshow)
EMoveWindow(disp, m->win, -mode.x, -mode.y);
}
ewin =
AddInternalToFamily(m->win, 1, m->style->border_name, EWIN_TYPE_MENU, m);
ewin = AddInternalToFamily(m->win, m->style->border_name, EWIN_TYPE_MENU, m,
MenuEwinInit);
if (ewin)
{
DesktopRemoveEwin(ewin);
ewin->head = head_num;
DesktopAddEwinToTop(ewin);
if (ewin->desktop != 0)
MoveEwin(ewin, ewin->x - desks.desk[ewin->desktop].x,
ewin->y - desks.desk[ewin->desktop].y);
RestackEwin(ewin);
if (conf.menuslide)
InstantShadeEwin(ewin, 0);
ICCCM_Cmap(NULL);
MoveEwin(ewin, ewin->x, ewin->y);
if (!noshow)
{
ShowEwin(ewin);
if (conf.menuslide)
UnShadeEwin(ewin);
}
ewin->menu = m;
ewin->MoveResize = MenuMoveResize;
ewin->Refresh = MenuRefresh;
}
m->stuck = 0;
@ -503,9 +507,9 @@ MenuDestroy(Menu * m)
if (m->items)
Efree(m->items);
if (m->data)
Efree(m->data);
FreePmapMask(&m->pmm);
Efree(m);
@ -738,11 +742,13 @@ MenuRealize(Menu * m)
x = m->style->bg_iclass->padding.left;
y = m->style->bg_iclass->padding.top;
}
r = 0;
mmw = 0;
mmh = 0;
pq = queue_up;
queue_up = 0;
for (i = 0; i < m->num; i++)
{
EMoveResizeWindow(disp, m->items[i]->win, x, y, maxw, maxh);
@ -814,9 +820,20 @@ MenuRealize(Menu * m)
}
EResizeWindow(disp, m->win, mmw, mmh);
queue_up = pq;
EDBUG_RETURN_;
}
void
MenuRedraw(Menu * m)
{
int i, w, h;
if (!m->style->use_item_bg)
{
IclassApplyCopy(m->style->bg_iclass, m->win, mmw, mmh, 0, 0,
GetWinWH(m->win, &w, &h);
FreePmapMask(&m->pmm);
IclassApplyCopy(m->style->bg_iclass, m->win, w, h, 0, 0,
STATE_NORMAL, &m->pmm, 1);
ESetWindowBackgroundPixmap(disp, m->win, m->pmm.pmap);
EShapeCombineMask(disp, m->win, ShapeBounding, 0, 0, m->pmm.mask,
@ -830,9 +847,6 @@ MenuRealize(Menu * m)
MenuDrawItem(m, m->items[i], 0);
PropagateShapes(m->win);
}
queue_up = pq;
EDBUG_RETURN_;
}
void
@ -850,7 +864,7 @@ MenuDrawItem(Menu * m, MenuItem * mi, char shape)
queue_up = 0;
mi_pmm = &(mi->pmm[(int)(mi->state)]);
if (IclassIsTransparent(m->style->bg_iclass))
if (conf.theme.transparency || IclassIsTransparent(m->style->bg_iclass))
FreePmapMask(mi_pmm);
if (!mi_pmm->pmap)
{
@ -1852,6 +1866,30 @@ MenuCreateFromDesktops(char *name, MenuStyle * ms)
EDBUG_RETURN(m);
}
#if 0
Menu *
MenuCreateMoveToDesktop(char *name, MenuStyle * ms)
{
Menu *m;
int i;
char s1[256], s2[256];
MenuItem *mi;
EDBUG(5, "MenuCreateDesktops");
m = MenuCreate(name);
m->style = ms;
for (i = 0; i < mode.numdesktops; i++)
{
Esnprintf(s1, sizeof(s1), _("Desktop %i"), i);
Esnprintf(s2, sizeof(s2), "%i", i);
mi = MenuItemCreate(s1, NULL, ACTION_MOVE_TO_DESK, s2, NULL);
MenuAddItem(m, mi);
}
EDBUG_RETURN(m);
}
#endif
Menu *
MenuCreateFromGroups(char *name, MenuStyle * ms)
{
@ -2375,6 +2413,7 @@ SubmenuShowTimeout(int val, void *dat)
return;
if (!FindEwinByMenu(data->m))
return;
GetWinXY(data->mi->win, &mx, &my);
GetWinWH(data->mi->win, &mw, &mh);
MenuShow(data->mi->child, 1);

View File

@ -280,6 +280,14 @@ PagerRefresh(EWin * ewin)
{
}
static void
PagerEwinInit(EWin * ewin, void *ptr)
{
ewin->pager = (Pager *) ptr;
ewin->MoveResize = PagerMoveResize;
ewin->Refresh = PagerRefresh;
}
void
PagerShow(Pager * p)
{
@ -306,9 +314,8 @@ PagerShow(Pager * p)
pq = queue_up;
queue_up = 0;
MatchToSnapInfoPager(p);
ewin = AddInternalToFamily(p->win, 1,
(p->border_name) ? p->border_name : "PAGER",
EWIN_TYPE_PAGER, p);
ewin = AddInternalToFamily(p->win, (p->border_name) ? p->border_name :
"PAGER", EWIN_TYPE_PAGER, p, PagerEwinInit);
if (ewin)
{
char s[4096];
@ -326,9 +333,6 @@ PagerShow(Pager * p)
ewin->client.height.min = 8 * ay;
ewin->client.width.max = 320 * ax;
ewin->client.height.max = 240 * ay;
ewin->pager = p;
ewin->MoveResize = PagerMoveResize;
ewin->Refresh = PagerRefresh;
p->ewin = ewin;
p->visible = 1;