mirror of
https://github.com/0intro/wmii
synced 2025-03-27 09:03:12 +03:00
Fixed bad pointer arithmatic in convert.c, added 'send <id> <place>' to /tag/<n>/ctl
This commit is contained in:
parent
360419c012
commit
84ee4cc281
@ -683,34 +683,39 @@ size_client(Client *c, char *arg)
|
||||
resize_client(f->client, &new, False);
|
||||
}
|
||||
|
||||
void
|
||||
send_client(Client *c, char *arg)
|
||||
int
|
||||
send_client(Frame *f, char *arg)
|
||||
{
|
||||
Frame *f = c->sel, *tf;
|
||||
Area *to, *a = f->area;
|
||||
View *v = a->view;
|
||||
int i = idx_of_area(a), j = idx_of_frame(f);
|
||||
Area *to, *a;
|
||||
Client *c;
|
||||
Frame *tf;
|
||||
View *v;
|
||||
int i = idx_of_area(a),
|
||||
j = idx_of_frame(f);
|
||||
a = f->area;
|
||||
v = a->view;
|
||||
c = f->client;
|
||||
|
||||
if((i == -1) || (j == -1))
|
||||
return;
|
||||
return 0;
|
||||
|
||||
if(i && !strncmp(arg, "prev", 5)) {
|
||||
if(a == v->area)
|
||||
return;
|
||||
return 0;
|
||||
for(to=v->area->next; to && a != to->next; to=to->next);
|
||||
if(!to && (f->anext || f != a->frame))
|
||||
to=new_column(v, v->area, 0);
|
||||
if(!to)
|
||||
return;
|
||||
return 0;
|
||||
send_to_area(to, a, c);
|
||||
}
|
||||
else if(i && !strncmp(arg, "next", 5)) {
|
||||
if(a == v->area)
|
||||
return;
|
||||
return 0;
|
||||
if(!(to = a->next) && (f->anext || f!= a->frame))
|
||||
to = new_column(v, a, 0);
|
||||
if(!to)
|
||||
return;
|
||||
return 0;
|
||||
send_to_area(to, a, c);
|
||||
}
|
||||
else if(!strncmp(arg, "toggle", 7)) {
|
||||
@ -725,7 +730,7 @@ send_client(Client *c, char *arg)
|
||||
else if(i && !strncmp(arg, "up", 3)) {
|
||||
for(tf=a->frame; tf && tf->anext != f; tf=tf->anext);
|
||||
if(!tf)
|
||||
return;
|
||||
return 0;
|
||||
remove_frame(f);
|
||||
insert_frame(tf, f, True);
|
||||
arrange_column(a, False);
|
||||
@ -733,7 +738,7 @@ send_client(Client *c, char *arg)
|
||||
}
|
||||
else if(i && !strncmp(arg, "down", 5)) {
|
||||
if(!f->anext)
|
||||
return;
|
||||
return 0;
|
||||
remove_frame(f);
|
||||
insert_frame(f->anext, f, False);
|
||||
arrange_column(a, False);
|
||||
@ -741,13 +746,14 @@ send_client(Client *c, char *arg)
|
||||
}
|
||||
else if(i) {
|
||||
if(sscanf(arg, "%d", &j) != 1)
|
||||
return;
|
||||
return 0;
|
||||
for(to=v->area; to && j; to=to->next, j--);
|
||||
send_to_area(to, a, c);
|
||||
}
|
||||
else
|
||||
return;
|
||||
return 0;
|
||||
flush_masked_events(EnterWindowMask);
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
|
99
cmd/wm/fs2.c
99
cmd/wm/fs2.c
@ -88,56 +88,56 @@ P9Srv p9srv = {
|
||||
/* ad-hoc file tree. Empty names ("") indicate a dynamic entry to be filled
|
||||
* in by lookup_file */
|
||||
static Dirtab
|
||||
dirtabroot[]= {{".", QTDIR, FsRoot, 0500|DMDIR },
|
||||
{"rbar", QTDIR, FsDBar, 0700|DMDIR },
|
||||
{"lbar", QTDIR, FsDBar, 0700|DMDIR },
|
||||
{"client", QTDIR, FsDClients, 0500|DMDIR },
|
||||
{"tag", QTDIR, FsDTags, 0500|DMDIR },
|
||||
{"ctl", QTAPPEND, FsFRctl, 0600|DMAPPEND },
|
||||
{"border", QTFILE, FsFBorder, 0600 },
|
||||
{"colrules", QTFILE, FsFColRules, 0600 },
|
||||
{"event", QTFILE, FsFEvent, 0600 },
|
||||
{"font", QTFILE, FsFFont, 0600 },
|
||||
{"keys", QTFILE, FsFKeys, 0600 },
|
||||
{"normcolors", QTFILE, FsFCNorm, 0600 },
|
||||
{"selcolors", QTFILE, FsFCSel, 0600 },
|
||||
{"tagrules", QTFILE, FsFTagRules, 0600 },
|
||||
{nil}},
|
||||
dirtabclients[]={{".", QTDIR, FsDClients, 0500|DMDIR },
|
||||
{"", QTDIR, FsDClient, 0500|DMDIR },
|
||||
{nil}},
|
||||
dirtabclient[]= {{".", QTDIR, FsDClient, 0500|DMDIR },
|
||||
{"ctl", QTAPPEND, FsFCctl, 0200|DMAPPEND },
|
||||
{"tags", QTFILE, FsFCtags, 0600 },
|
||||
{"props", QTFILE, FsFprops, 0400 },
|
||||
{nil}},
|
||||
dirtabsclient[]={{".", QTDIR, FsDSClient, 0500|DMDIR },
|
||||
{"ctl", QTAPPEND, FsFCctl, 0200|DMAPPEND },
|
||||
{"index", QTFILE, FsFCindex, 0400 },
|
||||
{"tags", QTFILE, FsFCtags, 0600 },
|
||||
{"props", QTFILE, FsFprops, 0400 },
|
||||
{nil}},
|
||||
dirtabbar[]= {{".", QTDIR, FsDBar, 0700|DMDIR },
|
||||
{"", QTFILE, FsFBar, 0600 },
|
||||
{nil}},
|
||||
dirtabtags[]= {{".", QTDIR, FsDTags, 0500|DMDIR },
|
||||
{"", QTDIR, FsDTag, 0500|DMDIR },
|
||||
{nil}},
|
||||
dirtabtag[]= {{".", QTDIR, FsDTag, 0500|DMDIR },
|
||||
{"ctl", QTAPPEND, FsFTctl, 0200|DMAPPEND },
|
||||
{"index", QTFILE, FsFTindex, 0400 },
|
||||
{nil}};
|
||||
dirtab_root[]= {{".", QTDIR, FsRoot, 0500|DMDIR },
|
||||
{"rbar", QTDIR, FsDBar, 0700|DMDIR },
|
||||
{"lbar", QTDIR, FsDBar, 0700|DMDIR },
|
||||
{"client", QTDIR, FsDClients, 0500|DMDIR },
|
||||
{"tag", QTDIR, FsDTags, 0500|DMDIR },
|
||||
{"ctl", QTAPPEND, FsFRctl, 0600|DMAPPEND },
|
||||
{"border", QTFILE, FsFBorder, 0600 },
|
||||
{"colrules", QTFILE, FsFColRules, 0600 },
|
||||
{"event", QTFILE, FsFEvent, 0600 },
|
||||
{"font", QTFILE, FsFFont, 0600 },
|
||||
{"keys", QTFILE, FsFKeys, 0600 },
|
||||
{"normcolors", QTFILE, FsFCNorm, 0600 },
|
||||
{"selcolors", QTFILE, FsFCSel, 0600 },
|
||||
{"tagrules", QTFILE, FsFTagRules, 0600 },
|
||||
{nil}},
|
||||
dirtab_clients[]={{".", QTDIR, FsDClients, 0500|DMDIR },
|
||||
{"", QTDIR, FsDClient, 0500|DMDIR },
|
||||
{nil}},
|
||||
dirtab_client[]= {{".", QTDIR, FsDClient, 0500|DMDIR },
|
||||
{"ctl", QTAPPEND, FsFCctl, 0200|DMAPPEND },
|
||||
{"tags", QTFILE, FsFCtags, 0600 },
|
||||
{"props", QTFILE, FsFprops, 0400 },
|
||||
{nil}},
|
||||
dirtab_sclient[]={{".", QTDIR, FsDSClient, 0500|DMDIR },
|
||||
{"ctl", QTAPPEND, FsFCctl, 0200|DMAPPEND },
|
||||
{"index", QTFILE, FsFCindex, 0400 },
|
||||
{"tags", QTFILE, FsFCtags, 0600 },
|
||||
{"props", QTFILE, FsFprops, 0400 },
|
||||
{nil}},
|
||||
dirtab_bar[]= {{".", QTDIR, FsDBar, 0700|DMDIR },
|
||||
{"", QTFILE, FsFBar, 0600 },
|
||||
{nil}},
|
||||
dirtab_tags[]= {{".", QTDIR, FsDTags, 0500|DMDIR },
|
||||
{"", QTDIR, FsDTag, 0500|DMDIR },
|
||||
{nil}},
|
||||
dirtab_tag[]= {{".", QTDIR, FsDTag, 0500|DMDIR },
|
||||
{"ctl", QTAPPEND, FsFTctl, 0200|DMAPPEND },
|
||||
{"index", QTFILE, FsFTindex, 0400 },
|
||||
{nil}};
|
||||
/* Writing the lists separately and using an array of their references
|
||||
* removes the need for casting and allows for C90 conformance,
|
||||
* since otherwise we would need to use compound literals */
|
||||
static Dirtab *dirtab[] = {
|
||||
[FsRoot] dirtabroot,
|
||||
[FsDBar] dirtabbar,
|
||||
[FsDClients] dirtabclients,
|
||||
[FsDClient] dirtabclient,
|
||||
[FsDSClient] dirtabsclient,
|
||||
[FsDTags] dirtabtags,
|
||||
[FsDTag] dirtabtag
|
||||
[FsRoot] dirtab_root,
|
||||
[FsDBar] dirtab_bar,
|
||||
[FsDClients] dirtab_clients,
|
||||
[FsDClient] dirtab_client,
|
||||
[FsDSClient] dirtab_sclient,
|
||||
[FsDTags] dirtab_tags,
|
||||
[FsDTag] dirtab_tag
|
||||
};
|
||||
|
||||
/* get_file/free_file save and reuse old FileId structs
|
||||
@ -662,6 +662,13 @@ fs_write(Req *r) {
|
||||
draw_clients();
|
||||
r->ofcall.count = r->ifcall.count - i;
|
||||
return respond(r, nil);
|
||||
case FsFTctl:
|
||||
data_to_cstring(r);
|
||||
|
||||
if(!message_view(f->view, r->ifcall.data))
|
||||
return respond(r, Ebadvalue);
|
||||
r->ofcall.count = r->ifcall.count;
|
||||
return respond(r, nil);
|
||||
case FsFRctl:
|
||||
data_to_cstring(r);
|
||||
|
||||
|
@ -370,7 +370,23 @@ view_index(View *v) {
|
||||
|
||||
/* XXX: This will need cleanup too */
|
||||
int
|
||||
view_message(View *v, char *message) {
|
||||
message_view(View *v, char *message) {
|
||||
unsigned int i, n;
|
||||
Frame *f;
|
||||
Area *a;
|
||||
if(!strncmp(message, "send", 5)) {
|
||||
message += 5;
|
||||
if(2 != sscanf(message, "%d %n", &i, &n))
|
||||
return 0;
|
||||
for(a=v->area; a; a=a->next)
|
||||
for(f=a->frame; f; f=f->anext)
|
||||
if(f->client->id == i)
|
||||
goto found_client;
|
||||
found_client:
|
||||
if(!f)
|
||||
return 0;
|
||||
return send_client(f, &message[5]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -285,7 +285,7 @@ void resize_client(Client *c, XRectangle *r, Bool ignore_xcall);
|
||||
void select_client(Client *c, char *arg);
|
||||
Client *selected_client();
|
||||
void match_sizehints(Client *c, XRectangle *r, Bool floating, BlitzAlign sticky);
|
||||
void send_client(Client *c, char *arg);
|
||||
int send_client(Frame *f, char *arg);
|
||||
void move_client(Client *c, char *arg);
|
||||
void size_client(Client *c, char *arg);
|
||||
void newcol_client(Client *c, char *arg);
|
||||
@ -373,6 +373,7 @@ void select_view(const char *arg);
|
||||
void detach_from_view(View *v, Client *c);
|
||||
void attach_to_view(View *v, Client *c);
|
||||
Client *sel_client_of_view(View *v);
|
||||
int message_view(View *v, char *message);
|
||||
void restack_view(View *v);
|
||||
View *view_of_name(const char *name);
|
||||
unsigned char * view_index(View *v);
|
||||
|
@ -129,7 +129,7 @@ ixp_unpack_string(unsigned char **msg, char **string, unsigned short *len)
|
||||
/* XXX we don't really need emallocz here */
|
||||
*string = cext_emallocz(*len+1);
|
||||
memcpy(*string, *msg, *len);
|
||||
string[*len] = 0;
|
||||
(*string)[*len] = 0;
|
||||
*msg += *len;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user