On 18/09/19 01:24PM, Birger Skogeng Pedersen wrote:
> Hi,
>
>
> It looks to me like there are a lot of key binds duplicated in the
> git-gui source.
>
> For instance, Ctrl/Cmd+Enter are bound in two lines:
> bind $ui_comm <$M1B-Key-Return> {do_commit;break}
> and
> bind . <$M1B-Key-Return> do_commit
>
> I guess the first one is specified to work in the commit message
> widget. The second one is for all widgets(?).
Yes, but in this case they are doing the same thing.
Actually, this is a bit of a mess that shouldn't exist in the first
place.
According to the bind manual page [0],
It is possible for several bindings to match a given X event. If the
bindings are associated with different tag's, then each of the
bindings will be executed, in order. By default, a binding for the
widget will be executed first, followed by a class binding, a binding
for its toplevel, and an all binding.
The continue and break commands may be used inside a binding script to
control the processing of matching scripts. If continue is invoked,
then the current binding script is terminated but Tk will continue
processing binding scripts associated with other tag's. If the break
command is invoked within a binding script, then that script
terminates and no other scripts will be invoked for the event.
What this essentially means is that first the binding for $ui_comm is
executed, and then the binding for ".". But since the binding for
$ui_comm has a break, only the first one is executed, and not the
second. This is what happens when the focus is in $ui_comm.
If the focus is elsewhere, the second binding (the one for ".") is
executed.
My point is, a break for something so simple should not be there in the
first place. If you do want Ctrl+Enter to make a commit from anywhere,
don't specify the binding for it in $ui_comm. So in this case IMO the
break is a simple hack to prevent do_commit from being executed twice.
Now on the more subjective side, is it really a good idea to allow
Ctrl+Enter to commit from anywhere? IMHO it should only do that from the
commit message buffer.
> Also, I see that some binds are with the "all" tag, while most are
> with just a dot as tag.
Ah, more of this bind mess. Luckily for us only places where "all" is
used is for binds that quit the application. So it shouldn't be too much
a problem.
Now for the dirty details:
Excerpt from the bind manual page:
- If the tag is the name of a toplevel window the binding applies to
the toplevel window and all its internal windows.
- If tag has the value all, the binding applies to all windows in the
application.
As far as I understand, binds for "." are executed for every child
window of the toplevel window "." (aka the main widow). Examples for
children of "." include the diff viewer, the commit message buffer, etc.
Now this is where my understanding of this gets shaky. If you bind
Ctrl-W to quit the window, then in that case every child window of "."
should have the same behaviour in that binding. But that is not the case
for, say, the "Options" dialog.
The Options dialog is a toplevel window itself (all dialogs are), but it
is called ".options", so one would assume it should be a subwindow for
".". That does not appear to be the case.
But we do want Ctrl-W to work on the options dialog too (and the tools
dialog, and all other dialogs). So, the binds for Ctrl-W should stay
bound to "all". Same argument can be applied to Ctrl-Q.
> Is this a mistake (aka something I could write a patch for)? Or am I
> just missing something?
I haven't got the time right now to look at all the duplicate bindings,
but at least for the Ctrl-Enter one, it is debatable whether it is a
bug.
If people think having this binding active for only the commit message
buffer, then it is a bug, and the binding for "." should be removed. I
am one of those people.
But if people think that Ctrl-Enter should trigger a commit _anywhere_
in the UI, then it is fine as it is.
I will try to look at other duplicates tomorrow.
> I propose:
> - replace "bind . " with "bind all "
Like I mentioned above, "bind ." and "bind all" are not the same thing.
In our case, the main problem is with dialogs. They have a different
toplevel window than the main program. So if we do replace "bind ." with
"bind all", then the bindings for things like commit, rescan will also
move over to those dialogs. I don't think it is a good idea to do so.
> - remove duplicated bind entries, if a key is bound to "all" then it
> shouldn't be bound with another tag
>From my quick scan of the search results for "bind", the only keys bound
to "all" are "Q" and "W". "Q" quits the entire application, and "W"
closes the current toplevel window. Both should stay the way they are.
As for duplicated bindings for ".", and other widgets, that is something
I haven't looked into too well. I will get to it by tomorrow.
[0] https://www.tcl.tk/man/tcl8.4/TkCmd/bind.htm
--
Regards,
Pratyush Yadav