From e2f3810fe83a7c7fdb4bd245ccdf5e4e343d1a55 Mon Sep 17 00:00:00 2001 From: oga Date: Thu, 22 Jan 2009 15:26:33 +0000 Subject: [PATCH] Cache all of the X atoms we use at startup. Do this instead of querying for them every time we use them. This removes an XXX that has been in there since time began. This will become more important as we move towards supporting netwm. ok todd@, okan@. --- calmwm.c | 2 ++ calmwm.h | 10 ++++++++++ client.c | 26 +++++++------------------- xutil.c | 22 +++++++++++++--------- 4 files changed, 32 insertions(+), 28 deletions(-) diff --git a/calmwm.c b/calmwm.c index c332e55..6dc7cb2 100644 --- a/calmwm.c +++ b/calmwm.c @@ -74,10 +74,12 @@ main(int argc, char **argv) bzero(&Conf, sizeof(Conf)); conf_setup(&Conf, conf_file); client_setup(); + xu_getatoms(); x_setup(); Starting = 0; xev_init(); + XEV_QUICK(NULL, NULL, MapRequest, xev_handle_maprequest, NULL); XEV_QUICK(NULL, NULL, UnmapNotify, xev_handle_unmapnotify, NULL); XEV_QUICK(NULL, NULL, ConfigureRequest, diff --git a/calmwm.h b/calmwm.h index 83dadde..95c4e8c 100644 --- a/calmwm.h +++ b/calmwm.h @@ -373,6 +373,7 @@ struct xevent *xev_new(Window *, Window *, int, void xev_register(struct xevent *); void xev_loop(void); +void xu_getatoms(void); int xu_ptr_grab(Window, int, Cursor); void xu_btn_grab(Window, int, u_int); int xu_ptr_regrab(int, Cursor); @@ -506,4 +507,13 @@ extern struct client_ctx_q Clientq; extern int HasXinerama, HasRandr, Randr_ev; extern struct conf Conf; +#define WM_STATE cwm_atoms[0] +#define WM_DELETE_WINDOW cwm_atoms[1] +#define WM_TAKE_FOCUS cwm_atoms[2] +#define WM_PROTOCOLS cwm_atoms[3] +#define _MOTIF_WM_HINTS cwm_atoms[4] +#define CWM_NO_ATOMS 5 + +extern Atom cwm_atoms[CWM_NO_ATOMS]; + #endif /* _CALMWM_H_ */ diff --git a/client.c b/client.c index ab3bd3d..6495d01 100644 --- a/client.c +++ b/client.c @@ -426,23 +426,18 @@ client_draw_border(struct client_ctx *cc) void client_update(struct client_ctx *cc) { - Atom *p, wm_delete, wm_protocols, wm_take_focus; + Atom *p; int i; long n; - /* XXX cache these. */ - wm_delete = XInternAtom(X_Dpy, "WM_DELETE_WINDOW", False); - wm_protocols = XInternAtom(X_Dpy, "WM_PROTOCOLS", False); - wm_take_focus = XInternAtom(X_Dpy, "WM_TAKE_FOCUS", False); - - if ((n = xu_getprop(cc, wm_protocols, + if ((n = xu_getprop(cc, WM_PROTOCOLS, XA_ATOM, 20L, (u_char **)&p)) <= 0) return; for (i = 0; i < n; i++) - if (p[i] == wm_delete) + if (p[i] == WM_DELETE_WINDOW) cc->xproto |= CLIENT_PROTO_DELETE; - else if (p[i] == wm_take_focus) + else if (p[i] == WM_TAKE_FOCUS) cc->xproto |= CLIENT_PROTO_TAKEFOCUS; XFree(p); @@ -451,14 +446,9 @@ client_update(struct client_ctx *cc) void client_send_delete(struct client_ctx *cc) { - Atom wm_delete, wm_protocols; - - /* XXX - cache */ - wm_delete = XInternAtom(X_Dpy, "WM_DELETE_WINDOW", False); - wm_protocols = XInternAtom(X_Dpy, "WM_PROTOCOLS", False); if (cc->xproto & CLIENT_PROTO_DELETE) - xu_sendmsg(cc, wm_protocols, wm_delete); + xu_sendmsg(cc, WM_PROTOCOLS, WM_DELETE_WINDOW); else XKillClient(X_Dpy, cc->win); } @@ -665,7 +655,6 @@ client_gethints(struct client_ctx *cc) XClassHint xch; int argc; char **argv; - Atom mha; struct mwm_hints *mwmh; if (XGetClassHint(X_Dpy, cc->win, &xch)) { @@ -675,9 +664,8 @@ client_gethints(struct client_ctx *cc) cc->app_class = xch.res_class; } - mha = XInternAtom(X_Dpy, "_MOTIF_WM_HINTS", False); - if (xu_getprop(cc, mha, mha, PROP_MWM_HINTS_ELEMENTS, - (u_char **)&mwmh) == MWM_NUMHINTS) + if (xu_getprop(cc, _MOTIF_WM_HINTS, _MOTIF_WM_HINTS, + PROP_MWM_HINTS_ELEMENTS, (u_char **)&mwmh) == MWM_NUMHINTS) if (mwmh->flags & MWM_HINTS_DECORATIONS && !(mwmh->decorations & MWM_DECOR_ALL) && !(mwmh->decorations & MWM_DECOR_BORDER)) diff --git a/xutil.c b/xutil.c index 11cde2f..6db1847 100644 --- a/xutil.c +++ b/xutil.c @@ -145,12 +145,9 @@ xu_getprop(struct client_ctx *cc, Atom atm, Atom type, long len, u_char **p) int xu_getstate(struct client_ctx *cc, int *state) { - Atom wm_state; long *p = NULL; - wm_state = XInternAtom(X_Dpy, "WM_STATE", False); - - if (xu_getprop(cc, wm_state, wm_state, 2L, (u_char **)&p) <= 0) + if (xu_getprop(cc, WM_STATE, WM_STATE, 2L, (u_char **)&p) <= 0) return (-1); *state = (int)*p; @@ -162,16 +159,23 @@ xu_getstate(struct client_ctx *cc, int *state) void xu_setstate(struct client_ctx *cc, int state) { - Atom wm_state; long dat[2]; - /* XXX cache */ - wm_state = XInternAtom(X_Dpy, "WM_STATE", False); - dat[0] = (long)state; dat[1] = (long)None; cc->state = state; - XChangeProperty(X_Dpy, cc->win, wm_state, wm_state, 32, + XChangeProperty(X_Dpy, cc->win, WM_STATE, WM_STATE, 32, PropModeReplace, (unsigned char *)dat, 2); } + +Atom cwm_atoms[CWM_NO_ATOMS]; + +void +xu_getatoms(void) +{ + WM_STATE = XInternAtom(X_Dpy, "WM_STATE", False); + WM_DELETE_WINDOW = XInternAtom(X_Dpy, "WM_DELETE_WINDOW", False); + WM_TAKE_FOCUS = XInternAtom(X_Dpy, "WM_TAKE_FOCUS", False); + WM_PROTOCOLS = XInternAtom(X_Dpy, "WM_PROTOCOLS", False); +}