Improve on menu transparency. Avoid some unnecessary redraws.
SVN revision: 9256
This commit is contained in:
parent
8c3fcca71e
commit
5e2544a147
11
src/E.h
11
src/E.h
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
20
src/dialog.c
20
src/dialog.c
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
75
src/menus.c
75
src/menus.c
|
@ -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);
|
||||
|
|
16
src/pager.c
16
src/pager.c
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue