Commit Graph

1575 Commits (7e123a10b6bd29d48d5f3c18287b3f533fcd3f80)

Author SHA1 Message Date
Ran Benita 4df720b464 test/x11-keyseq: new test
It is like test/stringcomp, only instead of using
xkb_keymap_new_from_string(), it uses xkbcomp to upload the keymap to a
dummy Xvfb X server and then xkb_x11_keymap_new_from_device().

If any of these components are not present or fails, the test is shown
as skipped.

The test is messy, fragile, limited and depends on external tools, but I
will improve on that later -- it's better to have a test.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-08-09 22:57:24 +03:00
Ran Benita 56de0115e6 x11/keymap: handle private actions
Previously we treated them as NoAction().

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-08-09 22:42:45 +03:00
Ran Benita ead816e515 utils: add a STATIC_ASSERT macro
It'd be nicer to use C11's static_assert(), but it's easier to roll our
own C99 version using a trick I saw in xv6.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-08-09 22:42:45 +03:00
Ran Benita d38ff018b1 keymap: remove "flags" field of xkb_private_action
Private actions have no flags - only serialized data.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-08-09 22:42:45 +03:00
Ran Benita f00e779ab5 x11/keymap: be more defensive about the number of modifiers
There can be at most 16 vmods, and we rely on the facts that #vmods +
NUM_REAL_MODS (8) <= XKB_MAX_MODS (32) when accessing keymap->mods.mods.
But msb_pos() can potentially return up to #vmods = 32 if the server is
malicious, so we need to truncate it.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-08-08 17:29:42 +03:00
Ran Benita 01753c0475 x11/keymap: don't forget to add the vmod offset in get_vmods
The first 8 modifiers in keymap->mods are the real modifiers; the virtual
 modifiers are then at slots 8-24. But XkbGetMap's virtualMods mask
starts the virtual modifiers at zero, so we need to add an offset (like
we do correctly in get_vmod_names()).

https://github.com/xkbcommon/libxkbcommon/issues/9

Reported-by: @rtcm
Signed-off-by: Ran Benita <ran234@gmail.com>
2014-08-08 16:50:11 +03:00
Ran Benita 9db1432326 docs: move keysym-transformations page to a better position
Signed-off-by: Ran Benita <ran234@gmail.com>
2014-07-28 18:04:34 +03:00
Ran Benita b629576266 docs: fix self-reference
Signed-off-by: Ran Benita <ran234@gmail.com>
2014-07-28 10:03:48 +03:00
Ran Benita 5058620c88 interactive-evdev: don't use sysexits.h
Signed-off-by: Ran Benita <ran234@gmail.com>
2014-07-27 16:36:11 +03:00
Ran Benita 40f109af56 ast-build: make sure InterpDef is freeable
With the following two rules:

    InterpretDecl   :       INTERPRET InterpretMatch OBRACE
                                VarDeclList
                            CBRACE SEMI
                            { $2->def = $4; $$ = $2; }
                    ;

    InterpretMatch  :       KeySym PLUS Expr
                            { $$ = InterpCreate($1, $3); }
                    |       KeySym
                            { $$ = InterpCreate($1, NULL); }
                    ;

And the fact that InterpCreate doesn't initialize ->def, if the
VarDeclList fails, the %destructor tries to recursively free the
uninitialized ->def VarDef. So always initialize it.

That was the only problematic code in the parser for %destructor (I'm
pretty sure).

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-07-27 14:32:18 +03:00
Ran Benita 37cf20c906 parser: silence bison "unused value" warnings
Previous commit triggered these for some reason:

/home/ran/src/libxkbcommon/src/xkbcomp/parser.y:555.25-33: warning: unused value: $1 [-Wother]
 CoordList       :       CoordList COMMA Coord
                         ^^^^^^^^^

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-07-26 22:49:30 +03:00
Ran Benita 7ec00933c1 parser: don't leak AST nodes for discarded symbols
If the parser has symbols on the stack, and then enters an error, it
discards the symbols and fails. But their actions which allocate AST
nodes had already ran. So we must free these to avoid leaks.

We use %destructor declarations, see
http://www.gnu.org/software/bison/manual/html_node/Destructor-Decl.html

Note: byacc only supports %destructor when compiled with
--enable-btyacc. Also, it doesn't support using the parse-param in the
destructor. So we might revert this commit before the next release, or
forget about byacc.

https://github.com/xkbcommon/libxkbcommon/issues/8

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-07-26 22:46:01 +03:00
Ran Benita f5182bbd74 test: add file with a syntax error
We didn't really have any. It also a exposes a memory leak, since the
parser doesn't clean up the AST nodes of the discarded symbols.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-07-26 22:29:22 +03:00
Ran Benita 61fed8dab9 Replace darray_mem with a new darray_steal
That's a more declarative interface.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-07-26 00:19:34 +03:00
Ran Benita fbd9286036 ast-build: use cast instead of ->common
Missed in 1b2bb204e0.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-07-26 00:13:54 +03:00
Ran Benita 5f5b960c71 types: refactor CopyKeyTypesToKeymap
So it's OOM-safe and doesn't clobber keymap on failure.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-07-25 23:45:04 +03:00
Ran Benita 320e5ffaf1 keycodes: split CopyKeyInfoToKeymap to several functions
It's a bit easier to read and self-documenting. Also handles OOM better.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-07-25 23:45:04 +03:00
Ran Benita cb4bae714e parser: don't shadow "str"
It's a name of a function in scanner-utils.h and also of some
parameters.

https://bugs.freedesktop.org/show_bug.cgi?id=79898

Reported-by: Bryce Harrington <b.harrington@samsung.com>
Signed-off-by: Ran Benita <ran234@gmail.com>
2014-06-30 14:52:30 +03:00
Ran Benita 9c30d6da4e x11: don't iterate on empty batches
If count % SIZE == 0 we did a useless iteration where start==stop. It's
harmless but strange, so don't do that.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-06-15 15:30:51 +03:00
Ran Benita 67d884ec14 Remove unnecessary !!(expressions)
_Bool already does that.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-06-01 15:24:10 +03:00
Ran Benita d6f2d8ecd0 rules: fix leak on failure
matcher_match() builds up the kccgst's, and we steal the memory on
success. But on error we didn't free it.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-05-28 20:36:58 +03:00
Ran Benita 76e1fca20a Bump version to 0.4.2
Signed-off-by: Ran Benita <ran234@gmail.com>
2014-05-15 12:07:00 +03:00
Ran Benita 1aea81c273 Update NEWS
Signed-off-by: Ran Benita <ran234@gmail.com>
2014-05-15 12:06:46 +03:00
Ran Benita e3f751be66 x11: fix out-of-bounds access in adopt_atoms() error handling
Two problems:

- `j` can be >= `SIZE`, and needs to be wrapped like in the rest of the
   code.

- `cookies[j % SIZE]` is not initialized if there's no atom in `from[j]`.

The is manifested when:

- We've already gone through one batch (>= 128 atoms) (in fact this
  cannot happen in call to `adopt_atoms` in the current code).

- An XCB request failed in the middle of a batch.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-05-14 12:02:13 +03:00
Ran Benita 86cfef63ca ast-build: don't leak on OOM in BoolVarCreate
Signed-off-by: Ran Benita <ran234@gmail.com>
2014-05-11 09:47:56 +03:00
Ran Benita 2e561c3f25 parser: show the keysym in "unrecognized keysym" messages
Signed-off-by: Ran Benita <ran234@gmail.com>
2014-04-30 08:57:16 +03:00
Ran Benita 770f3e4bda doc: fix new doxygen version warnings
Signed-off-by: Ran Benita <ran234@gmail.com>
2014-04-25 01:21:09 +03:00
Ran Benita 67323f41a6 keycodes: fix uninitialized variable
Happened in one of the previous commits. For some reason, gcc doesn't
warn about this, but clang does...

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-04-25 01:14:31 +03:00
Ran Benita 07fb6a6c19 xkbcomp: don't align enum values
Signed-off-by: Ran Benita <ran234@gmail.com>
2014-04-22 18:19:01 +03:00
Ran Benita 28a22ba226 xkbcomp: use straight assignment instead of CopyModSet
Signed-off-by: Ran Benita <ran234@gmail.com>
2014-04-22 18:11:16 +03:00
Ran Benita 9014cf8cd8 keymap, keycodes, compat: don't use darray for LEDs
Use a static array of size XKB_MAX_LEDS instead, as in xkb_mod_set.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-04-22 14:58:42 +03:00
Ran Benita 787faf3665 keymap: don't use darray in xkb_mod_set
Instead just statically allocate the mods array (of size MAX_MOD_SIZE =
32). The limit is not going anywhere, and static allocations are nicer
(nicer code, no OOM, etc.). It's also small and dense enough.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-04-22 14:56:44 +03:00
Ran Benita 6b1cdee107 keymap: add and use xkb_mods_{foreach,enumerate}()
To iterate over an xkb_mod_set. Slightly nicer interface and makes
transitioning from darray easier.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-04-22 14:56:01 +03:00
Ran Benita 0f6bca2b37 keymap: rename xkb_foreach_key to xkb_keys_foreach
We'll use the format xkb_foos_foreach and xkb_foos_enumerate for the
various iterators.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-04-22 14:56:01 +03:00
Ran Benita 9b1a68eca9 keymap: protect xkb_foreach_key macro params
Signed-off-by: Ran Benita <ran234@gmail.com>
2014-04-22 14:56:01 +03:00
Ran Benita decb291553 darray: remove unused darray_foreach_reverse()
Signed-off-by: Ran Benita <ran234@gmail.com>
2014-04-22 14:56:01 +03:00
Ran Benita 00f084b6ec utils: detect overflow in memdup()
Signed-off-by: Ran Benita <ran234@gmail.com>
2014-04-22 14:56:01 +03:00
Ran Benita 95aabeecb1 symbols: use xkb_mod_set instead of entire keymap
The keymap is not removed entirely from the Info (just constified),
since it is still needed in AddKeySymbols() for looking up aliases. This
dependency will be removed in the future.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-04-19 17:07:34 +03:00
Ran Benita f2cbeda9f0 types: use xkb_mod_set instead of entire keymap
Signed-off-by: Ran Benita <ran234@gmail.com>
2014-04-19 16:23:48 +03:00
Ran Benita bf2878d227 compat: use xkb_mod_set instead of entire keymap
Signed-off-by: Ran Benita <ran234@gmail.com>
2014-04-19 16:23:48 +03:00
Ran Benita b5655b3d67 vmod: take xkb_mod_set instead of the entire keymap
This is the only place where the modifier information is modified. We
will make it local to a given XKB file (after which it will be merged
into the keymap). Currently it changes the keymap directly, which
sidesteps the abstraction and leaves side-effects even if the XkbFile's
compilation fails.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-04-19 16:23:48 +03:00
Ran Benita 0b7c8d6198 action: take xkb_mod_set instead of the entire keymap
A couple of modiifer actions need this information, but not the entire
keymap.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-04-19 16:23:48 +03:00
Ran Benita 9fbcf6bb18 expr: take xkb_mod_set instead of the entire keymap
The modifier-resolving functions only need the modifier information.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-04-19 16:23:46 +03:00
Ran Benita edc0aef57d text: take xkb_mod_set instead of the entire keymap
The modifier printing functions only need the modifier information, they
don't care about keys or leds, etc.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-04-19 16:23:04 +03:00
Ran Benita ca3170ad38 Add struct xkb_mod_set
The only thing that the compilation phase needs the keymap for currently
is for access to the modifier information (it also modifies it in
place!). We want to only pass along the neccessary information, to make
it more tractable and testable, so instead of passing the entire keymap
we add a new 'mod_set' object and pass a (const) reference to that.
The new object is just the old array of 'struct xkb_mod'.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-04-19 16:20:09 +03:00
Ran Benita 3d7aff5fcd keymap: rename wrap_group_into_range -> XkbWrapGroupIntoRange
It better fits with the naming convention in keymap.h.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-04-19 16:15:05 +03:00
Ran Benita 51a1df2f21 keymap: move ModNameToIndex from text.c and use it in keymap.c
Signed-off-by: Ran Benita <ran234@gmail.com>
2014-04-19 16:12:26 +03:00
Ran Benita 120c5c317e symbols: separate ctx
Same as was done for compat and types.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-04-17 22:16:34 +03:00
Ran Benita 659eacc9fc compat: separate ctx
Same as was done for types.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-04-17 22:16:34 +03:00
Ran Benita 36cbecc5b5 types: separate ctx
Separate the ctx object to its own field in CompatInfo, instead of doing
keymap->ctx.

The compilation functions should not have direct access to the keymap;
instead they should process the files with their own independent state
(in the *Info structs) as much as possible, and only at the end should
they be copied (i.e. commited) to the keymap. If the compilation fails,
it leaves no by-products. It's also just good form.

This was seemingly the original author's intention, but I suppose he cut
a few corners (mostly with the handling of virtual modifiers, which are
threaded through types -> compat -> symbols).

This commit is the first step and may look artificial; however the
'keymap' field will be removed shortly.

Signed-off-by: Ran Benita <ran234@gmail.com>
2014-04-16 23:19:49 +03:00