Projects
Factory:RISC-V:Base
libxkbcommon
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 3
View file
_service:tar_scm:libxkbcommon.spec
Changed
@@ -1,6 +1,6 @@ Name: libxkbcommon -Version: 1.3.1 -Release: 4 +Version: 1.5.0 +Release: 1 Summary: X.Org X11 XKB parsing library License: MIT URL: https://www.x.org @@ -113,6 +113,11 @@ %{_mandir}/man1/xkbcli.1.gz %changelog +* Sat Feb 04 2023 zhouwenpei <zhouwenpei1@h-partners.com> - 1.5.0-1 +- CVE:NA +- SUG:NA +- DESC:update to 1.5.0 + * Wed Aug 03 2022 wangkerong <wangkerong@h-partners.com> - 1.3.1-4 - CVE:NA - SUG:NA
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/.github/workflows/main.yml
Deleted
@@ -1,108 +0,0 @@ -name: CI - -on: - push: - branches: master - pull_request: - branches: master - -# Set permissions at the job level. -permissions: {} - -jobs: - linux: - runs-on: ubuntu-20.04 - permissions: - contents: read - strategy: - matrix: - compiler: clang, gcc - steps: - - uses: actions/checkout@v2 - with: - persist-credentials: false - - uses: actions/setup-python@v2 - with: - python-version: '3.9' - - name: Install dependencies - run: | - python -m pip install --upgrade meson - sudo apt install -y \ - doxygen libxcb-xkb-dev valgrind ninja-build \ - libwayland-dev wayland-protocols bison graphviz - - name: Setup - run: | - meson setup build - env: - CC: ${{ matrix.compiler }} - - name: Build - run: | - meson compile -C build - - name: Test - run: - meson test -C build --print-errorlogs --setup=valgrind --no-suite python-tests - - macos: - runs-on: macos-10.15 - permissions: - contents: read - steps: - - uses: actions/checkout@v2 - with: - persist-credentials: false - - uses: actions/setup-python@v2 - with: - python-version: '3.9' - - name: Install dependencies - run: | - python -m pip install --upgrade meson - brew install libxml2 doxygen bison ninja - brew link bison --force - env: - HOMEBREW_NO_AUTO_UPDATE: 1 - HOMEBREW_NO_INSTALL_CLEANUP: 1 - - name: Setup - run: | - PATH="/usr/local/opt/bison/bin:${PATH}" meson setup -Denable-wayland=false -Denable-x11=false build - - name: Build - run: | - PATH="/usr/local/opt/bison/bin:${PATH}" meson compile -C build - - name: Test - run: - meson test -C build --print-errorlogs - - windows: - runs-on: windows-2019 - permissions: - contents: read - steps: - - uses: actions/checkout@v2 - with: - persist-credentials: false - - uses: actions/setup-python@v2 - with: - python-version: '3.9' - - name: Install dependencies - shell: powershell - run: | - python -m pip install --upgrade meson - Invoke-WebRequest -Uri https://github.com/ninja-build/ninja/releases/download/v1.10.1/ninja-win.zip -OutFile ninja.zip - Invoke-WebRequest -Uri https://github.com/lexxmark/winflexbison/releases/download/v2.5.23/win_flex_bison-2.5.23.zip -OutFile win_flex_bison.zip - Expand-Archive -Path win_flex_bison.zip -DestinationPath bin - Expand-Archive -Path ninja.zip -DestinationPath bin - Write-Output ((Get-Location).ToString() + "./bin") | Out-File -Append -FilePath $env:GITHUB_PATH -Encoding utf8 - - name: Setup - shell: cmd - run: | - call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 - meson setup -Denable-wayland=false -Denable-x11=false -Denable-docs=false -Denable-xkbregistry=false build - env: - CC: cl - - name: Build - shell: cmd - run: | - call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 - meson compile -C build - - name: Test - run: - meson test -C build --print-errorlogs
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/.github/workflows/github-release.yml -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/.github/workflows/github-release.yml
Changed
@@ -15,7 +15,7 @@ permissions: contents: write steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: fetch-depth: 0 persist-credentials: false
View file
_service:tar_scm:libxkbcommon-1.5.0.tar.xz/.github/workflows/linux.yml
Added
@@ -0,0 +1,54 @@ +name: linux + +on: + push: + branches: master + pull_request: + branches: master + +# Set permissions at the job level. +permissions: {} + +jobs: + linux: + runs-on: ubuntu-20.04 + permissions: + contents: read + strategy: + matrix: + compiler: clang, gcc + steps: + - uses: actions/checkout@v3 + with: + persist-credentials: false + - uses: actions/setup-python@v4 + with: + python-version: '3.9' + - name: Install dependencies + run: | + python -m pip install --upgrade meson + sudo apt update + sudo apt install -y \ + doxygen libxcb-xkb-dev valgrind ninja-build \ + libwayland-dev wayland-protocols bison graphviz + - name: Setup + run: | + meson setup build + env: + CC: ${{ matrix.compiler }} + - name: Build + run: | + meson compile -C build + - name: Test + run: + meson test -C build --print-errorlogs --no-suite python-tests + - name: Test with valgrind + run: + meson test -C build --print-errorlogs --setup=valgrind --no-suite python-tests + - name: Upload test logs + uses: actions/upload-artifact@v3 + if: failure() + with: + name: test logs + path: | + build/meson-logs/
View file
_service:tar_scm:libxkbcommon-1.5.0.tar.xz/.github/workflows/macos.yml
Added
@@ -0,0 +1,40 @@ +name: macos + +on: + push: + branches: master + pull_request: + branches: master + +# Set permissions at the job level. +permissions: {} + +jobs: + macos: + runs-on: macos-10.15 + permissions: + contents: read + steps: + - uses: actions/checkout@v3 + with: + persist-credentials: false + - uses: actions/setup-python@v4 + with: + python-version: '3.9' + - name: Install dependencies + run: | + python -m pip install --upgrade meson + brew install libxml2 doxygen bison ninja + brew link bison --force + env: + HOMEBREW_NO_AUTO_UPDATE: 1 + HOMEBREW_NO_INSTALL_CLEANUP: 1 + - name: Setup + run: | + PATH="/usr/local/opt/bison/bin:${PATH}" meson setup -Denable-wayland=false -Denable-x11=false build + - name: Build + run: | + PATH="/usr/local/opt/bison/bin:${PATH}" meson compile -C build + - name: Test + run: + meson test -C build --print-errorlogs
View file
_service:tar_scm:libxkbcommon-1.5.0.tar.xz/.github/workflows/windows.yml
Added
@@ -0,0 +1,47 @@ +name: windows + +on: + push: + branches: master + pull_request: + branches: master + +# Set permissions at the job level. +permissions: {} + +jobs: + windows: + runs-on: windows-2019 + permissions: + contents: read + steps: + - uses: actions/checkout@v3 + with: + persist-credentials: false + - uses: actions/setup-python@v4 + with: + python-version: '3.9' + - name: Install dependencies + shell: powershell + run: | + python -m pip install --upgrade meson + Invoke-WebRequest -Uri https://github.com/ninja-build/ninja/releases/download/v1.10.1/ninja-win.zip -OutFile ninja.zip + Invoke-WebRequest -Uri https://github.com/lexxmark/winflexbison/releases/download/v2.5.23/win_flex_bison-2.5.23.zip -OutFile win_flex_bison.zip + Expand-Archive -Path win_flex_bison.zip -DestinationPath bin + Expand-Archive -Path ninja.zip -DestinationPath bin + Write-Output ((Get-Location).ToString() + "./bin") | Out-File -Append -FilePath $env:GITHUB_PATH -Encoding utf8 + - name: Setup + shell: cmd + run: | + call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 + meson setup -Denable-wayland=false -Denable-x11=false -Denable-docs=false -Denable-xkbregistry=false build + env: + CC: cl + - name: Build + shell: cmd + run: | + call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 + meson compile -C build + - name: Test + run: + meson test -C build --print-errorlogs
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/NEWS -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/NEWS
Changed
@@ -1,3 +1,70 @@ +libxkbcommon 1.5.0 - 2023-01-02 +================== + +- Add `xkb_context` flag `XKB_CONTEXT_NO_SECURE_GETENV` and `rxkb_context` flag + `RXKB_CONTEXT_NO_SECURE_GETENV`. + + xkbcommon uses `getenv_secure()` to obtain environment variables. This flag + makes xkbcommon use `getenv()` instead. + + This is useful for some clients that have relatively benign capabilities set, + like CAP_SYS_NICE, that also want to use e.g. the XKB configuration from the + environment and user configs in XDG_CONFIG_HOME. + + Contributed by Ronan Pigott. + +- Fix crash in `xkbcli interactive-wayland` under a compositor which supports + new versions of the xdg-shell protocol. + + Contributed by Jan Alexander Steffens (heftig). + +- Fix some MSVC build issues. + +- Fix some issues when including xkbcommon as a meson subproject. + +- meson>=0.51 is now required. + + +libxkbcommon 1.4.1 - 2022-05-21 +================== + +- Fix compose sequence overriding (common prefix) not working correctly. + Regressed in 1.2.0. + + Contributed by Weng Xuetian. + +- Remove various bogus currency sign (particulary Euro and Korean Won) entries + from the keysym <-> Unicode mappings. They prevented the real + keysyms/codepoints for these from mapping correctly. + + Contributed by Sam Lantinga and Simon Ser. + +libxkbcommon 1.4.0 - 2022-02-04 +================== + +- Add `enable-tools` option to Meson build (on by default) to allow disabling + the `xkbcli` tools. + + Contributed by Alex Xu (Hello71). + +- In `xkbcli list`, fix "YAML Norway problem" in output. + + Contributed by Peter Hutterer. + +- In libxkbregistry, variants now inherit iso639, iso3166 and brief from parent + layout if omitted. + + Contributed by M Hickford. + +- In libxkbregistry, don't call `xmlCleanupParser()` - it's not supposed to + be called by libraries. + + Contributed by Peter Hutterer. + +- In libxkbregistry, skip over invalid ISO-639 or ISO-3166 entries. + + Contributed by Peter Hutterer. + libxkbcommon 1.3.1 - 2021-09-10 ==================
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/README.md -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/README.md
Changed
@@ -15,6 +15,7 @@ meson setup build ninja -C build + ninja -C build test # Run the tests. To build for use with Wayland, you can disable X11 support while still using the X11 keyboard configuration resource files thusly:
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/include/xkbcommon/xkbcommon.h -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/include/xkbcommon/xkbcommon.h
Changed
@@ -580,9 +580,17 @@ XKB_CONTEXT_NO_DEFAULT_INCLUDES = (1 << 0), /** * Don't take RMLVO names from the environment. + * * @since 0.3.0 */ - XKB_CONTEXT_NO_ENVIRONMENT_NAMES = (1 << 1) + XKB_CONTEXT_NO_ENVIRONMENT_NAMES = (1 << 1), + /** + * Disable the use of secure_getenv for this context, so that privileged + * processes can use environment variables. Client uses at their own risk. + * + * @since 1.5.0 + */ + XKB_CONTEXT_NO_SECURE_GETENV = (1 << 2) }; /** @@ -1201,7 +1209,8 @@ * @code xkb_keymap_num_levels_for_key(keymap, key) @endcode * @paramout masks_out A buffer in which the requested masks should be * stored. - * @paramout masks_size The size of the buffer pointed to by masks_out. + * @paramout masks_size The number of elements in the buffer pointed to by + * masks_out. * * If @c layout is out of range for this key (that is, larger or equal to * the value returned by xkb_keymap_num_layouts_for_key()), it is brought @@ -1333,6 +1342,33 @@ struct xkb_keymap * xkb_state_get_keymap(struct xkb_state *state); +/** + * @page server-client-state Server State and Client State + * @parblock + * + * The xkb_state API is used by two distinct actors in most window-system + * architectures: + * + * 1. A *server* - for example, a Wayland compositor, an X11 server, an evdev + * listener. + * + * Servers maintain the XKB state for a device according to input events from + * the device, such as key presses and releases, and out-of-band events from + * the user, like UI layout switchers. + * + * 2. A *client* - for example, a Wayland client, an X11 client. + * + * Clients do not listen to input from the device; instead, whenever the + * server state changes, the server serializes the state and notifies the + * clients that the state has changed; the clients then update the state + * from the serialization. + * + * Some entry points in the xkb_state API are only meant for servers and some + * are only meant for clients, and the two should generally not be mixed. + * + * @endparblock + */ + /** Specifies the direction of the key (press / release). */ enum xkb_key_direction { XKB_KEY_UP, /**< The key was released. */ @@ -1379,11 +1415,8 @@ * Update the keyboard state to reflect a given key being pressed or * released. * - * This entry point is intended for programs which track the keyboard state - * explicitly (like an evdev client). If the state is serialized to you by - * a master process (like a Wayland compositor) using functions like - * xkb_state_serialize_mods(), you should use xkb_state_update_mask() instead. - * The two functions should not generally be used together. + * This entry point is intended for *server* applications and should not be used + * by *client* applications; see @ref server-client-state for details. * * A series of calls to this function should be consistent; that is, a call * with XKB_KEY_DOWN for a key should be matched by an XKB_KEY_UP; if a key @@ -1411,21 +1444,16 @@ /** * Update a keyboard state from a set of explicit masks. * - * This entry point is intended for window systems and the like, where a - * master process holds an xkb_state, then serializes it over a wire - * protocol, and clients then use the serialization to feed in to their own - * xkb_state. + * This entry point is intended for *client* applications; see @ref + * server-client-state for details. *Server* applications should use + * xkb_state_update_key() instead. * * All parameters must always be passed, or the resulting state may be * incoherent. * * The serialization is lossy and will not survive round trips; it must only - * be used to feed slave state objects, and must not be used to update the - * master state. - * - * If you do not fit the description above, you should use - * xkb_state_update_key() instead. The two functions should not generally be - * used together. + * be used to feed client state objects, and must not be used to update the + * server state. * * @returns A mask of state components that have changed as a result of * the update. If nothing in the state has changed, returns 0. @@ -1603,6 +1631,10 @@ * The counterpart to xkb_state_update_mask for modifiers, to be used on * the server side of serialization. * + * This entry point is intended for *server* applications; see @ref + * server-client-state for details. *Client* applications should use the + * xkb_state_mod_*_is_active API. + * * @param state The keyboard state. * @param components A mask of the modifier state components to serialize. * State components other than XKB_STATE_MODS_* are ignored. @@ -1612,9 +1644,6 @@ * @returns A xkb_mod_mask_t representing the given components of the * modifier state. * - * This function should not be used in regular clients; please use the - * xkb_state_mod_*_is_active API instead. - * * @memberof xkb_state */ xkb_mod_mask_t @@ -1625,6 +1654,10 @@ * The counterpart to xkb_state_update_mask for layouts, to be used on * the server side of serialization. * + * This entry point is intended for *server* applications; see @ref + * server-client-state for details. *Client* applications should use the + * xkb_state_layout_*_is_active API. + * * @param state The keyboard state. * @param components A mask of the layout state components to serialize. * State components other than XKB_STATE_LAYOUT_* are ignored. @@ -1634,9 +1667,6 @@ * @returns A layout index representing the given components of the * layout state. * - * This function should not be used in regular clients; please use the - * xkb_state_layout_*_is_active API instead. - * * @memberof xkb_state */ xkb_layout_index_t
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/include/xkbcommon/xkbregistry.h -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/include/xkbcommon/xkbregistry.h
Changed
@@ -163,6 +163,13 @@ * on the lookup behavior. */ RXKB_CONTEXT_LOAD_EXOTIC_RULES = (1 << 1), + /** + * Disable the use of secure_getenv for this context, so that privileged + * processes can use environment variables. Client uses at their own risk. + * + * @since 1.5.0 + */ + RXKB_CONTEXT_NO_SECURE_GETENV = (1 << 2) }; /**
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/meson.build -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/meson.build
Changed
@@ -1,13 +1,13 @@ project( 'libxkbcommon', 'c', - version: '1.3.1', + version: '1.5.0', default_options: 'c_std=c11', 'warning_level=2', 'b_lundef=true', , - meson_version : '>= 0.49.0', + meson_version : '>= 0.51.0', ) pkgconfig = import('pkgconfig') cc = meson.get_compiler('c') @@ -17,7 +17,6 @@ # Compiler flags. cflags = '-fno-strict-aliasing', - '-fsanitize-undefined-trap-on-error', '-Wno-unused-parameter', '-Wno-missing-field-initializers', '-Wpointer-arith', @@ -41,7 +40,7 @@ if XKBCONFIGROOT == '' xkeyboard_config_dep = dependency('xkeyboard-config', required: false) if xkeyboard_config_dep.found() - XKBCONFIGROOT = xkeyboard_config_dep.get_pkgconfig_variable('xkb_base') + XKBCONFIGROOT = xkeyboard_config_dep.get_variable(pkgconfig: 'xkb_base') else XKBCONFIGROOT = get_option('prefix')/get_option('datadir')/'X11'/'xkb' endif @@ -125,8 +124,6 @@ else message('C library does not support secure_getenv, using getenv instead') endif -have_getopt_long = cc.has_header_symbol('getopt.h', 'getopt_long', - prefix: '#define _GNU_SOURCE') if not cc.has_header_symbol('limits.h', 'PATH_MAX', prefix: system_ext_define) if host_machine.system() == 'windows' # see https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#maximum-path-length-limitation @@ -148,7 +145,7 @@ # Supports -Wl,--version-script? have_version_script = cc.links( 'int main(){}', - args: '-Wl,--version-script=' + meson.source_root()/'xkbcommon.map', + args: '-Wl,--version-script=' + meson.current_source_dir()/'xkbcommon.map', name: '-Wl,--version-script', ) @@ -234,7 +231,7 @@ libxkbcommon_link_args = libxkbcommon_link_deps = if have_version_script - libxkbcommon_link_args += '-Wl,--version-script=' + meson.source_root()/'xkbcommon.map' + libxkbcommon_link_args += '-Wl,--version-script=' + meson.current_source_dir()/'xkbcommon.map' libxkbcommon_link_deps += 'xkbcommon.map' elif cc.get_argument_syntax() == 'msvc' libxkbcommon_def = custom_target('xkbcommon.def', @@ -302,7 +299,7 @@ libxkbcommon_x11_link_args = libxkbcommon_x11_link_deps = if have_version_script - libxkbcommon_x11_link_args += '-Wl,--version-script=' + meson.source_root()/'xkbcommon-x11.map' + libxkbcommon_x11_link_args += '-Wl,--version-script=' + meson.current_source_dir()/'xkbcommon-x11.map' libxkbcommon_x11_link_deps += 'xkbcommon-x11.map' elif cc.get_argument_syntax() == 'msvc' libxkbcommon_x11_def = custom_target('xkbcommon-x11.def', @@ -362,7 +359,7 @@ libxkbregistry_link_args = libxkbregistry_link_deps = if have_version_script - libxkbregistry_link_args += '-Wl,--version-script=' + meson.source_root()/'xkbregistry.map' + libxkbregistry_link_args += '-Wl,--version-script=' + meson.current_source_dir()/'xkbregistry.map' libxkbregistry_link_deps += 'xkbregistry.map' elif cc.get_argument_syntax() == 'msvc' libxkbregistry_def = custom_target('xkbregistry.def', @@ -406,7 +403,7 @@ man_pages = # Tools -build_tools = have_getopt_long +build_tools = get_option('enable-tools') and cc.has_header_symbol('getopt.h', 'getopt_long', prefix: '#define _GNU_SOURCE') if build_tools libxkbcommon_tools_internal = static_library( 'tools-internal', @@ -485,18 +482,18 @@ You can disable the Wayland xkbcli programs with -Denable-wayland=false.''') endif - wayland_scanner = find_program(wayland_scanner_dep.get_pkgconfig_variable('wayland_scanner')) + wayland_scanner = find_program(wayland_scanner_dep.get_variable(pkgconfig: 'wayland_scanner')) wayland_scanner_code_gen = generator( wayland_scanner, output: '@BASENAME@-protocol.c', - arguments: 'code', '@INPUT@', '@OUTPUT@', + arguments: 'private-code', '@INPUT@', '@OUTPUT@', ) wayland_scanner_client_header_gen = generator( wayland_scanner, output: '@BASENAME@-client-protocol.h', arguments: 'client-header', '@INPUT@', '@OUTPUT@', ) - wayland_protocols_datadir = wayland_protocols_dep.get_pkgconfig_variable('pkgdatadir') + wayland_protocols_datadir = wayland_protocols_dep.get_variable(pkgconfig: 'pkgdatadir') xdg_shell_xml = wayland_protocols_datadir/'stable/xdg-shell/xdg-shell.xml' xdg_shell_sources = wayland_scanner_code_gen.process(xdg_shell_xml), @@ -526,7 +523,7 @@ # xkeyboard-config "verifier" xkct_config = configuration_data() -xkct_config.set('MESON_BUILD_ROOT', meson.build_root()) +xkct_config.set('MESON_BUILD_ROOT', meson.current_build_dir()) xkct_config.set('XKB_CONFIG_ROOT', XKBCONFIGROOT) configure_file(input: 'test/xkeyboard-config-test.py.in', output: 'xkeyboard-config-test', @@ -536,15 +533,15 @@ test_env = environment() test_env.set('XKB_LOG_LEVEL', 'debug') test_env.set('XKB_LOG_VERBOSITY', '10') -test_env.set('top_srcdir', meson.source_root()) -test_env.set('top_builddir', meson.build_root()) +test_env.set('top_srcdir', meson.current_source_dir()) +test_env.set('top_builddir', meson.current_build_dir()) test_env.set('HAVE_XKBCLI_INTERACTIVE_EVDEV', configh_data.get('HAVE_XKBCLI_INTERACTIVE_EVDEV', 0).to_string()) test_env.set('HAVE_XKBCLI_INTERACTIVE_WAYLAND', configh_data.get('HAVE_XKBCLI_INTERACTIVE_WAYLAND', 0).to_string()) test_env.set('HAVE_XKBCLI_INTERACTIVE_X11', configh_data.get('HAVE_XKBCLI_INTERACTIVE_X11', 0).to_string()) test_env.set('HAVE_XKBCLI_LIST', configh_data.get('HAVE_XKBCLI_LIST', 0).to_string()) test_configh_data = configuration_data() -test_configh_data.set_quoted('TEST_XKB_CONFIG_ROOT', meson.source_root()/'test'/'data') +test_configh_data.set_quoted('TEST_XKB_CONFIG_ROOT', meson.current_source_dir()/'test'/'data') configure_file(output: 'test-config.h', configuration: test_configh_data) # Some tests need to use unexported symbols, so we link them against @@ -598,14 +595,11 @@ executable('test-filecomp', 'test/filecomp.c', dependencies: test_dep), env: test_env, ) -# TODO: This test currently uses some functions that don't exist on Windows. -if cc.get_id() != 'msvc' - test( - 'context', - executable('test-context', 'test/context.c', dependencies: test_dep), - env: test_env, - ) -endif +test( + 'context', + executable('test-context', 'test/context.c', dependencies: test_dep), + env: test_env, +) test( 'rules-file', executable('test-rules-file', 'test/rules-file.c', dependencies: test_dep), @@ -687,7 +681,7 @@ 'registry', executable('test-registry', 'test/registry.c', include_directories: include_directories('src'), - dependencies: dep_libxkbregistry), + dependencies: dep_libxkbregistry, test_dep), env: test_env, ) endif @@ -704,7 +698,7 @@ env = environment() - env.set('XKB_CONFIG_ROOT', meson.source_root()/'test'/'data') + env.set('XKB_CONFIG_ROOT', meson.current_source_dir()/'test'/'data') foreach keysym: keysyms_to_test test('keysym-test-@0@'.format(keysym), find_program('test/test-keysym.py'), @@ -735,7 +729,7 @@ # Benchmarks. bench_env = environment() -bench_env.set('top_srcdir', meson.source_root()) +bench_env.set('top_srcdir', meson.current_source_dir()) benchmark( 'key-proc', executable('bench-key-proc', 'bench/key-proc.c', dependencies: test_dep), @@ -797,7 +791,7 @@ doxygen_data.set('PACKAGE_NAME', meson.project_name()) doxygen_data.set('PACKAGE_VERSION', meson.project_version()) doxygen_data.set('INPUT', ' '.join(doxygen_input)) - doxygen_data.set('OUTPUT_DIRECTORY', meson.build_root()) + doxygen_data.set('OUTPUT_DIRECTORY', meson.current_build_dir()) doxyfile = configure_file( input: 'doc/Doxyfile.in', output: 'Doxyfile', @@ -809,7 +803,7 @@ 'doc', input: doxyfile + doxygen_input, output: 'html', - command: doxygen_wrapper, doxygen.path(), meson.build_root()/'Doxyfile', meson.source_root(), + command: doxygen_wrapper, doxygen, meson.current_build_dir()/'Doxyfile', meson.current_source_dir(), install: true, install_dir: docdir, build_by_default: true,
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/meson_options.txt -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/meson_options.txt
Changed
@@ -44,6 +44,12 @@ description: 'Default XKB options', ) option( + 'enable-tools', + type: 'boolean', + value: true, + description: 'Enable building tools', +) +option( 'enable-x11', type: 'boolean', value: true, @@ -59,7 +65,7 @@ 'enable-wayland', type: 'boolean', value: true, - description: 'Enable support for Wayland utility programs', + description: 'Enable support for Wayland utility programs (requires enable-tools)', ) option( 'enable-xkbregistry',
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/src/compose/parser.c -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/src/compose/parser.c
Changed
@@ -126,18 +126,18 @@ { skip_more_whitespace_and_comments: /* Skip spaces. */ - while (is_space(peek(s))) - if (next(s) == '\n') + while (is_space(scanner_peek(s))) + if (scanner_next(s) == '\n') return TOK_END_OF_LINE; /* Skip comments. */ - if (chr(s, '#')) { - skip_to_eol(s); + if (scanner_chr(s, '#')) { + scanner_skip_to_eol(s); goto skip_more_whitespace_and_comments; } /* See if we're done. */ - if (eof(s)) return TOK_END_OF_FILE; + if (scanner_eof(s)) return TOK_END_OF_FILE; /* New token. */ s->token_line = s->line; @@ -145,14 +145,14 @@ s->buf_pos = 0; /* LHS Keysym. */ - if (chr(s, '<')) { - while (peek(s) != '>' && !eol(s) && !eof(s)) - buf_append(s, next(s)); - if (!chr(s, '>')) { + if (scanner_chr(s, '<')) { + while (scanner_peek(s) != '>' && !scanner_eol(s) && !scanner_eof(s)) + scanner_buf_append(s, scanner_next(s)); + if (!scanner_chr(s, '>')) { scanner_err(s, "unterminated keysym literal"); return TOK_ERROR; } - if (!buf_append(s, '\0')) { + if (!scanner_buf_append(s, '\0')) { scanner_err(s, "keysym literal is too long"); return TOK_ERROR; } @@ -162,46 +162,46 @@ } /* Colon. */ - if (chr(s, ':')) + if (scanner_chr(s, ':')) return TOK_COLON; - if (chr(s, '!')) + if (scanner_chr(s, '!')) return TOK_BANG; - if (chr(s, '~')) + if (scanner_chr(s, '~')) return TOK_TILDE; /* String literal. */ - if (chr(s, '\"')) { - while (!eof(s) && !eol(s) && peek(s) != '\"') { - if (chr(s, '\\')) { + if (scanner_chr(s, '\"')) { + while (!scanner_eof(s) && !scanner_eol(s) && scanner_peek(s) != '\"') { + if (scanner_chr(s, '\\')) { uint8_t o; - if (chr(s, '\\')) { - buf_append(s, '\\'); + if (scanner_chr(s, '\\')) { + scanner_buf_append(s, '\\'); } - else if (chr(s, '"')) { - buf_append(s, '"'); + else if (scanner_chr(s, '"')) { + scanner_buf_append(s, '"'); } - else if (chr(s, 'x') || chr(s, 'X')) { - if (hex(s, &o)) - buf_append(s, (char) o); + else if (scanner_chr(s, 'x') || scanner_chr(s, 'X')) { + if (scanner_hex(s, &o)) + scanner_buf_append(s, (char) o); else scanner_warn(s, "illegal hexadecimal escape sequence in string literal"); } - else if (oct(s, &o)) { - buf_append(s, (char) o); + else if (scanner_oct(s, &o)) { + scanner_buf_append(s, (char) o); } else { - scanner_warn(s, "unknown escape sequence (%c) in string literal", peek(s)); + scanner_warn(s, "unknown escape sequence (%c) in string literal", scanner_peek(s)); /* Ignore. */ } } else { - buf_append(s, next(s)); + scanner_buf_append(s, scanner_next(s)); } } - if (!chr(s, '\"')) { + if (!scanner_chr(s, '\"')) { scanner_err(s, "unterminated string literal"); return TOK_ERROR; } - if (!buf_append(s, '\0')) { + if (!scanner_buf_append(s, '\0')) { scanner_err(s, "string literal is too long"); return TOK_ERROR; } @@ -215,11 +215,11 @@ } /* Identifier or include. */ - if (is_alpha(peek(s)) || peek(s) == '_') { + if (is_alpha(scanner_peek(s)) || scanner_peek(s) == '_') { s->buf_pos = 0; - while (is_alnum(peek(s)) || peek(s) == '_') - buf_append(s, next(s)); - if (!buf_append(s, '\0')) { + while (is_alnum(scanner_peek(s)) || scanner_peek(s) == '_') + scanner_buf_append(s, scanner_next(s)); + if (!scanner_buf_append(s, '\0')) { scanner_err(s, "identifier is too long"); return TOK_ERROR; } @@ -233,7 +233,7 @@ } /* Discard rest of line. */ - skip_to_eol(s); + scanner_skip_to_eol(s); scanner_err(s, "unrecognized token"); return TOK_ERROR; @@ -243,68 +243,68 @@ lex_include_string(struct scanner *s, struct xkb_compose_table *table, union lvalue *val_out) { - while (is_space(peek(s))) - if (next(s) == '\n') + while (is_space(scanner_peek(s))) + if (scanner_next(s) == '\n') return TOK_END_OF_LINE; s->token_line = s->line; s->token_column = s->column; s->buf_pos = 0; - if (!chr(s, '\"')) { + if (!scanner_chr(s, '\"')) { scanner_err(s, "include statement must be followed by a path"); return TOK_ERROR; } - while (!eof(s) && !eol(s) && peek(s) != '\"') { - if (chr(s, '%')) { - if (chr(s, '%')) { - buf_append(s, '%'); + while (!scanner_eof(s) && !scanner_eol(s) && scanner_peek(s) != '\"') { + if (scanner_chr(s, '%')) { + if (scanner_chr(s, '%')) { + scanner_buf_append(s, '%'); } - else if (chr(s, 'H')) { - const char *home = secure_getenv("HOME"); + else if (scanner_chr(s, 'H')) { + const char *home = xkb_context_getenv(table->ctx, "HOME"); if (!home) { scanner_err(s, "%%H was used in an include statement, but the HOME environment variable is not set"); return TOK_ERROR; } - if (!buf_appends(s, home)) { + if (!scanner_buf_appends(s, home)) { scanner_err(s, "include path after expanding %%H is too long"); return TOK_ERROR; } } - else if (chr(s, 'L')) { - char *path = get_locale_compose_file_path(table->locale); + else if (scanner_chr(s, 'L')) { + char *path = get_locale_compose_file_path(table->ctx, table->locale); if (!path) { scanner_err(s, "failed to expand %%L to the locale Compose file"); return TOK_ERROR; } - if (!buf_appends(s, path)) { + if (!scanner_buf_appends(s, path)) { free(path); scanner_err(s, "include path after expanding %%L is too long"); return TOK_ERROR; } free(path); } - else if (chr(s, 'S')) { - const char *xlocaledir = get_xlocaledir_path(); - if (!buf_appends(s, xlocaledir)) { + else if (scanner_chr(s, 'S')) { + const char *xlocaledir = get_xlocaledir_path(table->ctx); + if (!scanner_buf_appends(s, xlocaledir)) { scanner_err(s, "include path after expanding %%S is too long"); return TOK_ERROR; } } else { - scanner_err(s, "unknown %% format (%c) in include statement", peek(s)); + scanner_err(s, "unknown %% format (%c) in include statement", scanner_peek(s)); return TOK_ERROR; } } else { - buf_append(s, next(s)); + scanner_buf_append(s, scanner_next(s)); } } - if (!chr(s, '\"')) { + if (!scanner_chr(s, '\"')) { scanner_err(s, "unterminated include statement"); return TOK_ERROR; } - if (!buf_append(s, '\0')) { + if (!scanner_buf_append(s, '\0')) { scanner_err(s, "include path is too long"); return TOK_ERROR; } @@ -387,7 +387,7 @@ } else if (!last) { if (node->is_leaf) { scanner_warn(s, "a sequence already exists which is a prefix of this sequence; overriding"); - node->internal.eqkid = node->lokid = node->hikid = 0; + node->internal.eqkid = 0; node->internal.is_leaf = false; } lhs_pos++;
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/src/compose/paths.c -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/src/compose/paths.c
Changed
@@ -23,9 +23,10 @@ #include "config.h" +#include "xkbcommon/xkbcommon.h" #include "utils.h" +#include "context.h" #include "paths.h" -#include "utils.h" enum resolve_name_direction { LEFT_TO_RIGHT, @@ -33,9 +34,9 @@ }; const char * -get_xlocaledir_path(void) +get_xlocaledir_path(struct xkb_context *ctx) { - const char *dir = secure_getenv("XLOCALEDIR"); + const char *dir = xkb_context_getenv(ctx, "XLOCALEDIR"); if (!dir) dir = XLOCALEDIR; return dir; @@ -47,8 +48,8 @@ * @filename is relative to the xlocaledir. */ static char * -resolve_name(const char *filename, enum resolve_name_direction direction, - const char *name) +resolve_name(struct xkb_context *ctx, const char *filename, + enum resolve_name_direction direction, const char *name) { int ret; bool ok; @@ -62,7 +63,7 @@ char *match; size_t left_len, right_len, name_len; - xlocaledir = get_xlocaledir_path(); + xlocaledir = get_xlocaledir_path(ctx); ret = snprintf(path, sizeof(path), "%s/%s", xlocaledir, filename); if (ret < 0 || (size_t) ret >= sizeof(path)) @@ -137,27 +138,27 @@ } char * -resolve_locale(const char *locale) +resolve_locale(struct xkb_context *ctx, const char *locale) { - char *alias = resolve_name("locale.alias", LEFT_TO_RIGHT, locale); + char *alias = resolve_name(ctx, "locale.alias", LEFT_TO_RIGHT, locale); return alias ? alias : strdup(locale); } char * -get_xcomposefile_path(void) +get_xcomposefile_path(struct xkb_context *ctx) { - return strdup_safe(secure_getenv("XCOMPOSEFILE")); + return strdup_safe(xkb_context_getenv(ctx, "XCOMPOSEFILE")); } char * -get_xdg_xcompose_file_path(void) +get_xdg_xcompose_file_path(struct xkb_context *ctx) { const char *xdg_config_home; const char *home; - xdg_config_home = secure_getenv("XDG_CONFIG_HOME"); + xdg_config_home = xkb_context_getenv(ctx, "XDG_CONFIG_HOME"); if (!xdg_config_home || xdg_config_home0 != '/') { - home = secure_getenv("HOME"); + home = xkb_context_getenv(ctx, "HOME"); if (!home) return NULL; return asprintf_safe("%s/.config/XCompose", home); @@ -167,11 +168,11 @@ } char * -get_home_xcompose_file_path(void) +get_home_xcompose_file_path(struct xkb_context *ctx) { const char *home; - home = secure_getenv("HOME"); + home = xkb_context_getenv(ctx, "HOME"); if (!home) return NULL; @@ -179,7 +180,7 @@ } char * -get_locale_compose_file_path(const char *locale) +get_locale_compose_file_path(struct xkb_context *ctx, const char *locale) { char *resolved; char *path; @@ -198,7 +199,7 @@ if (streq(locale, "C")) locale = "en_US.UTF-8"; - resolved = resolve_name("compose.dir", RIGHT_TO_LEFT, locale); + resolved = resolve_name(ctx, "compose.dir", RIGHT_TO_LEFT, locale); if (!resolved) return NULL; @@ -206,7 +207,7 @@ path = resolved; } else { - const char *xlocaledir = get_xlocaledir_path(); + const char *xlocaledir = get_xlocaledir_path(ctx); path = asprintf_safe("%s/%s", xlocaledir, resolved); free(resolved); }
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/src/compose/paths.h -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/src/compose/paths.h
Changed
@@ -25,21 +25,21 @@ #define COMPOSE_RESOLVE_H char * -resolve_locale(const char *locale); +resolve_locale(struct xkb_context *ctx, const char *locale); const char * -get_xlocaledir_path(void); +get_xlocaledir_path(struct xkb_context *ctx); char * -get_xcomposefile_path(void); +get_xcomposefile_path(struct xkb_context *ctx); char * -get_xdg_xcompose_file_path(void); +get_xdg_xcompose_file_path(struct xkb_context *ctx); char * -get_home_xcompose_file_path(void); +get_home_xcompose_file_path(struct xkb_context *ctx); char * -get_locale_compose_file_path(const char *locale); +get_locale_compose_file_path(struct xkb_context *ctx, const char *locale); #endif
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/src/compose/table.c -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/src/compose/table.c
Changed
@@ -38,7 +38,7 @@ struct xkb_compose_table *table; struct compose_node dummy; - resolved_locale = resolve_locale(locale); + resolved_locale = resolve_locale(ctx, locale); if (!resolved_locale) return NULL; @@ -174,7 +174,7 @@ if (!table) return NULL; - path = get_xcomposefile_path(); + path = get_xcomposefile_path(ctx); if (path) { file = fopen(path, "rb"); if (file) @@ -182,7 +182,7 @@ } free(path); - path = get_xdg_xcompose_file_path(); + path = get_xdg_xcompose_file_path(ctx); if (path) { file = fopen(path, "rb"); if (file) @@ -190,7 +190,7 @@ } free(path); - path = get_home_xcompose_file_path(); + path = get_home_xcompose_file_path(ctx); if (path) { file = fopen(path, "rb"); if (file) @@ -198,7 +198,7 @@ } free(path); - path = get_locale_compose_file_path(table->locale); + path = get_locale_compose_file_path(ctx, table->locale); if (path) { file = fopen(path, "rb"); if (file)
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/src/context-priv.c -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/src/context-priv.c
Changed
@@ -34,6 +34,16 @@ #include "utils.h" #include "context.h" +char * +xkb_context_getenv(struct xkb_context *ctx, const char *name) +{ + if (ctx->use_secure_getenv) { + return secure_getenv(name); + } else { + return getenv(name); + } +} + unsigned int xkb_context_num_failed_include_paths(struct xkb_context *ctx) { @@ -105,7 +115,7 @@ const char *env = NULL; if (ctx->use_environment_names) - env = secure_getenv("XKB_DEFAULT_RULES"); + env = xkb_context_getenv(ctx, "XKB_DEFAULT_RULES"); return env ? env : DEFAULT_XKB_RULES; } @@ -116,7 +126,7 @@ const char *env = NULL; if (ctx->use_environment_names) - env = secure_getenv("XKB_DEFAULT_MODEL"); + env = xkb_context_getenv(ctx, "XKB_DEFAULT_MODEL"); return env ? env : DEFAULT_XKB_MODEL; } @@ -127,7 +137,7 @@ const char *env = NULL; if (ctx->use_environment_names) - env = secure_getenv("XKB_DEFAULT_LAYOUT"); + env = xkb_context_getenv(ctx, "XKB_DEFAULT_LAYOUT"); return env ? env : DEFAULT_XKB_LAYOUT; } @@ -136,12 +146,12 @@ xkb_context_get_default_variant(struct xkb_context *ctx) { const char *env = NULL; - const char *layout = secure_getenv("XKB_DEFAULT_LAYOUT"); + const char *layout = xkb_context_getenv(ctx, "XKB_DEFAULT_LAYOUT"); /* We don't want to inherit the variant if they haven't also set a * layout, since they're so closely paired. */ if (layout && ctx->use_environment_names) - env = secure_getenv("XKB_DEFAULT_VARIANT"); + env = xkb_context_getenv(ctx, "XKB_DEFAULT_VARIANT"); return env ? env : DEFAULT_XKB_VARIANT; } @@ -152,7 +162,7 @@ const char *env = NULL; if (ctx->use_environment_names) - env = secure_getenv("XKB_DEFAULT_OPTIONS"); + env = xkb_context_getenv(ctx, "XKB_DEFAULT_OPTIONS"); return env ? env : DEFAULT_XKB_OPTIONS; }
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/src/context.c -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/src/context.c
Changed
@@ -29,20 +29,12 @@ #include <sys/types.h> #include <sys/stat.h> #include <errno.h> -#ifdef _MSC_VER -# include <direct.h> -# include <io.h> -# ifndef S_ISDIR -# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) -# endif -#else -# include <unistd.h> -#endif #include "xkbcommon/xkbcommon.h" #include "utils.h" #include "context.h" + /** * Append one directory to the context's include path. */ @@ -86,14 +78,14 @@ const char * xkb_context_include_path_get_extra_path(struct xkb_context *ctx) { - const char *extra = secure_getenv("XKB_CONFIG_EXTRA_PATH"); + const char *extra = xkb_context_getenv(ctx, "XKB_CONFIG_EXTRA_PATH"); return extra ? extra : DFLT_XKB_CONFIG_EXTRA_PATH; } const char * xkb_context_include_path_get_system_path(struct xkb_context *ctx) { - const char *root = secure_getenv("XKB_CONFIG_ROOT"); + const char *root = xkb_context_getenv(ctx, "XKB_CONFIG_ROOT"); return root ? root : DFLT_XKB_CONFIG_ROOT; } @@ -107,9 +99,9 @@ char *user_path; int ret = 0; - home = secure_getenv("HOME"); + home = xkb_context_getenv(ctx, "HOME"); - xdg = secure_getenv("XDG_CONFIG_HOME"); + xdg = xkb_context_getenv(ctx, "XDG_CONFIG_HOME"); if (xdg != NULL) { user_path = asprintf_safe("%s/xkb", xdg); if (user_path) { @@ -298,13 +290,15 @@ ctx->log_fn = default_log_fn; ctx->log_level = XKB_LOG_LEVEL_ERROR; ctx->log_verbosity = 0; + ctx->use_environment_names = !(flags & XKB_CONTEXT_NO_ENVIRONMENT_NAMES); + ctx->use_secure_getenv = !(flags & XKB_CONTEXT_NO_SECURE_GETENV); /* Environment overwrites defaults. */ - env = secure_getenv("XKB_LOG_LEVEL"); + env = xkb_context_getenv(ctx, "XKB_LOG_LEVEL"); if (env) xkb_context_set_log_level(ctx, log_level(env)); - env = secure_getenv("XKB_LOG_VERBOSITY"); + env = xkb_context_getenv(ctx, "XKB_LOG_VERBOSITY"); if (env) xkb_context_set_log_verbosity(ctx, log_verbosity(env)); @@ -316,8 +310,6 @@ return NULL; } - ctx->use_environment_names = !(flags & XKB_CONTEXT_NO_ENVIRONMENT_NAMES); - ctx->atom_table = atom_table_new(); if (!ctx->atom_table) { xkb_context_unref(ctx);
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/src/context.h -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/src/context.h
Changed
@@ -53,8 +53,12 @@ size_t text_next; unsigned int use_environment_names : 1; + unsigned int use_secure_getenv : 1; }; +char * +xkb_context_getenv(struct xkb_context *ctx, const char *name); + unsigned int xkb_context_num_failed_include_paths(struct xkb_context *ctx);
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/src/keysym-utf.c -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/src/keysym-utf.c
Changed
@@ -819,22 +819,9 @@ { 0x0ef9, 0x11f0 }, /* Hangul_J_KkogjiDalrinIeung ᇰ HANGUL JONGSEONG YESIEUNG */ { 0x0efa, 0x11f9 }, /* Hangul_J_YeorinHieuh ᇹ HANGUL JONGSEONG YEORINHIEUH */ { 0x0eff, 0x20a9 }, /* Korean_Won ₩ WON SIGN */ - { 0x13a4, 0x20ac }, /* Euro € EURO SIGN */ { 0x13bc, 0x0152 }, /* OE Œ LATIN CAPITAL LIGATURE OE */ { 0x13bd, 0x0153 }, /* oe œ LATIN SMALL LIGATURE OE */ { 0x13be, 0x0178 }, /* Ydiaeresis Ÿ LATIN CAPITAL LETTER Y WITH DIAERESIS */ - { 0x20a0, 0x20a0 }, /* EcuSign ₠ EURO-CURRENCY SIGN */ - { 0x20a1, 0x20a1 }, /* ColonSign ₡ COLON SIGN */ - { 0x20a2, 0x20a2 }, /* CruzeiroSign ₢ CRUZEIRO SIGN */ - { 0x20a3, 0x20a3 }, /* FFrancSign ₣ FRENCH FRANC SIGN */ - { 0x20a4, 0x20a4 }, /* LiraSign ₤ LIRA SIGN */ - { 0x20a5, 0x20a5 }, /* MillSign ₥ MILL SIGN */ - { 0x20a6, 0x20a6 }, /* NairaSign ₦ NAIRA SIGN */ - { 0x20a7, 0x20a7 }, /* PesetaSign ₧ PESETA SIGN */ - { 0x20a8, 0x20a8 }, /* RupeeSign ₨ RUPEE SIGN */ - { 0x20a9, 0x20a9 }, /* WonSign ₩ WON SIGN */ - { 0x20aa, 0x20aa }, /* NewSheqelSign ₪ NEW SHEQEL SIGN */ - { 0x20ab, 0x20ab }, /* DongSign ₫ DONG SIGN */ { 0x20ac, 0x20ac }, /* EuroSign € EURO SIGN */ };
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/src/registry.c -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/src/registry.c
Changed
@@ -72,6 +72,7 @@ enum context_state context_state; bool load_extra_rules_files; + bool use_secure_getenv; struct list models; /* list of struct rxkb_models */ struct list layouts; /* list of struct rxkb_layouts */ @@ -437,6 +438,17 @@ DECLARE_CREATE_FOR_TYPE(rxkb_context); DECLARE_TYPED_GETTER_FOR_TYPE(rxkb_context, log_level, enum rxkb_log_level); +static char * +rxkb_context_getenv(struct rxkb_context *ctx, const char *name) +{ + if (ctx->use_secure_getenv) { + return secure_getenv(name); + } else { + return getenv(name); + } +} + + XKB_EXPORT void rxkb_context_set_log_level(struct rxkb_context *ctx, enum rxkb_log_level level) @@ -508,11 +520,12 @@ ctx->context_state = CONTEXT_NEW; ctx->load_extra_rules_files = flags & RXKB_CONTEXT_LOAD_EXOTIC_RULES; + ctx->use_secure_getenv = !(flags & RXKB_CONTEXT_NO_SECURE_GETENV); ctx->log_fn = default_log_fn; ctx->log_level = RXKB_LOG_LEVEL_ERROR; /* Environment overwrites defaults. */ - env = secure_getenv("RXKB_LOG_LEVEL"); + env = rxkb_context_getenv(ctx, "RXKB_LOG_LEVEL"); if (env) rxkb_context_set_log_level(ctx, log_level(env)); @@ -593,9 +606,9 @@ return false; } - home = secure_getenv("HOME"); + home = rxkb_context_getenv(ctx, "HOME"); - xdg = secure_getenv("XDG_CONFIG_HOME"); + xdg = rxkb_context_getenv(ctx, "XDG_CONFIG_HOME"); if (xdg != NULL) { user_path = asprintf_safe("%s/xkb", xdg); if (user_path) { @@ -619,13 +632,13 @@ } } - extra = secure_getenv("XKB_CONFIG_EXTRA_PATH"); + extra = rxkb_context_getenv(ctx, "XKB_CONFIG_EXTRA_PATH"); if (extra != NULL) ret |= rxkb_context_include_path_append(ctx, extra); else ret |= rxkb_context_include_path_append(ctx, DFLT_XKB_CONFIG_EXTRA_PATH); - root = secure_getenv("XKB_CONFIG_ROOT"); + root = rxkb_context_getenv(ctx, "XKB_CONFIG_ROOT"); if (root != NULL) ret |= rxkb_context_include_path_append(ctx, root); else @@ -808,6 +821,11 @@ char *str = extract_text(node); struct rxkb_object *parent; + if (!str || strlen(str) != 3) { + free(str); + continue; + } + parent = &layout->base; code = rxkb_iso639_code_create(parent); code->code = str; @@ -827,6 +845,11 @@ char *str = extract_text(node); struct rxkb_object *parent; + if (!str || strlen(str) != 2) { + free(str); + continue; + } + parent = &layout->base; code = rxkb_iso3166_code_create(parent); code->code = str; @@ -860,7 +883,8 @@ v->name = strdup(l->name); v->variant = name; v->description = description; - v->brief = brief; + // if variant omits brief, inherit from parent layout. + v->brief = brief == NULL ? strdup_safe(l->brief) : brief; v->popularity = popularity; list_append(&ctx->layouts, &v->base.link); @@ -870,11 +894,35 @@ if (!is_node(ci, "configItem")) continue; + bool found_language_list = false; + bool found_country_list = false; for (node = ci->children; node; node = node->next) { - if (is_node(node, "languageList")) + if (is_node(node, "languageList")) { parse_language_list(node, v); - if (is_node(node, "countryList")) + found_language_list = true; + } + if (is_node(node, "countryList")) { parse_country_list(node, v); + found_country_list = true; + } + } + if (!found_language_list) { + // inherit from parent layout + struct rxkb_iso639_code* x; + list_for_each(x, &l->iso639s, base.link) { + struct rxkb_iso639_code* code = rxkb_iso639_code_create(&v->base); + code->code = strdup(x->code); + list_append(&v->iso639s, &code->base.link); + } + } + if (!found_country_list) { + // inherit from parent layout + struct rxkb_iso3166_code* x; + list_for_each(x, &l->iso3166s, base.link) { + struct rxkb_iso3166_code* code = rxkb_iso3166_code_create(&v->base); + code->code = strdup(x->code); + list_append(&v->iso3166s, &code->base.link); + } } } } else { @@ -1197,7 +1245,6 @@ success = true; error: xmlFreeDoc(doc); - xmlCleanupParser(); return success; }
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/src/scanner-utils.h -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/src/scanner-utils.h
Changed
@@ -85,7 +85,7 @@ } static inline char -peek(struct scanner *s) +scanner_peek(struct scanner *s) { if (unlikely(s->pos >= s->len)) return '\0'; @@ -93,19 +93,19 @@ } static inline bool -eof(struct scanner *s) +scanner_eof(struct scanner *s) { return s->pos >= s->len; } static inline bool -eol(struct scanner *s) +scanner_eol(struct scanner *s) { - return peek(s) == '\n'; + return scanner_peek(s) == '\n'; } static inline void -skip_to_eol(struct scanner *s) +scanner_skip_to_eol(struct scanner *s) { const char *nl = memchr(s->s + s->pos, '\n', s->len - s->pos); const size_t new_pos = nl ? (size_t) (nl - s->s) : s->len; @@ -114,11 +114,11 @@ } static inline char -next(struct scanner *s) +scanner_next(struct scanner *s) { - if (unlikely(eof(s))) + if (unlikely(scanner_eof(s))) return '\0'; - if (unlikely(eol(s))) { + if (unlikely(scanner_eol(s))) { s->line++; s->column = 1; } @@ -129,16 +129,16 @@ } static inline bool -chr(struct scanner *s, char ch) +scanner_chr(struct scanner *s, char ch) { - if (likely(peek(s) != ch)) + if (likely(scanner_peek(s) != ch)) return false; s->pos++; s->column++; return true; } static inline bool -str(struct scanner *s, const char *string, size_t len) +scanner_str(struct scanner *s, const char *string, size_t len) { if (s->len - s->pos < len) return false; @@ -148,10 +148,10 @@ return true; } -#define lit(s, literal) str(s, literal, sizeof(literal) - 1) +#define scanner_lit(s, literal) scanner_str(s, literal, sizeof(literal) - 1) static inline bool -buf_append(struct scanner *s, char ch) +scanner_buf_append(struct scanner *s, char ch) { if (s->buf_pos + 1 >= sizeof(s->buf)) return false; @@ -160,7 +160,7 @@ } static inline bool -buf_appends(struct scanner *s, const char *str) +scanner_buf_appends(struct scanner *s, const char *str) { int ret; ret = snprintf(s->buf + s->buf_pos, sizeof(s->buf) - s->buf_pos, "%s", str); @@ -171,20 +171,20 @@ } static inline bool -oct(struct scanner *s, uint8_t *out) +scanner_oct(struct scanner *s, uint8_t *out) { int i; - for (i = 0, *out = 0; peek(s) >= '0' && peek(s) <= '7' && i < 3; i++) - *out = *out * 8 + next(s) - '0'; + for (i = 0, *out = 0; scanner_peek(s) >= '0' && scanner_peek(s) <= '7' && i < 3; i++) + *out = *out * 8 + scanner_next(s) - '0'; return i > 0; } static inline bool -hex(struct scanner *s, uint8_t *out) +scanner_hex(struct scanner *s, uint8_t *out) { int i; - for (i = 0, *out = 0; is_xdigit(peek(s)) && i < 2; i++) { - const char c = next(s); + for (i = 0, *out = 0; is_xdigit(scanner_peek(s)) && i < 2; i++) { + const char c = scanner_next(s); const char offset = (c >= '0' && c <= '9' ? '0' : c >= 'a' && c <= 'f' ? 'a' - 10 : 'A' - 10); *out = *out * 16 + c - offset;
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/src/utils.h -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/src/utils.h
Changed
@@ -31,13 +31,21 @@ #include <stdio.h> #include <string.h> #if HAVE_UNISTD_H -#include <unistd.h> +# include <unistd.h> #else /* Required on Windows where unistd.h doesn't exist */ -#define R_OK 4 /* Test for read permission. */ -#define W_OK 2 /* Test for write permission. */ -#define X_OK 1 /* Test for execute permission. */ -#define F_OK 0 /* Test for existence. */ +# define R_OK 4 /* Test for read permission. */ +# define W_OK 2 /* Test for write permission. */ +# define X_OK 1 /* Test for execute permission. */ +# define F_OK 0 /* Test for existence. */ +#endif + +#ifdef _MSC_VER +# include <direct.h> +# include <io.h> +# ifndef S_ISDIR +# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) +# endif #endif #include "darray.h"
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/src/xkbcomp/rules.c -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/src/xkbcomp/rules.c
Changed
@@ -86,49 +86,49 @@ { skip_more_whitespace_and_comments: /* Skip spaces. */ - while (chr(s, ' ') || chr(s, '\t') || chr(s, '\r')); + while (scanner_chr(s, ' ') || scanner_chr(s, '\t') || scanner_chr(s, '\r')); /* Skip comments. */ - if (lit(s, "//")) { - skip_to_eol(s); + if (scanner_lit(s, "//")) { + scanner_skip_to_eol(s); } /* New line. */ - if (eol(s)) { - while (eol(s)) next(s); + if (scanner_eol(s)) { + while (scanner_eol(s)) scanner_next(s); return TOK_END_OF_LINE; } /* Escaped line continuation. */ - if (chr(s, '\\')) { + if (scanner_chr(s, '\\')) { /* Optional \r. */ - chr(s, '\r'); - if (!eol(s)) { + scanner_chr(s, '\r'); + if (!scanner_eol(s)) { scanner_err(s, "illegal new line escape; must appear at end of line"); return TOK_ERROR; } - next(s); + scanner_next(s); goto skip_more_whitespace_and_comments; } /* See if we're done. */ - if (eof(s)) return TOK_END_OF_FILE; + if (scanner_eof(s)) return TOK_END_OF_FILE; /* New token. */ s->token_line = s->line; s->token_column = s->column; /* Operators and punctuation. */ - if (chr(s, '!')) return TOK_BANG; - if (chr(s, '=')) return TOK_EQUALS; - if (chr(s, '*')) return TOK_STAR; + if (scanner_chr(s, '!')) return TOK_BANG; + if (scanner_chr(s, '=')) return TOK_EQUALS; + if (scanner_chr(s, '*')) return TOK_STAR; /* Group name. */ - if (chr(s, '$')) { + if (scanner_chr(s, '$')) { val->string.start = s->s + s->pos; val->string.len = 0; - while (is_ident(peek(s))) { - next(s); + while (is_ident(scanner_peek(s))) { + scanner_next(s); val->string.len++; } if (val->string.len == 0) { @@ -139,15 +139,15 @@ } /* Include statement. */ - if (lit(s, "include")) + if (scanner_lit(s, "include")) return TOK_INCLUDE; /* Identifier. */ - if (is_ident(peek(s))) { + if (is_ident(scanner_peek(s))) { val->string.start = s->s + s->pos; val->string.len = 0; - while (is_ident(peek(s))) { - next(s); + while (is_ident(scanner_peek(s))) { + scanner_next(s); val->string.len++; } return TOK_IDENTIFIER; @@ -376,46 +376,46 @@ return; } - while (!eof(&s) && !eol(&s)) { - if (chr(&s, '%')) { - if (chr(&s, '%')) { - buf_append(&s, '%'); + while (!scanner_eof(&s) && !scanner_eol(&s)) { + if (scanner_chr(&s, '%')) { + if (scanner_chr(&s, '%')) { + scanner_buf_append(&s, '%'); } - else if (chr(&s, 'H')) { - const char *home = secure_getenv("HOME"); + else if (scanner_chr(&s, 'H')) { + const char *home = xkb_context_getenv(m->ctx, "HOME"); if (!home) { scanner_err(&s, "%%H was used in an include statement, but the HOME environment variable is not set"); return; } - if (!buf_appends(&s, home)) { + if (!scanner_buf_appends(&s, home)) { scanner_err(&s, "include path after expanding %%H is too long"); return; } } - else if (chr(&s, 'S')) { + else if (scanner_chr(&s, 'S')) { const char *default_root = xkb_context_include_path_get_system_path(m->ctx); - if (!buf_appends(&s, default_root) || !buf_appends(&s, "/rules")) { + if (!scanner_buf_appends(&s, default_root) || !scanner_buf_appends(&s, "/rules")) { scanner_err(&s, "include path after expanding %%S is too long"); return; } } - else if (chr(&s, 'E')) { + else if (scanner_chr(&s, 'E')) { const char *default_root = xkb_context_include_path_get_extra_path(m->ctx); - if (!buf_appends(&s, default_root) || !buf_appends(&s, "/rules")) { + if (!scanner_buf_appends(&s, default_root) || !scanner_buf_appends(&s, "/rules")) { scanner_err(&s, "include path after expanding %%E is too long"); return; } } else { - scanner_err(&s, "unknown %% format (%c) in include statement", peek(&s)); + scanner_err(&s, "unknown %% format (%c) in include statement", scanner_peek(&s)); return; } } else { - buf_append(&s, next(&s)); + scanner_buf_append(&s, scanner_next(&s)); } } - if (!buf_append(&s, '\0')) { + if (!scanner_buf_append(&s, '\0')) { scanner_err(&s, "include path is too long"); return; }
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/src/xkbcomp/scanner.c -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/src/xkbcomp/scanner.c
Changed
@@ -34,14 +34,14 @@ const char *start = s->s + s->pos; char *end; - if (lit(s, "0x")) { - while (is_xdigit(peek(s))) next(s); + if (scanner_lit(s, "0x")) { + while (is_xdigit(scanner_peek(s))) scanner_next(s); is_hex = true; } else { - while (is_digit(peek(s))) next(s); - is_float = chr(s, '.'); - while (is_digit(peek(s))) next(s); + while (is_digit(scanner_peek(s))) scanner_next(s); + is_float = scanner_chr(s, '.'); + while (is_digit(scanner_peek(s))) scanner_next(s); } if (s->s + s->pos == start) return false; @@ -69,16 +69,16 @@ skip_more_whitespace_and_comments: /* Skip spaces. */ - while (is_space(peek(s))) next(s); + while (is_space(scanner_peek(s))) scanner_next(s); /* Skip comments. */ - if (lit(s, "//") || chr(s, '#')) { - skip_to_eol(s); + if (scanner_lit(s, "//") || scanner_chr(s, '#')) { + scanner_skip_to_eol(s); goto skip_more_whitespace_and_comments; } /* See if we're done. */ - if (eof(s)) return END_OF_FILE; + if (scanner_eof(s)) return END_OF_FILE; /* New token. */ s->token_line = s->line; @@ -86,28 +86,28 @@ s->buf_pos = 0; /* String literal. */ - if (chr(s, '\"')) { - while (!eof(s) && !eol(s) && peek(s) != '\"') { - if (chr(s, '\\')) { + if (scanner_chr(s, '\"')) { + while (!scanner_eof(s) && !scanner_eol(s) && scanner_peek(s) != '\"') { + if (scanner_chr(s, '\\')) { uint8_t o; - if (chr(s, '\\')) buf_append(s, '\\'); - else if (chr(s, 'n')) buf_append(s, '\n'); - else if (chr(s, 't')) buf_append(s, '\t'); - else if (chr(s, 'r')) buf_append(s, '\r'); - else if (chr(s, 'b')) buf_append(s, '\b'); - else if (chr(s, 'f')) buf_append(s, '\f'); - else if (chr(s, 'v')) buf_append(s, '\v'); - else if (chr(s, 'e')) buf_append(s, '\033'); - else if (oct(s, &o)) buf_append(s, (char) o); + if (scanner_chr(s, '\\')) scanner_buf_append(s, '\\'); + else if (scanner_chr(s, 'n')) scanner_buf_append(s, '\n'); + else if (scanner_chr(s, 't')) scanner_buf_append(s, '\t'); + else if (scanner_chr(s, 'r')) scanner_buf_append(s, '\r'); + else if (scanner_chr(s, 'b')) scanner_buf_append(s, '\b'); + else if (scanner_chr(s, 'f')) scanner_buf_append(s, '\f'); + else if (scanner_chr(s, 'v')) scanner_buf_append(s, '\v'); + else if (scanner_chr(s, 'e')) scanner_buf_append(s, '\033'); + else if (scanner_oct(s, &o)) scanner_buf_append(s, (char) o); else { scanner_warn(s, "unknown escape sequence in string literal"); /* Ignore. */ } } else { - buf_append(s, next(s)); + scanner_buf_append(s, scanner_next(s)); } } - if (!buf_append(s, '\0') || !chr(s, '\"')) { + if (!scanner_buf_append(s, '\0') || !scanner_chr(s, '\"')) { scanner_err(s, "unterminated string literal"); return ERROR_TOK; } @@ -118,10 +118,10 @@ } /* Key name literal. */ - if (chr(s, '<')) { - while (is_graph(peek(s)) && peek(s) != '>') - buf_append(s, next(s)); - if (!buf_append(s, '\0') || !chr(s, '>')) { + if (scanner_chr(s, '<')) { + while (is_graph(scanner_peek(s)) && scanner_peek(s) != '>') + scanner_buf_append(s, scanner_next(s)); + if (!scanner_buf_append(s, '\0') || !scanner_chr(s, '>')) { scanner_err(s, "unterminated key name literal"); return ERROR_TOK; } @@ -131,29 +131,29 @@ } /* Operators and punctuation. */ - if (chr(s, ';')) return SEMI; - if (chr(s, '{')) return OBRACE; - if (chr(s, '}')) return CBRACE; - if (chr(s, '=')) return EQUALS; - if (chr(s, '')) return OBRACKET; - if (chr(s, '')) return CBRACKET; - if (chr(s, '(')) return OPAREN; - if (chr(s, ')')) return CPAREN; - if (chr(s, '.')) return DOT; - if (chr(s, ',')) return COMMA; - if (chr(s, '+')) return PLUS; - if (chr(s, '-')) return MINUS; - if (chr(s, '*')) return TIMES; - if (chr(s, '/')) return DIVIDE; - if (chr(s, '!')) return EXCLAM; - if (chr(s, '~')) return INVERT; + if (scanner_chr(s, ';')) return SEMI; + if (scanner_chr(s, '{')) return OBRACE; + if (scanner_chr(s, '}')) return CBRACE; + if (scanner_chr(s, '=')) return EQUALS; + if (scanner_chr(s, '')) return OBRACKET; + if (scanner_chr(s, '')) return CBRACKET; + if (scanner_chr(s, '(')) return OPAREN; + if (scanner_chr(s, ')')) return CPAREN; + if (scanner_chr(s, '.')) return DOT; + if (scanner_chr(s, ',')) return COMMA; + if (scanner_chr(s, '+')) return PLUS; + if (scanner_chr(s, '-')) return MINUS; + if (scanner_chr(s, '*')) return TIMES; + if (scanner_chr(s, '/')) return DIVIDE; + if (scanner_chr(s, '!')) return EXCLAM; + if (scanner_chr(s, '~')) return INVERT; /* Identifier. */ - if (is_alpha(peek(s)) || peek(s) == '_') { + if (is_alpha(scanner_peek(s)) || scanner_peek(s) == '_') { s->buf_pos = 0; - while (is_alnum(peek(s)) || peek(s) == '_') - buf_append(s, next(s)); - if (!buf_append(s, '\0')) { + while (is_alnum(scanner_peek(s)) || scanner_peek(s) == '_') + scanner_buf_append(s, scanner_next(s)); + if (!scanner_buf_append(s, '\0')) { scanner_err(s, "identifier too long"); return ERROR_TOK; }
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/test/common.c -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/test/common.c
Changed
@@ -34,6 +34,7 @@ #include <limits.h> #include <fcntl.h> +#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #ifdef _MSC_VER @@ -163,6 +164,52 @@ } char * +test_makedir(const char *parent, const char *path) +{ + char *dirname; + int err; + + dirname = asprintf_safe("%s/%s", parent, path); + assert(dirname); +#ifdef _MSC_VER + err = _mkdir(dirname); +#else + err = mkdir(dirname, 0777); +#endif + assert(err == 0); + + return dirname; +} + +char * +test_maketempdir(const char *template) +{ +#ifdef _MSC_VER + const char *basetmp = getenv("TMP"); + if (basetmp == NULL) { + basetmp = getenv("TEMP"); + } + if (basetmp == NULL) { + basetmp = getenv("top_builddir"); + } + assert(basetmp != NULL); + char *tmpdir = asprintf_safe("%s/%s", basetmp, template); + assert(tmpdir != NULL); + char *tmp = _mktemp(tmpdir); + assert(tmp == tmpdir); + int ret = _mkdir(tmp); + assert(ret == 0); + return tmpdir; +#else + char *tmpdir = asprintf_safe("/tmp/%s", template); + assert(tmpdir != NULL); + char *tmp = mkdtemp(tmpdir); + assert(tmp == tmpdir); + return tmpdir; +#endif +} + +char * test_get_path(const char *path_rel) { char *path;
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/test/compose.c -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/test/compose.c
Changed
@@ -560,6 +560,26 @@ free(table_string); } +static void +test_override(struct xkb_context *ctx) +{ + const char *table_string = "<dead_circumflex> <dead_circumflex> : \"foo\" X\n" + "<dead_circumflex> <e> : \"bar\" Y\n" + "<dead_circumflex> <dead_circumflex> <e> : \"baz\" Z\n"; + + assert(test_compose_seq_buffer(ctx, table_string, + /* Comes after - does override. */ + XKB_KEY_dead_circumflex, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, + XKB_KEY_dead_circumflex, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, + XKB_KEY_e, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "baz", XKB_KEY_Z, + + /* Override does not affect sibling nodes */ + XKB_KEY_dead_circumflex, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, + XKB_KEY_e, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "bar", XKB_KEY_Y, + + XKB_KEY_NoSymbol)); +} + int main(int argc, char *argv) { @@ -575,6 +595,7 @@ test_state(ctx); test_modifier_syntax(ctx); test_include(ctx); + test_override(ctx); xkb_context_unref(ctx); return 0;
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/test/context.c -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/test/context.c
Changed
@@ -30,15 +30,6 @@ #include <sys/stat.h> #include <sys/types.h> -#ifdef _MSC_VER -# include <io.h> -# include <direct.h> -# ifndef S_ISDIR -# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) -# endif -#else -# include <unistd.h> -#endif /* keeps a cache of all makedir/maketmpdir directories so we can free and * rmdir them in one go, see unmakedirs() */ @@ -82,29 +73,15 @@ static const char *makedir(const char *parent, const char *path) { - char *dirname; - int err; - - dirname = asprintf_safe("%s/%s", parent, path); - assert(dirname); - err = mkdir(dirname, 0777); - assert(err == 0); - + char *dirname = test_makedir(parent, path); dirnamesndirs++ = dirname; - return dirname; } static const char *maketmpdir(void) { - const char *template = "/tmp/xkbcommon-test.XXXXXX"; - char *tmpdir = strdup(template); - - tmpdir = mkdtemp(tmpdir); - assert(tmpdir != NULL); - + char *tmpdir = test_maketempdir("xkbcommon-test.XXXXXX"); dirnamesndirs++ = tmpdir; - return tmpdir; }
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/test/keysym.c -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/test/keysym.c
Changed
@@ -252,6 +252,7 @@ assert(test_utf32_to_keysym(0xd7, XKB_KEY_multiply)); assert(test_utf32_to_keysym('-', XKB_KEY_minus)); assert(test_utf32_to_keysym(0x10fffd, 0x110fffd)); + assert(test_utf32_to_keysym(0x20ac, XKB_KEY_EuroSign)); // Unicode non-characters assert(test_utf32_to_keysym(0xfdd0, XKB_KEY_NoSymbol));
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/test/registry.c -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/test/registry.c
Changed
@@ -35,6 +35,7 @@ #include "xkbcommon/xkbregistry.h" #include "utils.h" +#include "test.h" #define NO_VARIANT NULL @@ -56,6 +57,8 @@ const char *variant; const char *brief; const char *description; + const char *iso6393; /* language list (iso639 three letter codes), 3 is enough for our test */ + const char *iso31663; /* country list (iso3166 two letter codes), 3 is enough for our tests */ }; struct test_option { @@ -76,7 +79,9 @@ const char *name, const char *vendor, const char *brief, - const char *description) + const char *description, + const char * const iso6393, + const char * const iso31663) { fprintf(fp, " <configItem>\n" " <name>%s</name>\n", name); @@ -86,6 +91,27 @@ fprintf(fp, " <description>%s</description>\n", description); if (vendor) fprintf(fp, " <vendor>%s</vendor>\n", vendor); + if (iso3166 && iso31660) { + fprintf(fp, " <countryList>\n"); + for (int i = 0; i < 3; i++) { + const char *iso = iso3166i; + if (!iso) + break; + fprintf(fp, " <iso3166Id>%s</iso3166Id>\n", iso); + } + fprintf(fp, " </countryList>\n"); + } + if (iso639 && iso6390) { + fprintf(fp, " <languageList>\n"); + for (int i = 0; i < 3; i++) { + const char *iso = iso639i; + if (!iso) + break; + fprintf(fp, " <iso639Id>%s</iso639Id>\n", iso); + } + fprintf(fp, " </languageList>\n"); + } + fprintf(fp, " </configItem>\n"); } @@ -107,14 +133,13 @@ int rc; FILE *fp; - tmpdir = asprintf_safe("/tmp/%s.%d.XXXXXX", ruleset, iteration++); - assert(tmpdir); - assert(mkdtemp(tmpdir) == tmpdir); + char *template = asprintf_safe("%s.%d.XXXXXX", ruleset, iteration++); + assert(template != NULL); + tmpdir = test_maketempdir(template); + free(template); + + free(test_makedir(tmpdir, "rules")); - rc = snprintf_safe(buf, sizeof(buf), "%s/rules", tmpdir); - assert(rc); - rc = mkdir(buf, 0777); - assert(rc == 0); rc = snprintf_safe(buf, sizeof(buf), "%s/rules/%s.xml", tmpdir, ruleset); assert(rc); @@ -131,7 +156,7 @@ for (const struct test_model *m = test_models; m->name; m++) { fprintf(fp, "<model>\n"); - fprint_config_item(fp, m->name, m->vendor, NULL, m->description); + fprint_config_item(fp, m->name, m->vendor, NULL, m->description, NULL, NULL); fprintf(fp, "</model>\n"); } fprintf(fp, "</modelList>\n"); @@ -149,14 +174,13 @@ while (l->name) { fprintf(fp, "<layout>\n"); - fprint_config_item(fp, l->name, NULL, l->brief, l->description); + fprint_config_item(fp, l->name, NULL, l->brief, l->description, l->iso639, l->iso3166); if (next->name && streq(next->name, l->name)) { fprintf(fp, "<variantList>\n"); do { fprintf(fp, "<variant>\n"); - fprint_config_item(fp, next->variant, NULL, next->brief, - next->description); + fprint_config_item(fp, next->variant, NULL, next->brief, next->description, next->iso639, next->iso3166); fprintf(fp, "</variant>\n"); l = next; next++; @@ -175,10 +199,10 @@ for (const struct test_option_group *g = test_groups; g->name; g++) { fprintf(fp, "<group allowMultipleSelection=\"%s\">\n", g->allow_multiple_selection ? "true" : "false"); - fprint_config_item(fp, g->name, NULL, NULL, g->description); + fprint_config_item(fp, g->name, NULL, NULL, g->description, NULL, NULL); for (const struct test_option *o = g->options; o->name; o++) { fprintf(fp, " <option>\n"); - fprint_config_item(fp, o->name, NULL, NULL, o->description); + fprint_config_item(fp, o->name, NULL, NULL, o->description, NULL, NULL); fprintf(fp, "</option>\n"); } fprintf(fp, "</group>\n"); @@ -443,6 +467,9 @@ static bool cmp_layouts(struct test_layout *tl, struct rxkb_layout *l) { + struct rxkb_iso3166_code *iso3166 = NULL; + struct rxkb_iso639_code *iso639 = NULL; + if (!tl || !l) return false; @@ -458,6 +485,36 @@ if (!streq_null(tl->description, rxkb_layout_get_description(l))) return false; + iso3166 = rxkb_layout_get_iso3166_first(l); + for (size_t i = 0; i < sizeof(tl->iso3166); i++) { + const char *iso = tl->iso3166i; + if (iso == NULL && iso3166 == NULL) + break; + + if (!streq_null(iso, rxkb_iso3166_code_get_code(iso3166))) + return false; + + iso3166 = rxkb_iso3166_code_next(iso3166); + } + + if (iso3166 != NULL) + return false; + + iso639 = rxkb_layout_get_iso639_first(l); + for (size_t i = 0; i < sizeof(tl->iso639); i++) { + const char *iso = tl->iso639i; + if (iso == NULL && iso639 == NULL) + break; + + if (!streq_null(iso, rxkb_iso639_code_get_code(iso639))) + return false; + + iso639 = rxkb_iso639_code_next(iso639); + } + + if (iso639 != NULL) + return false; + return true; } @@ -563,6 +620,7 @@ struct test_layout system_layouts = { {"l1", NO_VARIANT, "lbrief1", "ldesc1"}, {"l1", "v1", "vbrief1", "vdesc1"}, + {"l1", "v2", NULL, "vdesc2"}, {NULL}, }; struct test_option_group system_groups = { @@ -597,6 +655,11 @@ assert(cmp_layouts(&system_layouts1, l)); rxkb_layout_unref(l); + l = fetch_layout(ctx, "l1", "v2"); + struct test_layout expected = {"l1", "v2", "lbrief1", "vdesc2"}; + assert(cmp_layouts(&expected, l)); + rxkb_layout_unref(l); + g = fetch_option_group(ctx, "grp1"); assert(cmp_option_groups(&system_groups0, g, CMP_EXACT)); rxkb_option_group_unref(g); @@ -609,6 +672,107 @@ } static void +test_load_languages(void) +{ + struct test_model system_models = { + {"m1", "vendor1", "desc1"}, + {NULL}, + }; + struct test_layout system_layouts = { + {"l1", NO_VARIANT, "lbrief1", "ldesc1", + .iso639 = { "abc", "def" }, + .iso3166 = { "uv", "wx" }}, + {"l1", "v1", "vbrief1", "vdesc1", + .iso639 = {"efg"}, + .iso3166 = {"yz"}}, + {"l2", NO_VARIANT, "lbrief1", "ldesc1", + .iso639 = { "hij", "klm" }, + .iso3166 = { "op", "qr" }}, + {"l2", "v2", "lbrief1", "ldesc1", + .iso639 = { NULL }, /* inherit from parent */ + .iso3166 = { NULL }}, /* inherit from parent */ + {NULL}, + }; + struct test_option_group system_groups = { + {"grp1", "gdesc1", true, + { {"grp1:1", "odesc11"}, {"grp1:2", "odesc12"} } }, + { NULL }, + }; + struct rxkb_context *ctx; + struct rxkb_layout *l; + struct rxkb_iso3166_code *iso3166; + struct rxkb_iso639_code *iso639; + + ctx = test_setup_context(system_models, NULL, + system_layouts, NULL, + system_groups, NULL); + + l = fetch_layout(ctx, "l1", NO_VARIANT); + assert(cmp_layouts(&system_layouts0, l)); + rxkb_layout_unref(l); + + l = fetch_layout(ctx, "l1", "v1"); + assert(cmp_layouts(&system_layouts1, l)); + rxkb_layout_unref(l); + + l = fetch_layout(ctx, "l2", "v2"); + iso3166 = rxkb_layout_get_iso3166_first(l); + assert(streq(rxkb_iso3166_code_get_code(iso3166), "op")); + iso3166 = rxkb_iso3166_code_next(iso3166); + assert(streq(rxkb_iso3166_code_get_code(iso3166), "qr")); + + iso639 = rxkb_layout_get_iso639_first(l); + assert(streq(rxkb_iso639_code_get_code(iso639), "hij")); + iso639 = rxkb_iso639_code_next(iso639); + assert(streq(rxkb_iso639_code_get_code(iso639), "klm")); + + rxkb_layout_unref(l); + rxkb_context_unref(ctx); +} + +static void +test_load_invalid_languages(void) +{ + struct test_model system_models = { + {"m1", "vendor1", "desc1"}, + {NULL}, + }; + struct test_layout system_layouts = { + {"l1", NO_VARIANT, "lbrief1", "ldesc1", + .iso639 = { "ab", "def" }, + .iso3166 = { "uvw", "xz" }}, + {NULL}, + }; + struct test_option_group system_groups = { + {"grp1", "gdesc1", true, + { {"grp1:1", "odesc11"}, {"grp1:2", "odesc12"} } }, + { NULL }, + }; + struct rxkb_context *ctx; + struct rxkb_layout *l; + struct rxkb_iso3166_code *iso3166; + struct rxkb_iso639_code *iso639; + + ctx = test_setup_context(system_models, NULL, + system_layouts, NULL, + system_groups, NULL); + + l = fetch_layout(ctx, "l1", NO_VARIANT); + /* uvw is invalid, we expect 2 letters, verify it was ignored */ + iso3166 = rxkb_layout_get_iso3166_first(l); + assert(streq(rxkb_iso3166_code_get_code(iso3166), "xz")); + assert(rxkb_iso3166_code_next(iso3166) == NULL); + + /* ab is invalid, we expect 3 letters, verify it was ignored */ + iso639 = rxkb_layout_get_iso639_first(l); + assert(streq(rxkb_iso639_code_get_code(iso639), "def")); + assert(rxkb_iso639_code_next(iso639) == NULL); + rxkb_layout_unref(l); + + rxkb_context_unref(ctx); +} + +static void test_popularity(void) { struct test_layout system_layouts = { @@ -849,6 +1013,8 @@ test_load_full(); test_load_merge(); test_load_merge_no_overwrite(); + test_load_languages(); + test_load_invalid_languages(); test_popularity(); return 0;
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/test/test.h -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/test/test.h
Changed
@@ -54,6 +54,12 @@ test_key_seq_va(struct xkb_keymap *keymap, va_list args); char * +test_makedir(const char *parent, const char *path); + +char * +test_maketempdir(const char *template); + +char * test_get_path(const char *path_rel); char *
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/test/tool-option-parsing.py -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/test/tool-option-parsing.py
Changed
@@ -100,7 +100,7 @@ for testfunc, reason in self.skipError: if testfunc(rc, stdout, stderr): raise unittest.SkipTest(reason) - assert rc == 0, (stdout, stderr) + assert rc == 0, (rc, stdout, stderr) return stdout, stderr def run_command_invalid(self, args):
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/tools/interactive-wayland.c -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/tools/interactive-wayland.c
Changed
@@ -42,7 +42,7 @@ #include "xdg-shell-client-protocol.h" #include <wayland-util.h> -#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define MIN(a, b) ((a) < (b) ? (a) : (b)) struct interactive_dpy { struct wl_display *dpy; @@ -557,7 +557,7 @@ seat->global_name = name; seat->inter = inter; seat->wl_seat = wl_registry_bind(registry, name, &wl_seat_interface, - MAX(version, 5)); + MIN(version, 5)); wl_seat_add_listener(seat->wl_seat, &seat_listener, seat); ret = asprintf(&seat->name_str, "seat:%d", wl_proxy_get_id((struct wl_proxy *) seat->wl_seat)); @@ -607,17 +607,17 @@ else if (strcmp(interface, "xdg_wm_base") == 0) { inter->shell = wl_registry_bind(registry, name, &xdg_wm_base_interface, - MAX(version, 2)); + MIN(version, 2)); xdg_wm_base_add_listener(inter->shell, &shell_listener, inter); } else if (strcmp(interface, "wl_compositor") == 0) { inter->compositor = wl_registry_bind(registry, name, &wl_compositor_interface, - MAX(version, 1)); + MIN(version, 1)); } else if (strcmp(interface, "wl_shm") == 0) { inter->shm = wl_registry_bind(registry, name, &wl_shm_interface, - MAX(version, 1)); + MIN(version, 1)); } }
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/tools/registry-list.c -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/tools/registry-list.c
Changed
@@ -140,11 +140,12 @@ m = rxkb_model_first(ctx); assert(m); /* Empty model list is usually a bug or a bad xml file */ while (m) { + const char *vendor = rxkb_model_get_vendor(m); printf("- name: %s\n" " vendor: %s\n" " description: %s\n", rxkb_model_get_name(m), - rxkb_model_get_vendor(m), + vendor ? vendor : "''", rxkb_model_get_description(m)); m = rxkb_model_next(m); } @@ -159,12 +160,12 @@ const char *variant = rxkb_layout_get_variant(l); const char *brief = rxkb_layout_get_brief(l); - printf("- layout: %s\n" - " variant: %s\n" - " brief: %s\n" + printf("- layout: '%s'\n" + " variant: '%s'\n" + " brief: '%s'\n" " description: %s\n", rxkb_layout_get_name(l), - variant ? variant : "''", + variant ? variant : "", brief ? brief : "''", rxkb_layout_get_description(l)); @@ -173,7 +174,7 @@ if (iso639) { const char *sep = ""; while (iso639) { - printf("%s%s", sep, rxkb_iso639_code_get_code(iso639)); + printf("%s'%s'", sep, rxkb_iso639_code_get_code(iso639)); iso639 = rxkb_iso639_code_next(iso639); sep = ", "; } @@ -184,7 +185,7 @@ if (iso3166) { const char *sep = ""; while (iso3166) { - printf("%s%s", sep, rxkb_iso3166_code_get_code(iso3166)); + printf("%s'%s'", sep, rxkb_iso3166_code_get_code(iso3166)); iso3166 = rxkb_iso3166_code_next(iso3166); sep = ", "; } @@ -199,7 +200,7 @@ while (g) { struct rxkb_option *o; - printf("- name: %s\n" + printf("- name: '%s'\n" " description: %s\n" " allows_multiple: %s\n" " options:\n",
View file
_service:tar_scm:libxkbcommon-1.3.1.tar.xz/tools/xkbcli-list.1 -> _service:tar_scm:libxkbcommon-1.5.0.tar.xz/tools/xkbcli-list.1
Changed
@@ -1,4 +1,4 @@ -.Dd July 27, 2020 +.Dd November 1, 2021 .Dt XKBCLI\-LIST 1 .Os . @@ -11,11 +11,11 @@ .Op Pa /path/to/xkbbase Oo Pa /path/to/xkbbase Oc ... . .Sh DESCRIPTION -.Nm -is a commandline tool to list available model, layout, variant and option (MLVO) values from the XKB registry. +List available model, layout, variant and option (MLVO) values from the XKB registry. +The output is in YAML 1.2 format. . .Pp -Positional arguments provided on the commandline are treated as XKB base directory installations. +Positional arguments are treated as XKB base directory installations. . .Bl -tag -width Ds .It Fl \-help
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2