Hide Border struct internals

This commit is contained in:
Kim Woelders 2013-06-06 22:26:28 +02:00
parent 5132afd313
commit bf1095d107
6 changed files with 171 additions and 132 deletions

View File

@ -49,6 +49,61 @@
#define EWIN_BORDER_TITLE_EVENT_MASK \
(EWIN_BORDER_PART_EVENT_MASK)
typedef struct {
int min, max;
} WinLimit;
typedef struct {
int originbox;
struct {
int percent;
int absolute;
} x , y;
} WinPoint;
typedef struct {
WinLimit width, height;
WinPoint topleft, bottomright;
} Geometry;
typedef struct {
Geometry geom;
ImageClass *iclass;
ActionClass *aclass;
TextClass *tclass;
ECursor *ec;
signed char ontop;
int flags;
char keep_for_shade;
} WinPart;
struct _border {
dlist_t list;
char *name;
char *group_border_name;
EImageBorder border;
int num_winparts;
WinPart *part;
char no_extent;
char changes_shape;
char shadedir;
char throwaway;
unsigned int ref_count;
ActionClass *aclass;
};
struct _ewinbit {
EWin *ewin; /* Belongs to */
Win win;
int x, y, w, h;
int cx, cy, cw, ch;
char state;
char expose;
char left;
ImageState *is;
TextState *ts;
};
static LIST_HEAD(border_list);
static void _BorderDestroy(Border * b);
@ -485,6 +540,24 @@ BorderCanShade(const Border * b)
return !b->no_extent;
}
const EImageBorder *
BorderGetSize(const Border * b)
{
return &b->border;
}
int
BorderGetShadedir(const Border * b)
{
return b->shadedir;
}
ActionClass *
BorderGetAclass(const Border * b)
{
return b->aclass;
}
void
EwinBorderSelect(EWin * ewin)
{
@ -670,6 +743,12 @@ EwinBorderSetInitially(EWin * ewin, const char *name)
_EwinBorderAssign(ewin, BorderFind(name));
}
const Border *
EwinBorderGetGroupBorder(const EWin * ewin)
{
return BorderFind(ewin->border->group_border_name);
}
static Border *
_BorderCreate(const char *name)
{

View File

@ -26,69 +26,17 @@
#include "eimage.h"
#include "etypes.h"
#include "list.h"
#include "xtypes.h"
typedef struct {
int min, max;
} WinLimit;
typedef struct {
int originbox;
struct {
int percent;
int absolute;
} x , y;
} WinPoint;
typedef struct {
WinLimit width, height;
WinPoint topleft, bottomright;
} Geometry;
typedef struct {
Geometry geom;
ImageClass *iclass;
ActionClass *aclass;
TextClass *tclass;
ECursor *ec;
signed char ontop;
int flags;
char keep_for_shade;
} WinPart;
struct _border {
dlist_t list;
char *name;
char *group_border_name;
EImageBorder border;
int num_winparts;
WinPart *part;
char no_extent;
char changes_shape;
char shadedir;
char throwaway;
unsigned int ref_count;
ActionClass *aclass;
};
struct _ewinbit {
EWin *ewin; /* Belongs to */
Win win;
int x, y, w, h;
int cx, cy, cw, ch;
char state;
char expose;
char left;
ImageState *is;
TextState *ts;
};
/* borders.c */
Border *BorderFind(const char *name);
const char *BorderGetName(const Border * b);
int BorderCanShade(const Border * b);
const EImageBorder *BorderGetSize(const Border * b);
int BorderGetShadedir(const Border * b);
ActionClass *BorderGetAclass(const Border * b);
int BorderConfigLoad(FILE * fs);
void EwinBorderSelect(EWin * ewin);
void EwinBorderDetach(EWin * ewin);
void EwinBorderSetTo(EWin * ewin, const Border * b);
@ -98,8 +46,10 @@ void EwinBorderMinShadeSize(const EWin * ewin, int *mw, int *mh);
void EwinBorderUpdateInfo(EWin * ewin);
void EwinBorderChange(EWin * ewin, const Border * b, int normal);
void EwinBorderSetInitially(EWin * ewin, const char *name);
const Border *EwinBorderGetGroupBorder(const EWin * ewin);
int BorderWinpartIndex(EWin * ewin, Win win);
void BorderCheckState(EWin * ewin, XEvent * ev);
Border *BorderCreateFiller(int w, int h, int sw, int sh);
Border **BordersGetList(int *pnum);

View File

@ -174,6 +174,7 @@ doEwinMoveResize(EWin * ewin, Desk * dsk, int x, int y, int w, int h, int flags)
EWin **lst;
int i, num;
Desk *pdesk;
const EImageBorder *pad;
if (ewin->state.zoomed)
return;
@ -191,6 +192,8 @@ doEwinMoveResize(EWin * ewin, Desk * dsk, int x, int y, int w, int h, int flags)
reparent = move = resize = raise = 0;
floating = EoIsFloating(ewin);
pad = BorderGetSize(ewin->border);
if (flags & MRF_FLOAT)
{
if (floating == 0)
@ -310,10 +313,8 @@ doEwinMoveResize(EWin * ewin, Desk * dsk, int x, int y, int w, int h, int flags)
}
else
{
w = ewin->client.w + ewin->border->border.left +
ewin->border->border.right;
h = ewin->client.h + ewin->border->border.top +
ewin->border->border.bottom;
w = ewin->client.w + pad->left + pad->right;
h = ewin->client.h + pad->top + pad->bottom;
}
}
@ -321,8 +322,8 @@ doEwinMoveResize(EWin * ewin, Desk * dsk, int x, int y, int w, int h, int flags)
dy = y - EoGetY(ewin);
if ((dx != 0) || (dy != 0))
move = 1;
ewin->client.x = x + ewin->border->border.left;
ewin->client.y = y + ewin->border->border.top;
ewin->client.x = x + pad->left;
ewin->client.y = y + pad->top;
#if 0
Eprintf("repa=%d float=%d raise=%d move=%d resz=%d\n",
@ -355,9 +356,7 @@ doEwinMoveResize(EWin * ewin, Desk * dsk, int x, int y, int w, int h, int flags)
if (flags & MRF_RESIZE)
{
if (!ewin->state.shaded)
EMoveResizeWindow(EwinGetClientConWin(ewin),
ewin->border->border.left,
ewin->border->border.top,
EMoveResizeWindow(EwinGetClientConWin(ewin), pad->left, pad->top,
ewin->client.w, ewin->client.h);
#if USE_CONTAINER_WIN
EMoveResizeWindow(EwinGetClientWin(ewin), 0, 0, ewin->client.w,
@ -764,7 +763,7 @@ EwinInstantShade(EWin * ewin, int force)
EwinBorderMinShadeSize(ewin, &minw, &minh);
switch (ewin->border->shadedir)
switch (BorderGetShadedir(ewin->border))
{
default:
case SHADE_LEFT:
@ -802,6 +801,7 @@ EwinInstantUnShade(EWin * ewin)
{
XSetWindowAttributes att;
int x, y, w, h;
const EImageBorder *pad;
if (ewin->state.zoomed)
return;
@ -811,18 +811,18 @@ EwinInstantUnShade(EWin * ewin)
x = EoGetX(ewin);
y = EoGetY(ewin);
switch (ewin->border->shadedir)
pad = BorderGetSize(ewin->border);
switch (BorderGetShadedir(ewin->border))
{
default:
break;
case SHADE_RIGHT:
w = ewin->client.w + ewin->border->border.left +
ewin->border->border.right;
w = ewin->client.w + pad->left + pad->right;
x = x + EoGetW(ewin) - w;
break;
case SHADE_DOWN:
h = ewin->client.h + ewin->border->border.top +
ewin->border->border.bottom;
h = ewin->client.h + pad->top + pad->bottom;
y = y + EoGetH(ewin) - h;
break;
}
@ -871,6 +871,7 @@ _EwinShadeStart(_ewin_shade_data * esd)
EWin *ewin = esd->ewin;
int minw, minh;
XSetWindowAttributes att;
const EImageBorder *pad;
esd->start.x = EoGetX(ewin);
esd->start.y = EoGetY(ewin);
@ -883,19 +884,21 @@ _EwinShadeStart(_ewin_shade_data * esd)
EwinBorderMinShadeSize(ewin, &minw, &minh);
switch (ewin->border->shadedir)
pad = BorderGetSize(ewin->border);
switch (BorderGetShadedir(ewin->border))
{
default:
case SHADE_LEFT:
att.win_gravity = EastGravity;
esd->a = esd->start.w;
esd->b = ewin->border->border.left + ewin->border->border.right;
esd->b = pad->left + pad->right;
esd->final.w = minw;
break;
case SHADE_RIGHT:
att.win_gravity = WestGravity;
esd->a = esd->start.w;
esd->b = ewin->border->border.left + ewin->border->border.right;
esd->b = pad->left + pad->right;
esd->c = esd->start.x + esd->start.w;
esd->final.x = esd->c - minw;
esd->final.w = minw;
@ -903,13 +906,13 @@ _EwinShadeStart(_ewin_shade_data * esd)
case SHADE_UP:
att.win_gravity = SouthGravity;
esd->a = esd->start.h;
esd->b = ewin->border->border.top + ewin->border->border.bottom;
esd->b = pad->top + pad->bottom;
esd->final.h = minh;
break;
case SHADE_DOWN:
att.win_gravity = SouthGravity;
esd->a = esd->start.h;
esd->b = ewin->border->border.top + ewin->border->border.bottom;
esd->b = pad->top + pad->bottom;
esd->c = esd->start.y + esd->start.h;
esd->final.y = esd->c - minh;
esd->final.h = minh;
@ -981,6 +984,7 @@ _EwinUnshadeStart(_ewin_shade_data * esd)
EWin *ewin = esd->ewin;
int cow __UNUSED__, coh __UNUSED__, clx, cly;
XSetWindowAttributes att;
const EImageBorder *pad;
esd->start.x = EoGetX(ewin);
esd->start.y = EoGetY(ewin);
@ -997,12 +1001,14 @@ _EwinUnshadeStart(_ewin_shade_data * esd)
clx = cly = 0;
switch (ewin->border->shadedir)
pad = BorderGetSize(ewin->border);
switch (BorderGetShadedir(ewin->border))
{
default:
case SHADE_LEFT:
att.win_gravity = NorthEastGravity;
esd->a = ewin->border->border.left + ewin->border->border.right;
esd->a = pad->left + pad->right;
esd->b = ewin->client.w + esd->a;
esd->c = 0; /* Not used */
esd->final.w = esd->b;
@ -1011,7 +1017,7 @@ _EwinUnshadeStart(_ewin_shade_data * esd)
break;
case SHADE_RIGHT:
att.win_gravity = NorthWestGravity;
esd->a = ewin->border->border.left + ewin->border->border.right;
esd->a = pad->left + pad->right;
esd->b = ewin->client.w + esd->a;
esd->c = esd->start.x + esd->start.w; /* NB! w != a is possible */
esd->final.x = esd->c - esd->b;
@ -1020,7 +1026,7 @@ _EwinUnshadeStart(_ewin_shade_data * esd)
break;
case SHADE_UP:
att.win_gravity = SouthEastGravity;
esd->a = ewin->border->border.top + ewin->border->border.bottom;
esd->a = pad->top + pad->bottom;
esd->b = ewin->client.h + esd->a;
esd->c = 0; /* Not used */
esd->final.h = esd->b;
@ -1029,7 +1035,7 @@ _EwinUnshadeStart(_ewin_shade_data * esd)
break;
case SHADE_DOWN:
att.win_gravity = SouthEastGravity;
esd->a = ewin->border->border.top + ewin->border->border.bottom;
esd->a = pad->top + pad->bottom;
esd->b = ewin->client.h + esd->a;
esd->c = esd->start.y + esd->start.h; /* NB! h != a is possible */
esd->final.y = esd->c - esd->b;
@ -1042,15 +1048,11 @@ _EwinUnshadeStart(_ewin_shade_data * esd)
EChangeWindowAttributes(EwinGetClientWin(ewin), CWWinGravity, &att);
EWindowSync(EwinGetClientWin(ewin)); /* Gravity - recache */
#if USE_CONTAINER_WIN
EMoveResizeWindow(ewin->win_container,
ewin->border->border.left, ewin->border->border.top,
cow, coh);
EMoveResizeWindow(ewin->win_container, pad->left, pad->top, cow, coh);
EMoveResizeWindow(EwinGetClientWin(ewin), clx, cly,
ewin->client.w, ewin->client.h);
#else
EMoveResizeWindow(EwinGetClientWin(ewin),
ewin->border->border.left + clx,
ewin->border->border.top + cly,
EMoveResizeWindow(EwinGetClientWin(ewin), pad->left + clx, pad->top + cly,
ewin->client.w, ewin->client.h);
#endif
}
@ -1060,6 +1062,9 @@ _EwinUnshadeEnd(_ewin_shade_data * esd)
{
EWin *ewin = esd->ewin;
XSetWindowAttributes att;
#if USE_CONTAINER_WIN
const EImageBorder *pad = BorderGetSize(ewin->border);
#endif
EoMoveResize(ewin, esd->final.x, esd->final.y, esd->final.w, esd->final.h);
@ -1070,8 +1075,7 @@ _EwinUnshadeEnd(_ewin_shade_data * esd)
#if USE_CONTAINER_WIN
EMoveResizeWindow(EwinGetClientWin(ewin), 0, 0,
ewin->client.w, ewin->client.h);
EMoveResizeWindow(ewin->win_container,
ewin->border->border.left, ewin->border->border.top,
EMoveResizeWindow(ewin->win_container, pad->left, pad->top,
ewin->client.w, ewin->client.h);
#else
EWindowSync(EwinGetClientWin(ewin)); /* Gravity - recache */
@ -1097,6 +1101,7 @@ _EwinShadeRun(EObj * eobj, int remaining, void *state)
EWin *ewin = (EWin *) eobj;
int k, x, y, w, h, ww, hh;
int cow __UNUSED__, coh __UNUSED__, shx, shy;
const EImageBorder *pad;
k = 1024 - remaining;
@ -1110,14 +1115,16 @@ _EwinShadeRun(EObj * eobj, int remaining, void *state)
shx = shy = 0;
switch (ewin->border->shadedir)
pad = BorderGetSize(ewin->border);
switch (BorderGetShadedir(ewin->border))
{
default:
case SHADE_LEFT:
w = ((esd->a * (1024 - k)) + (esd->b * k)) >> 10;
if (w <= 0)
w = 1;
ww = w - (ewin->border->border.left + ewin->border->border.right);
ww = w - (pad->left + pad->right);
if (ww <= 0)
ww = 1;
cow = ww;
@ -1128,7 +1135,7 @@ _EwinShadeRun(EObj * eobj, int remaining, void *state)
if (w <= 0)
w = 1;
x = esd->c - w;
ww = w - (ewin->border->border.left + ewin->border->border.right);
ww = w - (pad->left + pad->right);
if (ww <= 0)
ww = 1;
cow = ww;
@ -1137,7 +1144,7 @@ _EwinShadeRun(EObj * eobj, int remaining, void *state)
h = ((esd->a * (1024 - k)) + (esd->b * k)) >> 10;
if (h <= 0)
h = 1;
hh = h - (ewin->border->border.top + ewin->border->border.bottom);
hh = h - (pad->top + pad->bottom);
if (hh <= 0)
hh = 1;
coh = hh;
@ -1148,7 +1155,7 @@ _EwinShadeRun(EObj * eobj, int remaining, void *state)
if (h <= 0)
h = 1;
y = esd->c - h;
hh = h - (ewin->border->border.top + ewin->border->border.bottom);
hh = h - (pad->top + pad->bottom);
if (hh <= 0)
hh = 1;
coh = hh;
@ -1156,13 +1163,9 @@ _EwinShadeRun(EObj * eobj, int remaining, void *state)
break;
}
#if USE_CONTAINER_WIN
EMoveResizeWindow(ewin->win_container,
ewin->border->border.left,
ewin->border->border.top, cow, coh);
EMoveResizeWindow(ewin->win_container, pad->left, pad->top, cow, coh);
#else
EMoveResizeWindow(EwinGetClientWin(ewin),
ewin->border->border.left + shx,
ewin->border->border.top + shy,
EMoveResizeWindow(EwinGetClientWin(ewin), pad->left + shx, pad->top + shy,
ewin->client.w, ewin->client.h);
#endif
if (ewin->state.shaped)

View File

@ -313,22 +313,22 @@ EwinManage(EWin * ewin)
static void
EwinSetGeometry(EWin * ewin)
{
int x, y, l, r, t, b;
int x, y;
int grav;
const EImageBorder *pad;
grav = (ewin->state.identified) ? StaticGravity : ewin->icccm.grav;
EwinGetPosition(ewin, ewin->client.x, ewin->client.y, grav, &x, &y);
l = ewin->border->border.left;
r = ewin->border->border.right;
t = ewin->border->border.top;
b = ewin->border->border.bottom;
pad = BorderGetSize(ewin->border);
ewin->client.x = x + l;
ewin->client.y = y + t;
ewin->client.x = x + pad->left;
ewin->client.y = y + pad->top;
EoMoveResize(ewin, x, y, ewin->client.w + l + r, ewin->client.h + t + b);
EoMoveResize(ewin, x, y,
ewin->client.w + pad->left + pad->right,
ewin->client.h + pad->top + pad->bottom);
}
static void
@ -570,10 +570,13 @@ void
EwinGetPosition(const EWin * ewin, int x, int y, int grav, int *px, int *py)
{
int bw, bd_lr, bd_tb;
const EImageBorder *pad;
bw = ewin->client.bw;
bd_lr = ewin->border->border.left + ewin->border->border.right;
bd_tb = ewin->border->border.top + ewin->border->border.bottom;
pad = BorderGetSize(ewin->border);
bd_lr = pad->left + pad->right;
bd_tb = pad->top + pad->bottom;
if (grav == 0)
grav = ewin->icccm.grav;
@ -596,7 +599,7 @@ EwinGetPosition(const EWin * ewin, int x, int y, int grav, int *px, int *py)
x -= bd_lr - bw;
break;
case StaticGravity:
x -= ewin->border->border.left;
x -= pad->left;
break;
default:
break;
@ -620,7 +623,7 @@ EwinGetPosition(const EWin * ewin, int x, int y, int grav, int *px, int *py)
y -= bd_tb - bw;
break;
case StaticGravity:
y -= ewin->border->border.top;
y -= pad->top;
break;
default:
break;
@ -1116,12 +1119,13 @@ EwinWithdraw(EWin * ewin, Win to)
if (xwin == EwinGetContainerXwin(ewin))
{
const EImageBorder *pad = BorderGetSize(ewin->border);
/* Park the client window on the new root */
x = ewin->client.x;
y = ewin->client.y;
ETranslateCoordinates(EwinGetClientWin(ewin), VROOT,
-ewin->border->border.left,
-ewin->border->border.top, &x, &y, NULL);
-pad->left, -pad->top, &x, &y, NULL);
EReparentWindow(EwinGetClientWin(ewin), to, x, y);
HintsDelWindowHints(ewin);
}
@ -1659,18 +1663,18 @@ EwinBorderGetName(const EWin * ewin)
void
EwinBorderGetSize(const EWin * ewin, int *bl, int *br, int *bt, int *bb)
{
const Border *b = ewin->border;
const EImageBorder *pad = BorderGetSize(ewin->border);
if (!b)
if (!pad)
{
*bl = *br = *bt = *bb = 0;
return;
}
*bl = b->border.left;
*br = b->border.right;
*bt = b->border.top;
*bb = b->border.bottom;
*bl = pad->left;
*br = pad->right;
*bt = pad->top;
*bb = pad->bottom;
}
void
@ -2523,8 +2527,8 @@ EwinHandleEventsClient(Win win __UNUSED__, XEvent * ev, void *prm)
case FocusOut:
if (ev->xfocus.detail == NotifyInferior)
break;
if (ewin->border->aclass)
ActionclassEvent(ewin->border->aclass, ev, ewin);
if (BorderGetAclass(ewin->border))
ActionclassEvent(BorderGetAclass(ewin->border), ev, ewin);
FocusHandleChange(ewin, ev);
break;

View File

@ -535,7 +535,7 @@ _EwinGroupsShowHide(EWin * ewin, int group_index, char onoff)
for (i = 0; i < num; i++)
{
if (onoff == SET_ON)
b = BorderFind(gwins[i]->border->group_border_name);
b = EwinBorderGetGroupBorder(gwins[i]);
else
b = gwins[i]->normal_border;

View File

@ -336,18 +336,21 @@ MenuShow(Menu * m, char noshow)
if (b)
{
int sx, sy, sw, sh;
const EImageBorder *pad;
pad = BorderGetSize(b);
head_num = ScreenGetGeometryByPointer(&sx, &sy, &sw, &sh);
if (wx > sx + sw - mw - b->border.right)
wx = sx + sw - mw - b->border.right;
if (wx < sx + b->border.left)
wx = sx + b->border.left;
if (wx > sx + sw - mw - pad->right)
wx = sx + sw - mw - pad->right;
if (wx < sx + pad->left)
wx = sx + pad->left;
if (wy > sy + sh - mh - b->border.bottom)
wy = sy + sh - mh - b->border.bottom;
if (wy < sy + b->border.top)
wy = sy + b->border.top;
if (wy > sy + sh - mh - pad->bottom)
wy = sy + sh - mh - pad->bottom;
if (wy < sy + pad->top)
wy = sy + pad->top;
}
}