commit 15dfca474fa8a7ce75f5d7c80ef3063ad6d32ffe
parent cdc57ca2fdcdf6885877b4cb3273cde969ccc431
Author: Anselm R. Garbe <garbeam@wmii.de>
Date: Tue, 30 May 2006 18:28:05 +0200
removed /def/col{width,mode}, added /def/ncol instead, though /def/ncol has no effect atm
Diffstat:
6 files changed, 93 insertions(+), 94 deletions(-)
diff --git a/cmd/wm/area.c b/cmd/wm/area.c
@@ -21,12 +21,8 @@ create_area(View *v, unsigned int pos)
unsigned int w;
Area *a = nil;
- if(v->area.size > 1) {
- if(def.colw)
- w = def.colw;
- else
- w = rect.width / v->area.size - 1;
- }
+ if(v->area.size > 1)
+ w = rect.width / v->area.size - 1;
else
w = rect.width;
if(w < MIN_COLWIDTH)
diff --git a/cmd/wm/fs.c b/cmd/wm/fs.c
@@ -41,8 +41,7 @@ enum { WMII_IOUNIT = 2048 };
* /def/rules FsFrules rules
* /def/keys FsFkeys keys
* /def/grabmod FsFgrabmod grab modifier
- * /def/colmode FsFmode column mode
- * /def/colwidth FsFcolw column width
+ * /def/ncol FsFncol column number
* /bar/ FsDbars
* /bar/lab/ FsDbar
* /bar/lab/data FsFdata <arbitrary data which gets displayed>
@@ -200,7 +199,7 @@ name_of_qid(Qid wqid[IXP_MAX_WELEM], unsigned short qsel)
case FsFselcolors: return "selcolors"; break;
case FsFnormcolors: return "normcolors"; break;
case FsFfont: return "font"; break;
- case FsFcolw: return "colwidth"; break;
+ case FsFncol: return "ncol"; break;
case FsFgrabmod: return "grabmod"; break;
case FsFrules: return "rules"; break;
case FsFkeys: return "keys"; break;
@@ -250,10 +249,7 @@ name_of_qid(Qid wqid[IXP_MAX_WELEM], unsigned short qsel)
case FsFmode:
if((dir_type == FsDarea) && (i1 == -1 || i2 == -1))
return nil;
- if(dir_type == FsDdef)
- return "colmode";
- else
- return "mode";
+ return "mode";
break;
case FsFevent: return "event"; break;
default: return nil; break;
@@ -306,8 +302,8 @@ type_of_name(Qid wqid[IXP_MAX_WELEM], unsigned short qsel, char *name)
return FsFnormcolors;
if(!strncmp(name, "font", 5))
return FsFfont;
- if(!strncmp(name, "colwidth", 9))
- return FsFcolw;
+ if(!strncmp(name, "ncol", 5))
+ return FsFncol;
if(!strncmp(name, "grabmod", 8))
return FsFgrabmod;
if(!strncmp(name, "keys", 5))
@@ -316,7 +312,7 @@ type_of_name(Qid wqid[IXP_MAX_WELEM], unsigned short qsel, char *name)
return FsFrules;
if(!strncmp(name, "data", 5))
return FsFdata;
- if(!strncmp(name, "mode", 5) || !strncmp(name, "colmode", 8))
+ if(!strncmp(name, "mode", 5))
return FsFmode;
if((dir_type == FsDbars) && bar_of_name(name))
return FsDbar;
@@ -461,7 +457,7 @@ qid_of_name(Qid wqid[IXP_MAX_WELEM], unsigned short qsel, char *name)
case FsFborder:
case FsFgrabmod:
case FsFfont:
- case FsFcolw:
+ case FsFncol:
case FsFrules:
case FsFselcolors:
case FsFnormcolors:
@@ -603,15 +599,9 @@ stat_of_name(Stat *stat, char *name, Qid wqid[IXP_MAX_WELEM], unsigned short qse
(i1 == bar.size) ? 0 : strlen(bar.data[i1]->data), IXP_DMREAD | IXP_DMWRITE);
break;
case FsFmode:
- {
- int i;
- if(dir_type == FsDarea)
- i = view.data[i1]->area.data[i2]->mode;
- else
- i = def.colmode;
- return pack_stat(stat, wqid, qsel, name,
- strlen(str_of_column_mode(i)), IXP_DMREAD | IXP_DMWRITE);
- }
+ return pack_stat(stat, wqid, qsel, name,
+ strlen(str_of_column_mode(view.data[i1]->area.data[i2]->mode)),
+ IXP_DMREAD | IXP_DMWRITE);
break;
case FsFcolors:
case FsFselcolors:
@@ -624,9 +614,8 @@ stat_of_name(Stat *stat, char *name, Qid wqid[IXP_MAX_WELEM], unsigned short qse
case FsFrules:
return pack_stat(stat, wqid, qsel, name, def.rules ? strlen(def.rules) : 0, IXP_DMREAD | IXP_DMWRITE);
break;
- case FsFcolw:
- snprintf(buf, sizeof(buf), "%d", def.colw);
- return pack_stat(stat, wqid, qsel, name, strlen(buf), IXP_DMREAD | IXP_DMWRITE);
+ case FsFncol:
+ return pack_stat(stat, wqid, qsel, name, def.ncol ? strlen(def.ncol) : 0, IXP_DMREAD | IXP_DMWRITE);
case FsFfont:
return pack_stat(stat, wqid, qsel, name, strlen(def.font), IXP_DMREAD | IXP_DMWRITE);
case FsFgrabmod:
@@ -965,6 +954,20 @@ xread(IXPConn *c, Fcall *fcall)
else if(fcall->count)
memcpy(p, def.rules + fcall->offset, fcall->count);
break;
+ case FsFncol:
+ len = def.ncol ? strlen(def.ncol) : 0;
+ if(len <= fcall->offset) {
+ fcall->count = 0;
+ break;
+ }
+ fcall->count = len - fcall->offset;
+ if(fcall->count > fcall->iounit) {
+ memcpy(p, def.ncol + fcall->offset, fcall->iounit);
+ fcall->count = fcall->iounit;
+ }
+ else if(fcall->count)
+ memcpy(p, def.ncol + fcall->offset, fcall->count);
+ break;
default:
break;
}
@@ -1044,9 +1047,7 @@ xread(IXPConn *c, Fcall *fcall)
p = ixp_pack_stat(p, &stat);
fcall->count += stat_of_name(&stat, "grabmod", m->wqid, m->sel);
p = ixp_pack_stat(p, &stat);
- fcall->count += stat_of_name(&stat, "colmode", m->wqid, m->sel);
- p = ixp_pack_stat(p, &stat);
- fcall->count += stat_of_name(&stat, "colwidth", m->wqid, m->sel);
+ fcall->count += stat_of_name(&stat, "ncol", m->wqid, m->sel);
p = ixp_pack_stat(p, &stat);
break;
case FsDview:
@@ -1229,24 +1230,22 @@ xread(IXPConn *c, Fcall *fcall)
if((fcall->count = strlen(def.grabmod)))
memcpy(p, def.grabmod, fcall->count);
break;
- case FsFcolw:
- snprintf(buf, sizeof(buf), "%d", def.colw);
- if((fcall->count = strlen(buf)))
- memcpy(p, buf, fcall->count);
+ case FsFncol:
+ fcall->count = def.ncol ? strlen(def.ncol) : 0;
+ if(fcall->count > fcall->iounit) {
+ memcpy(p, def.ncol, fcall->iounit);
+ fcall->count = fcall->iounit;
+ }
+ else if(fcall->count)
+ memcpy(p, def.ncol, fcall->count);
break;
case FsFfont:
if((fcall->count = strlen(def.font)))
memcpy(p, def.font, fcall->count);
break;
case FsFmode:
- if(dir_type == FsDarea) {
- if(!i2)
- return Enofile;
- i = view.data[i1]->area.data[i2]->mode;
- }
- else
- i = def.colmode;
- snprintf(buf, sizeof(buf), "%s", str_of_column_mode(i));
+ snprintf(buf, sizeof(buf), "%s",
+ str_of_column_mode(view.data[i1]->area.data[i2]->mode));
fcall->count = strlen(buf);
memcpy(p, buf, fcall->count);
break;
@@ -1442,6 +1441,20 @@ xwrite(IXPConn *c, Fcall *fcall)
memcpy(def.rules + fcall->offset, fcall->data, fcall->count);
def.rules[fcall->offset + fcall->count] = 0;
break;
+ case FsFncol:
+ if(def.ncolsz < fcall->offset + fcall->count + 1) {
+ def.ncolsz = fcall->offset + fcall->count + 1;
+ tmp = cext_emallocz(def.ncolsz);
+ len = def.ncol ? strlen(def.ncol) : 0;
+ if(len) {
+ memcpy(tmp, def.ncol, len);
+ free(def.ncol);
+ }
+ def.ncol = tmp;
+ }
+ memcpy(def.ncol + fcall->offset, fcall->data, fcall->count);
+ def.ncol[fcall->offset + fcall->count] = 0;
+ break;
case FsFgeom:
if(fcall->count >= sizeof(buf))
return Ebadvalue;
@@ -1479,17 +1492,6 @@ xwrite(IXPConn *c, Fcall *fcall)
restack_view(view.data[sel]);
}
break;
- case FsFcolw:
- if(fcall->count >= sizeof(buf))
- return Ebadvalue;
- memcpy(buf, fcall->data, fcall->count);
- buf[fcall->count] = 0;
- if(sscanf(buf, "%d", &i) != 1)
- return Ebadvalue;
- if(i && i < MIN_COLWIDTH)
- return Ebadvalue;
- def.colw = i;
- break;
case FsFfont:
if(def.font)
free(def.font);
@@ -1507,14 +1509,10 @@ xwrite(IXPConn *c, Fcall *fcall)
buf[fcall->count] = 0;
if((i = column_mode_of_str(buf)) == -1)
return Ebadvalue;
- if(dir_type == FsDarea) {
- view.data[i1]->area.data[i2]->mode = i;
- arrange_column(view.data[i1]->area.data[i2], True);
- restack_view(view.data[i1]);
- draw_clients();
- }
- else
- def.colmode = i;
+ view.data[i1]->area.data[i2]->mode = i;
+ arrange_column(view.data[i1]->area.data[i2], True);
+ restack_view(view.data[i1]);
+ draw_clients();
break;
case FsFevent:
if(fcall->count >= sizeof(buf))
@@ -1545,8 +1543,16 @@ xclunk(IXPConn *c, Fcall *fcall)
type = unpack_type(m->wqid[m->sel].path);
if(type == FsFkeys)
update_keys();
- else if(type == FsFrules)
- update_rules();
+ else if(type == FsFrules) {
+ unsigned int i;
+ update_rules(&crule, def.rules);
+ for(i = 0; i < client.size; i++)
+ apply_rules(client.data[i]);
+ update_views();
+ }
+ else if(type == FsFncol) {
+ update_rules(&vrule, def.ncol);
+ }
cext_vdetach(ixp_vector_of_maps(&c->map), m);
free(m);
fcall->id = RCLUNK;
diff --git a/cmd/wm/rule.c b/cmd/wm/rule.c
@@ -6,7 +6,6 @@
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
-#include <regex.h>
#include "wm.h"
/* basic rule matching language /regex/ -> value
@@ -17,14 +16,6 @@ enum {
TAGS
};
-typedef struct {
- regex_t regex;
- char values[256];
-} Rule;
-VECTOR(RuleVector, Rule *);
-
-static RuleVector rule;
-
static Vector *
vector_of_rules(RuleVector *rv)
{
@@ -43,20 +34,19 @@ permit_tag(const char *tag)
}
void
-update_rules()
+update_rules(RuleVector *rule, const char *data)
{
- unsigned int i;
int mode = IGNORE;
char *p, *r = nil, *v = nil, regex[256], values[256];
- if(!def.rules || !strlen(def.rules))
+ if(!data || !strlen(data))
return;
- while(rule.size) {
- Rule *r = rule.data[0];
- regfree(&r->regex);
- cext_vdetach(vector_of_rules(&rule), r);
- free(r);
+ while(rule->size) {
+ Rule *rul = rule->data[0];
+ regfree(&rul->regex);
+ cext_vdetach(vector_of_rules(rule), rul);
+ free(rul);
}
for(p = def.rules; *p; p++)
@@ -89,7 +79,7 @@ update_rules()
cext_trim(values, " \t/");
if(!regcomp(&rul->regex, regex, 0)) {
cext_strlcpy(rul->values, values, sizeof(rul->values));
- cext_vattach(vector_of_rules(&rule), rul);
+ cext_vattach(vector_of_rules(rule), rul);
}
else
free(rul);
@@ -101,9 +91,6 @@ update_rules()
}
break;
}
- for(i = 0; i < client.size; i++)
- apply_rules(client.data[i]);
- update_views();
}
void
@@ -147,8 +134,8 @@ match(Client *c, const char *prop)
unsigned int i;
regmatch_t tmpregm;
- for(i = 0; i < rule.size; i++) {
- Rule *r = rule.data[i];
+ for(i = 0; i < crule.size; i++) {
+ Rule *r = crule.data[i];
if(!regexec(&r->regex, prop, 1, &tmpregm, 0))
if(!strlen(c->tags) || !strncmp(c->tags, "nil", 4))
apply_tags(c, r->values);
diff --git a/cmd/wm/wm.c b/cmd/wm/wm.c
@@ -295,6 +295,8 @@ main(int argc, char *argv[])
key.size = 0;
bar.data = nil;
bar.size = 0;
+ def.ncol = nil;
+ def.ncolsz = 0;
def.rules = nil;
def.rulessz = 0;
def.keys = nil;
@@ -302,7 +304,6 @@ main(int argc, char *argv[])
def.font = strdup(BLITZ_FONT);
def.border = 2;
def.colmode = Coldefault;
- def.colw = 0;
cext_strlcpy(def.selcolor, BLITZ_SELCOLORS, sizeof(def.selcolor));
blitz_loadcolor(dpy, &def.sel, screen, def.selcolor);
cext_strlcpy(def.normcolor, BLITZ_NORMCOLORS, sizeof(def.normcolor));
diff --git a/cmd/wm/wm.h b/cmd/wm/wm.h
@@ -4,6 +4,7 @@
*/
#include <stdio.h>
+#include <regex.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
@@ -70,7 +71,7 @@ enum {
FsFmode,
FsFtags,
FsFindex,
- FsFcolw,
+ FsFncol,
FsLast
};
@@ -165,7 +166,8 @@ typedef struct {
char grabmod[5];
unsigned long mod;
int colmode;
- unsigned int colw;
+ char *ncol;
+ unsigned int ncolsz;
} Default;
/* global variables */
@@ -173,6 +175,12 @@ VECTOR(ClientVector, Client *);
VECTOR(KeyVector, Key *);
VECTOR(BarVector, Bar *);
+typedef struct {
+ regex_t regex;
+ char values[256];
+} Rule;
+VECTOR(RuleVector, Rule *);
+
/* global variables */
ViewVector view;
unsigned int sel;
@@ -198,6 +206,9 @@ Cursor cursor[CurLast];
unsigned int valid_mask;
unsigned int num_lock_mask;
void (*handler[LASTEvent]) (XEvent *);
+RuleVector crule;
+RuleVector vrule;
+
/* area.c */
Area *create_area(View *v, unsigned int pos);
@@ -291,7 +302,7 @@ void snap_move(XRectangle *r, XRectangle *rects, unsigned int num,
int snapw, int snaph);
/* rule.c */
-void update_rules();
+void update_rules(RuleVector *rule, const char *data);
void apply_rules(Client *c);
void apply_tags(Client *c, const char *tags);
diff --git a/rc/wmiirc b/rc/wmiirc
@@ -36,8 +36,6 @@ xwrite /def/border 2
xwrite /def/font $WMII_FONT
xwrite /def/selcolors $WMII_SELCOLORS
xwrite /def/normcolors $WMII_NORMCOLORS
-xwrite /def/colmode default
-xwrite /def/colwidth 0
# TAGGING RULES
wmiir write /def/rules <<EOF