wmii

git clone git://oldgit.suckless.org/wmii/
Log | Files | Refs | README | LICENSE

commit 73a594825f927c617bb4bdeadfa415d5dcf6c1b3
parent d8e827bc2175dd7abd9b95a7583fdfccf8901500
Author: Kris Maglione <jg@suckless.org>
Date:   Thu, 15 Feb 2007 20:02:13 -0500

Reduced the memory consumption of place_client. Replaced strncmps against literal strings with strcmps.


Diffstat:
area.c | 55++++++++++++++++++++++++++++++++++++++++++-------------
fs.c | 26+++++++++++++-------------
2 files changed, 55 insertions(+), 26 deletions(-)

diff --git a/area.c b/area.c @@ -6,6 +6,7 @@ #include <stdlib.h> #include <stdio.h> #include <string.h> +#include <math.h> static void place_client(Area *a, Client *c); @@ -214,10 +215,35 @@ detach_from_area(Frame *f) { assert(a->sel); } +void +bit_twiddle(uint *field, uint width, uint x, uint y, Bool set) { + enum { devisor = sizeof(uint) * 8 }; + uint bx, mask; + + bx = x / devisor; + mask = 1 << x % devisor; + if(set) + field[y*width + bx] |= mask; + else + field[y*width + bx] &= ~mask; +} + +static Bool +bit_get(uint *field, uint width, uint x, uint y) { + enum { devisor = sizeof(uint) * 8 }; + uint bx, mask; + + bx = x / devisor; + mask = 1 << x % devisor; + + return (field[y*width + bx] & mask) != 0; +} + static void place_client(Area *a, Client *c) { - static uint mx, my; - static Bool *field; + enum { devisor = sizeof(uint) * 8 }; + static uint mwidth, mx, my; + static uint *field = nil; BlitzAlign align; XPoint p1 = {0, 0}; XPoint p2 = {0, 0}; @@ -231,7 +257,6 @@ place_client(Area *a, Client *c) { num = 0; fit = False; align = CENTER; - field = nil; f = c->sel; @@ -246,13 +271,12 @@ place_client(Area *a, Client *c) { if(!field) { mx = screen->rect.width / 8; my = screen->rect.height / 8; - field = emallocz(my * mx * sizeof(Bool)); + mwidth = ceil((float)mx / devisor); + field = emallocz(sizeof(uint) * mwidth * my); } - for(y = 0; y < my; y++) - for(x = 0; x < mx; x++) - field[y*mx + x] = True; - dx = screen->rect.width / mx; - dy = screen->rect.height / my; + memset(field, ~0, (sizeof(uint) * mwidth * my)); + dx = 8; + dy = 8; for(fr=a->frame; fr; fr=fr->anext) { if(fr == f) { cx = f->rect.width / dx; @@ -271,13 +295,18 @@ place_client(Area *a, Client *c) { maxy = r_south(&fr->rect) / dy; for(j = y; j < my && j < maxy; j++) for(i = x; i < mx && i < maxx; i++) - field[j*mx + i] = False; + bit_twiddle(field, mwidth, i, j, False); + } + for(y = 0; y < my; y++) { + for(x = 0; x < mx; x++) + fprintf(stderr, "%d", bit_get(field, mwidth, x, y)); + fprintf(stderr, "\n"); } for(y = 0; y < my; y++) for(x = 0; x < mx; x++) { - if(field[y*mx + x]) { - for(i = x; (i < mx) && field[y*mx + i]; i++); - for(j = y; (j < my) && field[j*mx + x]; j++); + if(bit_get(field, mwidth, x, y)) { + for(i = x; (i < mx) && bit_get(field, mwidth, i, y); i++); + for(j = y; (j < my) && bit_get(field, mwidth, x, j); j++); if(((i - x) * (j - y) > (p2.x - p1.x) * (p2.y - p1.y)) && (i - x > cx) && (j - y > cy)) { diff --git a/fs.c b/fs.c @@ -233,38 +233,38 @@ message_root(char *message) snprintf(buffer, BUFFER_SIZE, "%s ", message); message = buffer; } - if(!strncmp(message, "quit ", 5)) + if(!strcmp(message, "quit ")) srv.running = 0; - else if(!strncmp(message, "view ", 5)) + else if(!strcmp(message, "view ")) select_view(&message[5]); - else if(!strncmp(message, "selcolors ", 10)) { + else if(!strcmp(message, "selcolors ")) { fprintf(stderr, "wmiiwm: warning: selcolors have been removed\n"); return Ebadcmd; - }else if(!strncmp(message, "focuscolors ", 10)) { + }else if(!strcmp(message, "focuscolors ")) { message += 10; n = strlen(message); return parse_colors(&message, (int *)&n, &def.focuscolor); } - else if(!strncmp(message, "normcolors ", 11)) { + else if(!strcmp(message, "normcolors ")) { message += 11; n = strlen(message); return parse_colors(&message, (int *)&n, &def.normcolor); } - else if(!strncmp(message, "font ", 5)) { + else if(!strcmp(message, "font ")) { message += 5; free(def.font.fontstr); def.font.fontstr = estrdup(message); loadfont(&blz, &def.font); resize_bar(screen); } - else if(!strncmp(message, "border ", 7)) { + else if(!strcmp(message, "border ")) { message += 7; n = (uint)strtol(message, &message, 10); if(*message) return Ebadvalue; def.border = n; } - else if(!strncmp(message, "grabmod ", 8)) { + else if(!strcmp(message, "grabmod ")) { message += 8; ulong mod; mod = mod_key_of_str(message); @@ -375,7 +375,7 @@ lookup_file(FileId *parent, char *name) if(!*dir->name) { /* strlen(dir->name) == 0 */ switch(parent->tab.type) { case FsDClients: - if(!name || !strncmp(name, "sel", 4)) { + if(!name || !strcmp(name, "sel")) { if((c = sel_client())) { file = get_file(); *last = file; @@ -407,7 +407,7 @@ lookup_file(FileId *parent, char *name) } break; case FsDTags: - if(!name || !strncmp(name, "sel", 4)) { + if(!name || !strcmp(name, "sel")) { if(screen->sel) { file = get_file(); *last = file; @@ -459,7 +459,7 @@ lookup_file(FileId *parent, char *name) /* Special considerations: */ switch(file->tab.type) { case FsDBars: - if(!strncmp(file->tab.name, "lbar", 5)) + if(!strcmp(file->tab.name, "lbar")) file->content.bar_p = &screen[0].lbar; else file->content.bar_p = &screen[0].rbar; @@ -504,7 +504,7 @@ fs_walk(P9Req *r) { f = r->fid->aux; clone_files(f); for(i=0; i < r->ifcall.nwname; i++) { - if(!strncmp(r->ifcall.wname[i], "..", 3)) { + if(!strcmp(r->ifcall.wname[i], "..")) { if(f->next) { nf=f; f=f->next; @@ -515,7 +515,7 @@ fs_walk(P9Req *r) { if(!nf) break; assert(!nf->next); - if(strncmp(r->ifcall.wname[i], ".", 2)) { + if(strcmp(r->ifcall.wname[i], ".")) { nf->next = f; f = nf; }