cvsimport

This commit is contained in:
okan
2014-09-18 13:56:58 +00:00
13 changed files with 301 additions and 257 deletions

144
client.c
View File

@ -31,8 +31,8 @@
#include "calmwm.h"
static struct client_ctx *client_mrunext(struct client_ctx *);
static struct client_ctx *client_mruprev(struct client_ctx *);
static struct client_ctx *client_next(struct client_ctx *);
static struct client_ctx *client_prev(struct client_ctx *);
static void client_mtf(struct client_ctx *);
static void client_none(struct screen_ctx *);
static void client_placecalc(struct client_ctx *);
@ -45,13 +45,16 @@ struct client_ctx *curcc = NULL;
struct client_ctx *
client_find(Window win)
{
struct screen_ctx *sc;
struct client_ctx *cc;
TAILQ_FOREACH(cc, &Clientq, entry)
if (cc->win == win)
return (cc);
return (NULL);
TAILQ_FOREACH(sc, &Screenq, entry) {
TAILQ_FOREACH(cc, &sc->clientq, entry) {
if (cc->win == win)
return(cc);
}
}
return(NULL);
}
struct client_ctx *
@ -63,16 +66,16 @@ client_init(Window win, struct screen_ctx *sc)
int mapped;
if (win == None)
return (NULL);
return(NULL);
if (!XGetWindowAttributes(X_Dpy, win, &wattr))
return (NULL);
return(NULL);
if (sc == NULL) {
sc = screen_fromroot(wattr.root);
sc = screen_find(wattr.root);
mapped = 1;
} else {
if (wattr.override_redirect || wattr.map_state != IsViewable)
return (NULL);
return(NULL);
mapped = wattr.map_state != IsUnmapped;
}
@ -126,8 +129,7 @@ client_init(Window win, struct screen_ctx *sc)
(state == IconicState) ? client_hide(cc) : client_unhide(cc);
TAILQ_INSERT_TAIL(&sc->mruq, cc, mru_entry);
TAILQ_INSERT_TAIL(&Clientq, cc, entry);
TAILQ_INSERT_TAIL(&sc->clientq, cc, entry);
xu_ewmh_net_client_list(sc);
xu_ewmh_restore_net_wm_state(cc);
@ -138,7 +140,7 @@ client_init(Window win, struct screen_ctx *sc)
XSync(X_Dpy, False);
XUngrabServer(X_Dpy);
return (cc);
return(cc);
}
void
@ -147,13 +149,12 @@ client_delete(struct client_ctx *cc)
struct screen_ctx *sc = cc->sc;
struct winname *wn;
TAILQ_REMOVE(&sc->mruq, cc, mru_entry);
TAILQ_REMOVE(&Clientq, cc, entry);
TAILQ_REMOVE(&sc->clientq, cc, entry);
xu_ewmh_net_client_list(sc);
if (cc->group != NULL)
TAILQ_REMOVE(&cc->group->clients, cc, group_entry);
TAILQ_REMOVE(&cc->group->clientq, cc, group_entry);
if (cc == client_current())
client_none(sc);
@ -186,7 +187,7 @@ client_setactive(struct client_ctx *cc)
XInstallColormap(X_Dpy, cc->colormap);
if ((cc->flags & CLIENT_INPUT) ||
((cc->flags & CLIENT_WM_TAKE_FOCUS) == 0)) {
(!(cc->flags & CLIENT_WM_TAKE_FOCUS))) {
XSetInputFocus(X_Dpy, cc->win,
RevertToPointerRoot, CurrentTime);
}
@ -194,7 +195,7 @@ client_setactive(struct client_ctx *cc)
client_msg(cc, cwmh[WM_TAKE_FOCUS], Last_Event_Time);
if ((oldcc = client_current())) {
oldcc->active = 0;
oldcc->flags &= ~CLIENT_ACTIVE;
client_draw_border(oldcc);
}
@ -203,7 +204,7 @@ client_setactive(struct client_ctx *cc)
client_mtf(cc);
curcc = cc;
cc->active = 1;
cc->flags |= CLIENT_ACTIVE;
cc->flags &= ~CLIENT_URGENCY;
client_draw_border(cc);
conf_grab_mouse(cc->win);
@ -226,11 +227,11 @@ client_none(struct screen_ctx *sc)
struct client_ctx *
client_current(void)
{
return (curcc);
return(curcc);
}
void
client_freeze(struct client_ctx *cc)
client_toggle_freeze(struct client_ctx *cc)
{
if (cc->flags & CLIENT_FREEZE)
cc->flags &= ~CLIENT_FREEZE;
@ -239,7 +240,18 @@ client_freeze(struct client_ctx *cc)
}
void
client_sticky(struct client_ctx *cc)
client_toggle_hidden(struct client_ctx *cc)
{
if (cc->flags & CLIENT_HIDDEN)
cc->flags &= ~CLIENT_HIDDEN;
else
cc->flags |= CLIENT_HIDDEN;
xu_ewmh_set_net_wm_state(cc);
}
void
client_toggle_sticky(struct client_ctx *cc)
{
if (cc->flags & CLIENT_STICKY)
cc->flags &= ~CLIENT_STICKY;
@ -250,7 +262,7 @@ client_sticky(struct client_ctx *cc)
}
void
client_fullscreen(struct client_ctx *cc)
client_toggle_fullscreen(struct client_ctx *cc)
{
struct screen_ctx *sc = cc->sc;
struct geom xine;
@ -259,7 +271,7 @@ client_fullscreen(struct client_ctx *cc)
!(cc->flags & CLIENT_FULLSCREEN))
return;
if ((cc->flags & CLIENT_FULLSCREEN)) {
if (cc->flags & CLIENT_FULLSCREEN) {
cc->bwidth = Conf.bwidth;
cc->geom = cc->fullgeom;
cc->flags &= ~(CLIENT_FULLSCREEN | CLIENT_FREEZE);
@ -282,12 +294,12 @@ resize:
}
void
client_maximize(struct client_ctx *cc)
client_toggle_maximize(struct client_ctx *cc)
{
struct screen_ctx *sc = cc->sc;
struct geom xine;
if (cc->flags & CLIENT_FREEZE)
if (cc->flags & (CLIENT_FREEZE|CLIENT_STICKY))
return;
if ((cc->flags & CLIENT_MAXFLAGS) == CLIENT_MAXIMIZED) {
@ -296,12 +308,12 @@ client_maximize(struct client_ctx *cc)
goto resize;
}
if ((cc->flags & CLIENT_VMAXIMIZED) == 0) {
if (!(cc->flags & CLIENT_VMAXIMIZED)) {
cc->savegeom.h = cc->geom.h;
cc->savegeom.y = cc->geom.y;
}
if ((cc->flags & CLIENT_HMAXIMIZED) == 0) {
if (!(cc->flags & CLIENT_HMAXIMIZED)) {
cc->savegeom.w = cc->geom.w;
cc->savegeom.x = cc->geom.x;
}
@ -327,12 +339,12 @@ resize:
}
void
client_vmaximize(struct client_ctx *cc)
client_toggle_vmaximize(struct client_ctx *cc)
{
struct screen_ctx *sc = cc->sc;
struct geom xine;
if (cc->flags & CLIENT_FREEZE)
if (cc->flags & (CLIENT_FREEZE|CLIENT_STICKY))
return;
if (cc->flags & CLIENT_VMAXIMIZED) {
@ -359,12 +371,12 @@ resize:
}
void
client_hmaximize(struct client_ctx *cc)
client_toggle_hmaximize(struct client_ctx *cc)
{
struct screen_ctx *sc = cc->sc;
struct geom xine;
if (cc->flags & CLIENT_FREEZE)
if (cc->flags & (CLIENT_FREEZE|CLIENT_STICKY))
return;
if (cc->flags & CLIENT_HMAXIMIZED) {
@ -484,7 +496,7 @@ client_hide(struct client_ctx *cc)
XUnmapWindow(X_Dpy, cc->win);
cc->active = 0;
cc->flags &= ~CLIENT_ACTIVE;
cc->flags |= CLIENT_HIDDEN;
client_set_wm_state(cc, IconicState);
@ -508,7 +520,7 @@ client_unhide(struct client_ctx *cc)
void
client_urgency(struct client_ctx *cc)
{
if (!cc->active)
if (!(cc->flags & CLIENT_ACTIVE))
cc->flags |= CLIENT_URGENCY;
}
@ -518,7 +530,7 @@ client_draw_border(struct client_ctx *cc)
struct screen_ctx *sc = cc->sc;
unsigned long pixel;
if (cc->active)
if (cc->flags & CLIENT_ACTIVE)
switch (cc->flags & CLIENT_HIGHLIGHT) {
case CLIENT_GROUP:
pixel = sc->xftcolor[CWM_COLOR_BORDER_GROUP].pixel;
@ -605,14 +617,14 @@ client_setname(struct client_ctx *cc)
if (!xu_getstrprop(cc->win, XA_WM_NAME, &newname))
newname = xstrdup("");
TAILQ_FOREACH(wn, &cc->nameq, entry)
TAILQ_FOREACH(wn, &cc->nameq, entry) {
if (strcmp(wn->name, newname) == 0) {
/* Move to the last since we got a hit. */
TAILQ_REMOVE(&cc->nameq, wn, entry);
TAILQ_INSERT_TAIL(&cc->nameq, wn, entry);
goto match;
}
}
wn = xmalloc(sizeof(*wn));
wn->name = newname;
TAILQ_INSERT_TAIL(&cc->nameq, wn, entry);
@ -638,27 +650,26 @@ client_cycle(struct screen_ctx *sc, int flags)
struct client_ctx *oldcc, *newcc;
int again = 1;
oldcc = client_current();
/* If no windows then you cant cycle */
if (TAILQ_EMPTY(&sc->mruq))
if (TAILQ_EMPTY(&sc->clientq))
return;
oldcc = client_current();
if (oldcc == NULL)
oldcc = (flags & CWM_RCYCLE ?
TAILQ_LAST(&sc->mruq, cycle_entry_q) :
TAILQ_FIRST(&sc->mruq));
TAILQ_LAST(&sc->clientq, client_ctx_q) :
TAILQ_FIRST(&sc->clientq));
newcc = oldcc;
while (again) {
again = 0;
newcc = (flags & CWM_RCYCLE ? client_mruprev(newcc) :
client_mrunext(newcc));
newcc = (flags & CWM_RCYCLE ? client_prev(newcc) :
client_next(newcc));
/* Only cycle visible and non-ignored windows. */
if ((newcc->flags & (CLIENT_HIDDEN|CLIENT_IGNORE))
|| ((flags & CWM_INGROUP) && (newcc->group != oldcc->group)))
|| ((flags & CWM_INGROUP) &&
(newcc->group != oldcc->group)))
again = 1;
/* Is oldcc the only non-hidden window? */
@ -691,23 +702,23 @@ client_cycle_leave(struct screen_ctx *sc)
}
static struct client_ctx *
client_mrunext(struct client_ctx *cc)
client_next(struct client_ctx *cc)
{
struct screen_ctx *sc = cc->sc;
struct client_ctx *ccc;
return ((ccc = TAILQ_NEXT(cc, mru_entry)) != NULL ?
ccc : TAILQ_FIRST(&sc->mruq));
return((ccc = TAILQ_NEXT(cc, entry)) != NULL ?
ccc : TAILQ_FIRST(&sc->clientq));
}
static struct client_ctx *
client_mruprev(struct client_ctx *cc)
client_prev(struct client_ctx *cc)
{
struct screen_ctx *sc = cc->sc;
struct client_ctx *ccc;
return ((ccc = TAILQ_PREV(cc, cycle_entry_q, mru_entry)) != NULL ?
ccc : TAILQ_LAST(&sc->mruq, cycle_entry_q));
return((ccc = TAILQ_PREV(cc, client_ctx_q, entry)) != NULL ?
ccc : TAILQ_LAST(&sc->clientq, client_ctx_q));
}
static void
@ -765,8 +776,8 @@ client_mtf(struct client_ctx *cc)
{
struct screen_ctx *sc = cc->sc;
TAILQ_REMOVE(&sc->mruq, cc, mru_entry);
TAILQ_INSERT_HEAD(&sc->mruq, cc, mru_entry);
TAILQ_REMOVE(&sc->clientq, cc, entry);
TAILQ_INSERT_HEAD(&sc->clientq, cc, entry);
}
void
@ -871,11 +882,12 @@ client_mwm_hints(struct client_ctx *cc)
struct mwm_hints *mwmh;
if (xu_getprop(cc->win, cwmh[_MOTIF_WM_HINTS], cwmh[_MOTIF_WM_HINTS],
PROP_MWM_HINTS_ELEMENTS, (unsigned char **)&mwmh) == MWM_NUMHINTS)
PROP_MWM_HINTS_ELEMENTS, (unsigned char **)&mwmh) == MWM_NUMHINTS) {
if (mwmh->flags & MWM_HINTS_DECORATIONS &&
!(mwmh->decorations & MWM_DECOR_ALL) &&
!(mwmh->decorations & MWM_DECOR_BORDER))
cc->bwidth = 0;
}
}
void
@ -896,7 +908,7 @@ client_transient(struct client_ctx *cc)
static int
client_inbound(struct client_ctx *cc, int x, int y)
{
return (x < cc->geom.w && x >= 0 &&
return(x < cc->geom.w && x >= 0 &&
y < cc->geom.h && y >= 0);
}
@ -916,15 +928,15 @@ client_snapcalc(int n0, int n1, int e0, int e1, int snapdist)
/* possible to snap in both directions */
if (s0 != 0 && s1 != 0)
if (abs(s0) < abs(s1))
return (s0);
return(s0);
else
return (s1);
return(s1);
else if (s0 != 0)
return (s0);
return(s0);
else if (s1 != 0)
return (s1);
return(s1);
else
return (0);
return(0);
}
void
@ -940,7 +952,7 @@ client_htile(struct client_ctx *cc)
return;
i = n = 0;
TAILQ_FOREACH(ci, &gc->clients, group_entry) {
TAILQ_FOREACH(ci, &gc->clientq, group_entry) {
if (ci->flags & CLIENT_HIDDEN ||
ci->flags & CLIENT_IGNORE || (ci == cc))
continue;
@ -968,7 +980,7 @@ client_htile(struct client_ctx *cc)
x = xine.x;
w = xine.w / n;
h = xine.h - mh;
TAILQ_FOREACH(ci, &gc->clients, group_entry) {
TAILQ_FOREACH(ci, &gc->clientq, group_entry) {
if (ci->flags & CLIENT_HIDDEN ||
ci->flags & CLIENT_IGNORE || (ci == cc))
continue;
@ -999,7 +1011,7 @@ client_vtile(struct client_ctx *cc)
return;
i = n = 0;
TAILQ_FOREACH(ci, &gc->clients, group_entry) {
TAILQ_FOREACH(ci, &gc->clientq, group_entry) {
if (ci->flags & CLIENT_HIDDEN ||
ci->flags & CLIENT_IGNORE || (ci == cc))
continue;
@ -1027,7 +1039,7 @@ client_vtile(struct client_ctx *cc)
y = xine.y;
h = xine.h / n;
w = xine.w - mw;
TAILQ_FOREACH(ci, &gc->clients, group_entry) {
TAILQ_FOREACH(ci, &gc->clientq, group_entry) {
if (ci->flags & CLIENT_HIDDEN ||
ci->flags & CLIENT_IGNORE || (ci == cc))
continue;