Add the `--whole-window` switch for mouse bindings. This switch controls
what part of the container the pointer must be over to trigger a mouse
binding. The default is to only trigger mouse bindings over the
titlebars. With this switch, a mouse binding will be triggered over the
main part of the window as well.
This is a breaking change to the previous behavior, which would trigger
a mouse binding with a modifier over any part of the window.
fixes#1429
Copy the binding struct before running it and use this copy to emit the
binding event.
This fixes a crash when the command `reload` is used in a binding when
the binding event is emitted.
The binding event will be triggered when a binding is run as a result of
some a user action. The binding event has the following properties:
change: (str) Currently this will only be "run" but may be expanded in
the future. Included for consistency with other events.
binding: (map) the serialized binding
The "binding" member will have these properties:
input_type: (str) either "keyboard" or "mouse"
input_code: (int) the xcb keycode of the keyboard binding if it was
provided or the mouse button if it is a mouse binding.
symbol: (str) the string representation of the input code
command: (str) the bound command
mods: (list of str) a list of the modifiers that were pressed as string
symbols
fixes#1210
This removes our last dependency on Xlib! :)
(Okay, an Xlib dependency still comes in through other libraries that we
link against, but it’s not us. Our code is simpler by this change and
uses one less connection to X11.)
A configured mouse binding (for example `bindsym button3 kill`) runs
its command when the mouse button is pressed over parts of a container.
If the binding has no modifer, it will only run when the button is
clicked on the window titlebar.
Otherwise if the binding has a modifier, it will run over the titlebar
or any part of the contained window.
fixes#558
This should be the last commit that formats a big bunch of files. From
here on, whenever I merge patches, I’ll run clang-format like described
in the title.
This has multiple effects:
1) The i3 codebase is now consistently formatted. clang-format uncovered
plenty of places where inconsistent code made it into our code base.
2) When writing code, you don’t need to think or worry about our coding
style. Write it in yours, then run clang-format-3.5
3) When submitting patches, we don’t need to argue about coding style.
The basic idea is that we don’t want to care about _how_ we write the
code, but _what_ it does :). The coding style that we use is defined in
the .clang-format config file and is based on the google style, but
adapted in such a way that the number of modifications to the i3 code
base is minimal.
Add run_binding function to bindings.h.
> Runs the given binding and handles parse errors. Returns a
> CommandResult for running the binding's command. Caller should render
> tree if needs_tree_render is true. Free with command_result_free().
Change the primary binding accessor to `get_binding_from_xcb_event`.
This function gets a binding from a generic xcb event of type KeyPress,
KeyRelease, ButtonPress, or ButtonRelease by determining the input type
(keyboard or mouse), the modifiers pressed from the filtered event
`state`, managing the proper fall back in case mode switch is enabled,
and finally querying the bindings for a binding that matches the event.
The logic of querying keyboard bindings is not intended to be altered by
this change.
The general accessor has been slightly modified to work with mouse
bindings and made private because it is only used in bindings.c
If a `bindsym` config directive specifies a symbol beginning with
"button", the binding will be given the type B_MOUSE for the indicated
button number.
Example:
bindsym $mod+button2 exec echo 'button two'
This will be interpreted as having input code (now `keycode`) 2 and type
B_MOUSE.
The mechanism to find and run mouse bindings on mouse events is not
implemented.
Rename `get_binding` to `get_keyboard_binding` and ensure that this
function only accesses bindings of type B_KEYBOARD. Other types of
bindings (e.g. mouse bindings) will be accessed by a different function.
Create files bindings.[ch] to contain functions for configuring,
finding, and running bindings.
Use the new function `configure_binding` for binding configuration. This
function adds a binding from config parameters.
Export the function `modifiers_from_str` from config_directives.h.
This change is made in preparation for the new bindmouse functionality.