On Thu, Apr 11, 2013 at 11:51:22PM +0100, Thomas Adam wrote: > Hi, > > On Thu, Apr 11, 2013 at 11:32:21PM +0100, Nicholas Marriott wrote: > > Should prepare actually do validation be able to return > > CMD_RETURN_ERROR? Or would we want to run hooks even when we know the > > command is going to fail? > > Thanks for this feedback, and the other point about hooks acting more like > options do -- I'll get round to those in a bit. > > As for whether prepare() should do validation... I'm not sure. I don't > think it can without restructuring some commands quite heavily to cater for > that. It is a slightly odd mixture of state between prepare() setting the > running environment for the command, and exec() still using bits of that > context and parsing the args struct to do further validation and to then > either invalidate running that command, or not. But I can't see how else it > should work, since exec() on some commands really can get interesting, > especially where it is trying to emulate more than one command in the same > exec() function (such as select-window, choose-tree, etc.) > > So I think it's safe to say that prepare() has no knowledge of whether a > command is going to run or not, and all it should guarantee is the > environment it can set up for the command. That can fail of course in > exec() at the point that tries to use the context it's being asked to run in > and that's OK. So we should probably just allow this to try and run and > fail in the same way as an ordinary command would do.
Ok let's just leave prepare() as you have it then. > > I hope that makes sense. > > > I think struct cmd_ctx would be better than cmd_context, it matches all > > the others. > > Heh; I did that deliberately since we used to have cmd_ctx before cmd_q came > along, and it was getting confusing; but sure, I can rename this. Yes but now we don't have it anymore :-). I did think of suggesting just to ditch cmd_context entirely and put the members inside struct cmd_q but I think it is better with a separate struct cmd_ctx - there is no need to malloc it though, just put it as a member in struct cmd_q. Thanks > > > Could struct cmd_q just contain a cmd_ctx rather than a pointer? > > Particularly since it appears to be leaked :-). > > Yeah, I spotted that and free()d it. I suppose we could just include it > without malloc()ing it. > > > Also I would be inclined to declare it as: > > > > struct cmd_ctx { > > struct client *c; > > struct window *w; > > struct window *w2; > > struct window_pane *wp; > > struct window_pane *wp2; > > ... > > } > > OK. > > > Some other stuff, mostly minor apart from cmd-queue.c. Trimmed out a lot > > of context hope it is clear enough: > > > > > +void > > > +cmd_bind_key_prepare(unused struct cmd *self, unused struct cmd_q *cmdq) > > > +{ > > > + return; > > > +} > > > > This return is unnecessary. > > Yeah, I'll make this NULL in cmd_entry for those commands which don't need a > prepare() and then not define one. It's like this only because I > auto-generated these stubs from the outset to avoid RSI. > > [... minor nites duly noted ...] > > > > > I think I would add a helper something like: > > > > void > > cmdq_run_hook(struct hooks *hooks, const char *prefix, struct cmd *cmd, > > struct cmdq *cmdq) > > { > > struct hook *h; > > char *s; > > > > xasprintf(&s, "%s-%s", prefix, cmd->entry->name); > > if ((h = hooks_find(hooks, s)) != NULL) > > hooks_run(h, cmdq); > > free(s); > > } > > > > Then the changes to cmdq_continue could be much smaller. > > Sure. Can do. > > > > +enum cmd_retval > > > +cmd_show_hooks_exec(struct cmd *self, struct cmd_q *cmdq) > > > +{ > > > + struct args *args = self->args; > > > + struct session *s; > > > + struct hook *hook; > > > + struct hooks *hooks_ent; > > > > Why not just hooks? > > Dunno. Will change it. > > Thanks for the review, I'll reroll a patch with these fixups in. > > -- Thomas Adam > > -- > "It was the cruelest game I've ever played and it's played inside my head." > -- "Hush The Warmth", Gorky's Zygotic Mynci. ------------------------------------------------------------------------------ Precog is a next-generation analytics platform capable of advanced analytics on semi-structured data. The platform includes APIs for building apps and a phenomenal toolset for data science. Developers can use our toolset for easy data analysis & visualization. Get a free account! http://www2.precog.com/precogplatform/slashdotnewsletter _______________________________________________ tmux-users mailing list tmux-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tmux-users