On Fri, Oct 05, 2007 at 23:33:44 CEST, Anselm R. Garbe wrote:
You miss that seltags and Client-tags are both globally defined
in the same context as the tags definition. Afaik you can't
evaluate the sizeof operator and you can't perform a division
operation in a non-functional scope, so I don't see how you
would like to replace the allocation of seltags and Client-tags
using emallocz.
sizeof is a compile-time constant, and any expression containing only
compile-time constants (literal numbers, sizeof, etc; no variables or
functions) can be evaluated at compile time. To demonstrate, consider
the attached patch against changeset 1025 (written in standard, albeit
little-used, C) which removes the dynamic allocation of seltags and
Client-tags and replaces it with constant initialization. Due to
added whitespace where some declarations were rearranged, and a
comment, the number of LOC decreased only by 2.
--- dwm.c.old 2007-10-06 10:02:01.680419843 -0300
+++ dwm.c 2007-10-06 11:28:34.323541304 -0300
@@ -57,21 +57,6 @@
/* typedefs */
typedef struct Client Client;
-struct Client {
- char name[256];
- int x, y, w, h;
- int rx, ry, rw, rh; /* revert geometry */
- int basew, baseh, incw, inch, maxw, maxh, minw, minh;
- int minax, maxax, minay, maxay;
- long flags;
- unsigned int border, oldborder;
- Bool isbanned, isfixed, ismax, isfloating, wasfloating;
- Bool *tags;
- Client *next;
- Client *prev;
- Client *snext;
- Window win;
-};
typedef struct {
int x, y, w, h;
@@ -195,7 +180,7 @@
double mwfact;
int screen, sx, sy, sw, sh, wax, way, waw, wah;
int (*xerrorxlib)(Display *, XErrorEvent *);
-unsigned int bh, bpos, ntags;
+unsigned int bh, bpos;
unsigned int blw = 0;
unsigned int ltidx = 0; /* default */
unsigned int nlayouts = 0;
@@ -218,7 +203,6 @@
Atom wmatom[WMLast], netatom[NetLast];
Bool otherwm, readin;
Bool running = True;
-Bool *seltags;
Bool selscreen = True;
Client *clients = NULL;
Client *sel = NULL;
@@ -232,6 +216,26 @@
/* configuration, allows nested code to access above variables */
#include config.h
+/* Statically define the number of tags. */
+unsigned int ntags = sizeof tags / sizeof tags[0];
+Bool seltags[sizeof tags / sizeof tags[0]] = {[0] = True};
+
+struct Client {
+ char name[256];
+ int x, y, w, h;
+ int rx, ry, rw, rh; /* revert geometry */
+ int basew, baseh, incw, inch, maxw, maxh, minw, minh;
+ int minax, maxax, minay, maxay;
+ long flags;
+ unsigned int border, oldborder;
+ Bool isbanned, isfixed, ismax, isfloating, wasfloating;
+ Bool tags[sizeof tags / sizeof tags[0]];
+ Client *next;
+ Client *prev;
+ Client *snext;
+ Window win;
+};
+
/* functions*/
void
applyrules(Client *c) {
@@ -393,7 +397,6 @@
XFreeCursor(dpy, cursor[CurMove]);
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
XSync(dpy, False);
- free(seltags);
}
void
@@ -1006,7 +1009,6 @@
XWindowChanges wc;
c = emallocz(sizeof(Client));
- c-tags = emallocz(ntags * sizeof(Bool));
c-win = w;
c-x = wa-x;
c-y = wa-y;
@@ -1467,9 +1469,6 @@
/* init tags */
compileregs();
- ntags = sizeof tags / sizeof tags[0];
- seltags = emallocz(sizeof(Bool) * ntags);
- seltags[0] = True;
/* init appearance */
dc.norm[ColBorder] = getcolor(NORMBORDERCOLOR);
@@ -1703,7 +1702,6 @@
focus(NULL);
XUngrabButton(dpy, AnyButton, AnyModifier, c-win);
setclientstate(c, WithdrawnState);
- free(c-tags);
free(c);
XSync(dpy, False);
XSetErrorHandler(xerror);