Repository: neutrinolabs/xrdp Branch: devel Commit: b9742d94f729 Files: 691 Total size: 6.1 MB Directory structure: gitextract_vzhdixoe/ ├── .cirrus.yml ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ └── config.yml │ └── workflows/ │ ├── build.yml │ ├── coverity.yml │ └── release-tarball.yml ├── .gitignore ├── .gitmodules ├── COPYING ├── Makefile.am ├── NEWS.md ├── README.md ├── SECURITY.md ├── astyle_config.as ├── bootstrap ├── coding_style.md ├── common/ │ ├── Makefile.am │ ├── arch.h │ ├── base64.c │ ├── base64.h │ ├── channel_defs.h │ ├── defines.h │ ├── fifo.c │ ├── fifo.h │ ├── file.c │ ├── file.h │ ├── guid.c │ ├── guid.h │ ├── list.c │ ├── list.h │ ├── list16.c │ ├── list16.h │ ├── log.c │ ├── log.h │ ├── ms-erref.h │ ├── ms-fscc.h │ ├── ms-rdpbcgr.h │ ├── ms-rdpeclip.h │ ├── ms-rdpedisp.h │ ├── ms-rdpefs.h │ ├── ms-rdpegdi.h │ ├── ms-rdpele.h │ ├── ms-rdperp.h │ ├── ms-smb2.h │ ├── os_calls.c │ ├── os_calls.h │ ├── parse.c │ ├── parse.h │ ├── pixman-region.c │ ├── pixman-region.h │ ├── pixman-region16.c │ ├── rail.h │ ├── scancode.c │ ├── scancode.h │ ├── set_int.c │ ├── set_int.h │ ├── ssl_calls.c │ ├── ssl_calls.h │ ├── string_calls.c │ ├── string_calls.h │ ├── thread_calls.c │ ├── thread_calls.h │ ├── timers.c │ ├── timers.h │ ├── trans.c │ ├── trans.h │ ├── unicode_defines.h │ ├── xrdp_client_info.h │ ├── xrdp_constants.h │ ├── xrdp_rail.h │ ├── xrdp_scancode_defs.h │ ├── xrdp_sockets.h │ └── xup_client_info.h ├── configure.ac ├── docs/ │ ├── Makefile.am │ └── man/ │ ├── .gitignore │ ├── Makefile.am │ ├── gfx.toml.5.in │ ├── sesman.ini.5.in │ ├── xrdp-chansrv.8.in │ ├── xrdp-dis.1.in │ ├── xrdp-dumpfv1.8.in │ ├── xrdp-genkeymap.8.in │ ├── xrdp-keygen.8.in │ ├── xrdp-km.toml.5.in │ ├── xrdp-mkfv1.8.in │ ├── xrdp-sesadmin.8.in │ ├── xrdp-sesman.8.in │ ├── xrdp-sesrun.8.in │ ├── xrdp.8.in │ └── xrdp.ini.5.in ├── fontutils/ │ ├── Makefile.am │ ├── README_fv1.txt │ ├── dumpfv1.c │ ├── fv1.c │ ├── fv1.h │ ├── mkfv1.c │ └── windows/ │ ├── .gitignore │ ├── Makefile │ └── fontdump.c ├── genkeymap/ │ ├── Makefile.am │ ├── dump-keymaps.sh │ ├── genkeymap.c │ └── readme.txt ├── instfiles/ │ ├── Makefile.am │ ├── default/ │ │ ├── Makefile.am │ │ └── xrdp │ ├── init.d/ │ │ ├── Makefile.am │ │ └── xrdp │ ├── keymap-names.txt │ ├── km-00000405.toml │ ├── km-00000406.toml │ ├── km-00000407.ini │ ├── km-00000407.toml │ ├── km-00000409.toml │ ├── km-0000040a.toml │ ├── km-0000040b.toml │ ├── km-0000040c.toml │ ├── km-0000040e.toml │ ├── km-00000410.ini │ ├── km-00000410.toml │ ├── km-00000411.ini │ ├── km-00000411.toml │ ├── km-00000412.toml │ ├── km-00000414.toml │ ├── km-00000415.ini │ ├── km-00000415.toml │ ├── km-00000416.toml │ ├── km-00000419.ini │ ├── km-00000419.toml │ ├── km-0000041d.ini │ ├── km-0000041d.toml │ ├── km-00000424.toml │ ├── km-00000426.toml │ ├── km-00000807.toml │ ├── km-00000809.ini │ ├── km-00000809.toml │ ├── km-0000080a.toml │ ├── km-0000080c.toml │ ├── km-00000813.toml │ ├── km-00000816.ini │ ├── km-00000816.toml │ ├── km-0000100c.toml │ ├── km-00010409.ini │ ├── km-00010409.toml │ ├── km-00010426.toml │ ├── km-00060409.toml │ ├── km-19360409.ini │ ├── km-19360409.toml │ ├── pam.d/ │ │ ├── Makefile.am │ │ ├── mkpamrules │ │ ├── xrdp-sesman.arch │ │ ├── xrdp-sesman.debian │ │ ├── xrdp-sesman.freebsd │ │ ├── xrdp-sesman.macos │ │ ├── xrdp-sesman.redhat │ │ ├── xrdp-sesman.suse │ │ ├── xrdp-sesman.system │ │ └── xrdp-sesman.unix │ ├── pulse/ │ │ ├── Makefile.am │ │ └── default.pa │ ├── rc.d/ │ │ ├── Makefile.am │ │ ├── xrdp │ │ └── xrdp-sesman │ ├── xrdp-sesman.service.in │ └── xrdp.service.in ├── keygen/ │ ├── Makefile.am │ ├── keygen.c │ └── openssl.conf ├── libipm/ │ ├── Doxyfile │ ├── Makefile.am │ ├── ccp.c │ ├── ccp.h │ ├── ccp_application_types.c │ ├── ccp_application_types.h │ ├── eicp.c │ ├── eicp.h │ ├── ercp.c │ ├── ercp.h │ ├── libipm.c │ ├── libipm.h │ ├── libipm_facilities.h │ ├── libipm_private.h │ ├── libipm_recv.c │ ├── libipm_send.c │ ├── scp.c │ ├── scp.h │ ├── scp_application_types.c │ ├── scp_application_types.h │ ├── scp_sync.c │ └── scp_sync.h ├── libxrdp/ │ ├── Makefile.am │ ├── libxrdp.c │ ├── libxrdp.h │ ├── libxrdpinc.h │ ├── xrdp_bitmap32_compress.c │ ├── xrdp_bitmap_compress.c │ ├── xrdp_caps.c │ ├── xrdp_channel.c │ ├── xrdp_channel.h │ ├── xrdp_fastpath.c │ ├── xrdp_iso.c │ ├── xrdp_jpeg_compress.c │ ├── xrdp_mcs.c │ ├── xrdp_mppc_enc.c │ ├── xrdp_orders.c │ ├── xrdp_orders_rail.c │ ├── xrdp_orders_rail.h │ ├── xrdp_rdp.c │ ├── xrdp_sec.c │ └── xrdp_surface.c ├── m4/ │ ├── .gitignore │ ├── ax_append_compile_flags.m4 │ ├── ax_append_flag.m4 │ ├── ax_cflags_warn_all.m4 │ ├── ax_check_compile_flag.m4 │ ├── ax_gcc_func_attribute.m4 │ ├── ax_require_defined.m4 │ ├── ax_type_socklen_t.m4 │ ├── axrdp.m4 │ └── pkg.m4 ├── mc/ │ ├── Makefile.am │ ├── mc.c │ └── mc.h ├── neutrinordp/ │ ├── Makefile.am │ ├── xrdp-color.c │ ├── xrdp-color.h │ ├── xrdp-neutrinordp.c │ └── xrdp-neutrinordp.h ├── pkgconfig/ │ ├── .gitignore │ ├── Makefile.am │ ├── xrdp-uninstalled.pc.in │ └── xrdp.pc.in ├── scripts/ │ ├── install_astyle.sh │ ├── install_astyle_dependencies_with_apt.sh │ ├── install_cppcheck.sh │ ├── install_cppcheck_dependencies_with_apt.sh │ ├── install_xrdp_build_dependencies_with_apt.sh │ ├── run_astyle.sh │ └── run_cppcheck.sh ├── sesman/ │ ├── Doxyfile │ ├── Makefile.am │ ├── chansrv/ │ │ ├── Makefile.am │ │ ├── audin.c │ │ ├── audin.h │ │ ├── chansrv.c │ │ ├── chansrv.h │ │ ├── chansrv_common.c │ │ ├── chansrv_common.h │ │ ├── chansrv_config.c │ │ ├── chansrv_config.h │ │ ├── chansrv_fuse.c │ │ ├── chansrv_fuse.h │ │ ├── chansrv_xfs.c │ │ ├── chansrv_xfs.h │ │ ├── clipboard-notes.txt │ │ ├── clipboard.c │ │ ├── clipboard.h │ │ ├── clipboard_common.h │ │ ├── clipboard_file.c │ │ ├── clipboard_file.h │ │ ├── devredir.c │ │ ├── devredir.h │ │ ├── input.h │ │ ├── input_ibus.c │ │ ├── irp.c │ │ ├── irp.h │ │ ├── pcsc/ │ │ │ ├── .gitignore │ │ │ ├── Makefile │ │ │ ├── dumps/ │ │ │ │ ├── scard-begin-tranaction.txt │ │ │ │ ├── scard-connect.txt │ │ │ │ ├── scard-control.txt │ │ │ │ ├── scard-disconnect.txt │ │ │ │ ├── scard-end-tranaction.txt │ │ │ │ ├── scard-establish-context.txt │ │ │ │ ├── scard-get-status-change.txt │ │ │ │ ├── scard-list-readers.txt │ │ │ │ ├── scard-release-context.txt │ │ │ │ ├── scard-status.txt │ │ │ │ └── scard-transmit.txt │ │ │ ├── wrapper/ │ │ │ │ ├── Makefile │ │ │ │ ├── winscard-func-names.txt │ │ │ │ ├── winscard-funcs.h │ │ │ │ ├── winscard.c │ │ │ │ └── winscard.def │ │ │ └── xrdp_pcsc.c │ │ ├── rail.c │ │ ├── rail.h │ │ ├── smartcard.c │ │ ├── smartcard.h │ │ ├── smartcard_dummy.c │ │ ├── smartcard_internal.h │ │ ├── smartcard_pcsc.c │ │ ├── smartcard_pcsc.h │ │ ├── sound.c │ │ ├── sound.h │ │ ├── wave-format-server.txt │ │ ├── xcommon.c │ │ └── xcommon.h │ ├── display_utils.c │ ├── display_utils.h │ ├── eicp_process.c │ ├── eicp_process.h │ ├── ercp_process.c │ ├── ercp_process.h │ ├── libsesman/ │ │ ├── Makefile.am │ │ ├── sesman_access.c │ │ ├── sesman_access.h │ │ ├── sesman_auth.h │ │ ├── sesman_clip_restrict.c │ │ ├── sesman_clip_restrict.h │ │ ├── sesman_config.c │ │ ├── sesman_config.h │ │ ├── verify_user.c │ │ ├── verify_user_bsd.c │ │ ├── verify_user_kerberos.c │ │ ├── verify_user_pam.c │ │ └── verify_user_pam_userpass.c │ ├── lock_uds.c │ ├── lock_uds.h │ ├── notes.txt │ ├── reconnectwm.sh │ ├── scp_list.c │ ├── scp_list.h │ ├── scp_process.c │ ├── scp_process.h │ ├── sesexec/ │ │ ├── Makefile.am │ │ ├── ccp_server.c │ │ ├── ccp_server.h │ │ ├── eicp_server.c │ │ ├── eicp_server.h │ │ ├── env.c │ │ ├── env.h │ │ ├── ercp_server.c │ │ ├── ercp_server.h │ │ ├── login_info.c │ │ ├── login_info.h │ │ ├── sesexec.c │ │ ├── sesexec.h │ │ ├── sesexec_discover.c │ │ ├── sesexec_discover.h │ │ ├── session.c │ │ ├── session.h │ │ ├── sessionrecord.c │ │ ├── sessionrecord.h │ │ ├── xauth.c │ │ ├── xauth.h │ │ ├── xwait.c │ │ └── xwait.h │ ├── sesexec_control.c │ ├── sesexec_control.h │ ├── sesman.c │ ├── sesman.h │ ├── sesman.ini.in │ ├── sesman_restart.c │ ├── sesman_restart.h │ ├── session_list.c │ ├── session_list.h │ ├── sig.c │ ├── sig.h │ ├── startwm.sh │ └── tools/ │ ├── Makefile.am │ ├── authmod.c │ ├── authtest.c │ ├── dis.c │ ├── sesadmin.c │ ├── sesrun.c │ └── xcon.c ├── tests/ │ ├── Makefile.am │ ├── common/ │ │ ├── Makefile.am │ │ ├── UTF-8-test.txt │ │ ├── test_base64.c │ │ ├── test_common.h │ │ ├── test_common_main.c │ │ ├── test_fifo_calls.c │ │ ├── test_guid.c │ │ ├── test_list16_calls.c │ │ ├── test_list_calls.c │ │ ├── test_os_calls.c │ │ ├── test_os_calls_signals.c │ │ ├── test_parse.c │ │ ├── test_scancode.c │ │ ├── test_set_int.c │ │ ├── test_ssl_calls.c │ │ ├── test_string_calls.c │ │ ├── test_string_calls_unicode.c │ │ └── test_timers.c │ ├── libipm/ │ │ ├── Makefile.am │ │ ├── test_libipm.h │ │ ├── test_libipm_main.c │ │ ├── test_libipm_recv_calls.c │ │ └── test_libipm_send_calls.c │ ├── libxrdp/ │ │ ├── Makefile.am │ │ ├── test_libxrdp.h │ │ ├── test_libxrdp_main.c │ │ ├── test_libxrdp_process_monitor_stream.c │ │ └── test_xrdp_sec_process_mcs_data_monitors.c │ ├── memtest/ │ │ ├── Makefile.am │ │ ├── libmem.c │ │ ├── libmem.h │ │ └── memtest.c │ ├── readme.txt │ └── xrdp/ │ ├── Makefile.am │ ├── gfx/ │ │ ├── gfx.toml │ │ ├── gfx_codec_h264_only.toml │ │ ├── gfx_codec_h264_preferred.toml │ │ ├── gfx_codec_order_undefined.toml │ │ ├── gfx_codec_rfx_only.toml │ │ ├── gfx_codec_rfx_preferred.toml │ │ ├── gfx_codec_rfx_preferred_odd.toml │ │ ├── gfx_h264_encoder_invalid.toml │ │ ├── gfx_h264_encoder_openh264.toml │ │ ├── gfx_h264_encoder_undefined.toml │ │ ├── gfx_h264_encoder_x264.toml │ │ └── gfx_missing_h264.toml │ ├── test_bitmap_load.c │ ├── test_tconfig.c │ ├── test_xrdp.h │ ├── test_xrdp_egfx.c │ ├── test_xrdp_keymap.c │ ├── test_xrdp_main.c │ └── test_xrdp_region.c ├── third_party/ │ ├── COPYING-THIRD-PARTY │ ├── Makefile.am │ ├── Makefile.copying │ ├── README.md │ ├── copying_third_party.h │ └── tomlc99/ │ ├── .editorconfig │ ├── .gitignore │ ├── LICENSE │ ├── Makefile.am │ ├── README.md │ ├── libtoml.pc.sample │ ├── sample.toml │ ├── stdex/ │ │ ├── .gitignore │ │ ├── RUN.sh │ │ ├── arr1.toml │ │ ├── arr1.toml.res │ │ ├── arr2.toml │ │ ├── arr2.toml.res │ │ ├── arrtab1.toml │ │ ├── arrtab1.toml.res │ │ ├── arrtab2.toml │ │ ├── arrtab2.toml.res │ │ ├── arrtab3.toml │ │ ├── arrtab3.toml.res │ │ ├── arrtab4.toml │ │ ├── arrtab4.toml.res │ │ ├── arrtab5.toml │ │ ├── arrtab5.toml.res │ │ ├── arrtab6.toml │ │ ├── arrtab6.toml.res │ │ ├── arrtab7.toml │ │ ├── arrtab7.toml.res │ │ ├── bool1.toml │ │ ├── bool1.toml.res │ │ ├── comment.toml │ │ ├── comment.toml.res │ │ ├── float1.toml │ │ ├── float1.toml.res │ │ ├── float2.toml │ │ ├── float2.toml.res │ │ ├── float3.toml │ │ ├── float3.toml.res │ │ ├── float4.toml │ │ ├── float4.toml.res │ │ ├── float5.toml │ │ ├── float5.toml.res │ │ ├── float6.toml │ │ ├── float6.toml.res │ │ ├── inlinetab1.toml │ │ ├── inlinetab1.toml.res │ │ ├── inlinetab2.toml │ │ ├── inlinetab2.toml.res │ │ ├── inlinetab3.toml │ │ ├── inlinetab3.toml.res │ │ ├── int0.toml │ │ ├── int0.toml.res │ │ ├── int1.toml │ │ ├── int1.toml.res │ │ ├── keys00.toml │ │ ├── keys00.toml.res │ │ ├── keys01.toml │ │ ├── keys01.toml.res │ │ ├── keys02.toml │ │ ├── keys02.toml.res │ │ ├── keys03.toml │ │ ├── keys03.toml.res │ │ ├── keys04.toml │ │ ├── keys04.toml.res │ │ ├── keys05.toml │ │ ├── keys05.toml.res │ │ ├── keys06.toml │ │ ├── keys06.toml.res │ │ ├── keys07.toml │ │ ├── keys07.toml.res │ │ ├── keys08.toml │ │ ├── keys08.toml.res │ │ ├── keys09.toml │ │ ├── keys09.toml.res │ │ ├── keys10.toml │ │ ├── keys10.toml.res │ │ ├── keys11.toml │ │ ├── keys11.toml.res │ │ ├── keys12.toml │ │ ├── keys12.toml.res │ │ ├── kvpair0.toml │ │ ├── kvpair0.toml.res │ │ ├── kvpair1.toml │ │ ├── kvpair1.toml.res │ │ ├── kvpair2.toml │ │ ├── kvpair2.toml.res │ │ ├── string0.toml │ │ ├── string0.toml.res │ │ ├── string1.toml │ │ ├── string1.toml.res │ │ ├── string3.toml │ │ ├── string3.toml.res │ │ ├── string4.toml │ │ ├── string4.toml.res │ │ ├── string5.toml │ │ ├── string5.toml.res │ │ ├── string6.toml │ │ ├── string6.toml.res │ │ ├── string7.toml │ │ ├── string7.toml.res │ │ ├── string8.toml │ │ ├── string8.toml.res │ │ ├── tab01.toml │ │ ├── tab01.toml.res │ │ ├── tab02.toml │ │ ├── tab02.toml.res │ │ ├── tab03.toml │ │ ├── tab03.toml.res │ │ ├── tab04.toml │ │ ├── tab04.toml.res │ │ ├── tab05.toml │ │ ├── tab05.toml.res │ │ ├── tab06.toml │ │ ├── tab06.toml.res │ │ ├── tab07.toml │ │ ├── tab07.toml.res │ │ ├── tab08.toml │ │ ├── tab08.toml.res │ │ ├── tab09.toml │ │ ├── tab09.toml.res │ │ ├── tab10.toml │ │ ├── tab10.toml.res │ │ ├── tab11.toml │ │ ├── tab11.toml.res │ │ ├── ts1.toml │ │ ├── ts1.toml.res │ │ ├── ts2.toml │ │ ├── ts2.toml.res │ │ ├── ts3.toml │ │ ├── ts3.toml.res │ │ ├── ts4.toml │ │ ├── ts4.toml.res │ │ ├── ts5.toml │ │ └── ts5.toml.res │ ├── test1/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.sh │ │ ├── extra/ │ │ │ ├── array_of_tables.toml │ │ │ ├── inline_array.toml │ │ │ └── inline_table.toml │ │ └── run.sh │ ├── test2/ │ │ ├── .gitignore │ │ ├── Note.txt │ │ ├── build.sh │ │ └── run.sh │ ├── toml.c │ ├── toml.h │ ├── toml_cat.c │ ├── toml_json.c │ ├── toml_sample.c │ └── unittest/ │ └── t1.c ├── tools/ │ ├── Makefile.am │ ├── chkpriv/ │ │ ├── Makefile.am │ │ ├── xrdp-chkpriv.in │ │ └── xrdp-droppriv.c │ └── devel/ │ ├── Makefile.am │ ├── gtcp_proxy/ │ │ ├── README.txt │ │ ├── gtcp-proxy.c │ │ ├── gtcp.c │ │ ├── gtcp.h │ │ └── hexdump.c │ └── tcp_proxy/ │ ├── Makefile.am │ └── main.c ├── vnc/ │ ├── Makefile.am │ ├── rfb.c │ ├── rfb.h │ ├── vnc.c │ ├── vnc.h │ ├── vnc_clip.c │ └── vnc_clip.h ├── vrplayer/ │ ├── README.txt │ ├── decoder.cpp │ ├── decoder.h │ ├── demuxmedia.cpp │ ├── demuxmedia.h │ ├── dlgabout.cpp │ ├── dlgabout.h │ ├── dlgabout.ui │ ├── main.cpp │ ├── mainwindow.cpp │ ├── mainwindow.h │ ├── mainwindow.ui │ ├── mediapacket.cpp │ ├── mediapacket.h │ ├── ourinterface.cpp │ ├── ourinterface.h │ ├── playaudio.cpp │ ├── playaudio.h │ ├── playvideo.cpp │ ├── playvideo.h │ └── vrplayer.pro ├── waitforx/ │ ├── Makefile.am │ └── waitforx.c ├── xrdp/ │ ├── Makefile.am │ ├── README.logo │ ├── cursor0.cur │ ├── cursor1.cur │ ├── czech.txt │ ├── funcs.c │ ├── gfx.toml │ ├── lang.c │ ├── rdp-scan-codes.txt │ ├── sans-10.fv1 │ ├── sans-18.fv1 │ ├── xrdp.c │ ├── xrdp.h │ ├── xrdp.ini.in │ ├── xrdp_bitmap.c │ ├── xrdp_bitmap_common.c │ ├── xrdp_bitmap_load.c │ ├── xrdp_cache.c │ ├── xrdp_egfx.c │ ├── xrdp_egfx.h │ ├── xrdp_encoder.c │ ├── xrdp_encoder.h │ ├── xrdp_encoder_openh264.c │ ├── xrdp_encoder_openh264.h │ ├── xrdp_encoder_x264.c │ ├── xrdp_encoder_x264.h │ ├── xrdp_font.c │ ├── xrdp_keyboard.toml │ ├── xrdp_listen.c │ ├── xrdp_login_wnd.c │ ├── xrdp_main_utils.c │ ├── xrdp_mm.c │ ├── xrdp_mm.h │ ├── xrdp_mm_ccp.c │ ├── xrdp_painter.c │ ├── xrdp_process.c │ ├── xrdp_region.c │ ├── xrdp_tconfig.c │ ├── xrdp_tconfig.h │ ├── xrdp_types.h │ ├── xrdp_wm.c │ └── xrdpwin.c ├── xrdp_accel_assist/ │ ├── Makefile.am │ ├── encoder_headers/ │ │ ├── nvEncodeAPI_11_0.h │ │ └── nvEncodeAPI_11_1.h │ ├── xrdp_accel_assist.c │ ├── xrdp_accel_assist.h │ ├── xrdp_accel_assist_egl.c │ ├── xrdp_accel_assist_egl.h │ ├── xrdp_accel_assist_glx.c │ ├── xrdp_accel_assist_glx.h │ ├── xrdp_accel_assist_nvenc.c │ ├── xrdp_accel_assist_nvenc.h │ ├── xrdp_accel_assist_shaders.c │ ├── xrdp_accel_assist_x11.c │ └── xrdp_accel_assist_x11.h ├── xrdpapi/ │ ├── Makefile.am │ ├── connectmon.c │ ├── simple.c │ ├── vrplayer.c │ ├── vrplayer.mk │ ├── xrdp-ssh-agent.c │ ├── xrdpapi.c │ └── xrdpapi.h ├── xrdpvr/ │ ├── Makefile.am │ ├── xrdpvr.c │ ├── xrdpvr.h │ └── xrdpvr_internal.h └── xup/ ├── Makefile.am ├── xup.c └── xup.h ================================================ FILE CONTENTS ================================================ ================================================ FILE: .cirrus.yml ================================================ FreeBSD_task: matrix: env: SSL: libressl matrix: freebsd_instance: image_family: freebsd-14-3 prepare_script: - pkg install -y $SSL git autoconf automake libtool pkgconf opus jpeg-turbo fdk-aac pixman libX11 libXfixes libXrandr libxkbfile nasm fusefs-libs3 check imlib2 freetype2 cmocka ibus - git submodule update --init --recursive configure_script: - ./bootstrap - env CPPFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib ./configure --localstatedir=/var --enable-strict-locations --with-pkgconfigdir=/usr/local/libdata/pkgconfig --enable-strict-locations --enable-ibus --enable-ipv6 --enable-opus --enable-jpeg --enable-fdkaac --enable-painter --enable-pixman --enable-fuse --with-imlib2 --with-freetype2 build_script: - make -j $(sysctl -n hw.ncpu || echo 4) check_script: - make check install_script: - make install test_script: - /usr/local/sbin/xrdp -v ================================================ FILE: .github/FUNDING.yml ================================================ open_collective: xrdp-project ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.yml ================================================ name: "🕷️ Bug report" description: Report errors or unexpected behavior labels: - "bug" body: - type: markdown attributes: value: | Before submitting a bug, read the [FAQ](https://github.com/neutrinolabs/xrdp/wiki/Tips-and-FAQ). **In particular, on systemd-based systems. make sure you are not logged in on the console as the same user you are trying to use for xrdp** Please do not include links to images or videos on external websites. These are not guaranteed to always be available, and could be used to compromise web browsers. Videos hosted on github have a size limit (currently 10MB). If your video is larger than this, please upload it to https://youtube.com - type: input attributes: label: xrdp version placeholder: 0.9.20 validations: required: true - type: textarea attributes: label: Detailed xrdp version, build options description: Copy & paste the result of `xrdp --version`. DO NOT remove `~~~` but paste the result between two `~~~`. value: | ~~~ Paste the result between `~~~`. Please DO NOT remove `~~~`! ~~~ - type: input attributes: label: Operating system & version placeholder: "Ubuntu 22.04 / AlmaLinux 9 / FreeBSD 13.2 / etc" description: Tell us about your operating system. See PRETTY_NAME in /etc/os-release if you don't know. Note we are currently unable to provide direct support for Red Hat Enterprise Linux. Either reproduce the issue on CentOS/Alma/Rocky OS, or contact Red Hat directly for support. validations: required: true - type: dropdown attributes: label: Installation method description: How was xrdp installed from? options: - dnf / apt / zypper / pkg / etc - Homebrew / MacPorts - git clone & make install - Doesn't matter - other validations: required: true - type: input attributes: label: Which backend do you use? description: Tell us about xrdp backend and version you're using. Typically, it would be either Xvnc or xorgxrdp or rarely NeutrionRDP / FreeRDP. placeholder: Xvnc (tigervnc-1.12.0-13.el9_2) - type: input attributes: label: What desktop environment do you use? description: Tell us about your desktop (e.g. GNOME / KDE / Xfce / xterm). If you're certain the bug you about to report is not desktop specific, fill "any" here. placeholder: GNOME - type: input attributes: label: Environment xrdp running on description: Tell us whether xrdp is running on a VM, or if on a physical machine what graphics cards are installed. - type: input attributes: label: What's your client? description: If you issue occurs with specific clients, tell us the client app name, app version client os version and platform. placeholder: Microsoft's official client from Mac App Store, running on macOS Ventura. - type: dropdown attributes: label: Area(s) with issue? description: What things had an issue? Check all that apply. multiple: true options: - Audio redirection - Authentication - Crashes such as segfault - Clipboard - Compatiblity aginst clients - Compile error - File transfer / drive redirection - Graphic glitches - Keyboard / Mouse - Network - Performance - Session manager (sesman) - Smartcard - Other - type: textarea attributes: label: Steps to reproduce placeholder: Having detailed steps helps us reproduce the bug. validations: required: true - type: textarea attributes: label: ✔️ Expected Behavior placeholder: What were you expecting? validations: required: false - type: textarea attributes: label: ❌ Actual Behavior placeholder: What happened instead? validations: required: false - type: textarea attributes: label: Anything else? description: Links? References? Anything that will give us more context about the issue you are encountering! We recommend attaching `xrdp.log`, `xrdp-sesman.log`, `xrdp/xorg.conf` or screenshots to clarify context. ================================================ FILE: .github/ISSUE_TEMPLATE/config.yml ================================================ contact_links: - name: Questions about: If you are new to xrdp and want to ask community for help, raise it as Q&A in discussion. url: https://github.com/neutrinolabs/xrdp/discussions/new?category=q-a ================================================ FILE: .github/workflows/build.yml ================================================ name: build and test on: push: branches-ignore: - "gh-pages" tags-ignore: - "v0.[0-8]**" pull_request: branches-ignore: - "gh-pages" jobs: build_and_test: strategy: fail-fast: false matrix: include: # Minimal 64-bit arch builds - CC: gcc feature_set: min arch: amd64 os: ubuntu-latest unittests: false DISTCHECK: false - CC: g++ feature_set: min arch: amd64 os: ubuntu-latest unittests: false DISTCHECK: false - CC: clang feature_set: min arch: amd64 os: ubuntu-latest unittests: false DISTCHECK: false # Maximal 64-bit arch builds - CC: gcc feature_set: max arch: amd64 os: ubuntu-latest unittests: true DISTCHECK: true - CC: g++ feature_set: max arch: amd64 os: ubuntu-latest unittests: false DISTCHECK: false - CC: clang feature_set: max arch: amd64 os: ubuntu-latest unittests: true DISTCHECK: true - CC: clang feature_set: max arch: amd64 os: ubuntu-latest unittests: true DISTCHECK: false name_extra: and AddressSanitized CFLAGS: "-fsanitize=address -ggdb" LDFLAGS: "-fsanitize=address" - CC: clang feature_set: max arch: amd64 os: ubuntu-latest unittests: true DISTCHECK: false name_extra: and UndefinedBehaviorSanitized # -fsanitize=nullability is only available for Clang # TODO: enable alignment CFLAGS: "-fsanitize=undefined -fsanitize=nullability -fno-sanitize=alignment -ggdb" LDFLAGS: "-fsanitize=undefined -fsanitize=nullability -fno-sanitize=alignment" UBSAN_OPTIONS: print_stacktrace=1:halt_on_error=1:report_error_type=1 # Maximal debug 64-bit arch builds # Check we can also do a static build without # installing .a files - CC: gcc feature_set: max arch: amd64 os: ubuntu-latest unittests: true DISTCHECK: false name_extra: and DEBUG CONF_FLAGS_EXTRA: "--enable-devel-all --disable-static" # Maximal 32-bit arch builds - CC: gcc feature_set: max arch: i386 os: ubuntu-latest unittests: true DISTCHECK: false name_extra: for 32-bit arch (legacy OS) CFLAGS: "-m32" LDFLAGS: "-m32" - CC: g++ feature_set: max arch: i386 os: ubuntu-latest unittests: false DISTCHECK: false name_extra: for 32-bit arch (legacy OS) CFLAGS: "-m32" LDFLAGS: "-m32" - CC: clang feature_set: max arch: i386 os: ubuntu-latest unittests: true DISTCHECK: false name_extra: for 32-bit arch (legacy OS) CFLAGS: "-m32" LDFLAGS: "-m32" name: ${{ matrix.feature_set }} features with ${{ matrix.CC }} ${{ matrix.name_extra }} runs-on: ${{ matrix.os }} env: CC: ${{ matrix.CC }} CFLAGS: ${{ matrix.CFLAGS }} LDFLAGS: ${{ matrix.LDFLAGS }} UBSAN_OPTIONS: ${{ matrix.UBSAN_OPTIONS }} # HACK (2020-11-16): github actions doesn't support YAML anchors/aliases to # avoid repeating long config values. So instead the config values are defined # as environment variables using a naming convention with fields that come from # the job config. These environment variables are then referenced as regular # environment variables via the naming convention in the "define env" step to # define the standard environment variable used in the rest of the steps. CONF_FLAGS_amd64_min: "--disable-ipv6 --disable-jpeg --disable-fuse --disable-mp3lame --disable-fdkaac --disable-opus --disable-rfxcodec --disable-painter --disable-pixman --disable-utmp" CONF_FLAGS_amd64_max: "--enable-ibus --enable-ipv6 --enable-jpeg --enable-fuse --enable-mp3lame --enable-fdkaac --enable-opus --enable-rfxcodec --enable-painter --enable-pixman --enable-utmp --with-imlib2 --with-freetype2 --enable-tests --enable-x264 --enable-openh264 --enable-smartcard" CONF_FLAGS_i386_max: "--enable-ipv6 --enable-jpeg --enable-mp3lame --enable-opus --enable-rfxcodec --enable-painter --disable-pixman --with-freetype2 --host=i686-linux --enable-tests --enable-smartcard" PKG_CONFIG_PATH_i386: "/usr/lib/i386-linux-gnu/pkgconfig" steps: - name: "Define feature and arch dependent environment variables" # Note: any "variable=value" written to the $GITHUB_ENV file will be # defined as an environment variable for all future steps in this job # See: https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#setting-an-environment-variable run: | echo "CONF_FLAGS=$CONF_FLAGS_${{ matrix.arch }}_${{ matrix.feature_set }} ${{ matrix.CONF_FLAGS_EXTRA }}" >> $GITHUB_ENV echo "PKG_CONFIG_PATH=$PKG_CONFIG_PATH_${{ matrix.arch }}" >> $GITHUB_ENV - uses: actions/checkout@v6 - name: "Install Dependencies" # See https://github.com/actions/runner-images/issues/7192 run: | echo RESET grub-efi/install_devices | sudo debconf-communicate grub-pc sudo scripts/install_xrdp_build_dependencies_with_apt.sh ${{ matrix.feature_set }} ${{ matrix.arch }} --allow-downgrades --allow-remove-essential --allow-change-held-packages - name: Bootstrap run: ./bootstrap - name: configure run: ./configure $CONF_FLAGS - name: make run: make -j $(nproc) - name: unittests if: ${{ matrix.unittests }} run: make check -j $(nproc) || (cat tests/*/test-suite.log && exit 1) - name: distcheck id: dist_check if: ${{ matrix.DISTCHECK }} run: make distcheck -j $(nproc) - name: "Artifact: test-suite.log distcheck" uses: actions/upload-artifact@v7 if: always() && steps.dist_check.outcome == 'failure' with: name: test-suite-distcheck-${{ matrix.cc }}-${{ matrix.feature_set }} path: ${{ github.workspace }}/xrdp-*/_build/sub/tests/xrdp/test-suite.log cppcheck: name: cppcheck runs-on: ubuntu-latest env: CC: gcc # This is required to use a version of cppcheck other than that # supplied with the operating system CPPCHECK_VER: "2.20.0" CPPCHECK_REPO: https://github.com/danmar/cppcheck.git steps: # Set steps.os.outputs.image to the specific OS (e.g. 'ubuntu20') - name: Get operating system name and version. id: os run: echo "image=$ImageOS" >>$GITHUB_OUTPUT shell: bash - uses: actions/checkout@v6 - name: Cache cppcheck uses: actions/cache@v5 env: cache-name: cache-cppcheck with: path: ~/cppcheck.local key: ${{ steps.os.outputs.image }}-build-${{ env.cache-name }}-${{ env.CPPCHECK_VER }} - run: sudo scripts/install_cppcheck_dependencies_with_apt.sh $CPPCHECK_VER - run: ./bootstrap - run: ./configure - run: scripts/install_cppcheck.sh $CPPCHECK_REPO $CPPCHECK_VER - run: scripts/run_cppcheck.sh -v $CPPCHECK_VER code_formatting_check: name: code formatting check runs-on: ubuntu-latest env: CC: gcc # This is required to use a version of astyle other than that # supplied with the operating system ASTYLE_VER: 3.4.14 ASTYLE_REPO: https://gitlab.com/saalen/astyle.git steps: # Set steps.os.outputs.image to the specific OS (e.g. 'ubuntu20') - name: Get operating system name and version. id: os run: echo "image=$ImageOS" >>$GITHUB_OUTPUT shell: bash - uses: actions/checkout@v6 - name: Cache astyle uses: actions/cache@v5 env: cache-name: cache-astyle with: path: ~/astyle.local key: ${{ steps.os.outputs.image }}-build-${{ env.cache-name }}-${{ env.ASTYLE_VER }} - run: sudo scripts/install_astyle_dependencies_with_apt.sh - run: scripts/install_astyle.sh $ASTYLE_REPO $ASTYLE_VER - name: Format code with astyle run: scripts/run_astyle.sh -v $ASTYLE_VER - name: Check code formatting run: git diff --exit-code ================================================ FILE: .github/workflows/coverity.yml ================================================ name: Coverity on: schedule: - cron: "0 0 * * *" workflow_dispatch: jobs: scan: name: scan runs-on: ubuntu-latest if: ${{ github.repository_owner == 'neutrinolabs' }} env: CC: gcc CONF_FLAGS_amd64_max: "--enable-ipv6 --enable-jpeg --enable-fuse --enable-mp3lame --enable-fdkaac --enable-opus --enable-rfxcodec --enable-painter --enable-pixman --enable-utmp --enable-x264 --enable-openh264 --with-imlib2 --with-freetype2 --enable-tests" steps: - uses: actions/checkout@v6 - name: Download Coverity build tool run: | wget -c -N https://scan.coverity.com/download/linux64 --post-data "token=${{ secrets.COVERITY_SCAN_TOKEN }}&project=neutrinolabs/xrdp" -O coverity_tool.tar.gz mkdir coverity_tool tar xzf coverity_tool.tar.gz --strip 1 -C coverity_tool - name: "Install Dependencies" run: | echo RESET grub-efi/install_devices | sudo debconf-communicate grub-pc sudo scripts/install_xrdp_build_dependencies_with_apt.sh max amd64 --allow-downgrades --allow-remove-essential --allow-change-held-packages - name: Bootstrap run: ./bootstrap - name: configure run: ./configure $CONF_FLAGS_amd64_max - name: make run: | export PATH=`pwd`/coverity_tool/bin:$PATH cov-build --dir cov-int make -j $(nproc) - name: Submit build result to Coverity Scan run: | tar czvf cov.tar.gz cov-int curl --form token=${{ secrets.COVERITY_SCAN_TOKEN }} \ --form email=meta@vmeta.jp \ --form file=@cov.tar.gz \ --form version="Commit $GITHUB_SHA" \ --form description="Build submitted via CI" \ https://scan.coverity.com/builds?project=neutrinolabs/xrdp ================================================ FILE: .github/workflows/release-tarball.yml ================================================ name: Generate release tarball on: workflow_dispatch: inputs: tag: description: 'Tag to build' required: true jobs: build: name: Generate release tarball (${{ github.event.repository.name }} ${{ github.event.inputs.tag }}) runs-on: ubuntu-latest steps: - name: Set timestamp run: echo "timestamp=$(date +'%Y%m%d-%H%M%S')" >> $GITHUB_ENV - name: Checkout repository uses: actions/checkout@v6 with: ref: ${{ github.event.inputs.tag }} - name: Install dependencies run: | sudo scripts/install_xrdp_build_dependencies_with_apt.sh min amd64 - name: Run make distcheck run: | ./bootstrap ./configure make distcheck - name: Find generated tarball id: find_tarball run: | TARBALL=$(find . -maxdepth 1 -name "*.tar.gz" | head -n 1) if [ -z "$TARBALL" ]; then echo "Error: No tarball found" >&2 exit 1 fi echo "tarball=$TARBALL" >> $GITHUB_ENV - name: Upload Artifact uses: actions/upload-artifact@v7 with: name: ${{ github.event.repository.name }}-${{ github.event.inputs.tag }}-${{ env.timestamp }} path: "${{ env.tarball }}" if-no-files-found: error compression-level: 0 retention-days: 7 ================================================ FILE: .gitignore ================================================ *~ *.a aclocal.m4 AUTHORS autom4te.cache/ ChangeLog compile config_ac.h config_ac-h.in config.guess config.log config.status config.sub configure depcomp .deps/ fontutils/xrdp-dumpfv1 fontutils/xrdp-mkfv1 genkeymap/xrdp-genkeymap install-sh instfiles/pam.d/xrdp-sesman instfiles/*.service keygen/xrdp-keygen *.la .libs libtool *.lo *.log ltmain.sh Makefile Makefile.in missing mkinstalldirs NEWS *.o README sesman/chansrv/xrdp-chansrv sesman/sesexec/xrdp-sesexec sesman/tools/xrdp-authtest sesman/tools/xrdp-dis sesman/tools/xrdp-sesadmin sesman/tools/xrdp-sesrun sesman/tools/xrdp-sestest sesman/tools/xrdp-xcon sesman/xrdp-sesman sesman/sesman.ini *.so stamp-h1 tap-driver.sh test-driver tests/common/test_common tests/libipm/test_libipm tests/libxrdp/test_libxrdp tests/memtest/memtest tests/xrdp/test_xrdp tools/devel/tcp_proxy/tcp_proxy tools/chkpriv/xrdp-chkpriv tools/chkpriv/xrdp-droppriv *.trs waitforx/waitforx xrdp/xrdp xrdp/xrdp.ini xrdp_configure_options.h xrdpapi/xrdp-xrdpapi-simple .vscode/* xrdp_accel_assist/xrdp-accel-assist ================================================ FILE: .gitmodules ================================================ [submodule "librfxcodec"] path = librfxcodec url = https://github.com/neutrinolabs/librfxcodec.git branch = . ignore = untracked [submodule "libpainter"] path = libpainter url = https://github.com/neutrinolabs/libpainter.git branch = . ignore = untracked [submodule "ulalaca"] path = ulalaca url = https://github.com/neutrinolabs/ulalaca-xrdp.git ================================================ FILE: COPYING ================================================ Apache License, Version 2.0 Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: You must give any other recipients of the Work or Derivative Works a copy of this License; and You must cause any modified files to carry prominent notices stating that You changed the files; and You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: Makefile.am ================================================ ACLOCAL_AMFLAGS = -I m4 # Redefine the localstatedir to stop github CI defaulting to # something like /home/runner/work/xrdp/xrdp/xrdp-0.10.80/_inst/var # # A path this long (50 chars) can trigger some -Werror=format-truncation # errors when using the XRDP_SOCKET_ROOT_PATH macro to create a Unix # domain socket name, as these names have a quite short length (108 # characters on Linux). AM_DISTCHECK_CONFIGURE_FLAGS = \ --localstatedir=/distcheckdummy/var \ --without-systemdsystemunitdir \ --enable-strict-locations \ --enable-tests EXTRA_DIST = \ COPYING \ README.md \ NEWS.md \ astyle_config.as \ bootstrap \ coding_style.md \ m4 \ vrplayer if XRDP_NEUTRINORDP NEUTRINORDPDIR = neutrinordp else NEUTRINORDPDIR = endif if XRDP_XRDPVR XRDPVRDIR = xrdpvr else XRDPVRDIR = endif if XRDP_PAINTER PAINTERDIR = libpainter else PAINTERDIR = endif if XRDP_RFXCODEC RFXCODECDIR = librfxcodec else RFXCODECDIR = endif if XRDP_ULALACA ULALACADIR = ulalaca else ULALACADIR = endif if XRDP_ACCEL ACCELDIR = xrdp_accel_assist else ACCELDIR = endif # This should not be dictionary order but build order SUBDIRS = \ third_party \ third_party/tomlc99 \ common \ vnc \ xup \ mc \ $(NEUTRINORDPDIR) \ libipm \ libxrdp \ $(PAINTERDIR) \ $(RFXCODECDIR) \ sesman \ xrdp \ fontutils \ keygen \ waitforx \ docs \ instfiles \ genkeymap \ xrdpapi \ pkgconfig \ $(XRDPVRDIR) \ $(ULALACADIR) \ tests \ tools \ $(ACCELDIR) distclean-local: -rm -f xrdp_configure_options.h ================================================ FILE: NEWS.md ================================================ # Release notes for xrdp v0.9.19 (2022/03/17) ## General announcements * Running xrdp and xrdp-sesman on separate hosts is still supported by this release, but is now deprecated. This is not secure. A future release will replace the TCP socket used between these processes with a Unix Domain Socket, and then cross-host running will not be possible. ## New features * Both inbound and outbound clipboards can now be restricted for text, files or images [Sponsored by @CyberTrust @clear-code and @kenhys] (#2087) ## Bug fixes * [CVE-2022-23613](https://www.cve.org/CVERecord?id=CVE-2022-23613): Privilege escalation on xrdp-sesman (This fix is also in the out-of-band v0.9.18.1 release) * The versions of imlib2 used on RHEL 7 and 8 are now detected correctly (#2118) * Some situations where zombie processes could exist have been resolved (#2146, #2151, #2168) * Some null-pointer exceptions which can happen in the logging module have been addressed (#2149) * Some minor logging errors have been corrected (#2152) * The signal handling in sesman has been reworked to prevent race conditions when a child exits. This has also made it possible to reliably reload the sesman configuration with SIGHUP (#1729, #2168) ## Internal changes * Versions 0.13 and later of checklib can undefine the pre-processor symbol `HAVE_STDINT_H`. The xrdp tests now build successfully against these versions (#2124) * OpenSSL packaging changes (#2130):- - The OpenSSL 3 EVP interface is now fully supported - When building against OpenSSL 3, an internal implementation of the RC4 cipher is used instead of the implementation from the OpenSSL legacy provider - The wrapping of the OpenSSL library has been improved which should make it simpler to provide an alternative cryptographic provider in the future, if required - The logging of TLS/non-TLS security negotiation has been improved * cppcheck version used for CI bumped to 2.7 (#2140) * The `s_check()` macro which is easily mis-used has been removed (#2144) * Status values for the DRDYNVC channel are now available in `libxrdp/xrdp_channel.h` ## Changes for packagers or developers * On OpenSSL 3 systems, there is now no need to build with the `-Wno-error=deprecated-declarations` flag ## Known issues * On-the-fly resolution change requires the Microsoft Store version of Remote Desktop client but sometimes crashes on connect (#1869) * xrdp's login dialog is not relocated at the center of the new resolution after on-the-fly resolution change happens (#1867) ----------------------- # Release notes for xrdp v0.9.18.1 (2022/02/08) This is a security fix release that includes fixes for the following privilege escalation vulnerability. * [CVE-2022-23613: Privilege escalation on xrdp-sesman](https://www.cve.org/CVERecord?id=CVE-2022-23613) Users who uses xrdp v0.9.17 or v0.9.18 are recommended to update to this version. ## Special thanks Thanks to [Gilad Kleinman](https://github.com/giladkl) reporting the vulnerability and reviewing fix. ----------------------- # Release notes for xrdp v0.9.18 (2022/01/10) ## General announcements * Running xrdp and xrdp-sesman on separate hosts is still supported by this release, but is now deprecated. This is not secure. A future release will replace the TCP socket used between these processes with a Unix Domain Socket, and then cross-host running will not be possible. * Special thanks for @trishume for contributing code to the RFX codec ## New features * Backgrounds and logos on the login screen can now be zoomed and scaled (#1962) * Small change for Alpine Linux support (#2005) * loongarch support (#2057) * Improved Fail2ban support (#1976) ## Bug fixes * Logging is improved for security protocol level decisions (#1974, #1975) * An unnecessary log error message which is always generated when running neutrinordp has been removed (#2016) * An incorrect development log message has been fixed (#2074) * Some informational and error messages written to the console on stdout have been removed or replaced with log messages (#2078 #2080) * Failure to attach to the memory area shared with xorgxrdp is now logged (#2065) * A regression in the VNC module logging which might cause a connection to drop out has been identified and fixed (#1989) * Remote drive redirection now works if printer redirection is also requested by the client (#327) * Some file names could not be copied from the client to the server over the clipboard. This is now fixed (#1992, #1995) * A config value has been added which allows copy-pasting of files to work with Nautilus for GNOME 3 versions >= 3.29.92 (#1994, #1996) * Clipboard now works properly when files can't be read (#1997 #2001) * (xorgxrdp v0.2.18) The screen is fully refreshed after initialising shared memory which should fix black screen problems like #1964 * An incorrect initialisation reported by @qarmin has been fixed (#1909) * Some minor memory leaks have been fixed (#2014 #2028) * A hard hang in chansrv when copying files from the remote system has been addressed (#2032) * Users can now capitalise username and password on the login screen if required (#2061) * Some failed size checks in the fastpath code with `--enable-devel-streamcheck` have been addressed (#2066,#2070) * Log level for clipboard restriction has been promoted from DEVEL DEBUG to INFO (#2088) * A buffer overflow in the RFX codec associated with large screens has been fixed (#2087) ## Internal changes * Some 64-bit packages are removed during the 32-bit CI build process in an attempt to make this more robust (#1985) * Minor improvements to error checking and logging for file copy-paste (#1996) * Now uses cppcheck 2.6 for CI builds (#2008) * Generated systemd unit files now ignored by git (#2006) * More internal tests (#2015) * Some unnecessary files have been removed from the distribution (#2030) * The `which` command in shell scripts has been replaced with `command -v` (#2067) * Additional unit tests added for `g_file_get_size()` (#1988) * A compiler warning with -O3 on gcc 11.1 has been addressed (#2105) * An unused declaration for xrdp_wm_drdynvc_up has been removed (#2098) * The SCP V0 code has been unified, which will make it easier to update and replace (#2011) * Monitor processing unit tests for existing xrdp_sec function have been added (#1932) * The librfxcodec has been updated as part of #2087, and also to add stack frames to assemble code to assist debugging ## Changes for packagers or developers * The `--with-imlib2` option has been added. If xrdp is built with imlib2, the login screen supports more image formats for the background and logo, and better quality zooming and scaling (#1962) ## Known issues * On-the-fly resolution change requires the Microsoft Store version of Remote Desktop client but sometimes crashes on connect (#1869) * xrdp's login dialog is not relocated at the center of the new resolution after on-the-fly resolution change happens (#1867) ----------------------- # Release notes for xrdp v0.9.17 (2021/08/31) ## General announcements * Running xrdp and xrdp-sesman on separate hosts is still supported by this release, but is now deprecated. This is not secure. A future release will replace the TCP socket used between these processes with a Unix Domain Socket, and then cross-host running will not be possible. ## New features * The IP address, port, and user name of NeutrinoRDP Proxy connection are logged in xrdp.log - these connections may not have a sesman log to use (#1873) * The performance settings for NeutrinoRDP can be now configured (#1903) * Support for Alpine Linux in startwm.sh (#1965) * clipboard: log file transfer for the purpose of audit (#1954) * Client's Keyboard layout now can be overridden by xrdp configuration for debugging purposes (#1952) ## Bug fixes * PAM_USER environment variable is not set when using pam_exec module (#1882) * Allow common channel settings to be overridden for modules as well as chansrv (#1899) * The text only-copy/paste interface for the VNC module (used only when chansrv is not active) has been improved (#1900) * The unsupported `tcutils` utility has been removed (#1943) * The quality of TLS logging has been improved (#1926) * Keyboard information is now passed correctly through NeuutrinoRDP, and can be overridden if required (#1934) * A message is now logged in the sesman log for unsuccessful login attempts detailing the user used (#1947) ## Internal changes * astyle formatting is now checked during CI builds (#1879) * Generalise development build options, and add --enable-devel-streamcheck (#1887) * Now uses cppcheck 2.5 for CI builds (#1938) * The SCP protocol is now using a standard `struct trans` for messaging rather than its own thing (#1925) ## Changes for packagers or developers * The `--enable-xrdpdebug` developer option has been replaced with finer-grained `--enable-devel-*` options. Consequently, specifying `--enable-xrdpdebug` is now an error (#1913) ## Known issues * On-the-fly resolution change requires the Microsoft Store version of Remote Desktop client but sometimes crashes on connect (#1869) * xrdp's login dialog is not relocated at the center of the new resolution after on-the-fly resolution change happens (#1867) ----------------------- # Release notes for xrdp v0.9.16 (2021/04/30) ## New features * On-the-fly resolution change now supported for Xvnc and Xorg (#448, #1820) - thanks to @Nexarian for this significant first contribution. See the following YouTube video for a demo. * [Windows] https://youtu.be/cZ0ebieZHeA * [Mac] https://youtu.be/6kfAkyLUgFY * xrdp can now use key algorithms other than RSA for TLS (#1776) * Do not spit on the console 2nd stage (inspired by Debian) #1762 * Unified and improved logging (#1742, #1767, #1802, #1806, #1807, #1826, #1843) - thanks to @aquesnel for this detailed work. * Other logging level fixes (#1864) * chansrv can now work on `DISPLAY=:0` so it can be used with x11vnc/Vino/etc sessions (#1849) ## Bug fixes * Fix some regressions in sesman auth modules (#1769) * Minor manpage fixes (#1787) * Fix TS_PLAY_SOUND_PDU_DATA to set the correct frequency and duration (#1793) * Fix password leakage to logs in NeutrinoRDP module (#1872) - thanks to @TOMATO-ONE for reporting. ## Internal changes * cppcheck version for CI bumped to 2.4 (#1771, #1836) * FreeBSD version for CI bumped to 12-2 (#1804) * Support for check unit test framework added (#1843, #1860) * FreeBSD FUSE module now compiles under CI but needs additional work (#1856) * Compilation support added for additional Debian platforms (#1818) * Refactoring:- * Confusing preprocessor macro USE_NOPAM replaced with USE_PAM (#1800) * Window manager states in xrdp executable now use symbolic constants instead of numbers (#1803) * Documentation improvements * KRDC added to client list (#1817) * Platform support tier added (#1822) * README file revised (#1863) * Don't install test+development executables by default (#1858) ## Changes for packagers These changes are likely to impact operating system package builders and those building xrdp from source. * (#1843, #1860) This release introduces an additional optional compile-time dependency on the `check` unit test framework. The dependency is recommended when packaging for compile-time tests. * (#1858) The executables `memtest` and `tcp_proxy` are no longer copied to the sbin directory on a package install. ## Known issues * On-the-fly resolution change requires the Microsoft Store version of Remote Desktop client but sometimes crashes on connect (#1869) * xrdp's login dialog is not relocated at the center of the new resolution after on-the-fly resolution change happens (#1867) ----------------------- # Release notes for xrdp v0.9.15 (2020/12/28) ## New features * Allow token sign in without autologon for SSO (#1667 #1668) * Norwegian keyboard support (#1675) * Improved config support for chansrv (#1635) * Unified chansrv, sesman and libxrdp logging (#1633 #1708 #1738) - thanks to @aquesnel * Support SUSE move to /usr/etc (#1702) * Parameters may now be specified for user-specified shell (#1270 #1695) * xrdp executables now allow alternative config files to be specified with -c (#1588 #1650 #1651) * sesrun improvements (#1741) * Drive redirection location can now be specified (#1048) * Now compiles on RISC-V (#1761) ## Bug fixes * Additional buffer overflow checks (#1662) * FUSE support now builds on 32-bit platforms (#1682) * genkeymap array size conflict fixed (#1691) * Buffering issue with neutrinordp over a slow link fixed (#1608 1634) * Various documentation fixes (#1704 #1741 #1755 #1759) * Prevent PAM info message from causing authentication failure (#1727) * Cosmetic fixes for minor issues (#1751 #1755 #1749) * Try harder to clean up socket files on session exit (#1740 #1756) * xrdp-chansrv become defunct in docker while file copy (#1658) ## Internal changes * Compilation warnings with newer compilers (#1659 #1680) * Continuation Integration checks on 32-bit platforms now include FUSE support (#1682) * Continuation Integration builds now default to the Ubuntu Focal platform (#1666) * FUSE type tidy-ups (#1686) * Switch from Travis CI to GitHub Actions (#1728 #1732) * Easier to set up console logging for utilities (#1711) ----------------------- # Release notes for xrdp v0.9.14 (2020/08/31) ## New features * VNC multi-monitor support if you are using a suitable Xvnc server #1343 * VNC sessions now resize by default on reconnection if you are using a suitable Xvnc server #1343 * Support Slackware for PAM #1558 #1560 * Support Programmer Dvorak Keyboard #1663 **[HEADS UP]** The VNC changes are significant. They described in more detail on the following wiki page. * [Xvnc backend : Multi monitor and resize support](https://github.com/neutrinolabs/xrdp/wiki/Xvnc-backend-:-Multi-monitor-and-resize-support) ## Bug fixes * Fix odd shift key behavior (workaround) #397 #1522 * Fix Xorg path in the document for Arch Linux #1448 #1529 * Fix Xorg path in the document for CentOS 8 #1646 #1647 * Fix internal username/password buffer is smaller than RDP protocol specification #1648 #1653 * Fix possible memory out-of-bounds accesses #1549 * Fix memory allocation overflow #1557 * Prevent chansrv input channels being scanned during a server reset #1595 * Ignore TS_MULTIFRAGMENTUPDATE_CAPABILITYSET from client if fp disabled #1593 * Minor manpage fixes #1611 ## Other changes * CI error fixes * Introduce cppcheck ## Known issues * FreeRDP 2.0.0-rc4 or later might not able to connect to xrdp due to xrdp's bad-mannered behaviour, add `+glyph-cache` option to FreeRDP to connect #1266 * Audio redirection by MP3 codec doesn't sound with some client, use AAC instead #965 # Release notes for xrdp v0.9.13.1 (2020/06/30) This is a security fix release that includes fixes for the following local buffer overflow vulnerability. * [CVE-2020-4044: Local users can perform a buffer overflow attack against the xrdp-sesman service and then impersonate it](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-4044) This update is recommended for all xrdp users. ## Special thanks Thanks to [Ashley Newson](https://github.com/ashleynewson) reporting the vulnerability and reviewing fix. ----------------------- # Release notes for xrdp v0.9.13 (2020/03/11) This release is an intermediate bugfix release. The previous version v0.9.12 has some regressions on drive redirection. ## Bug fixes (drive redirection related) * Fix chansrv crashes with segmentation fault (regression in #1449) #1487 * Drive redirection now supports Guacamole client #1505 #1507 * Prevent a coredump in the event of a corrupted file system #1507 * Resolve double-free in `chansrv_fuse` #1469 ## Bug fixes (other) * Fix the issue `xrdp --version | less` will show empty output #1471 #1472 * Fix some warnings found by cppcheck #1479 #1481 #1484 #1485 ## Other changes * Add FreeBSD CI test #1466 * Move Microsoft-defined constants into separate includes #1470 * Perform cppcheck during CI test #1493 * Support mousex button 8/9 #1478 ## Known issues * FreeRDP 2.0.0-rc4 or later might not able to connect to xrdp due to xrdp's bad-mannered behaviour, add `+glyph-cache` option to FreeRDP to connect #1266 * Audio redirection by MP3 codec doesn't sound with some client, use AAC instead #965 ----------------------- # Release notes for xrdp v0.9.12 (2019/12/28) ## Bug fixes * Fix "The log reference is NULL" error when sesman startup #1425 * Fix behavior when shmem_id changes #1439 * Make vsock config accept -1 for cid and port #1441 * Cleanup refresh rect and check stream bounds #1437 * Significant improvements in drive redirection #1449 * Fix build on macOS Catalina #1462 ## Other changes * Proprietary microphone redirection via rdpsnd is now default off RDP compatible microphone redirection is on instead #1427 * Skip connecting to chansrv when no channels enabled #1393 * Add openSUSE's pam rules #1442 * Do not terminate xrdp daemon when caught SIGHUP #1319 ## Known issues * FreeRDP 2.0.0-rc4 or later might not able to connect to xrdp due to xrdp's bad-mannered behaviour, add `+glyph-cache` option to FreeRDP to connect #1266 * Audio redirection by MP3 codec doesn't sound with some client, use AAC instead #965 # Release notes for xrdp v0.9.11 (2019/08/19) ## New features * Suppress output (do not draw screen when client window is minimized) #1330 * Audio input (microphone) redirection compatible with [MS-RDPEAI](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rdpeai/d04ffa42-5a0f-4f80-abb1-cc26f71c9452) #1369 * Now xrdp can listen on more than one port #1124 #1366 ## Bug fixes * Fix the issue audio redirection sometimes sounds with long delay #1363 * Check term event for more responsive shutdown #1372 ## Known issues * FreeRDP 2.0.0-rc4 or later might not able to connect to xrdp due to xrdp's bad-mannered behaviour, add `+glyph-cache` option to FreeRDP to connect #1266 * Audio redirection by MP3 codec doesn't sound with some client, use AAC instead #965 ----------------------- # Release notes for xrdp v0.9.11 (2019/08/19) ## New features * Suppress output (do not draw screen when client window is minimized) #1330 * Audio input (microphone) redirection compatible with [MS-RDPEAI](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rdpeai/d04ffa42-5a0f-4f80-abb1-cc26f71c9452) #1369 * Now xrdp can listen on more than one port #1124 #1366 ## Bug fixes * Fix the issue audio redirection sometimes sounds with long delay #1363 * Check term event for more responsive shutdown #1372 ## Known issues * FreeRDP 2.0.0-rc4 or later might not able to connect to xrdp due to xrdp's bad-mannered behaviour, add `+glyph-cache` option to FreeRDP to connect #1266 * Audio redirection by MP3 codec doesn't sound with some client, use AAC instead #965 ----------------------- # Release notes for xrdp v0.9.10 (2019/04/18) ## Special thanks Thank you for matt335672 contributing to lots of improvements in drive redirection! ## New features * Restrict outbound (server->client) clipboard transfer, configured in `sesman.ini` #1298 ## Bug fixes * Fix the issue libscp v1 not setting width but height twice #1293 * Fix the issue reconnecting to session causes duplicate drive entries in fuse fs #1299 * Fix default_wm and reconnect_sh refer wrong path after sesman caught SIGUP #1315 #1331 * Shutdown xrdp more responsively #1325 * Improve remote file lookup in drive redirection #996 #1327 * Overwriting & appending to existing files is are now supported #1327 ## Other changes * Add Danish Keyboard #1290 * Put xrdp- prefix to some executables appear in man page #1313 * Replace some URLs from SF.net to xrdp.org #1313 ## Known issues * FreeRDP 2.0.0-rc4 or later might not able to connect to xrdp due to xrdp's bad-mannered behaviour, add `+glyph-cache` option to FreeRDP to connect #1266 * Audio redirection by MP3 codec doesn't sound with some client, use AAC instead #965 ----------------------- # Release notes for xrdp v0.9.9 (2018/12/25) ## Release cycle From the next release, release cycle will be changed from quarterly to every 4 months. xrdp will be released in April, August, December. ## New features * Disconnection by idle timeout (requires xorgxrdp v0.2.9 or later) #1227 * Glyph cache v2 (fixes no font issue on iOS/macOS/Android client) #367 #1235 ## Bug fixes * Fix xrdp-chansrv crashes caused in drive redirection #1202 #1225 * Fix build with FDK AAC v2 #1257 * Do not enable RemoteApp if the INFO_RAIL flag is not set (RDP-RDP proxy) #1253 ## Other changes * Add Spanish Latin Amarican keyboard #1237 #1240 #1244 * Dynamic channel improvements #1222 #1224 * Remove some deprecated sesman session types #1232 * Refactoring and cleanups ## Known issues * FreeRDP 2.0.0-rc4 or later might not able to connect to xrdp due to xrdp's bad-mannered behaviour, add `+glyph-cache` option to FreeRDP to connect #1266 * Audio redirection by MP3 codec doesn't sound with some client, use AAC instead #965 ----------------------- # Release notes for xrdp v0.9.8 (2018/09/25) ## Deprecation notice We removed TLSv1 and TLSv1.1 from the default config. The current default is TLSv1.2 and TLSv1.3. Users can whenever re-enable these early TLS versions by editing xrdp. To use TLSv1.3, OpenSSL or LibreSSL must support TLSv1.3. You can know the OpenSSL or LibreSSL version by `xrdp --version` command that compiled with xrdp. ## Other topics Pulseaudio modules has been removed from xrdp source tree since it is actually independent and not part of xrdp. The repository has been moved to: https://github.com/neutrinolabs/pulseaudio-module-xrdp If you want to use audio redirection, make sure install the module separately. ## New features * Add TLSv1.3 support #1193 ## Bug fixes * Ensure unmount redirected drive on fatal X error #1140 ## Other changes * Show more helpful message if xrdp-dis failed #1206 * Pass pulse socket name via environment variable #1198 * Fix xrdp's log path in man page #1168 # Release notes for xrdp v0.9.7 (2018/06/29) ## Deprecation notice x11rdp has been removed from xrdp reposiory and stored in the separate repository. Checkout [x11rdp repository](https://github.com/neutrionlabs/x11rdp) if you still need x11rdp. In most cases, [xorgxrdp](https://github.com/neutrinolabs/xorgxrdp) can replace x11rdp. ## Bug fixes * Fix endianness detection on ppc64el #1082 * Fix a bug xrdp file copy slow #1112 #1132 * Copy the PAM session environment for the reconnect script #1120 * Accept fullpath for DefaultWindowManager, ReconnectScript #1147 ## Other changes * Add PAM support for Arch Linux #1078 * Show OpenSSL version to '--version' CLI option #1096 * Separate x11rdp from xrdp repository #1104 * Support sesrun start xorgxrdp sessions #1108 * Show configure summary when configure is done #1126 #1134 #1137 * Less spit on the console when sesman starts #1142 * Fix memory leaks #1146 * Separate rc script for FreeBSD into xrdp and xrdp-sesman #1153 * Improve documents and helps ## Known issues * Audio redirection by MP3 codec doesn't sound with some client, use AAC instead #965 ----------------------- # Release notes for xrdp v0.9.6 (2018/03/26) ## Compatibility notice Exclamation mark (`!`) has been removed from comment out symbol of config files. Use number sign (`#`) or semicolon (`;`) instead. As a result of this change, now you can use exclamation mark as config value such as in `tls_ciphers`. ``` tls_ciphers=HIGH:!aNULL:!eNULL:!EXPORT:!RC4 ``` See also: #1033 ## macOS supports Please note that xrdp still doesn't support macOS officially so far. However, a volunteer is working on macOS compatibility. * Generate dylibs for macOS #1015 * Add PAM support for macOS #1021 ## Bug fixes * Make listen check before daemon fork #988 * Fix xrdp sometimes become zombie processes #1000 * Include hostname in sesman password file name #1006 #1007 #1076 * Fix default startwm.sh to use bash explicitly #1009 #1049 * Fix the issue FreeBSD doesn't acknowledge terminated sessions #1016 #1030 ## Other changes * Add Swiss French keyboard #1053 * Improve perfect forward secrecy, explicitly enable ECDHE/DHE #1024 #1052 #1063 * Lots of leak fixes, cleanups and refactoring ## Known issues * Audio redirection by MP3 codec doesn't sound with some client, use AAC instead #965 ----------------------- # Release notes for xrdp v0.9.5 (2017/12/27) ## Security fixes * Fix local denial of service [CVE-2017-16927](http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-16927) #958 #979 ## New features * Add a new log level TRACE more verbose than DEBUG #835 #944 * SSH agent forwarding via RDP #867 #868 FreeRDP/FreeRDP#4122 * Support horizontal wheel properly #928 ## Bug fixes * Avoid use of hard-coded sesman port #895 * Workaround for corrupted display with Windows Server 2008 using NeutrinoRDP #869 * Fix glitch in audio redirection by AAC #910 #936 * Implement vsock support #930 #935 #948 * Avoid 100% CPU usage on SSL accept #956 ## Other changes * Add US Dvorak keyboard #929 * Suppress some misleading logs #964 * Add Finnish keyboard #972 * Add more user-friendlier description about Xorg config #974 * Renew pulseaudio document #984 #985 * Lots of cleanups and refactoring ## Known issues * Audio redirection by MP3 codec doesn't sound with some client, use AAC instead #965 ----------------------- # Release notes for xrdp v0.9.4 (2017/09/28) ## New features * Accept prefill credentials in base64 form #153 #811 * Indroduce AAC encoder to audio redirection (requires Windows 10 client) ## Bugfixes * Fix ocasional SEGV in drive redirection #838 * Fix client's IP addresses in xrdp-sesman.log are always logged as `0.0.0.0` #878 #882 * Fix `ls_background_image` didn't accept full path #776 #853 * Fix misuse of hidelogwindow #414 #876 * Fix WTSVirtualChannelWrite return code #859 * Fix no longer needed socket files remained in the socket dir #812 #831 * Make creating socket path a bit more robust #823 ## Other changes * Add Belgian keyboard #858 * Add a PAM file for FreeBSD #824 * Several refactorings and cosmetic changes ## Known issues * Windows 10 (1703) shows black blank screen in RemoteFX mode * This issue is already fixed at Insider Preview build 16273 ----------------------- # Release notes for xrdp v0.9.3.1 (2017/08/16) This release fixes a trivial packaging issue #848 occurred in v0.9.3. The issue only affects systemd systems. This release is principally for distro packagers or users who compile & install xrdp from source. Users who running xrdp on these systems don't need to upgrade from v0.9.3 to v0.9.3.1. * Linux systems without systemd * non-Linux systems such as BSD operating systems ----------------------- # Release notes for xrdp v0.9.3 (2017/07/15) ## New features * Log user-friendly messages when certificate/privkey is inaccessible ## Bugfixes * Now sesman sets mandatory LOGNAME environment variable #725 * Now sesman ensures socket directory present #801 * Exit with failure status if port already in use #644 * Eliminate some hard coded paths * Fix glitches with IPv4 struct initialization #803 * Fix some keyboard layout integration (UK, Spanish) * Fix handle OS when IPv6 disabled #714 * Fix issues around systemd session #778 * Fix protocol error when 32 bit color and non RemoteFX session #737 #804 * Fix sesadmin shows error when no sessions #797 * Fix TLS spins 100% CPU #728 * Fix Xvnc backend disconnects when some data copied to clipboard #755 * Pick up the first section if given section(domain) doesn't match anything #750 ## Other changes * Change xrdp-chansrv log path to include display number * Optimize startwm.sh for SUSE * Several cleanups and optimizations ## Known issues * Windows 10 (1703) shows black blank screen in RemoteFX mode ----------------------- # Release notes for xrdp v0.9.2 (2017/03/30) ## New features * RemoteFX codec support is now enabled by default. * Bitmap updates support is now enabled by default. * TLS ciphers suites and version is now logged. * Connected computer name is now logged. * Switched to Xorg (xorgxrdp) as the default backend now. * Miscellaneous RemoteFX codec mode improvements. * Socket directory is configurable at the compile time. ## Bugfixes * Parallels client for MacOS / iOS can now connect (audio redirection must be disabled on client or xrdp server though). * MS RDP client for iOS can now connect using TLS security layer. * MS RDP client for Android can now connect to xrdp. * Large resolutions (4K) can be used with RemoteFX graphics. * Multiple RemoteApps can be opened throguh NeutrinoRDP proxy. * tls_ciphers in xrdp.ini is not limited to 63 chars anymore, it's variable-length. * Fixed an issue where tls_ciphers were ignored and rdp security layer could be used instead. * Kill disconnected sessions feature is working with Xorg (xorgxrdp) backend. * Miscellaneous code cleanup and memory issues fixes. ----------------------- # Release notes for xrdp v0.9.1 (2016/12/21) ## New features * New xorgxrdp backend using existing Xorg with additional modules * Improvements to X11rdp backend * Support for IPv6 (disabled by default) * Initial support for RemoteFX Codec (disabled by default) * Support for TLS security layer (preferred over RDP layer if supported by the client) * Support for disabling deprecated SSLv3 protocol and for selecting custom cipher suites in xrdp.ini * Support for bidirectional fastpath (enabled in both directions by default) * Support clients that don't support drawing orders, such as MS RDP client for Android, ChromeRDP (disabled by default) * More configurable login screen * Support for new virtual channels: * rdpdr: device redirection * rdpsnd: audio output * cliprdr: clipboard * xrdpvr: xrdp video redirection channel (can be used along with NeutrinoRDP client) * Support for disabling virtual channels globally or by session type * Allow to specify the path for backends (Xorg, X11rdp, Xvnc) * Added files for systemd support * Multi-monitor support * xrdp-chansrv stroes logs in `${XDG_DATA_HOME}/xrdp` now ## Security fixes * User's password could be recovered from the Xvnc password file * X11 authentication was not used ================================================ FILE: README.md ================================================ [![Build Status](https://github.com/neutrinolabs/xrdp/actions/workflows/build.yml/badge.svg)](https://github.com/neutrinolabs/xrdp/actions) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/neutrinolabs/xrdp-questions) ![Apache-License](https://img.shields.io/badge/License-Apache%202.0-blue.svg) [![Latest Version](https://img.shields.io/github/v/release/neutrinolabs/xrdp.svg?label=Latest%20Version)](https://github.com/neutrinolabs/xrdp/releases) # xrdp - an open source RDP server ## Overview **xrdp** provides a graphical login to remote machines using Microsoft Remote Desktop Protocol (RDP). xrdp accepts connections from a variety of RDP clients: * FreeRDP * rdesktop * KRDC * NeutrinoRDP * Windows MSTSC (Microsoft Terminal Services Client, aka `mstsc.exe`) * Microsoft Remote Desktop (found on Microsoft Store, which is distinct from MSTSC) Many of these work on some or all of Windows, Mac OS, iOS, and/or Android. RDP transport is encrypted using TLS by default. ![demo](https://github.com/neutrinolabs/xrdp/raw/gh-pages/xrdp_demo.gif) ## Features ### Remote Desktop Access * Connect to a Linux desktop using RDP from anywhere (requires [xorgxrdp](https://github.com/neutrinolabs/xorgxrdp) Xorg module) * Reconnect to an existing session * Session resizing (both on-connect and on-the-fly) * RDP/VNC proxy (connect to another RDP/VNC server via xrdp) ### Access to Remote Resources * Two-way clipboard transfer (text, bitmap, file) * Audio redirection ([requires to build additional modules](https://github.com/neutrinolabs/xrdp/wiki/How-to-set-up-audio-redirection)) * Microphone redirection ([requires to build additional modules](https://github.com/neutrinolabs/xrdp/wiki/How-to-set-up-audio-redirection)) * Drive redirection (mount local client drives on remote machine) ## Supported Platforms **xrdp** primarily targets GNU/Linux operating system. x86 (including x86-64) and ARM processors are most mature architecture to run xrdp on. See also [Platform Support Tier](https://github.com/neutrinolabs/xrdp/wiki/Platform-Support-Tier). Some components such as xorgxrdp and RemoteFX codec have special optimization for x86 using SIMD instructions. So running xrdp on x86 processors will get fully accelerated experience. ## Quick Start Most Linux distributions should distribute the latest release of xrdp in their repository. You would need xrdp and xorgxrdp packages for the best experience. It is recommended that xrdp depends on xorgxrdp, so it should be sufficient to install xrdp. If xorgxrdp is not provided, use Xvnc server. xrdp listens on 3389/tcp. Make sure your firewall accepts connection to 3389/tcp from where you want to access. ### Ubuntu / Debian ```bash apt install xrdp ``` ### Fedora, RHEL and derivatives If you're not running Fedora, make sure to enable EPEL packages first. ```bash dnf install epel-release ``` (All systems) Install xrdp with:- ```bash dnf install xrdp ``` ## Compiling See also https://github.com/neutrinolabs/xrdp/wiki#building-from-sources ### Prerequisites To compile xrdp from the packaged sources, you need basic build tools - a compiler (**gcc** or **clang**) and the **make** program. Additionally, you would need **openssl-devel**, **pam-devel**, **libX11-devel**, **libXfixes-devel**, **libXrandr-devel**. More additional software would be needed depending on your configuration. To compile xrdp from a checked out git repository, you would additionally need **autoconf**, **automake**, **libtool** and **pkg-config**. ### Get the source and build it If compiling from the packaged source, unpack the tarball and change to the resulting directory. If compiling from a checked out repository, please make sure you've got the submodules cloned too (use `git clone --recursive https://github.com/neutrinolabs/xrdp`) Then run following commands to compile and install xrdp: ```bash ./bootstrap ./configure make sudo make install ``` If you want to use audio redirection, you need to build and install additional pulseaudio modules. The build instructions can be found at wiki. * [How to set up audio redirection](https://github.com/neutrinolabs/xrdp/wiki/How-to-set-up-audio-redirection) ## Directory Structure ``` xrdp ├── common ······ common code ├── docs ········ documentation ├── fontutils ··· font handling utilities ├── genkeymap ··· keymap generator ├── instfiles ··· installable data file ├── keygen ······ xrdp RSA key pair generator ├── libpainter ·· painter library ├── librfxcodec · RFX codec library ├── libxrdp ····· core RDP protocol implementation ├── m4 ·········· Autoconf macros ├── mc ·········· media center module ├── neutrinordp · RDP client module for proxying RDP connections using NeutrinoRDP ├── pkgconfig ··· pkg-config configuration ├── scripts ····· build scripts ├┬─ sesman ······ session manager for xrdp |├── chansrv ···· channel server for xrdp |├── libsesman ·· Code common to sesman and its related executables |└── tools ······ session management tools for sys admins ├── tests ······· tests for the code ├┬─ tools ······· tools |└┬─ devel ······ development tools | ├── gtcp_proxy GTK app that forwards TCP connections to a remote host | └── tcp_proxy · CLI app that forwards TCP connections to a remote host ├── vnc ········· VNC client module for xrdp ├── vrplayer ···· QT player redirecting video/audio to clients over xrdpvr channel ├── xrdp ········ main server code ├── xrdpapi ····· virtual channel API ├── xrdpvr ······ API for playing media over RDP └── xup ········· xorgxrdp client module ``` ================================================ FILE: SECURITY.md ================================================ # Security Policy ## Reporting a Vulnerability Please DO NOT report any security issues to public GitHub issue. If you find a security vulnerability please kindly inform us via [Report Form](https://github.com/neutrinolabs/xrdp/security/advisories/new) so that we can fix the security problem to protect a lot of users around the world as soon as possible. If you have anything else you want to report privately to developers, send us an email to the following email address. This is a private mailing list not open for public viewing. * [xrdp-core@googlegroups.com](mailto:xrdp-core@googlegroups.com) ================================================ FILE: astyle_config.as ================================================ # detached brackets --style=allman # 4 spaces, no tabs --indent=spaces=4 # for C++ files only --indent-classes # Indent 'switch' blocks so that the 'case X:' statements are indented in the switch block. # The entire case block is indented. --indent-switches # Add extra indentation to namespace blocks. This option has no effect on Java files. --indent-namespaces # Converts tabs into spaces in the non-indentation part of the line. --convert-tabs # requires --convert-tabs to work properly --indent-preproc-define --indent-col1-comments --min-conditional-indent=2 --max-continuation-indent=40 # Insert space padding around operators. --pad-oper # Insert space padding after paren headers only (e.g. 'if', 'for', 'while'...). --pad-header # Add brackets to unbracketed one line conditional statements (e.g. 'if', 'for', 'while'...). --add-braces --align-pointer=name # Do not retain a backup of the original file. The original file is purged after it is formatted. --suffix=none # For each directory in the command line, process all subdirectories recursively. --recursive # Exclude git submodule directories and generated files. --exclude=libpainter --exclude=librfxcodec --exclude=xrdp_configure_options.h # ignore errors from generated files that do not exist --ignore-exclude-errors # Preserve the original file's date and time modified. --preserve-date # Formatted files display mode. Display only the files that have been formatted. # Do not display files that are unchanged. --formatted --lineend=linux ================================================ FILE: bootstrap ================================================ #!/bin/sh command -v autoconf if ! test $? -eq 0 then echo "error, install autoconf" exit 1 fi command -v automake if ! test $? -eq 0 then echo "error, install automake" exit 1 fi command -v libtool || command -v libtoolize if ! test $? -eq 0 then echo "error, install libtool" exit 1 fi command -v pkg-config if ! test $? -eq 0 then echo "error, install pkg-config" exit 1 fi if ! test -f libpainter/configure.ac then git submodule update --init libpainter fi if ! test -f librfxcodec/configure.ac then git submodule update --init librfxcodec fi if ! test -f ulalaca/Makefile.am then git submodule update --init ulalaca fi autoreconf -fvi ================================================ FILE: coding_style.md ================================================ XRdp Coding Style ================= The coding style used by XRdp is described below. The XRdp project uses astyle (artistic style) to format the code. Astyle requires a configuration file that describes how you want your code formatted. This file is present in the XRdp root directory and is named `astyle_config.as`. Here is how we run the astyle command: astyle --options=/path/to/file/astyle_config.as "*.c" This coding style is a work in progress and is still evolving. Language Standard ----------------- Try to make all code compile with both C and C++ compiler. C++ is more strict, which makes the code safer. Indentation ----------- * 4 spaces per indent * No tabs for any indents ☞ if (fd < 0) { return -1; } Line wrapping ------------- * Keep lines not longer than 80 chars * Align wrapped argument to the first argument ☞ log_message("connection aborted: error %d", ret); Variable names -------------- * Use lowercase with underscores as needed * Don't use camelCase * Preprocessor constants should be uppercase ☞ #define BUF_SIZE 1024 int fd; int bytes_in_stream; Variable declaration -------------------- * Each variable is declared on a separate line ☞ int i; int j; Whitespace ---------- * Use blank lines to group statements * Use at most one empty line between statements * For pointers and references, use a single space before * or & but not after * Use one space after a cast * No space before square brackets ☞ char *cptr; int *iptr; cptr = (char *) malloc(1024); write(fd, &buf[12], 16); Function declarations --------------------- * Use newline before function name ☞ static int value_ok(int val) { return (val >= 0); } Braces ------ * Opening brace is always on a separate line * Align braces with the line preceding the opening brace ☞ struct stream { int flags; char *data; }; void process_data(struct stream *s) { if (stream == NULL) { return; } } `if` statements --------------- * Always use braces * Put both braces on separate lines ☞ if (val <= 0xff) { out_uint8(s, val); } else if (val <= 0xffff) { out_uint16_le(s, val); } else { out_uint32_le(s, val); } `for` statements ---------------- * Always use braces * Put both braces on separate lines ☞ for (i = 0; i < 10; i++) { printf("i = %d\n", i); } `while` and `do while` statements --------------------------------- * Always use braces * `while` after the closing brace is on the same line ☞ while (cptr) { cptr—; } do { cptr--; } while (cptr); `switch` statements ------------------- * Indent `case` once * Indent statements under `case` one more time * Put both braces on separate lines ☞ switch (cmd) { case READ: read(fd, buf, 1024); break; default: printf("bad cmd\n"); } Comments -------- Use /* */ for comments Don't use // ================================================ FILE: common/Makefile.am ================================================ if XRDP_PIXMAN PIXMAN_SOURCES = else PIXMAN_SOURCES = pixman-region16.c pixman-region.h endif EXTRA_DIST = pixman-region.c include_HEADERS = \ ms-erref.h \ ms-fscc.h \ ms-rdpbcgr.h \ ms-rdpeclip.h \ ms-rdpefs.h \ ms-rdpegdi.h \ ms-rdpele.h \ ms-rdperp.h \ ms-rdpedisp.h \ ms-smb2.h \ xup_client_info.h \ xrdp_client_info.h \ xrdp_constants.h \ xrdp_rail.h \ xrdp_scancode_defs.h \ xrdp_sockets.h AM_CPPFLAGS = \ -DXRDP_CFG_PATH=\"${sysconfdir}/${sysconfsubdir}\" \ -DXRDP_SBIN_PATH=\"${sbindir}\" \ -DXRDP_SHARE_PATH=\"${datadir}/xrdp\" \ -DXRDP_PID_PATH=\"${localstatedir}/run\" \ -DXRDP_LOG_PATH=\"${localstatedir}/log\" if XRDP_NVENC AM_CPPFLAGS += -DXRDP_NVENC endif # -no-suppress is an automake-specific flag which is needed # to prevent us missing compiler errors in some circumstances # (see https://github.com/neutrinolabs/xrdp/pull/1843 ) AM_CFLAGS = -no-suppress $(OPENSSL_CFLAGS) module_LTLIBRARIES = \ libcommon.la libcommon_la_SOURCES = \ arch.h \ base64.h \ base64.c \ channel_defs.h \ defines.h \ fifo.c \ fifo.h \ file.c \ file.h \ guid.c \ guid.h \ list.c \ list.h \ list16.c \ list16.h \ log.c \ log.h \ os_calls.c \ os_calls.h \ parse.c \ parse.h \ rail.h \ scancode.c \ scancode.h \ set_int.c \ set_int.h \ ssl_calls.c \ ssl_calls.h \ string_calls.c \ string_calls.h \ thread_calls.c \ thread_calls.h \ timers.c \ timers.h \ trans.c \ trans.h \ unicode_defines.h \ $(PIXMAN_SOURCES) libcommon_la_LIBADD = \ -lpthread \ $(OPENSSL_LIBS) \ $(DLOPEN_LIBS) ================================================ FILE: common/arch.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #if !defined(ARCH_H) #define ARCH_H #include #include #if defined(HAVE_STDINT_H) #include #else typedef signed char int8_t; typedef unsigned char uint8_t; typedef signed short int16_t; typedef unsigned short uint16_t; typedef signed int int32_t; typedef unsigned int uint32_t; #if defined(_WIN64) typedef signed __int64 int64_t; typedef unsigned __int64 uint64_t; typedef signed __int64 intptr_t; typedef unsigned __int64 uintptr_t; #else typedef signed long long int64_t; typedef unsigned long long uint64_t; typedef signed long intptr_t; typedef unsigned long uintptr_t; #endif #endif typedef int bool_t; // Define Unicode character types #if defined(HAVE_UCHAR_H) #include #elif defined (__APPLE__) && defined(__cplusplus) // char16_t and char32_t are in stdint.h (C++ only) #elif defined(HAVE_STDINT_H) typedef uint_least16_t char16_t; typedef uint_least32_t char32_t; #else typedef uint16_t char16_t; typedef uint32_t char32_t; #endif /* you can define L_ENDIAN or B_ENDIAN and NEED_ALIGN or NO_NEED_ALIGN in the makefile to override */ /* check endianness */ #if !(defined(L_ENDIAN) || defined(B_ENDIAN)) #if !defined(__BYTE_ORDER) && defined(__linux__) #include #endif #if defined(BYTE_ORDER) #if BYTE_ORDER == BIG_ENDIAN #define B_ENDIAN #else #define L_ENDIAN #endif #endif #if !(defined(L_ENDIAN) || defined(B_ENDIAN)) #if defined(__sparc__) || \ defined(__s390__) || defined (__s390x__) || \ defined(__hppa__) || defined (__m68k__) || \ (defined(__PPC__) && defined(__BIG_ENDIAN__)) || \ (defined(__ppc__) && defined(__BIG_ENDIAN__)) #define B_ENDIAN #else #define L_ENDIAN #endif #endif #endif /* check if we need to align data */ #if !(defined(NEED_ALIGN) || defined(NO_NEED_ALIGN)) #if defined(__sparc__) || defined(__alpha__) || defined(__hppa__) || \ defined(__AIX__) || defined(__m68k__) || defined(__mips__) || \ defined(__ia64__) || defined(__arm__) || defined(__sh__) || \ (defined(__PPC__) && defined(__BIG_ENDIAN__)) || \ (defined(__ppc__) && defined(__BIG_ENDIAN__)) || \ defined(__loongarch__) || defined(__e2k__) #define NEED_ALIGN #elif defined(__x86__) || defined(__x86_64__) || \ defined(__AMD64__) || defined(_M_IX86) || defined (_M_AMD64) || \ defined(__i386__) || defined(__aarch64__) || \ defined(__PPC__) || defined(__LITTLE_ENDIAN__) || \ defined(__s390__) || defined (__s390x__) || \ defined(__riscv) #define NO_NEED_ALIGN #else #warning unknown arch #endif #endif /* defines for thread creation factory functions */ #if defined(_WIN32) #define THREAD_RV unsigned long #define THREAD_CC __stdcall #else #define THREAD_RV void* #define THREAD_CC #endif #if defined(_WIN32) #if defined(__BORLANDC__) #define EXPORT_CC _export __cdecl #else #define EXPORT_CC #endif #else #define EXPORT_CC #endif #ifndef DEFINED_Ts #define DEFINED_Ts typedef int8_t ti8; typedef uint8_t tui8; typedef int8_t tsi8; typedef int16_t ti16; typedef uint16_t tui16; typedef int16_t tsi16; typedef int32_t ti32; typedef uint32_t tui32; typedef int32_t tsi32; typedef int64_t ti64; typedef uint64_t tui64; typedef int64_t tsi64; typedef bool_t tbool; typedef intptr_t tbus; typedef intptr_t tintptr; /* socket */ #if defined(_WIN32) typedef unsigned int tsock; #else typedef int tsock; #endif #endif /* DEFINED_Ts */ /* format string verification */ #if defined(HAVE_FUNC_ATTRIBUTE_FORMAT) #define printflike(arg_format, arg_first_check) \ __attribute__((__format__(__printf__, arg_format, arg_first_check))) #else #define printflike(arg_format, arg_first_check) #endif /* module interface */ #ifdef __cplusplus extern "C" { #endif tintptr mod_init(void); int mod_exit(tintptr); #ifdef __cplusplus } #endif #endif ================================================ FILE: common/base64.c ================================================ /** * Copyright (C) 2022 Matt Burt, all xrdp contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ /** * @file common/base64.c * @brief Base64 encoder / decoder */ #if defined(HAVE_CONFIG_H) #include #endif #include "string_calls.h" #include "base64.h" /* * Values for invalid and padding characters, used in the charmap * for converting base64 to binary * * These values are specially chosen to make it easy to detect padding or * invalid characters by or-ing together the values looked up in * a base64 quantum */ #define E_INVALID 0x40 #define E_PAD 0x80 /* Determine the character set on this platform */ #if ('a' == 0x61 && 'z' == 0x7a ) && \ ('A' == 0x41 && 'Z' == 0x5a ) && \ ('0' == 0x30 && '9' == 0x39 ) # define PLATFORM_IS_ASCII 1 #else # error "Unrecognised character set on this platform" #endif /* character set check */ /* * Define a table to map the base64 character values to bit values. */ #ifdef PLATFORM_IS_ASCII #define CHARMAP_BASE 0x28 #define E_IV E_INVALID /* For table alignment */ const unsigned char charmap[] = { /* 0x28 */ E_IV, E_IV, E_IV, 0x3e, E_IV, E_IV, E_IV, 0x3f, /* 0x30 */ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, /* 0x38 */ 0x3c, 0x3d, E_IV, E_IV, E_IV, E_PAD, E_IV, E_IV, /* 0x40 */ E_IV, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, /* 0x48 */ 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, /* 0x50 */ 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, /* 0x58 */ 0x17, 0x18, 0x19, E_IV, E_IV, E_IV, E_IV, E_IV, /* 0x60 */ E_IV, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, /* 0x68 */ 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, /* 0x70 */ 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, /* 0x78 */ 0x31, 0x32, 0x33 }; #undef E_IV #endif /* PLATFORM_IS_ASCII */ /** * Lookup a value in the charmap * * @param x - byte to lookup. Only referenced once so can safely have * side effects. * @param dest - destination to assign result to. */ #define CM_LOOKUP(x,dest) \ { \ unsigned int t = (unsigned int)(x) - CHARMAP_BASE;\ dest = (t < sizeof(charmap)) ? charmap[t] : E_INVALID; \ } /*****************************************************************************/ int base64_decode(const char *src, char *dst, size_t dst_len, size_t *actual_len) { *actual_len = 0; size_t src_len; size_t src_i = 0; size_t dst_i = 0; unsigned int a; /* Four characters of base64 quantum */ unsigned int b; unsigned int c; unsigned int d; unsigned int v; #define OUTPUT_CHAR(x) \ { \ if (dst_i < dst_len) \ { \ dst[dst_i] = (x);\ } \ ++dst_i; \ } src_len = g_strlen(src); while (src_i < src_len) { if ((src_len - src_i) >= 4) { /* Usual case - full quantum */ CM_LOOKUP(src[src_i++], a); CM_LOOKUP(src[src_i++], b); CM_LOOKUP(src[src_i++], c); CM_LOOKUP(src[src_i++], d); } else { /* Add padding on the end to make up the full quantum */ CM_LOOKUP(src[src_i++], a); b = E_PAD; c = E_PAD; d = E_PAD; if ((src_len - src_i) > 0) { CM_LOOKUP(src[src_i++], b); } if ((src_len - src_i) > 0) { CM_LOOKUP(src[src_i++], c); } } /* * Bitwise-or the translated quantum values together, so that * any invalid or padding characters can be detected with a * single test */ v = a | b | c | d; if ((v & E_INVALID) != 0) { return -1; /* At least one invalid character */ } if ((v & E_PAD) == 0) { /* No padding - a full quantum */ v = (a << 18) | (b << 12) | (c << 6) | d; OUTPUT_CHAR(v >> 16); OUTPUT_CHAR((v >> 8) & 0xff); OUTPUT_CHAR(v & 0xff); } else if (((a | b | c) & E_PAD) == 0) { /* No padding in the first 3 chars, so the padding must * be at the end */ v = (a << 10) | (b << 4) | (c >> 2); OUTPUT_CHAR(v >> 8); OUTPUT_CHAR(v & 0xff); } else if (((a | b) & E_PAD) == 0 && c == d) { /* No padding in first two chars, so if the last two chars are * equal, they must both be padding */ v = (a << 2) | (b >> 4); OUTPUT_CHAR(v); } else { /* Illegal padding */ return -1; } } *actual_len = dst_i; return 0; #undef OUTPUT_CHAR } /*****************************************************************************/ size_t base64_encode(const char *src, size_t src_len, char *dst, size_t dst_len) { char *p = dst; size_t src_i = 0; size_t max_src_len; unsigned int v; static const char *b64chr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789+/="; /* Each three octets of the source results in four bytes at the output, * plus we need a terminator. So we can work out the maximum number of * source octets we can process */ if (dst_len == 0) { max_src_len = 0; } else { max_src_len = (dst_len - 1) / 4 * 3; } if (src_len > max_src_len) { src_len = max_src_len; } while (src_i < src_len) { switch (src_len - src_i) { case 1: v = (unsigned int)(unsigned char)src[src_i++] << 4; *p++ = b64chr[v >> 6]; *p++ = b64chr[v & 0x3f]; *p++ = b64chr[64]; *p++ = b64chr[64]; break; case 2: v = (unsigned int)(unsigned char)src[src_i++] << 10; v |= (unsigned int)(unsigned char)src[src_i++] << 2; *p++ = b64chr[v >> 12]; *p++ = b64chr[(v >> 6) & 0x3f]; *p++ = b64chr[v & 0x3f]; *p++ = b64chr[64]; break; default: v = (unsigned int)(unsigned char)src[src_i++] << 16; v |= (unsigned int)(unsigned char)src[src_i++] << 8; v |= (unsigned int)(unsigned char)src[src_i++]; *p++ = b64chr[v >> 18]; *p++ = b64chr[(v >> 12) & 0x3f]; *p++ = b64chr[(v >> 6) & 0x3f]; *p++ = b64chr[v & 0x3f]; break; } } *p = '\0'; return src_len; } ================================================ FILE: common/base64.h ================================================ /** * Copyright (C) 2021 Koichiro Iwao, all xrdp contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @file common/base64.h * @brief Base64 encoder / decoder * * Base-64 is described in RFC4648. The following notes apply to this * implementation:- * - The only supported characters are [A-Za-z0-9+/=]. At present, * embedded linefeeds and URL encodings are not supported. * */ #if !defined(BASE64_CALLS_H) #define BASE64_CALLS_H #include "arch.h" /* * Decodes a base64 string * * @param src Pointer to null-terminated source * @param dst Pointer to output buffer * @param dst_len Length of above. No more than this is written to the * output buffer * @param actual_len Pointer to value to receive actual length of decoded data * @return 0 for success, 1 for an invalid input string * * The following notes apply to this implementation:- * - Embedded padding is supported, provided it only occurs at the end * of a quantum as described in RFC4648(4). This allows concatenated * encodings to be fed into the decoder. * - Padding of the last quantum is assumed if not provided. * - Excess padding of the last quantum is ignored. * * Only dst_len bytes at most are written to the output. The length * returned in actual_len however represents how much buffer is needed for * a correct result. This may be more than dst_len, and enables the caller * to detect a potential buffer overflow */ int base64_decode(const char *src, char *dst, size_t dst_len, size_t *actual_len); /* * Encodes a buffer as base64 * * @param src Pointer to source * @param src_len Length of above. * @param dst Pointer to output buffer for null-terminated string * @param dst_len Length of above. No more than this is written to the * output buffer * @return Number of source characters processed * * The following notes apply to this implementation:- * - Padding of the last quantum is always written if the number of * source bytes is not divisible by 3. * * The number of source characters processed is always returned. If * the destination buffer is too small for all the output plus a * terminator, the returned value from this procedure will be less than * src_len. In this case no padding characters will have been written, * and the remaining characters can be converted with more calls to * this procedure. */ size_t base64_encode(const char *src, size_t src_len, char *dst, size_t dst_len); #endif /* BASE64_CALLS_H */ ================================================ FILE: common/channel_defs.h ================================================ /** * Copyright (C) 2024 Matt Burt, all xrdp contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @file common/channel_defs.h * @brief Private xrdp channel definitions */ #if !defined(CHANNEL_DEFS_H) #define CHANNEL_DEFS_H #include /** * Channel IDs assigned to xrdp private channels. These are chosen to avoid conflicts with * channel IDs returned by other servers. */ enum { CHAN_ID_XRDP_BASE = (('x' << 24) | ('r' << 16) | ('d' << 8) | 'p'), CHAN_ID_XRDP_SESSION_INFO = CHAN_ID_XRDP_BASE, // Add further IDs here CHAN_ID_XRDP_MAX }; // Max length of a DVC name. This is taken from the specification of // WTSVirtualChannelOpenEx() which limits the length of a virtual channel // to Windows MAX_PATH #define MAX_DVC_NAME_LEN 260 /** * Information to connect to a channel using xrdpapi */ #define XRDPAPI_CONNECT_PDU_LEN 384 // Connect PDU is always this length #define XRDPAPI_CONNECT_PDU_VERSION 1 // Current connnect PDU version struct xrdp_chan_connect { uint32_t version; uint32_t private_chan; // 0 for a standard channel uint32_t flags; char name[MAX_DVC_NAME_LEN + 1]; // null-terminated }; // Events received on the CHAN_ID_XRDP_SESSION_INFO channel // Update on all the session state data held by chansrv // // If more information is needed to be exported by xrdpapi, it can be // added to this event struct xrdp_chan_session_state { uint32_t is_connected; // Is the session connected? }; #endif /* CHANNEL_DEFS_H */ ================================================ FILE: common/defines.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * main define/macro file */ #ifndef DEFINES_H #define DEFINES_H /* other macros */ #undef MIN #define MIN(x1, x2) ((x1) < (x2) ? (x1) : (x2)) #undef MAX #define MAX(x1, x2) ((x1) > (x2) ? (x1) : (x2)) #undef HIWORD #define HIWORD(in) (((in) & 0xffff0000) >> 16) #undef LOWORD #define LOWORD(in) ((in) & 0x0000ffff) #undef MAKELONG #define MAKELONG(lo, hi) ((((hi) & 0xffff) << 16) | ((lo) & 0xffff)) #define UNUSED_VAR(x) ((void) (x)) /* graphics macros */ #define MAKERECT(r, x, y, cx, cy) \ { (r).left = x; (r).top = y; (r).right = (x) + (cx); (r).bottom = (y) + (cy); } #define ISRECTEMPTY(r) (((r).right <= (r).left) || ((r).bottom <= (r).top)) #define RECTOFFSET(r, dx, dy) \ { (r).left += dx; (r).top += dy; (r).right += dx; (r).bottom += dy; } #define GETPIXEL8(d, x, y, w) (*(((unsigned char*)d) + ((y) * (w) + (x)))) #define GETPIXEL16(d, x, y, w) (*(((unsigned short*)d) + ((y) * (w) + (x)))) #define GETPIXEL32(d, x, y, w) (*(((unsigned int*)d) + ((y) * (w) + (x)))) #define SETPIXEL8(d, x, y, w, v) \ (*(((unsigned char*)d) + ((y) * (w) + (x))) = (v)) #define SETPIXEL16(d, x, y, w, v) \ (*(((unsigned short*)d) + ((y) * (w) + (x))) = (v)) #define SETPIXEL32(d, x, y, w, v) \ (*(((unsigned int*)d) + ((y) * (w) + (x))) = (v)) #define COLOR8(r, g, b) \ ( \ (((r) >> 5) << 0) | \ (((g) >> 5) << 3) | \ (((b) >> 6) << 6) \ ) #define COLOR15(r, g, b) ((((r) >> 3) << 10) | (((g) >> 3) << 5) | ((b) >> 3)) #define COLOR16(r, g, b) ((((r) >> 3) << 11) | (((g) >> 2) << 5) | ((b) >> 3)) #define COLOR24RGB(r, g, b) (((r) << 16) | ((g) << 8) | (b)) #define COLOR24BGR(r, g, b) (((b) << 16) | ((g) << 8) | (r)) #define HRED(c) ((c & 0xff0000) >> 16) #define HGREEN(c) ((c & 0x00ff00) >> 8) #define HBLUE(c) ((c & 0x0000ff)) #define HCOLOR(bpp,c) \ ( \ (bpp==8?COLOR8(HRED(c),HGREEN(c),HBLUE(c)): \ (bpp==15?COLOR15(HRED(c),HGREEN(c),HBLUE(c)): \ (bpp==16?COLOR16(HRED(c),HGREEN(c),HBLUE(c)): \ (bpp>=24?COLOR24BGR(HRED(c),HGREEN(c),HBLUE(c)):c) \ ) \ ) \ ) \ ) #define SPLITCOLOR15(r, g, b, c) \ { \ r = (((c) >> 7) & 0xf8) | (((c) >> 12) & 0x7); \ g = (((c) >> 2) & 0xf8) | (((c) >> 8) & 0x7); \ b = (((c) << 3) & 0xf8) | (((c) >> 2) & 0x7); \ } #define SPLITCOLOR16(r, g, b, c) \ { \ r = (((c) >> 8) & 0xf8) | (((c) >> 13) & 0x7); \ g = (((c) >> 3) & 0xfc) | (((c) >> 9) & 0x3); \ b = (((c) << 3) & 0xf8) | (((c) >> 2) & 0x7); \ } #define SPLITCOLOR32(r, g, b, c) \ { \ r = ((c) >> 16) & 0xff; \ g = ((c) >> 8) & 0xff; \ b = (c) & 0xff; \ } /* font macros */ #define FONT_DATASIZE_FROM_GEOMETRY(width,height) \ ((((height) * (((width) + 7) / 8)) + 3) & ~3) #define FONT_DATASIZE(f) FONT_DATASIZE_FROM_GEOMETRY((f->width), (f->height)) /* use crc for bitmap cache lookups */ #define USE_CRC #define XR_RGB2BGR(a_ulColor) \ (a_ulColor & 0xFF000000) | \ ((a_ulColor & 0x00FF0000) >> 16) | \ (a_ulColor & 0x0000FF00) | \ ((a_ulColor & 0x000000FF) << 16) #endif ================================================ FILE: common/fifo.c ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Matt Burt 2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @file common/fifo.c * @brief Fifo for storing generic pointers * * Defines an unbounded FIFO-queue for void * pointers * * The stored pointers are called 'items' below. * * Items are stored in groups called 'chunks'. Chunks are linked together * in a chain:- * * +-------------+ +--------+ +--------+ +--------+ * | first_chunk |--->| next |--->| next |--->| NULL |<-+ * | last_chunk |-+ +--------+ +--------+ +--------+ | * | . . . | | | item.0 | | item.0 | | item.0 | | * +-------------+ | | ... | | ... | | ... | | * | | item.n | | item.n | | item.n | | * | +--------+ +--------+ +--------+ | * | | * +------------------------------------------+ * * This allows items to be added to the FIFO by allocating blocks * as each one fills up. * * The code to read from the FIFO de-allocates blocks as each one is * consumed. * * There is always at least one chunk in the FIFO. */ #if defined(HAVE_CONFIG_H) #include #endif #include #include "fifo.h" #define ITEMS_PER_CHUNK 31 struct chunk { struct chunk *next; void *items[ITEMS_PER_CHUNK]; }; struct fifo { struct chunk *first_chunk; struct chunk *last_chunk; /** Next address to write in 'last_chunk' */ unsigned short writer; /** Next address to read in 'first_chunk' */ unsigned short reader; /** Item destructor function, or NULL */ fifo_item_destructor item_destructor; }; /*****************************************************************************/ struct fifo * fifo_create(fifo_item_destructor item_destructor) { struct fifo *result = NULL; struct chunk *cptr = (struct chunk *)malloc(sizeof(struct chunk)); if (cptr != NULL) { /* 'next' pointer in last block is always NULL */ cptr->next = NULL; result = (struct fifo *)malloc(sizeof(struct fifo)); if (result == NULL) { free(cptr); } else { result->first_chunk = cptr; result->last_chunk = cptr; result->writer = 0; result->reader = 0; result->item_destructor = item_destructor; } } return result; } /*****************************************************************************/ /** * Internal function to call the destructor function on all items in the fifo * * @param self fifo. Can't be NULL * @param closure Additional argument to destructor function */ static void call_item_destructor(struct fifo *self, void *closure) { if (self->item_destructor != NULL) { struct chunk *cptr = self->first_chunk; unsigned int i = self->reader; // Process all the chunks up to the last one while (cptr != self->last_chunk) { (*self->item_destructor)(cptr->items[i++], closure); if (i == ITEMS_PER_CHUNK) { cptr = cptr->next; i = 0; } } // Process all the items in the last chunk while (i < self->writer) { (*self->item_destructor)(cptr->items[i++], closure); } } } /*****************************************************************************/ void fifo_delete(struct fifo *self, void *closure) { if (self != NULL) { call_item_destructor(self, closure); // Now free all the chunks struct chunk *cptr = self->first_chunk; while (cptr != NULL) { struct chunk *next = cptr->next; free(cptr); cptr = next; } free(self); } } /*****************************************************************************/ void fifo_clear(struct fifo *self, void *closure) { if (self != NULL) { call_item_destructor(self, closure); // Now free all the chunks except the last one struct chunk *cptr = self->first_chunk; while (cptr->next != NULL) { struct chunk *next = cptr->next; free(cptr); cptr = next; } // Re-initialise fifo fields self->first_chunk = cptr; self->last_chunk = cptr; self->reader = 0; self->writer = 0; } } /*****************************************************************************/ int fifo_add_item(struct fifo *self, void *item) { int rv = 0; if (self != NULL && item != NULL) { if (self->writer == ITEMS_PER_CHUNK) { // Add another chunk to the chain struct chunk *cptr; cptr = (struct chunk *)malloc(sizeof(struct chunk)); if (cptr == NULL) { return 0; } cptr->next = NULL; self->last_chunk->next = cptr; self->last_chunk = cptr; self->writer = 0; } self->last_chunk->items[self->writer++] = item; rv = 1; } return rv; } /*****************************************************************************/ void * fifo_remove_item(struct fifo *self) { void *item = NULL; if (self != NULL) { // More than one chunk in the fifo? if (self->first_chunk != self->last_chunk) { /* We're not reading the last chunk. There * must be something in the fifo */ item = self->first_chunk->items[self->reader++]; /* At the end of this chunk? */ if (self->reader == ITEMS_PER_CHUNK) { struct chunk *old_chunk = self->first_chunk; self->first_chunk = old_chunk->next; free(old_chunk); self->reader = 0; } } else if (self->reader < self->writer) { /* We're reading the last chunk */ item = self->first_chunk->items[self->reader++]; if (self->reader == self->writer) { // fifo is now empty. We can reset the pointers // to prevent unnecessary allocations in the future. self->reader = 0; self->writer = 0; } } } return item; } /*****************************************************************************/ int fifo_is_empty(struct fifo *self) { return (self == NULL || (self->first_chunk == self->last_chunk && self->reader == self->writer)); } ================================================ FILE: common/fifo.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Laxmikant Rashinkar 2004-2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @file common/fifo.h * @brief Fifo for storing generic pointers * * Declares an unbounded FIFO-queue for void * pointers */ #ifndef _FIFO_H #define _FIFO_H struct fifo; /** * Function used by fifo_clear()/fifo_delete() to destroy items * * @param item Item being deleted * @param closure Additional argument to function * * Use this function to free any allocated storage (e.g. if the items * are dynamically allocated) */ typedef void (*fifo_item_destructor)(void *item, void *closure); /** * Create new fifo * * @param item_destructor Destructor for fifo items, or NULL for none * @return fifo, or NULL if no memory */ struct fifo * fifo_create(fifo_item_destructor item_destructor); /** * Delete an existing fifo * * Any existing entries on the fifo are passed in order to the * item destructor specified when the fifo was created. * * @param self fifo to delete (may be NULL) * @param closure Additional parameter for fifo item destructor */ void fifo_delete(struct fifo *self, void *closure); /** * Clear(empty) an existing fifo * * Any existing entries on the fifo are passed in order to the * item destructor specified when the fifo was created. * * @param self fifo to clear (may be NULL) * @param closure Additional parameter for fifo item destructor */ void fifo_clear(struct fifo *self, void *closure); /** Add an item to a fifo * @param self fifo * @param item Item to add * @return 1 if successful, 0 for no memory, or tried to add NULL */ int fifo_add_item(struct fifo *self, void *item); /** Remove an item from a fifo * @param self fifo * @return item if successful, NULL for no items in FIFO */ void * fifo_remove_item(struct fifo *self); /** Is fifo empty? * * @param self fifo * @return 1 if fifo is empty, 0 if not */ int fifo_is_empty(struct fifo *self); #endif ================================================ FILE: common/file.c ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * read a config file */ #if defined(HAVE_CONFIG_H) #include #endif #include "arch.h" #include "os_calls.h" #include "string_calls.h" #include "list.h" #include "file.h" #include "parse.h" #define FILE_MAX_LINE_BYTES 2048 static int file_read_ini_line(struct stream *s, char *text, int text_bytes); /*****************************************************************************/ /* look up for a section name within str (i.e. pattern [section_name]) * if a section name is found, this function return 1 and copy the section * inplace of str. */ static int line_lookup_for_section_name(char *str, int str_bytes) { int name_index_start; int index; char c; name_index_start = -1; index = 0; while ((c = str[index]) != 0) { if (c == '[') { name_index_start = index + 1; } else if (c == ']' && name_index_start > 0) { if (name_index_start + index >= str_bytes) { return 0; } for (index = index - name_index_start; index > 0; index--) { str[0] = str[name_index_start]; str++; } str[0] = 0; return 1; } ++index; } return 0; } /*****************************************************************************/ /* returns error returns 0 if everything is ok returns 1 if problem reading file */ static int l_file_read_sections(int fd, int max_file_size, struct list *names) { struct stream *s; char text[FILE_MAX_LINE_BYTES]; int len; int rv; rv = 0; g_file_seek(fd, 0); g_memset(text, 0, FILE_MAX_LINE_BYTES); list_clear(names); make_stream(s); init_stream(s, max_file_size); len = g_file_read(fd, s->data, max_file_size); if (len > 0) { s->end = s->p + len; while (file_read_ini_line(s, text, FILE_MAX_LINE_BYTES) == 0) { if (line_lookup_for_section_name(text, FILE_MAX_LINE_BYTES) != 0) { list_add_strdup(names, text); } } } else if (len < 0) { rv = 1; } free_stream(s); return rv; } /*****************************************************************************/ /* Read a line in the stream 's', removing comments. * returns error * returns 0 if everything is ok * returns 1 if problem reading file */ static int file_read_ini_line(struct stream *s, char *text, int text_bytes) { int i; int skip_to_end; int at_end; char c; skip_to_end = 0; if (!s_check_rem(s, 1)) { return 1; } i = 0; in_uint8(s, c); while (c != 10 && c != 13) { /* these mean skip the rest of the line */ if (c == '#' || c == ';') { skip_to_end = 1; } if (!skip_to_end) { text[i] = c; i++; if (i >= text_bytes) { return 1; } } if (s_check_rem(s, 1)) { in_uint8(s, c); } else { c = 0; break; } } if (c == 10 || c == 13) { at_end = 0; while (c == 10 || c == 13) { if (s_check_rem(s, 1)) { in_uint8(s, c); } else { at_end = 1; break; } } if (!at_end) { s->p--; } } text[i] = 0; return 0; } /*****************************************************************************/ /* returns error */ static int file_split_name_value(char *text, char *name, char *value) { int len; int i; int value_index; int name_index; int on_to; value_index = 0; name_index = 0; on_to = 0; name[0] = 0; value[0] = 0; len = g_strlen(text); for (i = 0; i < len; i++) { if (text[i] == '=' && !on_to) { on_to = 1; } else if (on_to) { value[value_index] = text[i]; value_index++; value[value_index] = 0; } else { name[name_index] = text[i]; name_index++; name[name_index] = 0; } } g_strtrim(name, 3); /* trim both right and left */ g_strtrim(value, 3); /* trim both right and left */ return 0; } /*****************************************************************************/ /* return error */ static int l_file_read_section(int fd, int max_file_size, const char *section, struct list *names, struct list *values) { struct stream *s; char *data; char *text; char *name; char *value; char *lvalue; int len; int file_size; data = (char *) g_malloc(FILE_MAX_LINE_BYTES * 3, 0); text = data; name = text + FILE_MAX_LINE_BYTES; value = name + FILE_MAX_LINE_BYTES; file_size = 32 * 1024; /* 32 K file size limit */ g_file_seek(fd, 0); g_memset(text, 0, FILE_MAX_LINE_BYTES); list_clear(names); list_clear(values); make_stream(s); init_stream(s, file_size); len = g_file_read(fd, s->data, file_size); if (len > 0) { s->end = s->p + len; while (file_read_ini_line(s, text, FILE_MAX_LINE_BYTES) == 0) { if (line_lookup_for_section_name(text, FILE_MAX_LINE_BYTES) != 0) { if (g_strcasecmp(section, text) == 0) { while (file_read_ini_line(s, text, FILE_MAX_LINE_BYTES) == 0) { if (line_lookup_for_section_name(text, FILE_MAX_LINE_BYTES) != 0) { break; } if (g_strlen(text) > 0) { file_split_name_value(text, name, value); list_add_strdup(names, name); if (value[0] == '$') { lvalue = g_getenv(value + 1); if (lvalue != 0) { list_add_strdup(values, lvalue); } else { list_add_strdup(values, ""); } } else { list_add_strdup(values, value); } } } free_stream(s); g_free(data); return 0; } } } } free_stream(s); g_free(data); return 1; } /*****************************************************************************/ /* returns error returns 0 if everything is ok returns 1 if problem reading file */ /* 32 K file size limit */ int file_read_sections(int fd, struct list *names) { return l_file_read_sections(fd, 32 * 1024, names); } /*****************************************************************************/ /* return error */ /* this function should be preferred over file_read_sections because it can read any file size */ int file_by_name_read_sections(const char *file_name, struct list *names) { int fd; int file_size; int rv; file_size = g_file_get_size(file_name); if (file_size < 1) { return 1; } fd = g_file_open_ro(file_name); if (fd < 0) { return 1; } rv = l_file_read_sections(fd, file_size, names); g_file_close(fd); return rv; } /*****************************************************************************/ /* return error */ /* 32 K file size limit */ int file_read_section(int fd, const char *section, struct list *names, struct list *values) { return l_file_read_section(fd, 32 * 1024, section, names, values); } /*****************************************************************************/ /* return error */ /* this function should be preferred over file_read_section because it can read any file size */ int file_by_name_read_section(const char *file_name, const char *section, struct list *names, struct list *values) { int fd; int file_size; int rv; file_size = g_file_get_size(file_name); if (file_size < 1) { return 1; } fd = g_file_open_ro(file_name); if (fd < 0) { return 1; } rv = l_file_read_section(fd, file_size, section, names, values); g_file_close(fd); return rv; } ================================================ FILE: common/file.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * read a config file */ #if !defined(FILE_H) #define FILE_H #include "arch.h" int file_read_sections(int fd, struct list *names); int file_by_name_read_sections(const char *file_name, struct list *names); int file_read_section(int fd, const char *section, struct list *names, struct list *values); int file_by_name_read_section(const char *file_name, const char *section, struct list *names, struct list *values); #endif ================================================ FILE: common/guid.c ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) 2021 Matt Burt, all xrdp contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ /** * @file common/guid.c * @brief GUID manipulation definitions */ #if defined(HAVE_CONFIG_H) #include #endif #include "guid.h" #include "os_calls.h" #include "string_calls.h" enum { /* Field offsets in the UUID */ E_CLOCK_SEQ_HI_AND_RESERVED = 8, E_TIME_HI_AND_VERSION_MSB = 7, /* UUID versions from RFC4122 section 4.1.3 */ E_UUID_VERSION_RANDOM = 4 }; struct guid guid_new(void) { struct guid guid = {0}; g_random(guid.g, sizeof(guid.g)); /* Show this UUID as conforming to RFC4122 (section 4.1.1) */ guid.g[E_CLOCK_SEQ_HI_AND_RESERVED] &= ~0x40; /* Clear bit 6 */ guid.g[E_CLOCK_SEQ_HI_AND_RESERVED] |= (char)0x80; /* Set bit 7 */ guid.g[E_TIME_HI_AND_VERSION_MSB] &= ~0xf0; guid.g[E_TIME_HI_AND_VERSION_MSB] |= (E_UUID_VERSION_RANDOM << 4); return guid; } void guid_clear(struct guid *guid) { g_memset(&guid->g, '\x00', GUID_SIZE); } int guid_is_set(const struct guid *guid) { unsigned int i; int rv = 0; if (guid != NULL) { for (i = 0 ; i < GUID_SIZE; ++i) { if (guid->g[i] != '\x00') { rv = 1; break; } } } return rv; } const char *guid_to_str(const struct guid *src, char *dest) { const unsigned char *guid = (const unsigned char *)src->g; /* * Flipping integers into little-endian * See also: https://devblogs.microsoft.com/oldnewthing/20220928-00/?p=107221 */ g_sprintf(dest, "%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X", guid[3], guid[2], guid[1], guid[0], guid[5], guid[4], guid[7], guid[6], guid[8], guid[9], guid[10], guid[11], guid[12], guid[13], guid[14], guid[15]); return dest; } ================================================ FILE: common/guid.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2021 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ /** * @file common/guid.h * @brief GUID manipulation declarations */ #ifndef GUID_H #define GUID_H #include "arch.h" #define GUID_SIZE 16 /* bytes */ #define GUID_STR_SIZE (GUID_SIZE * 2 + 4 + 1) /* w/ 4 hyphens + null terminator */ #define GUID_ARE_EQUAL(g1,g2) (memcmp((g1)->g, (g2)->g, GUID_SIZE) == 0) /** * Use a struct for the guid so we can easily copy by assignment. * We use an array of char so that * we can compare GUIDs with a straight memcmp() * * Some fields of the GUID are in little-endian-order as specified by * [MS-DTYP]. This is at odds with RFC4122 which specifies big-endian * order for all fields. * * Octets RFC4122 field * ------ ------------- * 0-3 time_low (little-endian) * 4-5 time_mid (little-endian) * 6-7 time_hi_and_version (little-endian) * 8 clock_seq_hi_and_reserved * 9 clock_seq_low (in order) * 10-15 node */ struct guid { char g[GUID_SIZE]; }; /** * Get an initialised GUID * * The GUID is compatible with RFC4122 section 4.4. * * @return new GUID */ struct guid guid_new(void); /** * Clears an initialised GUID, so guid_is_set() returns true * * @param guid GUID to clear */ void guid_clear(struct guid *guid); /** * Checks if a GUID is initialised * * @param guid GUID to check (can be NULL) * @return non-zero if GUID is set */ int guid_is_set(const struct guid *guid); /** * Converts a GUID to a string representation * * @param guid GUID to represent * @param dest destionation pointer to at least GUID_STR_SIZE * bytes to store the representation * @return dest is returned for convenience */ const char *guid_to_str(const struct guid *guid, char *dest); #endif ================================================ FILE: common/list.c ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * simple list */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include "arch.h" #include "os_calls.h" #include "string_calls.h" #include "list.h" #include "log.h" enum { DEFAULT_LIST_SIZE = 10, DEFAULT_GROW_BY_SIZE = 10 }; /******************************************************************************/ struct list * list_create_sized(unsigned int size) { struct list *self; if (size < DEFAULT_LIST_SIZE) { size = DEFAULT_LIST_SIZE; } self = (struct list *)calloc(1, sizeof(struct list)); if (self != NULL) { self->items = (tbus *)malloc(sizeof(tbus) * size); if (self->items == NULL) { free(self); self = NULL; } else { self->grow_by = DEFAULT_GROW_BY_SIZE; self->alloc_size = size; } } return self; } /******************************************************************************/ struct list * list_create(void) { return list_create_sized(DEFAULT_LIST_SIZE); } /******************************************************************************/ void list_delete(struct list *self) { int i; if (self == 0) { return; } if (self->auto_free) { for (i = 0; i < self->count; i++) { free((void *)self->items[i]); self->items[i] = 0; } } free(self->items); free(self); } /******************************************************************************/ static int grow_list(struct list *self) { int rv = 1; unsigned int new_alloc_size = self->alloc_size + self->grow_by; tbus *p = (tbus *)realloc(self->items, sizeof(tbus) * new_alloc_size); if (p == NULL) { rv = 0; } else { self->alloc_size = new_alloc_size; self->items = p; } return rv; } /*****************************************************************************/ int list_add_item(struct list *self, tbus item) { if (self->count == self->alloc_size && !grow_list(self)) { return 0; } self->items[self->count] = item; self->count++; return 1; } /******************************************************************************/ tbus list_get_item(const struct list *self, int index) { if (index < 0 || index >= self->count) { return 0; } return self->items[index]; } /******************************************************************************/ void list_clear(struct list *self) { int i; if (self->auto_free) { for (i = 0; i < self->count; i++) { free((void *)self->items[i]); self->items[i] = 0; } } self->count = 0; self->grow_by = DEFAULT_GROW_BY_SIZE; self->alloc_size = DEFAULT_LIST_SIZE; self->items = (tbus *)realloc(self->items, sizeof(tbus) * self->alloc_size); } /******************************************************************************/ int list_index_of(struct list *self, tbus item) { int i; for (i = 0; i < self->count; i++) { if (self->items[i] == item) { return i; } } return -1; } /******************************************************************************/ void list_remove_item(struct list *self, int index) { int i; if (index >= 0 && index < self->count) { if (self->auto_free) { free((void *)self->items[index]); self->items[index] = 0; } for (i = index; i < (self->count - 1); i++) { self->items[i] = self->items[i + 1]; } self->count--; } } int list_insert_item(struct list *self, int index, tbus item) { int i; if (index > self->count) { index = self->count; } else if (index < 0) { index = 0; } if (self->count == self->alloc_size && !grow_list(self)) { return 0; } // Move all the items above this location up one for (i = self->count ; i > index ; --i) { self->items[i] = self->items[i - 1]; } self->count++; self->items[index] = item; return 1; } /******************************************************************************/ int list_add_strdup(struct list *self, const char *str) { int rv; char *dup; if (str == NULL) { rv = list_add_item(self, (tintptr)str); } else if ((dup = g_strdup(str)) == NULL) { rv = 0; } else { rv = list_add_item(self, (tintptr)dup); if (!rv) { g_free(dup); } } return rv; } /******************************************************************************/ int list_add_strdup_multi(struct list *self, ...) { va_list ap; int entry_count = self->count; const char *s; int rv = 1; va_start(ap, self); while ((s = va_arg(ap, const char *)) != LIST_ADD_STRDUP_TERM) { if (!list_add_strdup(self, s)) { rv = 0; break; } } va_end(ap); if (rv == 0) { // Remove the additional items we added while (self->count > entry_count) { list_remove_item(self, self->count - 1); } } return rv; } /******************************************************************************/ /* append one list to another using strdup for each item in the list */ /* begins copy at start_index, a zero based index on the source list */ int list_append_list_strdup(struct list *self, struct list *dest, int start_index) { int index; int rv = 1; int entry_dest_count = dest->count; for (index = start_index; index < self->count; index++) { const char *item = (const char *)list_get_item(self, index); if (!list_add_strdup(dest, item)) { rv = 0; break; } } if (rv == 0) { // Remove the additional items we added while (dest->count > entry_dest_count) { list_remove_item(dest, dest->count - 1); } } return rv; } /******************************************************************************/ void list_dump_items(struct list *self) { int index; if (self->count == 0) { LOG_DEVEL(LOG_LEVEL_TRACE, "List is empty"); } for (index = 0; index < self->count; index++) { LOG_DEVEL(LOG_LEVEL_TRACE, "%d: %p", index, (void *) list_get_item(self, index)); } } int split_string_append_fragment(const char **start, const char *end, struct list *list) { unsigned int len = end - *start; // Check for an unexpected terminator in the string const char *term = (const char *)memchr(*start, '\0', len); if (term != NULL) { end = term; len = end - *start; } char *copy = (char *)malloc(len + 1); if (copy == NULL) { list_delete(list); return 0; } g_memcpy(copy, *start, len); copy[len] = '\0'; if (!list_add_item(list, (tintptr)copy)) { g_free(copy); list_delete(list); return 0; } *start = end + 1; return 1; } /******************************************************************************/ struct list * split_string_into_list(const char *str, char character) { struct list *result = list_create(); if (result == NULL) { return result; } result->auto_free = 1; if (str == NULL) { return result; } const char *p; while ((p = g_strchr(str, character)) != NULL) { if (!split_string_append_fragment(&str, p, result)) { return NULL; } } if (*str != '\0') { if (!split_string_append_fragment(&str, str + g_strlen(str), result)) { return NULL; } } return result; } ================================================ FILE: common/list.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * simple list */ #if !defined(LIST_H) #define LIST_H #include "arch.h" /* list */ struct list { tintptr *items; int count; int alloc_size; int grow_by; int auto_free; }; struct list * list_create(void); /** * Creates a list with at least the specified number of items * reserved * @param size Number of items to reserve * @return list, or NULL if no memory */ struct list * list_create_sized(unsigned int size); void list_delete(struct list *self); /** * Adds an item to a list * @param self The list * @param item The item to add * @result 0 if a memory allocation failure occurred. In this * case the item is not added * * Memory allocation failures will not occur if the list is * sized appropriately when created. */ int list_add_item(struct list *self, tintptr item); tintptr list_get_item(const struct list *self, int index); void list_clear(struct list *self); int list_index_of(struct list *self, tintptr item); void list_remove_item(struct list *self, int index); /** * Inserts an item into a list * @param self The list * @param index The location to insert the item before * @param item The item to add * @result 0 if a memory allocation failure occurred. In this * case the item is not added * * Memory allocation failures will not occur if the list is * sized appropriately when created. */ int list_insert_item(struct list *self, int index, tintptr item); /** * Adds strings to a list from another list * @param self The source list * @param dest Destination list * @param start_index Index to start on the source list (zero based) * * @result 0 if a memory allocation failure occurred. In this * case the destination list is unaltered. * * Strings from the source list are copied with strdup() * The dest list should have auto_free set, or memory leaks will occur */ int list_append_list_strdup(struct list *self, struct list *dest, int start_index); void list_dump_items(struct list *self); /** * Appends a string fragment to a list * @param[in,out] start Pointer to start of fragment (by reference) * @param end Pointer to one past end of fragment * @param list List to append to * @result 1 for success * * In the event of a memory failure, 0 is returned and the list is deleted. */ int split_string_append_fragment(const char **start, const char *end, struct list *list); /** * Splits a string on a separation character and then returns a list of * the string split by the character, without the character contained within * the pieces. * * The list must be disposed of by the caller. * * @param str String to split. * @param character Character used as the delimiter between strings. * * @result 0 if a memory allocation failure occurred. * * String fragments in the list are created with strdup() */ struct list * split_string_into_list(const char *str, char character); /** * As list_add_item() but for a C string * * This is a convenience function for a common operation * @param self List to append to * @param str String to append * * The passed-in string is strdup'd onto the list, so if auto_free * isn't set, memory leaks will occur. * * A NULL pointer will be added as a NULL entry. * * @result 0 if any memory allocation failure occurred. In this case * the list is unchanged. */ int list_add_strdup(struct list *self, const char *str); /** * Add multiple strings to a list * * This is a convenience function for a common operation * @param self List to append to * @param ... Strings to append. Terminate the list with LIST_ADD_STRDUP_TERM * * @result 0 if any memory allocation failure occurred. In this case * the list is unchanged. */ /* * We need a typed terminator to guarantee the stack object is the * correct size (cf C99 std 6.2.5(12) for static checkers */ #define LIST_ADD_STRDUP_TERM ((const char *)0) int list_add_strdup_multi(struct list *self, ...); #endif ================================================ FILE: common/list16.c ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * simple list */ #if defined(HAVE_CONFIG_H) #include #endif #include "arch.h" #include "os_calls.h" #include "list16.h" /*****************************************************************************/ struct list16 * list16_create(void) { struct list16 *self; self = (struct list16 *)g_malloc(sizeof(struct list16), 0); list16_init(self); return self; } /*****************************************************************************/ void list16_delete(struct list16 *self) { if (self == 0) { return; } list16_deinit(self); g_free(self); } /*****************************************************************************/ void list16_init(struct list16 *self) { g_memset(self, 0, sizeof(struct list16)); self->max_count = 4; self->items = self->mitems; } /*****************************************************************************/ void list16_deinit(struct list16 *self) { if (self->items != self->mitems) { g_free(self->items); self->items = self->mitems; // Prevent double=free } } /*****************************************************************************/ /** * Makes the data array larger * * @param self The list * @return 1 for success, 0 for failure * * On failure, the data array is unchanged */ static int expand_array(struct list16 *self) { tui16 *p; int i; int new_max_count = self->max_count + 4; if (self->items == self->mitems) { /* Previous allocation is static. Make a new dynamic allocation */ p = (tui16 *)malloc(sizeof(tui16) * new_max_count); if (p == NULL) { return 0; } g_memcpy(p, self->items, sizeof(tui16) * self->max_count); } else { /* Try to reallocate the existing array */ p = (tui16 *)realloc(self->items, sizeof(tui16) * new_max_count); if (p == NULL) { return 0; } } /* Clear the new elements */ for (i = self->max_count; i < new_max_count; ++i) { p[i] = 0; } self->max_count = new_max_count; self->items = p; return 1; } /*****************************************************************************/ int list16_add_item(struct list16 *self, tui16 item) { if (self->count >= self->max_count && !expand_array(self)) { return 0; } self->items[self->count] = item; self->count++; return 1; } /*****************************************************************************/ tui16 list16_get_item(struct list16 *self, int index) { if (index < 0 || index >= self->count) { return 0; } return self->items[index]; } /*****************************************************************************/ void list16_clear(struct list16 *self) { if (self->items != self->mitems) { g_free(self->items); } self->count = 0; self->max_count = 4; self->items = self->mitems; } /*****************************************************************************/ int list16_index_of(struct list16 *self, tui16 item) { int i; for (i = 0; i < self->count; i++) { if (self->items[i] == item) { return i; } } return -1; } /*****************************************************************************/ void list16_remove_item(struct list16 *self, int index) { int i; if (index >= 0 && index < self->count) { for (i = index; i < (self->count - 1); i++) { self->items[i] = self->items[i + 1]; } self->count--; } } /*****************************************************************************/ int list16_insert_item(struct list16 *self, int index, tui16 item) { /* Make sure there's at least one free element in the array */ if (self->count >= self->max_count && !expand_array(self)) { return 0; } if (index < self->count) { memmove(&self->items[index + 1], &self->items[index], (self->count - index) * sizeof(tui16)); } self->items[index] = item; self->count++; return 1; } ================================================ FILE: common/list16.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * simple list */ #if !defined(LIST16_H) #define LIST16_H #include "arch.h" /* list */ struct list16 { tui16 *items; int count; int max_count; tui16 mitems[4]; }; struct list16 * list16_create(void); void list16_delete(struct list16 *self); /* Initialise a stack-based list16 */ void list16_init(struct list16 *self); /* Free any memory allocated to a list16. * After this call, list16_init() must be called again to re-use the list */ void list16_deinit(struct list16 *self); /* Returns != 0 if item added successfully */ int list16_add_item(struct list16 *self, tui16 item); tui16 list16_get_item(struct list16 *self, int index); void list16_clear(struct list16 *self); int list16_index_of(struct list16 *self, tui16 item); void list16_remove_item(struct list16 *self, int index); /* Returns != 0 if item added successfully */ int list16_insert_item(struct list16 *self, int index, tui16 item); #endif ================================================ FILE: common/log.c ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include #include #include #include #include #include "list.h" #include "file.h" #include "os_calls.h" #include "thread_calls.h" #include "string_calls.h" /* Add a define here so that the log.h will hold more information * when compiled from this C file. * When compiled normally the log.h file only contain the public parts * of the operators in this file. */ #define LOGINTERNALSTUFF #include "log.h" /* Here we store the current state and configuration of the log */ static struct log_config *g_staticLogConfig = NULL; /* This file first start with all private functions. In the end of the file the public functions is defined */ /** * * @brief Opens log file * @param fname log file name * @return see open(2) return values * */ static int internal_log_file_open(const char *fname) { int ret = -1; if (fname != NULL) { if (g_strcmp(fname, "") != 0) { ret = open(fname, O_WRONLY | O_CREAT | O_APPEND | O_SYNC, S_IRUSR | S_IWUSR); } else { ret = dup(1); } } if (ret != -1) { g_file_set_cloexec(ret, 1); } return ret; } /** * * @brief Converts xrdp log level to syslog logging level * @param lvl logging level * @return syslog equivalent logging level * */ static int internal_log_xrdp2syslog(const enum logLevels lvl) { switch (lvl) { case LOG_LEVEL_ALWAYS: return LOG_CRIT; case LOG_LEVEL_ERROR: return LOG_ERR; case LOG_LEVEL_WARNING: return LOG_WARNING; case LOG_LEVEL_INFO: return LOG_INFO; case LOG_LEVEL_DEBUG: case LOG_LEVEL_TRACE: return LOG_DEBUG; default: g_writeln("Undefined log level - programming error"); return LOG_DEBUG; } } /** * @brief Converts xrdp log levels to textual logging levels * @param lvl logging level * @param str pointer to a string, must be allocated before * */ void internal_log_lvl2str(const enum logLevels lvl, char *str) { switch (lvl) { case LOG_LEVEL_ALWAYS: snprintf(str, 9, "%s", "[CORE ] "); break; case LOG_LEVEL_ERROR: snprintf(str, 9, "%s", "[ERROR] "); break; case LOG_LEVEL_WARNING: snprintf(str, 9, "%s", "[WARN ] "); break; case LOG_LEVEL_INFO: snprintf(str, 9, "%s", "[INFO ] "); break; case LOG_LEVEL_DEBUG: snprintf(str, 9, "%s", "[DEBUG] "); break; case LOG_LEVEL_TRACE: snprintf(str, 9, "%s", "[TRACE] "); break; default: snprintf(str, 9, "%s", "PRG ERR!"); g_writeln("Programming error - undefined log level!!!"); } } /******************************************************************************/ enum logReturns internal_log_start(struct log_config *l_cfg) { enum logReturns ret = LOG_GENERAL_ERROR; if (0 == l_cfg) { ret = LOG_ERROR_MALLOC; return ret; } /* if progname is NULL, we return error */ if (0 == l_cfg->program_name) { g_writeln("program_name not properly assigned"); return ret; } if (l_cfg->dump_on_start) { internal_log_config_dump(l_cfg); } /* open file */ if (l_cfg->log_file != NULL) { l_cfg->fd = internal_log_file_open(l_cfg->log_file); if (-1 == l_cfg->fd) { return LOG_ERROR_FILE_OPEN; } } /* if syslog is enabled, open it */ if (l_cfg->enable_syslog) { openlog(l_cfg->program_name, LOG_CONS | LOG_PID, LOG_DAEMON); } #ifdef LOG_ENABLE_THREAD pthread_mutexattr_init(&(l_cfg->log_lock_attr)); pthread_mutex_init(&(l_cfg->log_lock), &(l_cfg->log_lock_attr)); #endif return LOG_STARTUP_OK; } /******************************************************************************/ enum logReturns internal_log_end(struct log_config *l_cfg) { enum logReturns ret = LOG_GENERAL_ERROR; /* if log is closed, quit silently */ if (0 == l_cfg) { return ret; } if (-1 != l_cfg->fd) { /* closing logfile... */ g_file_close(l_cfg->fd); } /* if syslog is enabled, close it */ if (l_cfg->enable_syslog) { closelog(); } /* freeing allocated memory */ if (0 != l_cfg->log_file) { g_free(l_cfg->log_file); l_cfg->log_file = 0; } ret = LOG_STARTUP_OK; return ret; } /** * Converts a string representing the log level to a value */ enum logLevels internal_log_text2level(const char *buf) { if (0 == g_strcasecmp(buf, "0") || 0 == g_strcasecmp(buf, "core")) { return LOG_LEVEL_ALWAYS; } else if (0 == g_strcasecmp(buf, "1") || 0 == g_strcasecmp(buf, "error")) { return LOG_LEVEL_ERROR; } else if (0 == g_strcasecmp(buf, "2") || 0 == g_strcasecmp(buf, "warn") || 0 == g_strcasecmp(buf, "warning")) { return LOG_LEVEL_WARNING; } else if (0 == g_strcasecmp(buf, "3") || 0 == g_strcasecmp(buf, "info")) { return LOG_LEVEL_INFO; } else if (0 == g_strcasecmp(buf, "4") || 0 == g_strcasecmp(buf, "debug")) { return LOG_LEVEL_DEBUG; } else if (0 == g_strcasecmp(buf, "5") || 0 == g_strcasecmp(buf, "trace")) { return LOG_LEVEL_TRACE; } g_writeln("Your configured log level is corrupt - we use debug log level"); return LOG_LEVEL_DEBUG; } /******************************************************************************/ static struct log_config * internal_config_read_logging(int file, const char *applicationName, const char *section_prefix) { int i; char *buf; char *temp_buf; char section_name[512]; struct log_config *lc; struct list *param_n; struct list *param_v; lc = internalInitAndAllocStruct(); if (lc == NULL) { return NULL; } param_n = list_create(); param_n->auto_free = 1; param_v = list_create(); param_v->auto_free = 1; list_clear(param_v); list_clear(param_n); /* setting defaults */ lc->program_name = applicationName; lc->log_file = 0; lc->fd = -1; lc->log_level = LOG_LEVEL_INFO; lc->enable_console = 0; lc->console_level = LOG_LEVEL_INFO; lc->enable_syslog = 0; lc->syslog_level = LOG_LEVEL_INFO; lc->dump_on_start = 0; lc->enable_pid = 0; g_snprintf(section_name, 511, "%s%s", section_prefix, SESMAN_CFG_LOGGING); file_read_section(file, section_name, param_n, param_v); for (i = 0; i < param_n->count; i++) { buf = (char *)list_get_item(param_n, i); if (0 == g_strcasecmp(buf, SESMAN_CFG_LOG_FILE)) { lc->log_file = g_strdup((char *)list_get_item(param_v, i)); if (lc->log_file != NULL) { if (lc->log_file[0] != '/' && g_strcmp(lc->log_file, "") != 0) { temp_buf = (char *)g_malloc(512, 0); g_snprintf(temp_buf, 511, "%s/%s", XRDP_LOG_PATH, lc->log_file); g_free(lc->log_file); lc->log_file = temp_buf; } } } if (0 == g_strcasecmp(buf, SESMAN_CFG_LOG_LEVEL)) { lc->log_level = internal_log_text2level((char *)list_get_item(param_v, i)); } if (0 == g_strcasecmp(buf, SESMAN_CFG_LOG_ENABLE_SYSLOG)) { lc->enable_syslog = g_text2bool((char *)list_get_item(param_v, i)); } if (0 == g_strcasecmp(buf, SESMAN_CFG_LOG_SYSLOG_LEVEL)) { lc->syslog_level = internal_log_text2level((char *)list_get_item(param_v, i)); } if (0 == g_strcasecmp(buf, SESMAN_CFG_LOG_ENABLE_CONSOLE)) { lc->enable_console = g_text2bool((char *)list_get_item(param_v, i)); } if (0 == g_strcasecmp(buf, SESMAN_CFG_LOG_CONSOLE_LEVEL)) { lc->console_level = internal_log_text2level((char *)list_get_item(param_v, i)); } if (0 == g_strcasecmp(buf, SESMAN_CFG_LOG_ENABLE_PID)) { lc->enable_pid = g_text2bool((char *)list_get_item(param_v, i)); } } if (0 == lc->log_file) { lc->log_file = g_strdup("./sesman.log"); } /* try to create path if not exist */ g_create_path(lc->log_file); #ifdef LOG_PER_LOGGER_LEVEL int len; struct log_logger_level *logger; list_clear(param_v); list_clear(param_n); g_snprintf(section_name, 511, "%s%s", section_prefix, SESMAN_CFG_LOGGING_LOGGER); file_read_section(file, section_name, param_n, param_v); for (i = 0; i < param_n->count; i++) { logger = (struct log_logger_level *)g_malloc(sizeof(struct log_logger_level), 1); list_add_item(lc->per_logger_level, (tbus) logger); logger->log_level = internal_log_text2level((char *)list_get_item(param_v, i)); g_strncpy(logger->logger_name, (char *)list_get_item(param_n, i), LOGGER_NAME_SIZE); logger->logger_name[LOGGER_NAME_SIZE] = '\0'; len = g_strlen(logger->logger_name); if (len >= 2 && logger->logger_name[len - 2] == '(' && logger->logger_name[len - 1] == ')' ) { logger->logger_type = LOG_TYPE_FUNCTION; logger->logger_name[len - 2] = '\0'; } else { logger->logger_type = LOG_TYPE_FILE; } } #endif list_delete(param_v); list_delete(param_n); return lc; } void internal_log_config_dump(struct log_config *config) { char str_level[20]; #ifdef LOG_PER_LOGGER_LEVEL struct log_logger_level *logger; int i; #endif g_printf("logging configuration:\r\n"); if (config->log_file) { internal_log_lvl2str(config->log_level, str_level); g_printf("\tLogFile: %s\r\n", config->log_file); g_printf("\tLogLevel: %s\r\n", str_level); } else { g_printf("\tLogFile: %s\r\n", ""); } if (config->enable_console) { internal_log_lvl2str(config->console_level, str_level); } else { g_strcpy(str_level, ""); } g_printf("\tConsoleLevel: %s\r\n", str_level); if (config->enable_syslog) { internal_log_lvl2str(config->syslog_level, str_level); } else { g_strcpy(str_level, ""); } g_printf("\tSyslogLevel: %s\r\n", str_level); #ifdef LOG_PER_LOGGER_LEVEL g_printf("per logger configuration:\r\n"); for (i = 0; i < config->per_logger_level->count; i++) { logger = (struct log_logger_level *)list_get_item(config->per_logger_level, i); internal_log_lvl2str(logger->log_level, str_level); g_printf("\t%-*s: %s\r\n", LOGGER_NAME_SIZE, logger->logger_name, str_level); } if (config->per_logger_level->count == 0) { g_printf("\tNone\r\n"); } #endif } struct log_config * internalInitAndAllocStruct(void) { struct log_config *ret = g_new0(struct log_config, 1); if (ret != NULL) { ret->fd = -1; ret->enable_syslog = 0; #ifdef LOG_PER_LOGGER_LEVEL ret->per_logger_level = list_create(); if (ret->per_logger_level != NULL) { ret->per_logger_level->auto_free = 1; } else { g_writeln("could not allocate memory for log struct"); g_free(ret); ret = NULL; } #endif } else { g_writeln("could not allocate memory for log struct"); } return ret; } /** * Copies logging levels only from one log_config structure to another **/ static void internal_log_config_copy_levels(struct log_config *dest, const struct log_config *src) { dest->log_level = src->log_level; dest->enable_syslog = src->enable_syslog; dest->syslog_level = src->syslog_level; dest->enable_console = src->enable_console; dest->console_level = src->console_level; #ifdef LOG_PER_LOGGER_LEVEL if (dest->per_logger_level == NULL) { dest->per_logger_level = list_create(); if (dest->per_logger_level == NULL) { return; } dest->per_logger_level->auto_free = 1; } else { list_clear(dest->per_logger_level); } if (src->per_logger_level == NULL) { return; } int i; for (i = 0; i < src->per_logger_level->count; ++i) { struct log_logger_level *dst_logger = (struct log_logger_level *)g_malloc(sizeof(struct log_logger_level), 1); *dst_logger = *(struct log_logger_level *) list_get_item(src->per_logger_level, i), list_add_item(dest->per_logger_level, (tbus) dst_logger); } #endif } static void internal_log_config_copy(struct log_config *dest, const struct log_config *src) { if (src != NULL && dest != NULL) { dest->fd = src->fd; g_free(dest->log_file); dest->log_file = g_strdup(src->log_file); #ifdef LOG_ENABLE_THREAD dest->log_lock = src->log_lock; dest->log_lock_attr = src->log_lock_attr; #endif dest->program_name = src->program_name; dest->enable_pid = src->enable_pid; dest->dump_on_start = src->dump_on_start; internal_log_config_copy_levels(dest, src); } } bool_t internal_log_is_enabled_for_level(const enum logLevels log_level, const bool_t override_destination_level, const enum logLevels override_log_level) { /* Is log initialized? */ if (g_staticLogConfig == NULL) { return 0; } else if (g_staticLogConfig->fd < 0 && !g_staticLogConfig->enable_syslog && !g_staticLogConfig->enable_console) { /* all logging outputs are disabled */ return 0; } else if (override_destination_level) { /* Override is enabled - should the message should be logged? */ return log_level <= override_log_level; } /* Override is disabled - Is there at least one log destination * which will accept the message based on the log level? */ else if (g_staticLogConfig->fd >= 0 && log_level <= g_staticLogConfig->log_level) { return 1; } else if (g_staticLogConfig->enable_syslog && log_level <= g_staticLogConfig->syslog_level) { return 1; } else if (g_staticLogConfig->enable_console && log_level <= g_staticLogConfig->console_level) { return 1; } else { return 0; } } bool_t internal_log_location_overrides_level(const char *function_name, const char *file_name, enum logLevels *log_level_return) { #ifdef LOG_PER_LOGGER_LEVEL struct log_logger_level *logger = NULL; int i; if (g_staticLogConfig == NULL) { return 0; } for (i = 0; i < g_staticLogConfig->per_logger_level->count; i++) { logger = (struct log_logger_level *)list_get_item(g_staticLogConfig->per_logger_level, i); if ((logger->logger_type == LOG_TYPE_FILE && 0 == g_strncmp(logger->logger_name, file_name, LOGGER_NAME_SIZE)) || (logger->logger_type == LOG_TYPE_FUNCTION && 0 == g_strncmp(logger->logger_name, function_name, LOGGER_NAME_SIZE))) { *log_level_return = logger->log_level; return 1; } } #endif return 0; } /* * Here below the public functions */ struct log_config * log_config_init_for_console(enum logLevels lvl, const char *override_name) { struct log_config *config = internalInitAndAllocStruct(); if (config != NULL) { config->program_name = ""; config->enable_console = 1; if (override_name != NULL && override_name[0] != '\0') { config->console_level = internal_log_text2level(override_name); } else { config->console_level = lvl; } } return config; } struct log_config * log_config_init_from_config(const char *iniFilename, const char *applicationName, const char *section_prefix) { int fd; struct log_config *config; if (applicationName == NULL) { g_writeln("Programming error your application name cannot be null"); return NULL; } if (iniFilename == NULL) { g_writeln("The inifile is null to log_config_init_from_config!"); return NULL; } fd = g_file_open_ro(iniFilename); if (-1 == fd) { g_writeln("We could not open the configuration file to read log parameters"); return NULL; } /* read logging config */ config = internal_config_read_logging(fd, applicationName, section_prefix); /* cleanup */ g_file_close(fd); return config; } enum logReturns log_config_free(struct log_config *config) { if (config != NULL) { #ifdef LOG_PER_LOGGER_LEVEL if (config->per_logger_level != NULL) { list_delete(config->per_logger_level); config->per_logger_level = NULL; } #endif if (0 != config->log_file) { g_free(config->log_file); config->log_file = 0; } g_free(config); } return LOG_STARTUP_OK; } /** * Restarts the logging. * * The logging file is never changed, as it is common in xrdp to share a * log file between parents and children. The end result would be * confusing for the user. */ static enum logReturns log_restart_from_param(const struct log_config *lc) { enum logReturns rv = LOG_GENERAL_ERROR; if (g_staticLogConfig == NULL) { log_message(LOG_LEVEL_ALWAYS, "Log not already initialized"); } else if (lc == NULL) { g_writeln("lc to log_start_from_param is NULL"); } else { if (g_staticLogConfig->fd >= 0 && g_strcmp(g_staticLogConfig->log_file, lc->log_file) != 0) { log_message(LOG_LEVEL_WARNING, "Unable to change log file name from %s to %s", g_staticLogConfig->log_file, lc->log_file); } /* Reconfigure syslog logging, allowing for a program_name change */ if (g_staticLogConfig->enable_syslog) { closelog(); } if (lc->enable_syslog) { openlog(lc->program_name, LOG_CONS | LOG_PID, LOG_DAEMON); } /* Copy over simple values... */ #ifdef LOG_ENABLE_THREAD g_staticLogConfig->log_lock = lc->log_lock; g_staticLogConfig->log_lock_attr = lc->log_lock_attr; #endif g_staticLogConfig->program_name = lc->program_name; g_staticLogConfig->enable_pid = lc->enable_pid; g_staticLogConfig->dump_on_start = lc->dump_on_start; /* ... and the log levels */ internal_log_config_copy_levels(g_staticLogConfig, lc); rv = LOG_STARTUP_OK; } return rv; } enum logReturns log_start_from_param(const struct log_config *src_log_config) { enum logReturns ret = LOG_GENERAL_ERROR; if (g_staticLogConfig != NULL) { log_message(LOG_LEVEL_ALWAYS, "Log already initialized"); return ret; } if (src_log_config == NULL) { g_writeln("src_log_config to log_start_from_param is NULL"); return ret; } else { g_staticLogConfig = internalInitAndAllocStruct(); if (g_staticLogConfig == NULL) { g_writeln("internalInitAndAllocStruct failed"); return LOG_ERROR_MALLOC; } internal_log_config_copy(g_staticLogConfig, src_log_config); ret = internal_log_start(g_staticLogConfig); if (ret != LOG_STARTUP_OK) { g_writeln("Could not start log"); log_config_free(g_staticLogConfig); g_staticLogConfig = NULL; } } return ret; } /** * This function initialize the log facilities according to the configuration * file, that is described by the in parameter. * @param applicationName the name that is used in the log for the running application * @return 0 on success */ enum logReturns log_start(const char *iniFile, const char *applicationName, unsigned int flags) { enum logReturns ret = LOG_GENERAL_ERROR; struct log_config *config; config = log_config_init_from_config(iniFile, applicationName, ""); if (config != NULL) { config->dump_on_start = (flags & LOG_START_DUMP_CONFIG) ? 1 : 0; if (flags & LOG_START_RESTART) { ret = log_restart_from_param(config); if (ret != LOG_STARTUP_OK) { g_writeln("Could not restart log"); } } else { ret = log_start_from_param(config); if (ret != LOG_STARTUP_OK) { g_writeln("Could not start log"); } } log_config_free(config); } else { g_writeln("Error reading configuration for log based on config: %s", iniFile); } return ret; } /** * Function that terminates all logging */ enum logReturns log_end(void) { enum logReturns ret = LOG_GENERAL_ERROR; ret = internal_log_end(g_staticLogConfig); log_config_free(g_staticLogConfig); g_staticLogConfig = NULL; return ret; } /*****************************************************************************/ /* log a hex dump */ enum logReturns log_hexdump(const enum logLevels log_level, const char *message, const char *src, int len) { return log_hexdump_with_location("", "", 0, log_level, message, src, len); } /*****************************************************************************/ /* log a hex dump */ enum logReturns log_hexdump_with_location(const char *function_name, const char *file_name, const int line_number, const enum logLevels log_level, const char *message, const char *src, int len) { char *dump_buffer; enum logReturns rv = LOG_STARTUP_OK; enum logLevels override_log_level = LOG_LEVEL_NEVER; bool_t override_destination_level = 0; override_destination_level = internal_log_location_overrides_level( function_name, file_name, &override_log_level); if (!internal_log_is_enabled_for_level(log_level, override_destination_level, override_log_level)) { return LOG_STARTUP_OK; } /* Start the dump on a new line so that the first line of the dump is aligned to the first column instead of to after the log message preamble (eg. time, log level, ...) */ #ifdef _WIN32 #define HEX_DUMP_HEADER ("Hex Dump:\r\n") #else #ifdef _MACOS #define HEX_DUMP_HEADER ("Hex Dump:\r") #else #define HEX_DUMP_HEADER ("Hex Dump:\n") #endif #endif dump_buffer = g_bytes_to_hexdump(src, len); if (dump_buffer != NULL) { if (g_strlen(file_name) > 0) { rv = log_message_with_location(function_name, file_name, line_number, log_level, "%s %s%s", message, HEX_DUMP_HEADER, dump_buffer); } else { rv = log_message(log_level, "%s %s%s", message, HEX_DUMP_HEADER, dump_buffer); } g_free(dump_buffer); } return rv; } enum logReturns log_message_with_location(const char *function_name, const char *file_name, const int line_number, const enum logLevels level, const char *msg, ...) { va_list ap; enum logReturns rv; char buff[LOG_BUFFER_SIZE]; enum logLevels override_log_level = LOG_LEVEL_NEVER; bool_t override_destination_level = 0; if (g_staticLogConfig == NULL) { g_writeln("The log reference is NULL - log not initialized properly " "when called from [%s(%s:%d)]", (function_name != NULL ? function_name : "unknown_function"), (file_name != NULL ? file_name : "unknown_file"), line_number); return LOG_ERROR_NO_CFG; } override_destination_level = internal_log_location_overrides_level( function_name, file_name, &override_log_level); if (!internal_log_is_enabled_for_level(level, override_destination_level, override_log_level)) { return LOG_STARTUP_OK; } g_snprintf(buff, LOG_BUFFER_SIZE, "[%s(%s:%d)] %s", function_name, file_name, line_number, msg); va_start(ap, msg); rv = internal_log_message(level, override_destination_level, override_log_level, buff, ap); va_end(ap); return rv; } enum logReturns log_message(const enum logLevels lvl, const char *msg, ...) { va_list ap; enum logReturns rv; va_start(ap, msg); rv = internal_log_message(lvl, 0, LOG_LEVEL_NEVER, msg, ap); va_end(ap); return rv; } enum logReturns internal_log_message(const enum logLevels lvl, const bool_t override_destination_level, const enum logLevels override_log_level, const char *msg, va_list ap) { char buff[LOG_BUFFER_SIZE + 43]; /* 31 ("[2022-10-07T19:58:33.065+0900] ") + 8 (log level) + 4 (space+cr+lf+\0) */ int len = 0; enum logReturns rv = LOG_STARTUP_OK; int writereply; if (g_staticLogConfig == NULL) { g_writeln("The log reference is NULL - log not initialized properly"); return LOG_ERROR_NO_CFG; } if (0 > g_staticLogConfig->fd && g_staticLogConfig->enable_syslog == 0 && g_staticLogConfig->enable_console == 0) { return LOG_ERROR_FILE_NOT_OPEN; } if (!internal_log_is_enabled_for_level(lvl, override_destination_level, override_log_level)) { return LOG_STARTUP_OK; } getFormattedDateTime(buff, 32); internal_log_lvl2str(lvl, buff + 31); if (g_staticLogConfig->enable_pid) { /* 31 (datetime) + 8 (log level) = 39 */ g_snprintf(buff + 39, LOG_BUFFER_SIZE, "[pid:%d tid:%lld] ", g_getpid(), (long long) tc_get_threadid()); len = g_strlen(buff + 39); } len += vsnprintf(buff + 39 + len, LOG_BUFFER_SIZE - len, msg, ap); /* checking for truncated messages */ if (len > LOG_BUFFER_SIZE) { log_message(LOG_LEVEL_WARNING, "next message will be truncated"); len = LOG_BUFFER_SIZE; } /* forcing the end of message string */ /* 31 (datetime) + 8 (log level) = 39 */ #ifdef _WIN32 buff[len + 39] = '\r'; buff[len + 40] = '\n'; buff[len + 41] = '\0'; #else #ifdef _MACOS buff[len + 39] = '\r'; buff[len + 40] = '\0'; #else buff[len + 39] = '\n'; buff[len + 40] = '\0'; #endif #endif if (g_staticLogConfig->enable_syslog && ((override_destination_level && lvl <= override_log_level) || (!override_destination_level && lvl <= g_staticLogConfig->syslog_level))) { /* log to syslog*/ /* %s fix compiler warning 'not a string literal' */ syslog(internal_log_xrdp2syslog(lvl), "%s", buff + 31); } if (g_staticLogConfig->enable_console && ((override_destination_level && lvl <= override_log_level) || (!override_destination_level && lvl <= g_staticLogConfig->console_level))) { /* log to console */ g_printf("%s", buff); } if ((override_destination_level && lvl <= override_log_level) || (!override_destination_level && lvl <= g_staticLogConfig->log_level)) { /* log to application logfile */ if (g_staticLogConfig->fd >= 0) { #ifdef LOG_ENABLE_THREAD pthread_mutex_lock(&(g_staticLogConfig->log_lock)); #endif writereply = g_file_write(g_staticLogConfig->fd, buff, g_strlen(buff)); if (writereply <= 0) { rv = LOG_ERROR_NULL_FILE; } #ifdef LOG_ENABLE_THREAD pthread_mutex_unlock(&(g_staticLogConfig->log_lock)); #endif } } return rv; } /** * Return the configured log file name */ char * getLogFile(char *replybuf, int bufsize) { if (g_staticLogConfig) { if (g_staticLogConfig->log_file) { g_strncpy(replybuf, g_staticLogConfig->log_file, bufsize); } else { g_sprintf(replybuf, "The log_file name is NULL"); } } else { g_snprintf(replybuf, bufsize, "The log is not properly started"); } return replybuf; } /** * Returns formatted datetime for log */ char * getFormattedDateTime(char *replybuf, int bufsize) { char buf_datetime[21]; /* 2022-10-07T16:36:04 + . */ char buf_millisec[4]; /* 357 */ char buf_timezone[6]; /* +0900 */ struct tm *now; struct timeval tv; int millisec; gettimeofday(&tv, NULL); now = localtime(&tv.tv_sec); millisec = (tv.tv_usec + 500 / 1000); g_snprintf(buf_millisec, sizeof(buf_millisec), "%03d", millisec); strftime(buf_datetime, sizeof(buf_datetime), "%FT%T.", now); strftime(buf_timezone, sizeof(buf_timezone), "%z", now); g_snprintf(replybuf, bufsize, "[%s%s%s] ", buf_datetime, buf_millisec, buf_timezone); return replybuf; } /*****************************************************************************/ #ifdef USE_DEVEL_LOGGING void log_devel_leaking_fds(const char *exe, int min, int max) { struct list *fd_list = g_get_open_fds(min, max); if (fd_list != NULL) { int i; for (i = 0 ; i < fd_list->count ; ++i) { int fd = (int)fd_list->items[i]; if (g_file_get_cloexec(fd) == 0) { LOG_DEVEL(LOG_LEVEL_WARNING, "File descriptor %d is not CLOEXEC when running %s", fd, exe); } } } } #endif // USE_DEVEL_LOGGING ================================================ FILE: common/log.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef LOG_H #define LOG_H #include #include "arch.h" #include "defines.h" #include "list.h" /* Check the config_ac.h file is included so we know whether to enable the * development macros */ #ifndef CONFIG_AC_H # error config_ac.h not visible in log.h #endif /* logging buffer size */ #define LOG_BUFFER_SIZE 8192 #define LOGGER_NAME_SIZE 50 /* logging levels */ enum logLevels { LOG_LEVEL_ALWAYS = 0, LOG_LEVEL_ERROR, /* for describing non-recoverable error states in a request or method */ LOG_LEVEL_WARNING, /* for describing recoverable error states in a request or method */ LOG_LEVEL_INFO, /* for low verbosity and high level descriptions of normal operations */ LOG_LEVEL_DEBUG, /* for medium verbosity and low level descriptions of normal operations */ LOG_LEVEL_TRACE, /* for high verbosity and low level descriptions of normal operations (eg. method or wire tracing) */ LOG_LEVEL_NEVER, }; /* startup return values */ enum logReturns { LOG_STARTUP_OK = 0, LOG_ERROR_MALLOC, LOG_ERROR_NULL_FILE, LOG_ERROR_FILE_OPEN, LOG_ERROR_NO_CFG, LOG_ERROR_FILE_NOT_OPEN, LOG_GENERAL_ERROR }; #define SESMAN_CFG_LOGGING "Logging" #define SESMAN_CFG_LOGGING_LOGGER "LoggingPerLogger" #define SESMAN_CFG_LOG_FILE "LogFile" #define SESMAN_CFG_LOG_LEVEL "LogLevel" #define SESMAN_CFG_LOG_ENABLE_CONSOLE "EnableConsole" #define SESMAN_CFG_LOG_CONSOLE_LEVEL "ConsoleLevel" #define SESMAN_CFG_LOG_ENABLE_SYSLOG "EnableSyslog" #define SESMAN_CFG_LOG_SYSLOG_LEVEL "SyslogLevel" #define SESMAN_CFG_LOG_ENABLE_PID "EnableProcessId" /* enable threading */ /*#define LOG_ENABLE_THREAD*/ #ifdef USE_DEVEL_LOGGING #define LOG_PER_LOGGER_LEVEL /** * @brief Logging macro for messages that are for an XRDP developer to * understand and debug XRDP code. * * Note: all log levels are relevant to help a developer understand XRDP at * different levels of granularity. * * Note: the logging function calls are removed when USE_DEVEL_LOGGING is * NOT defined. * * Note: when the build is configured with --enable-devel-logging, then * the log level can be configured per the source file name or method name * (with the suffix "()") in the [LoggingPerLogger] * section of the configuration file. * * For example: * ``` * [LoggingPerLogger] * xrdp.c=DEBUG * main()=WARNING * ``` * * @param lvl, the log level * @param msg, the log text as a printf format c-string * @param ... the arguments for the printf format c-string */ #define LOG_DEVEL(log_level, args...) \ log_message_with_location(__func__, __FILE__, __LINE__, log_level, args) /** * @brief Logging macro for messages that are for a system administrator to * configure and run XRDP on their machine. * * Note: the logging function calls contain additional code location info when * USE_DEVEL_LOGGING is defined. * * @param lvl, the log level * @param msg, the log text as a printf format c-string * @param ... the arguments for the printf format c-string */ #define LOG(log_level, args...) \ log_message_with_location(__func__, __FILE__, __LINE__, log_level, args) /** * @brief Logging macro for logging the contents of a byte array using a hex * dump format. * * Note: the logging function calls are removed when USE_DEVEL_LOGGING is * NOT defined. * * @param log_level, the log level * @param message, a message prefix for the hex dump. Note: no printf like * formatting is done to this message. * @param buffer, a pointer to the byte array to log as a hex dump * @param length, the length of the byte array to log */ #define LOG_DEVEL_HEXDUMP(log_level, message, buffer, length) \ log_hexdump_with_location(__func__, __FILE__, __LINE__, log_level, message, buffer, length) /** * @brief Logging macro for logging the contents of a byte array using a hex * dump format. * * @param log_level, the log level * @param message, a message prefix for the hex dump. Note: no printf like * formatting is done to this message. * @param buffer, a pointer to the byte array to log as a hex dump * @param length, the length of the byte array to log */ #define LOG_HEXDUMP(log_level, message, buffer, length) \ log_hexdump_with_location(__func__, __FILE__, __LINE__, log_level, message, buffer, length) #define LOG_DEVEL_LEAKING_FDS(exe,min,max) log_devel_leaking_fds(exe,min,max) #else #define LOG(log_level, args...) log_message(log_level, args) #define LOG_HEXDUMP(log_level, message, buffer, length) \ log_hexdump(log_level, message, buffer, length) /* Since log_message() returns a value ensure that the elided versions of * LOG_DEVEL and LOG_DEVEL_HEXDUMP also "fake" returning the success value */ #define LOG_DEVEL(log_level, args...) UNUSED_VAR(LOG_STARTUP_OK) #define LOG_DEVEL_HEXDUMP(log_level, message, buffer, length) UNUSED_VAR(LOG_STARTUP_OK) #define LOG_DEVEL_LEAKING_FDS(exe,min,max) #endif /* Flags values for log_start() */ /** * Dump the log config on startup */ #define LOG_START_DUMP_CONFIG (1<<0) /** * Restart the logging system. * * On a restart, existing files are not closed. This is because the * files may be shared by sub-processes, and the result will not be what the * user expects */ #define LOG_START_RESTART (1<<1) #ifdef LOG_PER_LOGGER_LEVEL enum log_logger_type { LOG_TYPE_FILE = 0, LOG_TYPE_FUNCTION, }; struct log_logger_level { enum logLevels log_level; enum log_logger_type logger_type; char logger_name[LOGGER_NAME_SIZE + 1]; }; #endif struct log_config { const char *program_name; /* Pointer to static storage */ char *log_file; /* Dynamically allocated */ int fd; enum logLevels log_level; int enable_console; enum logLevels console_level; int enable_syslog; enum logLevels syslog_level; #ifdef LOG_PER_LOGGER_LEVEL struct list *per_logger_level; #endif int dump_on_start; int enable_pid; #ifdef LOG_ENABLE_THREAD pthread_mutex_t log_lock; pthread_mutexattr_t log_lock_attr; #endif }; /* internal functions, only used in log.c if this ifdef is defined.*/ #ifdef LOGINTERNALSTUFF /** * * @brief Starts the logging subsystem * @param l_cfg logging system configuration * */ enum logReturns internal_log_start(struct log_config *l_cfg); /** * * @brief Shuts down the logging subsystem * @param l_cfg pointer to the logging subsystem to stop * */ enum logReturns internal_log_end(struct log_config *l_cfg); /** * Converts a log level to a string * @param lvl the loglevel * @param str pointer where the string will be stored. */ void internal_log_lvl2str(const enum logLevels lvl, char *str); /** * * @brief Converts a string to a log level * @param buf The string to convert * @return The corresponding level or LOG_LEVEL_DEBUG if error * */ enum logLevels internal_log_text2level(const char *buf); /** * A function that init our struct that holds all state and * also init its content. * @return LOG_STARTUP_OK or LOG_ERROR_MALLOC */ struct log_config * internalInitAndAllocStruct(void); /** * Print the contents of the logging config to stdout. */ void internal_log_config_dump(struct log_config *config); /** * the log function that all files use to log an event. * @param lvl the loglevel * @param override_destination_level if true then the destination log level is not used * @param override_log_level the loglevel instead of the destination log level if override_destination_level is true * @param msg the logtext. * @param ap the values for the message format arguments */ enum logReturns internal_log_message(const enum logLevels lvl, const bool_t override_destination_level, const enum logLevels override_log_level, const char *msg, va_list ap); /** * @param log_level the log level * @param override_destination_level if true then the destination log level is ignored. * @param override_log_level the log level to use instead of the destination log level * if override_destination_level is true * @return true if at least one log destination will accept a message logged at the given level. */ bool_t internal_log_is_enabled_for_level(const enum logLevels log_level, const bool_t override_destination_level, const enum logLevels override_log_level); /** * @param function_name the function name (typically the __func__ macro) * @param file_name the file name (typically the __FILE__ macro) * @param[out] log_level_return the log level to use instead of the destination log level * @return true if the logger location overrides the destination log levels */ bool_t internal_log_location_overrides_level(const char *function_name, const char *file_name, enum logLevels *log_level_return); /*End of internal functions*/ #endif /** * This function initialize the log facilities according to the configuration * file, that is described by the in parameter. * @param applicationName the name that is used in the log for the running * application * @param flags Flags to affect the operation of the call * @return LOG_STARTUP_OK on success */ enum logReturns log_start(const char *iniFile, const char *applicationName, unsigned int flags); /** * An alternative log_start where the caller gives the params directly. * * @post to avoid memory leaks, the config argument must be free'ed using * `log_config_free()` */ enum logReturns log_start_from_param(const struct log_config *src_log_config); /** * Sets up a suitable log config for writing to the console only * (i.e. for a utility) * * The config can be customised by the caller before calling * log_start_from_param() * * @param lvl log level * @param override_name level name, or NULL. This can be used to provide an * override to the default log level, by environment variable or * argument. * * @return pointer to struct log_config. */ struct log_config * log_config_init_for_console(enum logLevels lvl, const char *override_name); /** * Read configuration from a file and store the values in the returned * log_config. * @param applicationName the application name used in the log events. * @param section_prefix prefix for the logging sections to parse */ struct log_config * log_config_init_from_config(const char *iniFilename, const char *applicationName, const char *section_prefix); /** * Free the memory for the log_config struct. */ enum logReturns log_config_free(struct log_config *config); /** * Function that terminates all logging */ enum logReturns log_end(void); /** * the log function that all files use to log an event. * * Please prefer to use the LOG and LOG_DEVEL macros instead of this function directly. * * @param lvl the loglevel * @param msg the logtext. */ enum logReturns log_message(const enum logLevels lvl, const char *msg, ...) printflike(2, 3); enum logReturns log_hexdump(const enum logLevels log_level, const char *msg, const char *p, int len); /** * the log function that all files use to log an event, * with the function name and file line. * * Please prefer to use the LOG and LOG_DEVEL macros instead of this function directly. * * @param function_name the function name (typically the __func__ macro) * @param file_name the file name (typically the __FILE__ macro) * @param line_number the line number in the file (typically the __LINE__ macro) * @param lvl the loglevel * @param msg the logtext. */ enum logReturns log_message_with_location(const char *function_name, const char *file_name, const int line_number, const enum logLevels lvl, const char *msg, ...) printflike(5, 6); enum logReturns log_hexdump_with_location(const char *function_name, const char *file_name, const int line_number, const enum logLevels log_level, const char *msg, const char *p, int len); /** * This function returns the configured file name for the logfile * @param replybuf the buffer where the reply is stored * @param bufsize how big is the reply buffer. */ char *getLogFile(char *replybuf, int bufsize); /** * Returns formatted datetime for log */ char *getFormattedDateTime(char *replybuf, int bufsize); #ifdef USE_DEVEL_LOGGING /** * Log open file descriptors not cloexec before execing another program * * Used to ensure file descriptors aren't leaking when running * non-privileged executables * * Use the LOG_DEVEL_LEAKING_FDS() macro to invoke this function * * @param exe Executable we're about to launch * @param min Minimum FD to consider * @param max Maximum FD to consider + 1, or -1 for no upper FD */ void log_devel_leaking_fds(const char *exe, int min, int max); #endif #endif ================================================ FILE: common/ms-erref.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * MS-ERREF : Definitions from [MS-ERREF] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * References to MS-ERREF are currently correct for v20180912 of that * document */ #if !defined(MS_ERREF_H) #define MS_ERREF_H /* * NTSTATUS codes (section 2.3) */ enum NTSTATUS { STATUS_SUCCESS = 0x00000000, STATUS_NO_MORE_FILES = 0x80000006, STATUS_UNSUCCESSFUL = 0xc0000001, STATUS_INFO_LENGTH_MISMATCH = 0xc0000004, STATUS_NO_SUCH_FILE = 0xc000000f, STATUS_ACCESS_DENIED = 0xc0000022, STATUS_OBJECT_NAME_INVALID = 0xc0000033, STATUS_OBJECT_NAME_NOT_FOUND = 0xc0000034, STATUS_SHARING_VIOLATION = 0xc0000043, STATUS_NOT_SUPPORTED = 0xc00000bb }; #endif /* MS_ERREF_H */ ================================================ FILE: common/ms-fscc.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * MS-FSCC : Definitions from [MS-FSCC] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * References to MS-FSCC are currently correct for v20190923 of that * document */ #if !defined(MS_FSCC_H) #define MS_FSCC_H /* * File system ioctl codes (section 2.3) */ #define FSCTL_DELETE_OBJECT_ID 0x900a0 /* * File information classes (section 2.4) */ enum FILE_INFORMATION_CLASS { FileAllocationInformation = 19, /* Set */ FileBasicInformation = 4, /* Query, Set */ FileBothDirectoryInformation = 3, /* Query */ FileDirectoryInformation = 1, /* Query */ FileDispositionInformation = 13, /* Set */ FileEndOfFileInformation = 20, /* Set */ FileFullDirectoryInformation = 2, /* Query */ FileNamesInformation = 12, /* Query */ FileRenameInformation = 10, /* Set */ FileStandardInformation = 5 /* Query */ }; /* * Size of structs above without trailing RESERVED fields (MS-RDPEFS * 2.2.3.3.8) */ #define FILE_BASIC_INFORMATION_SIZE 36 #define FILE_STD_INFORMATION_SIZE 22 #define FILE_END_OF_FILE_INFORMATION_SIZE 8 /* * File System information classes (section 2.5) */ enum FILE_SYSTEM_INFORMATION_CLASS { FileFsVolumeInformation = 1, FileFsSizeInformation = 3, FileFsDeviceInformation = 4, FileFsAttributeInformation = 5, FileFsFullSizeInformation = 7 }; /* * Size of structs above without trailing RESERVED fields (MS-RDPEFS * 2.2.3.3.6) */ #define FILE_FS_SIZE_INFORMATION_SIZE 24 #define FILE_FS_DEVICE_INFORMATION_SIZE 8 #define FILE_FS_FULL_SIZE_INFORMATION_SIZE 32 /* Windows file attributes (section 2.6) */ #define W_FILE_ATTRIBUTE_DIRECTORY 0x00000010 #define W_FILE_ATTRIBUTE_READONLY 0x00000001 #define W_FILE_ATTRIBUTE_SYSTEM 0x00000004 #define W_FILE_ATTRIBUTE_NORMAL 0x00000080 #endif /* MS_FSCC_H */ ================================================ FILE: common/ms-rdpbcgr.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * MS-RDPBCGR : Definitions from [MS-RDPBCGR] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * References to MS-RDPBCGR are currently correct for v20190923 of that * document */ #if !defined(MS_RDPBCGR_H) #define MS_RDPBCGR_H /* RDP Security Negotiation codes */ #define RDP_NEG_REQ 0x01 /* MS-RDPBCGR 2.2.1.1.1 */ #define RDP_NEG_RSP 0x02 /* MS-RDPBCGR 2.2.1.2.1 */ #define RDP_NEG_FAILURE 0x03 /* MS-RDPBCGR 2.2.1.2.2 */ #define RDP_CORRELATION_INFO 0x06 /* MS-RDPBCGR 2.2.1.1.2 */ /* Protocol types codes (2.2.1.1.1, 2.2.1.2.1) */ #define PROTOCOL_RDP 0x00000000 #define PROTOCOL_SSL 0x00000001 #define PROTOCOL_HYBRID 0x00000002 #define PROTOCOL_RDSTLS 0x00000004 #define PROTOCOL_HYBRID_EX 0x00000008 /* Negotiation request packet flags (2.2.1.1.1) */ #define RESTRICTED_ADMIN_MODE_REQUIRED 0x00000001 #define REDIRECTED_AUTHENTICATION_MODE_REQUIRED 0x00000002 #define CORRELATION_INFO_PRESENT 0x00000008 /* Negotiation response packet flags (2.2.1.2.1) */ #define EXTENDED_CLIENT_DATA_SUPPORTED 0x01 #define DYNVC_GFX_PROTOCOL_SUPPORTED 0x02 #define NEGRSP_RESERVED 0x04 #define RESTRICTED_ADMIN_MODE_SUPPORTED 0x08 #define REDIRECTED_AUTHENTICATION_MODE_SUPPORTED 0x10 /* RDP Negotiation Failure Codes (2.2.1.2.2) */ #define SSL_REQUIRED_BY_SERVER 0x00000001 #define SSL_NOT_ALLOWED_BY_SERVER 0x00000002 #define SSL_CERT_NOT_ON_SERVER 0x00000003 #define INCONSISTENT_FLAGS 0x00000004 #define HYBRID_REQUIRED_BY_SERVER 0x00000005 #define SSL_WITH_USER_AUTH_REQUIRED_BY_SERVER 0x00000006 /* TS_UD_HEADER: type ((2.2.1.3.1) */ /* TODO: to be renamed */ #define SEC_TAG_CLI_INFO 0xc001 /* CS_CORE? */ #define SEC_TAG_CLI_CRYPT 0xc002 /* CS_SECURITY? */ #define SEC_TAG_CLI_CHANNELS 0xc003 /* CS_CHANNELS? */ #define SEC_TAG_CLI_4 0xc004 /* CS_CLUSTER? */ #define SEC_TAG_CLI_MONITOR 0xc005 /* CS_MONITOR */ #define SEC_TAG_CLI_MONITOR_EX 0xc008 /* CS_MONITOR_EX */ #define SEC_TAG_SRV_INFO 0x0c01 /* SC_CORE */ #define SEC_TAG_SRV_CRYPT 0x0c02 /* SC_SECURITY */ #define SEC_TAG_SRV_CHANNELS 0x0c03 /* SC_NET? */ /* Client Core Data: colorDepth, postBeta2ColorDepth (2.2.1.3.2) */ #define RNS_UD_COLOR_4BPP 0xCA00 #define RNS_UD_COLOR_8BPP 0xCA01 #define RNS_UD_COLOR_16BPP_555 0xCA02 #define RNS_UD_COLOR_16BPP_565 0xCA03 #define RNS_UD_COLOR_24BPP 0xCA04 /* Client Core Data: supportedColorDepths (2.2.1.3.2) */ #define RNS_UD_24BPP_SUPPORT 0x0001 #define RNS_UD_16BPP_SUPPORT 0x0002 #define RNS_UD_15BPP_SUPPORT 0x0004 #define RNS_UD_32BPP_SUPPORT 0x0008 /* Client Core Data: earlyCapabilityFlags (2.2.1.3.2) */ #define RNS_UD_CS_SUPPORT_ERRINFO_PDU 0x0001 #define RNS_UD_CS_WANT_32BPP_SESSION 0x0002 #define RNS_UD_CS_SUPPORT_MONITOR_LAYOUT_PDU 0x0040 #define RNS_UD_CS_SUPPORT_DYNVC_GFX_PROTOCOL 0x0100 #define RNS_UD_CS_SUPPORT_SKIP_CHANNELJOIN 0x0800 /* Client Core Data: connectionType (2.2.1.3.2) */ #define CONNECTION_TYPE_MODEM 0x01 #define CONNECTION_TYPE_BROADBAND_LOW 0x02 #define CONNECTION_TYPE_SATELLITE 0x03 #define CONNECTION_TYPE_BROADBAND_HIGH 0x04 #define CONNECTION_TYPE_WAN 0x05 #define CONNECTION_TYPE_LAN 0x06 #define CONNECTION_TYPE_AUTODETECT 0x07 /* TS_UD_CS_NET (2.2.1.3.4) */ /* This isn't explicitly named in MS-RDPBCGR */ #define MAX_STATIC_CHANNELS 31 /* Channel definition structure CHANNEL_DEF (2.2.1.3.4.1) */ #define CHANNEL_NAME_LEN 7 /* These names are also not explicitly defined in MS-RDPBCGR */ #define CLIPRDR_SVC_CHANNEL_NAME "cliprdr" #define DRDYNVC_SVC_CHANNEL_NAME "drdynvc" #define RAIL_SVC_CHANNEL_NAME "rail" #define RDPSND_SVC_CHANNEL_NAME "rdpsnd" #define RDPDR_SVC_CHANNEL_NAME "rdpdr" /* 2.2.1.3.6 Client Monitor Data */ /* monitorCount (4 bytes): A 32-bit, unsigned integer. The number of display */ /* monitor definitions in the monitorDefArray field (the maximum allowed is 16). */ #define CLIENT_MONITOR_DATA_MAXIMUM_MONITORS 16 /* 2.2.1.3.6 Client Monitor Data */ /* The maximum width of the virtual desktop resulting from the union of the monitors */ /* contained in the monitorDefArray field MUST NOT exceed 32,766 pixels. Similarly, */ /* the maximum height of the virtual desktop resulting from the union of the monitors */ /* contained in the monitorDefArray field MUST NOT exceed 32,766 pixels. */ /* The minimum permitted size of the virtual desktop is 200 x 200 pixels. */ #define CLIENT_MONITOR_DATA_MINIMUM_VIRTUAL_DESKTOP_WIDTH 0xC8 // 200 #define CLIENT_MONITOR_DATA_MINIMUM_VIRTUAL_DESKTOP_HEIGHT 0xC8 // 200 #define CLIENT_MONITOR_DATA_MAXIMUM_VIRTUAL_DESKTOP_WIDTH 0x7FFE // 32766 #define CLIENT_MONITOR_DATA_MAXIMUM_VIRTUAL_DESKTOP_HEIGHT 0x7FFE // 32766 /* 2.2.1.3.6.1 Monitor Definition (TS_MONITOR_DEF) */ #define TS_MONITOR_PRIMARY 0x00000001 /* Options field */ /* NOTE: XR_ prefixed to avoid conflict with FreeRDP */ #define XR_CHANNEL_OPTION_INITIALIZED 0x80000000 #define XR_CHANNEL_OPTION_ENCRYPT_RDP 0x40000000 #define XR_CHANNEL_OPTION_ENCRYPT_SC 0x20000000 #define XR_CHANNEL_OPTION_ENCRYPT_CS 0x10000000 #define XR_CHANNEL_OPTION_PRI_HIGH 0x08000000 #define XR_CHANNEL_OPTION_PRI_MED 0x04000000 #define XR_CHANNEL_OPTION_PRI_LOW 0x02000000 #define XR_CHANNEL_OPTION_COMPRESS_RDP 0x00800000 #define XR_CHANNEL_OPTION_COMPRESS 0x00400000 #define XR_CHANNEL_OPTION_SHOW_PROTOCOL 0x00200000 #define REMOTE_CONTROL_PERSISTENT 0x00100000 /* Server earlyCapabilityFlags (2.2.1.4.2) */ #define RNS_UD_SC_SKIP_CHANNELJOIN_SUPPORTED 0x00000008 /* Server Proprietary Certificate (2.2.1.4.3.1.1) */ /* TODO: to be renamed */ #define SEC_TAG_PUBKEY 0x0006 /* BB_RSA_KEY_BLOB */ #define SEC_TAG_KEYSIG 0x0008 /* BB_SIGNATURE_KEY_BLOB */ /* Info Packet (TS_INFO_PACKET): flags (2.2.1.11.1.1) */ /* TODO: to be renamed */ #define RDP_LOGON_AUTO 0x0008 #define RDP_LOGON_NORMAL 0x0033 #define RDP_COMPRESSION 0x0080 #define RDP_LOGON_BLOB 0x0100 #define RDP_LOGON_LEAVE_AUDIO 0x2000 #define RDP_LOGON_RAIL 0x8000 /* Extended Info Packet: clientAddress (2.2.1.11.1.1.1) */ #define EXTENDED_INFO_MAX_CLIENT_ADDR_LENGTH 80 /* Extended Info Packet: performanceFlags (2.2.1.11.1.1.1) */ /* TODO: to be renamed */ #define RDP5_DISABLE_NOTHING 0x00 #define RDP5_NO_WALLPAPER 0x01 #define RDP5_NO_FULLWINDOWDRAG 0x02 #define RDP5_NO_MENUANIMATIONS 0x04 #define RDP5_NO_THEMING 0x08 #define RDP5_NO_CURSOR_SHADOW 0x20 #define RDP5_NO_CURSORSETTINGS 0x40 /* disables cursor blinking */ /* LICENSE_PREAMBLE (2.2.1.12.1.1) */ #define ERROR_ALERT 0xff #define PREAMBLE_VERSION_3_0 0x03 /* LICENSE_BINARY_BLOB (2.2.1.12.1.2) */ #define BB_ERROR_BLOB 0x0004 /* LICENSE_ERROR_MESSAGE (2.2.1.12.1.3) */ #define STATUS_VALID_CLIENT 0x00000007 #define ST_NO_TRANSITION 0x00000002 /* Maps to generalCapabilitySet in T.128 page 138 */ /* Capability Set: capabilitySetType (2.2.1.13.1.1.1) */ #define CAPSTYPE_GENERAL 0x0001 #define CAPSTYPE_GENERAL_LEN 0x18 #define CAPSTYPE_BITMAP 0x0002 #define CAPSTYPE_BITMAP_LEN 0x1C #define CAPSTYPE_ORDER 0x0003 #define CAPSTYPE_ORDER_LEN 0x58 #define ORDER_CAP_NEGOTIATE 2 /* NEGOTIATEORDERSUPPORT? not used */ #define ORDER_CAP_NOSUPPORT 4 /* not used */ #define CAPSTYPE_BITMAPCACHE 0x0004 #define CAPSTYPE_BITMAPCACHE_LEN 0x28 #define CAPSTYPE_CONTROL 0x0005 #define CAPSTYPE_CONTROL_LEN 0x0C #define CAPSTYPE_ACTIVATION 0x0007 #define CAPSTYPE_ACTIVATION_LEN 0x0C #define CAPSTYPE_POINTER 0x0008 #define CAPSTYPE_POINTER_LEN 0x0a #define CAPSTYPE_POINTER_MONO_LEN 0x08 #define CAPSTYPE_SHARE 0x0009 #define CAPSTYPE_SHARE_LEN 0x08 #define CAPSTYPE_COLORCACHE 0x000A #define CAPSTYPE_COLORCACHE_LEN 0x08 #define CAPSTYPE_SOUND 0x000C #define CAPSTYPE_INPUT 0x000D #define CAPSTYPE_INPUT_LEN 0x58 #define CAPSTYPE_FONT 0x000E #define CAPSTYPE_FONT_LEN 0x04 #define CAPSTYPE_BRUSH 0x000F #define CAPSTYPE_BRUSH_LEN 0x08 #define CAPSTYPE_GLYPHCACHE 0x0010 #define CAPSTYPE_OFFSCREENCACHE 0x0011 #define CAPSTYPE_BITMAPCACHE_HOSTSUPPORT 0x0012 #define CAPSTYPE_BITMAPCACHE_HOSTSUPPORT_LEN 0x08 #define CAPSTYPE_BITMAPCACHE_REV2 0x0013 #define CAPSTYPE_BITMAPCACHE_REV2_LEN 0x28 #define BMPCACHE2_FLAG_PERSIST ((long)1<<31) #define CAPSTYPE_VIRTUALCHANNEL 0x0014 #define CAPSTYPE_VIRTUALCHANNEL_LEN 0x08 #define CAPSTYPE_DRAWNINGRIDCACHE 0x0015 #define CAPSTYPE_DRAWGDIPLUS 0x0016 #define CAPSTYPE_RAIL 0x0017 #define CAPSTYPE_WINDOW 0x0018 #define CAPSSETTYPE_COMPDESK 0x0019 #define CAPSSETTYPE_COMPDESK_LEN 0x06 #define CAPSSETTYPE_MULTIFRAGMENTUPDATE 0x001A #define CAPSSETTYPE_MULTIFRAGMENTUPDATE_LEN 0x08 #define CAPSETTYPE_LARGE_POINTER 0x001B #define CAPSETTYPE_LARGE_POINTER_LEN 0x06 #define CAPSETTYPE_SURFACE_COMMANDS 0x001C #define CAPSETTYPE_SURFACE_COMMANDS_LEN 0x0C #define CAPSSETTYPE_BITMAP_CODECS 0x001D #define CAPSSETTYPE_BITMAP_CODECS_LEN 0x1C #define CAPSTYPE_FRAME_ACKNOWLEDGE 0x001E #define CAPSTYPE_FRAME_ACKNOWLEDGE_LEN 0x08 /* Control PDU Data: action (2.2.1.15.1) */ /* TODO: to be renamed */ #define RDP_CTL_REQUEST_CONTROL 1 /* CTRLACTION_REQUEST_CONTROL */ #define RDP_CTL_GRANT_CONTROL 2 #define RDP_CTL_DETACH 3 #define RDP_CTL_COOPERATE 4 /* RDP5 disconnect PDU */ /* Set Error Info PDU Data: errorInfo (2.2.5.1.1) */ #define ERRINFO_NONE 0x0000 #define ERRINFO_RPC_INITIATED_DISCONNECT 0x0001 #define ERRINFO_RPC_INITIATED_LOGOFF 0x0002 #define ERRINFO_IDLE_TIMEOUT 0x0003 #define ERRINFO_LOGON_TIMEOUT 0x0004 #define ERRINFO_DISCONNECTED_BY_OTHERCONNECTION 0x0005 #define ERRINFO_OUT_OF_MEMORY 0x0006 #define ERRINFO_SERVER_DENIED_CONNECTION 0x0007 #define ERRINFO_SERVER_INSUFFICIENT_PRIVILEGES 0x0009 #define ERRINFO_LOGOFF_BY_USER 0x000c #define ERRINFO_SERVER_DWM_CRASH 0x0010 #define ERRINFO_SERVER_CSRSS_CRASH 0x0018 /* Virtual channel PDU (2.2.6.1) */ #define CHANNEL_CHUNK_LENGTH 1600 /* Channel PDU Header flags (2.2.6.1.1) */ /* NOTE: XR_ prefixed to avoid conflict with FreeRDP */ #define XR_CHANNEL_FLAG_FIRST 0x00000001 #define XR_CHANNEL_FLAG_LAST 0x00000002 #define XR_CHANNEL_FLAG_SHOW_PROTOCOL 0x00000010 /* General Capability Set: osMajorType (2.2.7.1.1) */ #define OSMAJORTYPE_UNSPECIFIED 0x0000 #define OSMAJORTYPE_WINDOWS 0x0001 #define OSMAJORTYPE_OS2 0x0002 #define OSMAJORTYPE_MACINTOSH 0x0003 #define OSMAJORTYPE_UNIX 0x0004 #define OSMAJORTYPE_IOS 0x0005 #define OSMAJORTYPE_OSX 0x0006 #define OSMAJORTYPE_ANDROID 0x0007 #define OSMAJORTYPE_CHROME_OS 0x0008 /* General Capability Set: osMinorType (2.2.7.1.1) */ #define OSMINORTYPE_UNSPECIFIED 0x0000 #define OSMINORTYPE_WINDOWS_31X 0x0001 #define OSMINORTYPE_WINDOWS_95 0x0002 #define OSMINORTYPE_WINDOWS_NT 0x0003 #define OSMINORTYPE_OS2_V21 0x0004 #define OSMINORTYPE_POWER_PC 0x0005 #define OSMINORTYPE_MACINTOSH 0x0006 #define OSMINORTYPE_NATIVE_XSERVER 0x0007 #define OSMINORTYPE_PSEUDO_XSERVER 0x0008 #define OSMINORTYPE_WINDOWS_RT 0x0009 /* General Capability Set: protocolVersion (2.2.7.1.1) */ #define TS_CAPS_PROTOCOLVERSION 0x0200 /* General Capability Set: extraFlags (2.2.7.1.1) */ #define FASTPATH_OUTPUT_SUPPORTED 0x0001 #define NO_BITMAP_COMPRESSION_HDR 0x0400 #define LONG_CREDENTIALS_SUPPORTED 0x0004 #define AUTORECONNECT_SUPPORTED 0x0008 #define ENC_SALTED_CHECKSUM 0x0010 /* Order Capability Set: orderSupportExFlags (2.2.7.1.3) */ /* NOTE: XR_ prefixed to avoid conflict with FreeRDP */ /* XR_PRIMARY_ORDER_COUNT is not an official definition */ #define XR_PRIMARY_ORDER_COUNT 32 #define XR_ORDERFLAGS_EX_CACHE_BITMAP_REV3_SUPPORT 0x0002 #define XR_ORDERFLAGS_EX_ALTSEC_FRAME_MARKER_SUPPORT 0x0004 /* Order Capability Set: orderFlags (2.2.7.1.3) */ #define NEGOTIATEORDERSUPPORT 0x0002 #define ZEROBOUNDSDELTASUPPORT 0x0008 #define COLORINDEXSUPPORT 0x0020 #define SOLIDPATTERNBRUSHONLY 0x0040 #define ORDERFLAGS_EXTRA_FLAGS 0x0080 /* Order Capability Set: orderSupport (2.2.7.1.3) */ #define TS_NEG_DSTBLT_INDEX 0x00 #define TS_NEG_PATBLT_INDEX 0x01 #define TS_NEG_SCRBLT_INDEX 0x02 #define TS_NEG_MEMBLT_INDEX 0x03 #define TS_NEG_MEM3BLT_INDEX 0x04 /* 0x05 */ /* 0x06 */ #define TS_NEG_DRAWNINEGRID_INDEX 0x07 #define TS_NEG_LINETO_INDEX 0x08 #define TS_NEG_MULTI_DRAWNINEGRID_INDEX 0x09 /* 0x0A */ #define TS_NEG_SAVEBITMAP_INDEX 0x0B /* 0x0C */ /* 0x0D */ /* 0x0E */ #define TS_NEG_MULTIDSTBLT_INDEX 0x0F #define TS_NEG_MULTIPATBLT_INDEX 0x10 #define TS_NEG_MULTISCRBLT_INDEX 0x11 #define TS_NEG_MULTIOPAQUERECT_INDEX 0x12 #define TS_NEG_FAST_INDEX_INDEX 0x13 #define TS_NEG_POLYGON_SC_INDEX 0x14 #define TS_NEG_POLYGON_CB_INDEX 0x15 #define TS_NEG_POLYLINE_INDEX 0x16 /* 0x17 */ #define TS_NEG_FAST_GLYPH_INDEX 0x18 #define TS_NEG_ELLIPSE_SC_INDEX 0x19 #define TS_NEG_ELLIPSE_CB_INDEX 0x1A #define TS_NEG_INDEX_INDEX 0x1B /* 0x1C */ /* 0x1D */ /* 0x1E */ /* 0x1F */ /* Input Capability Set: inputFlags (2.2.7.1.6) */ #define INPUT_FLAG_SCANCODES 0x0001 #define INPUT_FLAG_MOUSEX 0x0004 #define INPUT_FLAG_FASTPATH_INPUT 0x0008 #define INPUT_FLAG_UNICODE 0x0010 #define INPUT_FLAG_FASTPATH_INPUT2 0x0020 #define INPUT_FLAG_UNUSED1 0x0040 #define INPUT_FLAG_UNUSED2 0x0080 #define TS_INPUT_FLAG_MOUSE_HWHEEL 0x0100 #define TS_INPUT_FLAG_QOE_TIMESTAMPS 0x0200 /* Glyph Cache Capability Set: GlyphSupportLevel (2.2.7.1.8) */ #define GLYPH_SUPPORT_NONE 0x0000 #define GLYPH_SUPPORT_PARTIAL 0x0001 #define GLYPH_SUPPORT_FULL 0x0002 #define GLYPH_SUPPORT_ENCODE 0x0003 /* Desktop Composition Capability Set: CompDeskSupportLevel (2.2.7.2.8) */ #define COMPDESK_NOT_SUPPORTED 0x0000 #define COMPDESK_SUPPORTED 0x0001 /* Surface Commands Capability Set: cmdFlags (2.2.7.2.9) */ #define SURFCMDS_SETSURFACEBITS 0x00000002 #define SURFCMDS_FRAMEMARKER 0x00000010 #define SURFCMDS_STREAMSUFRACEBITS 0x00000040 /* Bitmap Codec: codecGUID (2.2.7.2.10.1.1) */ /* CODEC_GUID_NSCODEC CA8D1BB9-000F-154F-589F-AE2D1A87E2D6 */ #define XR_CODEC_GUID_NSCODEC \ "\xb9\x1b\x8d\xca\x0f\x00\x4f\x15\x58\x9f\xae\x2d\x1a\x87\xe2\xd6" /* CODEC_GUID_REMOTEFX 76772F12-BD72-4463-AFB3-B73C9C6F7886 */ #define XR_CODEC_GUID_REMOTEFX \ "\x12\x2F\x77\x76\x72\xBD\x63\x44\xAF\xB3\xB7\x3C\x9C\x6F\x78\x86" /* CODEC_GUID_IMAGE_REMOTEFX 2744CCD4-9D8A-4E74-803C-0ECBEEA19C54 */ #define XR_CODEC_GUID_IMAGE_REMOTEFX \ "\xD4\xCC\x44\x27\x8A\x9D\x74\x4E\x80\x3C\x0E\xCB\xEE\xA1\x9C\x54" /* MFVideoFormat_H264 34363248-0000-0010-8000-00AA00389B71 */ #define XR_CODEC_GUID_H264 \ "\x48\x32\x36\x34\x00\x00\x10\x00\x80\x00\x00\xAA\x00\x38\x9B\x71" /* CODEC_GUID_JPEG 1BAF4CE6-9EED-430C-869A-CB8B37B66237 */ #define XR_CODEC_GUID_JPEG \ "\xE6\x4C\xAF\x1B\xED\x9E\x0C\x43\x86\x9A\xCB\x8B\x37\xB6\x62\x37" /* CODEC_GUID_PNG 0E0C858D-28E0-45DB-ADAA-0F83E57CC560 */ #define XR_CODEC_GUID_PNG \ "\x8D\x85\x0C\x0E\xE0\x28\xDB\x45\xAD\xAA\x0F\x83\xE5\x7C\xC5\x60" /* CODEC_GUID_IGNORE 0C4351A6-3535-42AE-910C-CDFCE5760B58 */ #define XR_CODEC_GUID_IGNORE \ "\xA6\x51\x43\x0C\x35\x35\xAE\x42\x91\x0C\xCD\xFC\xE5\x76\x0B\x58" /* PDU Types (2.2.8.1.1.1.1) */ #define PDUTYPE_DEMANDACTIVEPDU 0x1 #define PDUTYPE_CONFIRMACTIVEPDU 0x3 #define PDUTYPE_DEACTIVATEALLPDU 0x6 #define PDUTYPE_DATAPDU 0x7 #define PDUTYPE_SERVER_REDIR_PKT 0xA #define PDUTYPE_TO_STR(pdu_type) \ ((pdu_type) == PDUTYPE_DEMANDACTIVEPDU ? "PDUTYPE_DEMANDACTIVEPDU" : \ (pdu_type) == PDUTYPE_CONFIRMACTIVEPDU ? "PDUTYPE_CONFIRMACTIVEPDU" : \ (pdu_type) == PDUTYPE_DEACTIVATEALLPDU ? "PDUTYPE_DEACTIVATEALLPDU" : \ (pdu_type) == PDUTYPE_DATAPDU ? "PDUTYPE_DATAPDU" : \ (pdu_type) == PDUTYPE_SERVER_REDIR_PKT ? "PDUTYPE_SERVER_REDIR_PKT" : \ "unknown" \ ) /* Share Data Header: pduType2 (2.2.8.1.1.1.2) */ #define PDUTYPE2_UPDATE 2 #define PDUTYPE2_CONTROL 20 #define PDUTYPE2_POINTER 27 #define PDUTYPE2_INPUT 28 #define PDUTYPE2_SYNCHRONISE 31 #define PDUTYPE2_REFRESH_RECT 33 #define PDUTYPE2_PLAY_SOUND 34 #define PDUTYPE2_SUPPRESS_OUTPUT 35 #define PDUTYPE2_SHUTDOWN_REQUEST 36 #define PDUTYPE2_SHUTDOWN_DENIED 37 #define PDUTYPE2_SAVE_SESSION_INFO 38 #define PDUTYPE2_FONTLIST 39 #define PDUTYPE2_SET_ERROR_INFO_PDU 47 #define PDUTYPE2_MONITOR_LAYOUT_PDU 55 #define PDUTYPE2_FRAME_ACKNOWLEDGE 56 /* From [MS-RDPRFX] */ /* TS_SECURITY_HEADER: flags (2.2.8.1.1.2.1) */ #define SEC_EXCHANGE_PKT 0x0001 #define SEC_ENCRYPT 0x0008 #define SEC_INFO_PKT 0x0040 #define SEC_LICENSE_PKT 0x0080 #define SEC_LICENSE_ENCRYPT_CS 0x0280 /* Slow-Path Input Event: messageType (2.2.8.1.1.3.1.1) */ /* TODO: to be renamed */ #define RDP_INPUT_SYNCHRONIZE 0 #define RDP_INPUT_CODEPOINT 1 #define RDP_INPUT_VIRTKEY 2 #define RDP_INPUT_SCANCODE 4 #define RDP_INPUT_UNICODE 5 #define RDP_INPUT_MOUSE 0x8001 #define RDP_INPUT_MOUSEX 0x8002 /* Keyboard Event: keyboardFlags (2.2.8.1.1.3.1.1.1) */ #define KBDFLAGS_EXTENDED 0x0100 #define KBDFLAGS_EXTENDED1 0x0200 #define KBDFLAGS_DOWN 0x4000 #define KBDFLAGS_RELEASE 0x8000 /* Mouse Event: pointerFlags (2.2.8.1.1.3.1.1.3) */ #define PTRFLAGS_HWHEEL 0x0400 #define PTRFLAGS_WHEEL 0x0200 #define PTRFLAGS_WHEEL_NEGATIVE 0x0100 #define WheelRotationMask 0x01FF #define PTRFLAGS_MOVE 0x0800 #define PTRFLAGS_DOWN 0x8000 #define PTRFLAGS_BUTTON1 0x1000 #define PTRFLAGS_BUTTON2 0x2000 #define PTRFLAGS_BUTTON3 0x4000 /* Extended Mouse Event: pointerFlags (2.2.8.1.1.3.1.1.4) */ #define PTRXFLAGS_DOWN 0x8000 #define PTRXFLAGS_BUTTON1 0x0001 #define PTRXFLAGS_BUTTON2 0x0002 /* Synchronize Event: toggleFlags (2.2.8.1.1.3.1.1.5) */ #define TS_SYNC_SCROLL_LOCK 0x0001 #define TS_SYNC_NUM_LOCK 0x0002 #define TS_SYNC_CAPS_LOCK 0x0004 #define TS_SYNC_KANA_LOCK 0x0008 /* Client Fast-Path Input Event PDU 2.2.8.1.2 */ #define FASTPATH_INPUT_ENCRYPTED 0x2 /* Fast-Path Input Event: eventCode (2.2.8.1.2.2) */ #define FASTPATH_INPUT_EVENT_SCANCODE 0x0 #define FASTPATH_INPUT_EVENT_MOUSE 0x1 #define FASTPATH_INPUT_EVENT_MOUSEX 0x2 #define FASTPATH_INPUT_EVENT_SYNC 0x3 #define FASTPATH_INPUT_EVENT_UNICODE 0x4 #define FASTPATH_INPUT_EVENT_QOE_TIMESTAMP 0x6 /* Fast-Path Keyboard Event: eventHeader (2.2.8.1.2.2.1) */ #define FASTPATH_INPUT_KBDFLAGS_RELEASE 0x01 #define FASTPATH_INPUT_KBDFLAGS_EXTENDED 0x02 #define FASTPATH_INPUT_KBDFLAGS_EXTENDED1 0x04 /* Slow-Path Graphics Update: updateType (2.2.9.1.1.3.1) */ #define UPDATETYPE_ORDERS 0 #define UPDATETYPE_BITMAP 1 #define UPDATETYPE_PALETTE 2 #define UPDATETYPE_SYNCHRONIZE 3 #define GRAPHICS_UPDATE_TYPE_TO_STR(type) \ ((type) == UPDATETYPE_ORDERS ? "UPDATETYPE_ORDERS" : \ (type) == UPDATETYPE_BITMAP ? "UPDATETYPE_BITMAP" : \ (type) == UPDATETYPE_PALETTE ? "UPDATETYPE_PALETTE" : \ (type) == UPDATETYPE_SYNCHRONIZE ? "UPDATETYPE_SYNCHRONIZE" : \ "unknown" \ ) /* Server Pointer Update PDU: messageType (2.2.9.1.1.4) */ #define TS_PTRMSGTYPE_SYSTEM 1 #define TS_PTRMSGTYPE_POSITION 3 #define TS_PTRMSGTYPE_COLOR 6 #define TS_PTRMSGTYPE_CACHED 7 #define TS_PTRMSGTYPE_POINTER 8 /* System Pointer Update: systemPointerType (2.2.9.1.1.4.3) */ /* These may also be defined by freerdp */ #ifndef SYSPTR_NULL #define SYSPTR_NULL 0 #define SYSPTR_DEFAULT 0x7F00 #endif /* Server Fast-Path Update PDU: action (2.2.9.1.2) */ #define FASTPATH_OUTPUT_ACTION_FASTPATH 0x0 #define FASTPATH_OUTPUT_ACTION_X224 0x3 /* Server Fast-Path Update PDU: flags (2.2.9.1.2) */ #define FASTPATH_OUTPUT_SECURE_CHECKSUM 0x1 #define FASTPATH_OUTPUT_ENCRYPTED 0x2 /* Fast-Path Update: updateCode (2.2.9.1.2.1) */ #define FASTPATH_UPDATETYPE_ORDERS 0x0 #define FASTPATH_UPDATETYPE_BITMAP 0x1 #define FASTPATH_UPDATETYPE_PALETTE 0x2 #define FASTPATH_UPDATETYPE_SYNCHRONIZE 0x3 #define FASTPATH_UPDATETYPE_SURFCMDS 0x4 #define FASTPATH_UPDATETYPE_PTR_NULL 0x5 #define FASTPATH_UPDATETYPE_PTR_DEFAULT 0x6 #define FASTPATH_UPDATETYPE_PTR_POSITION 0x8 #define FASTPATH_UPDATETYPE_COLOR 0x9 #define FASTPATH_UPDATETYPE_CACHED 0xA #define FASTPATH_UPDATETYPE_POINTER 0xB /* Fast-Path Update: fragmentation (2.2.9.1.2.1) */ #define FASTPATH_FRAGMENT_SINGLE 0x0 #define FASTPATH_FRAGMENT_LAST 0x1 #define FASTPATH_FRAGMENT_FIRST 0x2 #define FASTPATH_FRAGMENT_NEXT 0x3 #define FASTPATH_OUTPUT_COMPRESSION_USED 0x2 /* Surface Command Type (2.2.9.1.2.1.10.1) */ #define CMDTYPE_SET_SURFACE_BITS 0x0001 #define CMDTYPE_FRAME_MARKER 0x0004 #define CMDTYPE_STREAM_SURFACE_BITS 0x0006 /* Compression Flags (3.1.8.2.1) */ /* TODO: to be renamed, not used anywhere */ #define RDP_MPPC_COMPRESSED 0x20 #define RDP_MPPC_RESET 0x40 #define RDP_MPPC_FLUSH 0x80 #define RDP_MPPC_DICT_SIZE 8192 /* RDP 4.0 | MS-RDPBCGR 3.1.8 */ /* largePointerSupprtFlags (2.2.7.2.7) */ #define LARGE_POINTER_FLAG_96x96 0x00000001 #define LARGE_POINTER_FLAG_384x384 0x00000002 #endif /* MS_RDPBCGR_H */ ================================================ FILE: common/ms-rdpeclip.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * MS-RDPECLIP : Definitions from [MS-RDPECLIP] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * References to MS-RDPECLIP are currently correct for v220210407 of that * document */ #if !defined(MS_RDPECLIP_H) #define MS_RDPECLIP_H /* Clipboard PDU header message codes 2.2.1 */ #define CB_MONITOR_READY 1 #define CB_FORMAT_LIST 2 #define CB_FORMAT_LIST_RESPONSE 3 #define CB_FORMAT_DATA_REQUEST 4 #define CB_FORMAT_DATA_RESPONSE 5 #define CB_TEMP_DIRECTORY 6 #define CB_CLIP_CAPS 7 #define CB_FILECONTENTS_REQUEST 8 #define CB_FILECONTENTS_RESPONSE 9 #define CB_LOCK_CLIPDATA 10 #define CB_UNLOCK_CLIPDATA 11 #define CB_PDUTYPE_TO_STR(pdu_type) \ ((pdu_type) == CB_MONITOR_READY ? "CB_MONITOR_READY" : \ (pdu_type) == CB_FORMAT_LIST ? "CB_FORMAT_LIST" : \ (pdu_type) == CB_FORMAT_LIST_RESPONSE ? "CB_FORMAT_LIST_RESPONSE" : \ (pdu_type) == CB_FORMAT_DATA_REQUEST ? "CB_FORMAT_DATA_REQUEST" : \ (pdu_type) == CB_FORMAT_DATA_RESPONSE ? "CB_FORMAT_DATA_RESPONSE" : \ (pdu_type) == CB_TEMP_DIRECTORY ? "CB_TEMP_DIRECTORY" : \ (pdu_type) == CB_CLIP_CAPS ? "CB_CLIP_CAPS" : \ (pdu_type) == CB_FILECONTENTS_REQUEST ? "CB_FILECONTENTS_REQUEST" : \ (pdu_type) == CB_FILECONTENTS_RESPONSE ? "CB_FILECONTENTS_RESPONSE" : \ (pdu_type) == CB_LOCK_CLIPDATA ? "CB_LOCK_CLIPDATA" : \ (pdu_type) == CB_UNLOCK_CLIPDATA ? "CB_UNLOCK_CLIPDATA" : \ "unknown" \ ) /* Clipboard PDU header message flags 2.2.1 */ #define CB_RESPONSE_OK 0x0001 #define CB_RESPONSE_FAIL 0x0002 #define CB_ASCII_NAMES 0x0004 /* Capability set codes 2.2.2.1.1 */ #define CB_CAPSTYPE_GENERAL 1 #define CB_CAPS_VERSION_1 1 #define CB_CAPS_VERSION_2 2 /* General capability set general flags 2.2.2.1.1.1 */ #define CB_USE_LONG_FORMAT_NAMES 0x00000002 #define CB_STREAM_FILECLIP_ENABLED 0x00000004 #define CB_FILECLIP_NO_FILE_PATHS 0x00000008 #define CB_CAN_LOCK_CLIPDATA 0x00000010 /* File contents request PDU 2.2.5.3 */ /* Note that in the document these do not have a CB_ prefix */ #define CB_FILECONTENTS_SIZE 0x00000001 #define CB_FILECONTENTS_RANGE 0x00000002 /* File descriptor structure flags 2.2.5.2.3.1 */ /* Note that in the document these do not have a CB_ prefix */ #define CB_FD_ATTRIBUTES 0x00000004 #define CB_FD_FILESIZE 0x00000040 #define CB_FD_WRITESTIME 0x00000020 #define CB_FD_PROGRESSUI 0x00004000 /* File descriptor structure file attributes 2.2.5.2.3.1 */ /* Note that in the document these do not have a CB_ prefix */ #define CB_FILE_ATTRIBUTE_READONLY 0x00000001 #define CB_FILE_ATTRIBUTE_HIDDEN 0x00000002 #define CB_FILE_ATTRIBUTE_SYSTEM 0x00000004 #define CB_FILE_ATTRIBUTE_DIRECTORY 0x00000010 #define CB_FILE_ATTRIBUTE_ARCHIVE 0x00000020 #define CB_FILE_ATTRIBUTE_NORMAL 0x00000080 #endif /* MS_RDPECLIP_H */ ================================================ FILE: common/ms-rdpedisp.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * MS-RDPEDISP : Definitions from [MS-RDPEDISP] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * References to MS-RDPEDISP are currently correct for v20201030 of that * document */ #if !defined(MS_RDPEDISP_H) #define MS_RDPEDISP_H /* Display Control Messages: Display Virtual Channel Extension (2.2.2) */ #define DISPLAYCONTROL_PDU_TYPE_MONITOR_LAYOUT 0x00000002 #define DISPLAYCONTROL_PDU_TYPE_CAPS 0x00000005 /* Display Control Monitor Layout (2.2.2.2.1) */ #define DISPLAYCONTROL_MONITOR_PRIMARY 0x00000001 #define CLIENT_MONITOR_DATA_MINIMUM_VIRTUAL_MONITOR_WIDTH 0xC8 #define CLIENT_MONITOR_DATA_MINIMUM_VIRTUAL_MONITOR_HEIGHT 0xC8 #define CLIENT_MONITOR_DATA_MAXIMUM_VIRTUAL_MONITOR_WIDTH 0x2000 #define CLIENT_MONITOR_DATA_MAXIMUM_VIRTUAL_MONITOR_HEIGHT 0x2000 #define ORIENTATION_LANDSCAPE 0 #define ORIENTATION_PORTRAIT 90 #define ORIENTATION_LANDSCAPE_FLIPPED 180 #define ORIENTATION_PORTRAIT_FLIPPED 270 /* Display Control Monitor Layout (2.2.2.2.1) */ #define DISPLAYCONTROL_MONITOR_PRIMARY 0x00000001 #endif /* MS_RDPEDISP_H */ ================================================ FILE: common/ms-rdpefs.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * MS-RDPEFS : Definitions from [MS-RDPEFS] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * References to MS-RDPEFS are currently correct for v20180912 of that * document */ #if !defined(MS_RDPEFS_H) #define MS_RDPEFS_H /* * RDPDR_HEADER definitions (2.2.1.1) */ /* device redirector core component; most of the packets in this protocol */ /* are sent under this component ID */ #define RDPDR_CTYP_CORE 0x4472 /* printing component. the packets that use this ID are typically about */ /* printer cache management and identifying XPS printers */ #define RDPDR_CTYP_PRN 0x5052 /* Server Announce Request, as specified in section 2.2.2.2 */ #define PAKID_CORE_SERVER_ANNOUNCE 0x496E /* Client Announce Reply and Server Client ID Confirm, as specified in */ /* sections 2.2.2.3 and 2.2.2.6. */ #define PAKID_CORE_CLIENTID_CONFIRM 0x4343 /* Client Name Request, as specified in section 2.2.2.4 */ #define PAKID_CORE_CLIENT_NAME 0x434E /* Client Device List Announce Request, as specified in section 2.2.2.9 */ #define PAKID_CORE_DEVICELIST_ANNOUNCE 0x4441 /* Server Device Announce Response, as specified in section 2.2.2.1 */ #define PAKID_CORE_DEVICE_REPLY 0x6472 /* Device I/O Request, as specified in section 2.2.1.4 */ #define PAKID_CORE_DEVICE_IOREQUEST 0x4952 /* Device I/O Response, as specified in section 2.2.1.5 */ #define PAKID_CORE_DEVICE_IOCOMPLETION 0x4943 /* Server Core Capability Request, as specified in section 2.2.2.7 */ #define PAKID_CORE_SERVER_CAPABILITY 0x5350 /* Client Core Capability Response, as specified in section 2.2.2.8 */ #define PAKID_CORE_CLIENT_CAPABILITY 0x4350 /* Client Drive Device List Remove, as specified in section 2.2.3.2 */ #define PAKID_CORE_DEVICELIST_REMOVE 0x444D /* Add Printer Cachedata, as specified in [MS-RDPEPC] section 2.2.2.3 */ #define PAKID_PRN_CACHE_DATA 0x5043 /* Server User Logged On, as specified in section 2.2.2.5 */ #define PAKID_CORE_USER_LOGGEDON 0x554C /* Server Printer Set XPS Mode, as specified in [MS-RDPEPC] section 2.2.2.2 */ #define PAKID_PRN_USING_XPS 0x5543 /* * Capability header definitions (2.2.1.2) */ #define CAP_GENERAL_TYPE 0x0001 /* General cap set - GENERAL_CAPS_SET */ #define CAP_PRINTER_TYPE 0x0002 /* Print cap set - PRINTER_CAPS_SET */ #define CAP_PORT_TYPE 0x0003 /* Port cap set - PORT_CAPS_SET */ #define CAP_DRIVE_TYPE 0x0004 /* Drive cap set - DRIVE_CAPS_SET */ #define CAP_SMARTCARD_TYPE 0x0005 /* Smart card cap set - SMARTCARD_CAPS_SET */ /* * Device announce header (2.2.1.3) */ #define RDPDR_DTYP_SERIAL 0x0001 #define RDPDR_DTYP_PARALLEL 0x0002 #define RDPDR_DTYP_PRINT 0x0004 #define RDPDR_DTYP_FILESYSTEM 0x0008 #define RDPDR_DTYP_SMARTCARD 0x0020 /* Device I/O Request definitions (2.2.1.4) */ /* MajorFunction */ enum IRP_MJ { IRP_MJ_CREATE = 0x00000000, IRP_MJ_CLOSE = 0x00000002, IRP_MJ_READ = 0x00000003, IRP_MJ_WRITE = 0x00000004, IRP_MJ_DEVICE_CONTROL = 0x0000000E, IRP_MJ_QUERY_VOLUME_INFORMATION = 0x0000000A, IRP_MJ_SET_VOLUME_INFORMATION = 0x0000000B, IRP_MJ_QUERY_INFORMATION = 0x00000005, IRP_MJ_SET_INFORMATION = 0x00000006, IRP_MJ_DIRECTORY_CONTROL = 0x0000000C, IRP_MJ_LOCK_CONTROL = 0x00000011 }; /* MinorFunction */ /* Set to zero unless MajorFunction code == IRP_MJ_DIRECTORY_CONTROL */ enum IRP_MN { IRP_MN_NONE = 0x00000000, /* Name not in MS docs */ IRP_MN_QUERY_DIRECTORY = 0x00000001, IRP_MN_NOTIFY_CHANGE_DIRECTORY = 0x00000002 }; /* * General Capability Set (2.2.2.7.1) */ /* extendedPDU fields */ #define RDPDR_USER_LOGGEDON_PDU 0x00000004 #endif /* MS_RDPEFS_H */ ================================================ FILE: common/ms-rdpegdi.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * MS-RDPEGDI : Definitions from [MS-RDPEGDI] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * References to MS-RDPEGDI are currently correct for v20180912 of that * document */ #if !defined(MS_RDPEGDI_H) #define MS_RDPEGDI_H /* Drawing Order: controlFlags (2.2.2.2.1, 2.2.2.2.1.1.2) */ #define TS_STANDARD 0x01 #define TS_SECONDARY 0x02 #define TS_BOUNDS 0x04 #define TS_TYPE_CHANGE 0x08 #define TS_DELTA_COORDINATES 0x10 #define TS_ZERO_BOUNDS_DELTAS 0x20 #define TS_ZERO_FIELD_BYTE_BIT0 0x40 #define TS_ZERO_FIELD_BYTE_BIT1 0x80 /* Drawing Order: orderType (2.2.2.2.1.1.2) */ /* Should be renamed */ #define RDP_ORDER_DESTBLT 0 /* TS_ENC_DSTBLT_ORDER */ #define RDP_ORDER_PATBLT 1 #define RDP_ORDER_SCREENBLT 2 #define RDP_ORDER_LINE 9 #define RDP_ORDER_RECT 10 #define RDP_ORDER_DESKSAVE 11 #define RDP_ORDER_MEMBLT 13 #define RDP_ORDER_TRIBLT 14 #define RDP_ORDER_POLYLINE 22 #define RDP_ORDER_TEXT2 27 #define RDP_ORDER_COMPOSITE 37 /* 0x25 - not defined in RDPEGDI */ /* Secondary Drawing Order Header: orderType (2.2.2.2.1.2.1.1) */ #define TS_CACHE_BITMAP_UNCOMPRESSED 0x00 #define TS_CACHE_COLOR_TABLE 0x01 #define TS_CACHE_BITMAP_COMPRESSED 0x02 #define TS_CACHE_GLYPH 0x03 #define TS_CACHE_BITMAP_UNCOMPRESSED_REV2 0x04 #define TS_CACHE_BITMAP_COMPRESSED_REV2 0x05 #define TS_CACHE_BRUSH 0x07 #define TS_CACHE_BITMAP_COMPRESSED_REV3 0x08 #endif /* MS_RDPEGDI_H */ ================================================ FILE: common/ms-rdpele.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * MS-RDPELE : Definitions from [MS-RDPELE] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * References to MS-RDPELE are currently correct for v20180912 of that * document */ #if !defined(MS_RDPELE_H) #define MS_RDPELE_H /* LicensingMessage (MS-RDPELE 2.2.2) */ /* TODO: to be renamed */ #define LICENCE_TAG_DEMAND 0x01 /* LICENSE_REQUEST */ #define LICENCE_TAG_AUTHREQ 0x02 /* PLATFORM_CHALLENGE */ #define LICENCE_TAG_ISSUE 0x03 /* NEW_LICENSE */ #define LICENCE_TAG_REISSUE 0x04 /* UPGRADE_LICENSE */ #define LICENCE_TAG_PRESENT 0x12 /* LICENSE_INFO */ #define LICENCE_TAG_REQUEST 0x13 /* NEW_LICENSE_REQUEST */ #define LICENCE_TAG_AUTHRESP 0x15 /* PLATFORM_CHALLENGE_RESPONSE */ #define LICENCE_TAG_RESULT 0xff #endif /* MS_RDPELE_H */ ================================================ FILE: common/ms-rdperp.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * MS-RDPERP : Definitions from [MS-RDPERP] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * References to MS-RDPERP are currently correct for v20190923 of that * document */ #if !defined(MS_RDPERP_H) #define MS_RDPERP_H /* Window List Capability Set: WndSupportLevel (2.2.1.1.2) */ #define TS_WINDOW_LEVEL_NOT_SUPPORTED 0x00000000 #define TS_WINDOW_LEVEL_SUPPORTED 0x00000001 #define TS_WINDOW_LEVEL_SUPPORTED_EX 0x00000002 #endif /* MS_RDPERP_H */ ================================================ FILE: common/ms-smb2.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * MS-SMB2 : Definitions from [MS-SMB2] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * References to MS-SMB2 are currently correct for v20190923 of that * document */ #if !defined(MS_SMB2_H) #define MS_SMB2_H /* SMB2 CREATE request values (section 2.2.13) */ /* * ShareAccess Mask. Currently, this is referred * to in MS-RDPEFS 2.2.1.4.1 as 'SharedAccess' rather than 'ShareAccess'. */ #define SA_FILE_SHARE_READ 0x00000001 #define SA_FILE_SHARE_WRITE 0x00000002 #define SA_FILE_SHARE_DELETE 0x00000004 /* CreateDisposition Mask */ #define CD_FILE_SUPERSEDE 0x00000000 #define CD_FILE_OPEN 0x00000001 #define CD_FILE_CREATE 0x00000002 #define CD_FILE_OPEN_IF 0x00000003 #define CD_FILE_OVERWRITE 0x00000004 #define CD_FILE_OVERWRITE_IF 0x00000005 /* CreateOptions Mask */ enum CREATE_OPTIONS { CO_FILE_DIRECTORY_FILE = 0x00000001, CO_FILE_WRITE_THROUGH = 0x00000002, CO_FILE_SYNCHRONOUS_IO_NONALERT = 0x00000020, CO_FILE_DELETE_ON_CLOSE = 0x00001000 }; /* * DesiredAccess Mask (section 2.2.13.1.1) */ #define DA_FILE_READ_DATA 0x00000001 #define DA_FILE_WRITE_DATA 0x00000002 #define DA_FILE_APPEND_DATA 0x00000004 #define DA_FILE_READ_EA 0x00000008 /* rd extended attributes */ #define DA_FILE_WRITE_EA 0x00000010 /* wr extended attributes */ #define DA_FILE_EXECUTE 0x00000020 #define DA_FILE_READ_ATTRIBUTES 0x00000080 #define DA_FILE_WRITE_ATTRIBUTES 0x00000100 #define DA_DELETE 0x00010000 #define DA_READ_CONTROL 0x00020000 /* rd security descriptor */ #define DA_WRITE_DAC 0x00040000 #define DA_WRITE_OWNER 0x00080000 #define DA_SYNCHRONIZE 0x00100000 #define DA_ACCESS_SYSTEM_SECURITY 0x01000000 #define DA_MAXIMUM_ALLOWED 0x02000000 #define DA_GENERIC_ALL 0x10000000 #define DA_GENERIC_EXECUTE 0x20000000 #define DA_GENERIC_WRITE 0x40000000 #define DA_GENERIC_READ 0x80000000 #endif /* MS_SMB2_H */ ================================================ FILE: common/os_calls.c ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * generic operating system calls * * put all the os / arch define in here you want */ /* To test for Windows (64 bit or 32 bit) use _WIN32 and _WIN64 in addition for 64 bit windows. _WIN32 is defined for both. To test for Linux use __linux__. To test for BSD use BSD */ #if defined(HAVE_CONFIG_H) #include "config_ac.h" #endif #if defined(_WIN32) #include #include #else /* fix for solaris 10 with gcc 3.3.2 problem */ #if defined(sun) || defined(__sun) #define ctid_t id_t #endif #include #include #include #include #include #include #if defined(XRDP_ENABLE_VSOCK) #if defined(__linux__) #include #elif defined(__FreeBSD__) // sockaddr_hvs is not available outside the kernel for whatever reason struct sockaddr_hvs { unsigned char sa_len; sa_family_t sa_family; unsigned int hvs_port; unsigned char hvs_zero[sizeof(struct sockaddr) - sizeof(sa_family_t) - sizeof(unsigned char) - sizeof(unsigned int)]; }; #endif #endif #include #include #include #include #include #include #include #include #include #if defined(HAVE_SYS_PRCTL_H) #include #endif #include #include #include #include #include #include #include #include #include #endif #ifdef HAVE_SETUSERCONTEXT #include #endif #include #include #include #include #include /* this is so we can use #ifdef BSD later */ /* This is the recommended way of detecting BSD in the FreeBSD Porter's Handbook. */ #if (defined(__unix__) || defined(unix)) && !defined(USG) #include #endif #include "os_calls.h" #include #include "string_calls.h" #include "log.h" #include "xrdp_constants.h" #if defined(__linux__) #include #endif /* sys/ucred.h needs to be included to use struct xucred * in FreeBSD and OS X. No need for other BSDs except GNU/kFreeBSD */ #if defined(__FreeBSD__) || defined(__APPLE__) || defined(__FreeBSD_kernel__) #include #endif /* for solaris */ #if !defined(PF_LOCAL) #define PF_LOCAL AF_UNIX #endif #if !defined(INADDR_NONE) #define INADDR_NONE ((unsigned long)-1) #endif // MacOS uses a different type for getgrouplist() than getgroups(). This // appears to be the only platform which does this. #ifdef __APPLE__ # define GETGROUPLIST_T int #else # define GETGROUPLIST_T GETGROUPS_T #endif /** * Type big enough to hold socket address information for any connecting type */ union sock_info { struct sockaddr sa; struct sockaddr_in sa_in; #if defined(XRDP_ENABLE_IPV6) struct sockaddr_in6 sa_in6; #endif struct sockaddr_un sa_un; #if defined(XRDP_ENABLE_VSOCK) #if defined(__linux__) struct sockaddr_vm sa_vm; #elif defined(__FreeBSD__) struct sockaddr_hvs sa_hvs; #endif #endif }; /******************************************************************************/ static oom_type g_out_of_memory_handler; /*****************************************************************************/ int g_rm_temp_dir(void) { return 0; } /*****************************************************************************/ void g_init(const char *app_name) { #if defined(_WIN32) WSADATA wsadata; WSAStartup(2, &wsadata); #endif #if defined(XRDP_NVENC) if (g_strcmp(app_name, "xrdp-sesman") == 0) { /* call cuInit() to initalize the nvidia drivers */ /* TODO create an issue on nvidia forums to figure out why we need to * do this */ if (g_fork() == 0) { typedef int (*cu_init_proc)(int flags); cu_init_proc cu_init; long lib; char cuda_lib_name[] = "libcuda.so"; char cuda_func_name[] = "cuInit"; lib = g_load_library(cuda_lib_name); if (lib != 0) { cu_init = (cu_init_proc) g_get_proc_address(lib, cuda_func_name); if (cu_init != NULL) { cu_init(0); } } log_end(); g_deinit(); g_exit(0); } } #endif } /*****************************************************************************/ void g_deinit(void) { #if defined(_WIN32) WSACleanup(); #endif fflush(stdout); fflush(stderr); g_rm_temp_dir(); } /*****************************************************************************/ /* output text to stdout, try to use g_write / g_writeln instead to avoid linux / windows EOL problems */ void g_printf(const char *format, ...) { va_list ap; va_start(ap, format); vfprintf(stdout, format, ap); va_end(ap); } /*****************************************************************************/ void g_sprintf(char *dest, const char *format, ...) { va_list ap; va_start(ap, format); vsprintf(dest, format, ap); va_end(ap); } /*****************************************************************************/ int g_snprintf(char *dest, int len, const char *format, ...) { int err; va_list ap; va_start(ap, format); err = vsnprintf(dest, len, format, ap); va_end(ap); return err; } /*****************************************************************************/ void g_writeln(const char *format, ...) { va_list ap; va_start(ap, format); vfprintf(stdout, format, ap); va_end(ap); #if defined(_WIN32) g_printf("\r\n"); #else g_printf("\n"); #endif } /*****************************************************************************/ void g_write(const char *format, ...) { va_list ap; va_start(ap, format); vfprintf(stdout, format, ap); va_end(ap); } /*****************************************************************************/ /* print a hex dump to stdout*/ void g_hexdump(const char *p, int len) { unsigned char *line; int i; int thisline; int offset; line = (unsigned char *)p; offset = 0; while (offset < len) { g_printf("%04x ", offset); thisline = len - offset; if (thisline > 16) { thisline = 16; } for (i = 0; i < thisline; i++) { g_printf("%02x ", line[i]); } for (; i < 16; i++) { g_printf(" "); } for (i = 0; i < thisline; i++) { g_printf("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.'); } g_writeln("%s", ""); offset += thisline; line += thisline; } } /*****************************************************************************/ int g_getchar(void) { return getchar(); } /*****************************************************************************/ /*Returns 0 on success*/ int g_tcp_set_no_delay(int sck) { int ret = 1; /* error */ int option_value; socklen_t option_len; option_len = sizeof(option_value); /* SOL_TCP IPPROTO_TCP */ if (getsockopt(sck, IPPROTO_TCP, TCP_NODELAY, (char *)&option_value, &option_len) == 0) { if (option_value == 0) { option_value = 1; option_len = sizeof(option_value); if (setsockopt(sck, IPPROTO_TCP, TCP_NODELAY, (char *)&option_value, option_len) == 0) { ret = 0; /* success */ } else { LOG(LOG_LEVEL_ERROR, "Error setting tcp_nodelay"); } } } else { LOG(LOG_LEVEL_ERROR, "Error getting tcp_nodelay"); } return ret; } /*****************************************************************************/ /*Returns 0 on success*/ int g_tcp_set_keepalive(int sck) { int ret = 1; /* error */ int option_value; socklen_t option_len; option_len = sizeof(option_value); /* SOL_TCP IPPROTO_TCP */ if (getsockopt(sck, SOL_SOCKET, SO_KEEPALIVE, (char *)&option_value, &option_len) == 0) { if (option_value == 0) { option_value = 1; option_len = sizeof(option_value); if (setsockopt(sck, SOL_SOCKET, SO_KEEPALIVE, (char *)&option_value, option_len) == 0) { ret = 0; /* success */ } else { LOG(LOG_LEVEL_ERROR, "Error setting tcp_keepalive"); } } } else { LOG(LOG_LEVEL_ERROR, "Error getting tcp_keepalive"); } return ret; } /*****************************************************************************/ /* returns a newly created socket or -1 on error */ /* in win32 a socket is an unsigned int, in linux, it's an int */ int g_tcp_socket(void) { int rv; #if defined(XRDP_ENABLE_IPV6) rv = (int)socket(AF_INET6, SOCK_STREAM, 0); if (rv < 0) { switch (errno) { case EPROTONOSUPPORT: /* if IPv6 is supported, but don't have an IPv6 address */ case EAFNOSUPPORT: /* if IPv6 not supported, retry IPv4 */ LOG(LOG_LEVEL_INFO, "IPv6 not supported, falling back to IPv4"); rv = (int)socket(AF_INET, SOCK_STREAM, 0); break; default: LOG(LOG_LEVEL_ERROR, "g_tcp_socket: %s", g_get_strerror()); return -1; } } #else rv = (int)socket(AF_INET, SOCK_STREAM, 0); #endif if (rv < 0) { LOG(LOG_LEVEL_ERROR, "g_tcp_socket: %s", g_get_strerror()); return -1; } #if defined(XRDP_ENABLE_IPV6) int option_value; socklen_t option_len = sizeof(option_value); if (getsockopt(rv, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&option_value, &option_len) == 0) { if (option_value != 0) { #if defined(XRDP_ENABLE_IPV6ONLY) option_value = 1; #else option_value = 0; #endif option_len = sizeof(option_value); if (setsockopt(rv, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&option_value, option_len) < 0) { LOG(LOG_LEVEL_ERROR, "g_tcp_socket: setsockopt() failed"); } } } #endif return rv; } /*****************************************************************************/ /* returns error */ int g_sck_set_send_buffer_bytes(int sck, int bytes) { int option_value; socklen_t option_len; option_value = bytes; option_len = sizeof(option_value); if (setsockopt(sck, SOL_SOCKET, SO_SNDBUF, (char *)&option_value, option_len) != 0) { return 1; } return 0; } /*****************************************************************************/ /* returns error */ int g_sck_get_send_buffer_bytes(int sck, int *bytes) { int option_value; socklen_t option_len; option_value = 0; option_len = sizeof(option_value); if (getsockopt(sck, SOL_SOCKET, SO_SNDBUF, (char *)&option_value, &option_len) != 0) { return 1; } *bytes = option_value; return 0; } /*****************************************************************************/ /* returns error */ int g_sck_set_recv_buffer_bytes(int sck, int bytes) { int option_value; socklen_t option_len; option_value = bytes; option_len = sizeof(option_value); if (setsockopt(sck, SOL_SOCKET, SO_RCVBUF, (char *)&option_value, option_len) != 0) { return 1; } return 0; } /*****************************************************************************/ /* returns error */ int g_sck_get_recv_buffer_bytes(int sck, int *bytes) { int option_value; socklen_t option_len; option_value = 0; option_len = sizeof(option_value); if (getsockopt(sck, SOL_SOCKET, SO_RCVBUF, (char *)&option_value, &option_len) != 0) { return 1; } *bytes = option_value; return 0; } /*****************************************************************************/ int g_sck_set_reuseaddr(int sck) { int rv; int option_value = 1; socklen_t option_len = sizeof(option_value); rv = setsockopt(sck, SOL_SOCKET, SO_REUSEADDR, (char *) &option_value, option_len); if (rv < 0) { LOG(LOG_LEVEL_ERROR, "g_sck_set_reuseaddr: %s", g_get_strerror()); } return rv; } /*****************************************************************************/ int g_sck_local_socket(void) { #if defined(_WIN32) return -1; #else return socket(PF_LOCAL, SOCK_STREAM, 0); #endif } /*****************************************************************************/ int g_sck_local_socketpair(int sck[2]) { #if defined(_WIN32) return -1; #else return socketpair(PF_LOCAL, SOCK_STREAM, 0, sck); #endif } /*****************************************************************************/ int g_sck_vsock_socket(void) { #if defined(XRDP_ENABLE_VSOCK) #if defined(__linux__) LOG(LOG_LEVEL_DEBUG, "g_sck_vsock_socket: returning Linux vsock socket"); return socket(PF_VSOCK, SOCK_STREAM, 0); #elif defined(__FreeBSD__) LOG(LOG_LEVEL_DEBUG, "g_sck_vsock_socket: returning FreeBSD Hyper-V socket"); return socket(AF_HYPERV, SOCK_STREAM, 0); // docs say to use AF_HYPERV here - PF_HYPERV does not exist #else LOG(LOG_LEVEL_DEBUG, "g_sck_vsock_socket: vsock enabled at compile time, but platform is unsupported"); return -1; #endif #else LOG(LOG_LEVEL_DEBUG, "g_sck_vsock_socket: vsock disabled at compile time"); return -1; #endif } /*****************************************************************************/ /* returns error */ int g_sck_get_peer_cred(int sck, int *pid, int *uid, int *gid) { #if defined(SO_PEERCRED) socklen_t ucred_length; struct myucred { pid_t pid; uid_t uid; gid_t gid; } credentials; ucred_length = sizeof(credentials); if (getsockopt(sck, SOL_SOCKET, SO_PEERCRED, &credentials, &ucred_length)) { return 1; } if (pid != 0) { *pid = credentials.pid; } if (uid != 0) { *uid = credentials.uid; } if (gid != 0) { *gid = credentials.gid; } return 0; #elif defined(LOCAL_PEERCRED) /* FreeBSD, OS X reach here*/ struct xucred xucred; unsigned int xucred_length; xucred_length = sizeof(xucred); if (getsockopt(sck, SOL_LOCAL, LOCAL_PEERCRED, &xucred, &xucred_length)) { return 1; } if (pid != 0) { *pid = 0; /* can't get pid in FreeBSD, OS X */ } if (uid != 0) { *uid = xucred.cr_uid; } if (gid != 0) { *gid = xucred.cr_gid; } return 0; #else return 1; #endif } /*****************************************************************************/ static const char * get_peer_description(const union sock_info *sock_info, char *desc, unsigned int bytes) { if (bytes > 0) { int family = sock_info->sa.sa_family; switch (family) { case AF_INET: { char ip[INET_ADDRSTRLEN]; const struct sockaddr_in *sa_in = &sock_info->sa_in; if (inet_ntop(family, &sa_in->sin_addr, ip, sizeof(ip)) != NULL) { g_snprintf(desc, bytes, "%s:%d", ip, ntohs(sa_in->sin_port)); } else { g_snprintf(desc, bytes, ":%d", ntohs(sa_in->sin_port)); } break; } #if defined(XRDP_ENABLE_IPV6) case AF_INET6: { char ip[INET6_ADDRSTRLEN]; const struct sockaddr_in6 *sa_in6 = &sock_info->sa_in6; if (inet_ntop(family, &sa_in6->sin6_addr, ip, sizeof(ip)) != NULL) { g_snprintf(desc, bytes, "[%s]:%d", ip, ntohs(sa_in6->sin6_port)); } else { g_snprintf(desc, bytes, "[]:%d", ntohs(sa_in6->sin6_port)); } break; } #endif case AF_UNIX: { g_snprintf(desc, bytes, "AF_UNIX"); break; } #if defined(XRDP_ENABLE_VSOCK) #if defined(__linux__) case AF_VSOCK: { const struct sockaddr_vm *sa_vm = &sock_info->sa_vm; g_snprintf(desc, bytes, "AF_VSOCK:cid=%u/port=%u", sa_vm->svm_cid, sa_vm->svm_port); break; } #elif defined(__FreeBSD__) case AF_HYPERV: { const struct sockaddr_hvs *sa_hvs = &sock_info->sa_hvs; g_snprintf(desc, bytes, "AF_HYPERV:port=%u", sa_hvs->hvs_port); break; } #endif #endif default: g_snprintf(desc, bytes, "Unknown address family %d", family); break; } } return desc; } /*****************************************************************************/ void g_sck_close(int sck) { #if defined(_WIN32) closesocket(sck); #else char sockname[MAX_PEER_DESCSTRLEN]; union sock_info sock_info; socklen_t sock_len = sizeof(sock_info); memset(&sock_info, 0, sizeof(sock_info)); if (getsockname(sck, &sock_info.sa, &sock_len) == 0) { get_peer_description(&sock_info, sockname, sizeof(sockname)); } else { LOG(LOG_LEVEL_WARNING, "getsockname() failed on socket %d: %s", sck, g_get_strerror()); if (errno == EBADF || errno == ENOTSOCK) { return; } g_snprintf(sockname, sizeof(sockname), "unknown"); } if (close(sck) == 0) { LOG(LOG_LEVEL_DEBUG, "Closed socket %d (%s)", sck, sockname); } else { LOG(LOG_LEVEL_WARNING, "Cannot close socket %d (%s): %s", sck, sockname, g_get_strerror()); } #endif } #if defined(XRDP_ENABLE_IPV6) /*****************************************************************************/ /* Helper function for g_tcp_connect. */ static int connect_loopback(int sck, const char *port) { struct sockaddr_in6 sa; struct sockaddr_in s; int res; // First IPv6 g_memset(&sa, 0, sizeof(sa)); sa.sin6_family = AF_INET6; sa.sin6_addr = in6addr_loopback; // IPv6 ::1 sa.sin6_port = htons((tui16)atoi(port)); res = connect(sck, (struct sockaddr *)&sa, sizeof(sa)); if (res == -1 && errno == EINPROGRESS) { return -1; } if (res == 0 || (res == -1 && errno == EISCONN)) { return 0; } // else IPv4 g_memset(&s, 0, sizeof(s)); s.sin_family = AF_INET; s.sin_addr.s_addr = htonl(INADDR_LOOPBACK); // IPv4 127.0.0.1 s.sin_port = htons((tui16)atoi(port)); res = connect(sck, (struct sockaddr *)&s, sizeof(s)); if (res == -1 && errno == EINPROGRESS) { return -1; } if (res == 0 || (res == -1 && errno == EISCONN)) { return 0; } // else IPv6 with IPv4 address g_memset(&sa, 0, sizeof(sa)); sa.sin6_family = AF_INET6; inet_pton(AF_INET6, "::FFFF:127.0.0.1", &sa.sin6_addr); sa.sin6_port = htons((tui16)atoi(port)); res = connect(sck, (struct sockaddr *)&sa, sizeof(sa)); if (res == -1 && errno == EINPROGRESS) { return -1; } if (res == 0 || (res == -1 && errno == EISCONN)) { return 0; } return -1; } #endif /*****************************************************************************/ /* returns error, zero is good */ /* The connection might get to be in progress, if so -1 is returned. */ /* The caller needs to call again to check if succeed. */ #if defined(XRDP_ENABLE_IPV6) int g_tcp_connect(int sck, const char *address, const char *port) { int res = 0; struct addrinfo p; struct addrinfo *h = (struct addrinfo *)NULL; struct addrinfo *rp = (struct addrinfo *)NULL; g_memset(&p, 0, sizeof(struct addrinfo)); p.ai_socktype = SOCK_STREAM; p.ai_protocol = IPPROTO_TCP; p.ai_flags = AI_ADDRCONFIG | AI_V4MAPPED; p.ai_family = AF_INET6; if (g_strcmp(address, "127.0.0.1") == 0) { return connect_loopback(sck, port); } else { res = getaddrinfo(address, port, &p, &h); } if (res != 0) { LOG(LOG_LEVEL_ERROR, "g_tcp_connect(%d, %s, %s): getaddrinfo() failed: %s", sck, address, port, gai_strerror(res)); } if (res > -1) { if (h != NULL) { for (rp = h; rp != NULL; rp = rp->ai_next) { res = connect(sck, (struct sockaddr *)(rp->ai_addr), rp->ai_addrlen); if (res == -1 && errno == EINPROGRESS) { break; /* Return -1 */ } if (res == 0 || (res == -1 && errno == EISCONN)) { res = 0; break; /* Success */ } } freeaddrinfo(h); } } return res; } #else int g_tcp_connect(int sck, const char *address, const char *port) { struct sockaddr_in s; struct hostent *h; int res; g_memset(&s, 0, sizeof(struct sockaddr_in)); s.sin_family = AF_INET; s.sin_port = htons((tui16)atoi(port)); s.sin_addr.s_addr = inet_addr(address); if (s.sin_addr.s_addr == INADDR_NONE) { h = gethostbyname(address); if (h != 0) { if (h->h_name != 0) { if (h->h_addr_list != 0) { if ((*(h->h_addr_list)) != 0) { s.sin_addr.s_addr = *((int *)(*(h->h_addr_list))); } } } } } res = connect(sck, (struct sockaddr *)&s, sizeof(struct sockaddr_in)); /* Mac OSX connect() returns -1 for already established connections */ if (res == -1 && errno == EISCONN) { res = 0; } return res; } #endif /*****************************************************************************/ /* returns error, zero is good */ int g_sck_local_connect(int sck, const char *port) { #if defined(_WIN32) return -1; #else struct sockaddr_un s; memset(&s, 0, sizeof(struct sockaddr_un)); s.sun_family = AF_UNIX; strncpy(s.sun_path, port, sizeof(s.sun_path)); s.sun_path[sizeof(s.sun_path) - 1] = 0; return connect(sck, (struct sockaddr *)&s, sizeof(struct sockaddr_un)); #endif } /*****************************************************************************/ int g_sck_set_non_blocking(int sck) { unsigned long i; #if defined(_WIN32) i = 1; ioctlsocket(sck, FIONBIO, &i); #else i = fcntl(sck, F_GETFL); i = i | O_NONBLOCK; if (fcntl(sck, F_SETFL, i) < 0) { LOG(LOG_LEVEL_ERROR, "g_sck_set_non_blocking: fcntl() failed"); } #endif return 0; } #if defined(XRDP_ENABLE_IPV6) /*****************************************************************************/ /* returns error, zero is good */ int g_tcp_bind(int sck, const char *port) { struct sockaddr_in6 sa; struct sockaddr_in s; int errno6; // First IPv6 g_memset(&sa, 0, sizeof(sa)); sa.sin6_family = AF_INET6; sa.sin6_addr = in6addr_any; // IPv6 :: sa.sin6_port = htons((tui16)atoi(port)); if (bind(sck, (struct sockaddr *)&sa, sizeof(sa)) == 0) { return 0; } errno6 = errno; // else IPv4 g_memset(&s, 0, sizeof(s)); s.sin_family = AF_INET; s.sin_addr.s_addr = htonl(INADDR_ANY); // IPv4 0.0.0.0 s.sin_port = htons((tui16)atoi(port)); if (bind(sck, (struct sockaddr *)&s, sizeof(s)) == 0) { return 0; } LOG(LOG_LEVEL_ERROR, "g_tcp_bind(%d, %s) failed " "bind IPv6 (errno=%d) and IPv4 (errno=%d).", sck, port, errno6, errno); return -1; } #else int g_tcp_bind(int sck, const char *port) { struct sockaddr_in s; memset(&s, 0, sizeof(struct sockaddr_in)); s.sin_family = AF_INET; s.sin_port = htons((tui16)atoi(port)); s.sin_addr.s_addr = INADDR_ANY; return bind(sck, (struct sockaddr *)&s, sizeof(struct sockaddr_in)); } #endif /*****************************************************************************/ int g_sck_local_bind(int sck, const char *port) { #if defined(_WIN32) return -1; #else struct sockaddr_un s; memset(&s, 0, sizeof(struct sockaddr_un)); s.sun_family = AF_UNIX; strncpy(s.sun_path, port, sizeof(s.sun_path)); s.sun_path[sizeof(s.sun_path) - 1] = 0; return bind(sck, (struct sockaddr *)&s, sizeof(struct sockaddr_un)); #endif } /*****************************************************************************/ int g_sck_vsock_bind(int sck, const char *port) { #if defined(XRDP_ENABLE_VSOCK) #if defined(__linux__) struct sockaddr_vm s; g_memset(&s, 0, sizeof(struct sockaddr_vm)); s.svm_family = AF_VSOCK; s.svm_port = atoi(port); s.svm_cid = VMADDR_CID_ANY; return bind(sck, (struct sockaddr *)&s, sizeof(struct sockaddr_vm)); #elif defined(__FreeBSD__) struct sockaddr_hvs s; g_memset(&s, 0, sizeof(struct sockaddr_hvs)); s.sa_family = AF_HYPERV; s.hvs_port = atoi(port); return bind(sck, (struct sockaddr *)&s, sizeof(struct sockaddr_hvs)); #else return -1; #endif #else return -1; #endif } /*****************************************************************************/ int g_sck_vsock_bind_address(int sck, const char *port, const char *address) { #if defined(XRDP_ENABLE_VSOCK) #if defined(__linux__) struct sockaddr_vm s; g_memset(&s, 0, sizeof(struct sockaddr_vm)); s.svm_family = AF_VSOCK; s.svm_port = atoi(port); s.svm_cid = atoi(address); return bind(sck, (struct sockaddr *)&s, sizeof(struct sockaddr_vm)); #elif defined(__FreeBSD__) struct sockaddr_hvs s; g_memset(&s, 0, sizeof(struct sockaddr_hvs)); s.sa_family = AF_HYPERV; s.hvs_port = atoi(port); // channel/address currently unsupported in FreeBSD 13. return bind(sck, (struct sockaddr *)&s, sizeof(struct sockaddr_hvs)); #else return -1; #endif #else return -1; #endif } #if defined(XRDP_ENABLE_IPV6) /*****************************************************************************/ /* Helper function for g_tcp_bind_address. */ static int bind_loopback(int sck, const char *port) { struct sockaddr_in6 sa; struct sockaddr_in s; int errno6; int errno4; // First IPv6 g_memset(&sa, 0, sizeof(sa)); sa.sin6_family = AF_INET6; sa.sin6_addr = in6addr_loopback; // IPv6 ::1 sa.sin6_port = htons((tui16)atoi(port)); if (bind(sck, (struct sockaddr *)&sa, sizeof(sa)) == 0) { return 0; } errno6 = errno; // else IPv4 g_memset(&s, 0, sizeof(s)); s.sin_family = AF_INET; s.sin_addr.s_addr = htonl(INADDR_LOOPBACK); // IPv4 127.0.0.1 s.sin_port = htons((tui16)atoi(port)); if (bind(sck, (struct sockaddr *)&s, sizeof(s)) == 0) { return 0; } errno4 = errno; // else IPv6 with IPv4 address g_memset(&sa, 0, sizeof(sa)); sa.sin6_family = AF_INET6; inet_pton(AF_INET6, "::FFFF:127.0.0.1", &sa.sin6_addr); sa.sin6_port = htons((tui16)atoi(port)); if (bind(sck, (struct sockaddr *)&sa, sizeof(sa)) == 0) { return 0; } LOG(LOG_LEVEL_ERROR, "bind_loopback(%d, %s) failed; " "IPv6 ::1 (errno=%d), IPv4 127.0.0.1 (errno=%d) and IPv6 ::FFFF:127.0.0.1 (errno=%d).", sck, port, errno6, errno4, errno); return -1; } /*****************************************************************************/ /* Helper function for g_tcp_bind_address. */ /* Returns error, zero is good. */ static int getaddrinfo_bind(int sck, const char *port, const char *address) { int res; int error; struct addrinfo hints; struct addrinfo *list; struct addrinfo *i; res = -1; g_memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_flags = 0; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; error = getaddrinfo(address, port, &hints, &list); if (error == 0) { i = list; while ((i != 0) && (res < 0)) { res = bind(sck, i->ai_addr, i->ai_addrlen); i = i->ai_next; } freeaddrinfo(list); } else { LOG(LOG_LEVEL_ERROR, "getaddrinfo error: %s", gai_strerror(error)); return -1; } return res; } /*****************************************************************************/ /* Binds a socket to a port. If no specified address the port will be bind */ /* to 'any', i.e. available on all network. */ /* For bind to local host, see valid address strings below. */ /* Returns error, zero is good. */ int g_tcp_bind_address(int sck, const char *port, const char *address) { int res; if ((address == 0) || (address[0] == 0) || (g_strcmp(address, "0.0.0.0") == 0) || (g_strcmp(address, "::") == 0)) { return g_tcp_bind(sck, port); } if ((g_strcmp(address, "127.0.0.1") == 0) || (g_strcmp(address, "::1") == 0) || (g_strcmp(address, "localhost") == 0)) { return bind_loopback(sck, port); } // Let getaddrinfo translate the address string... // IPv4: ddd.ddd.ddd.ddd // IPv6: x:x:x:x:x:x:x:x%, or x::x:x:x:x% res = getaddrinfo_bind(sck, port, address); if (res != 0) { // If fail and it is an IPv4 address, try with the mapped address struct in_addr a; if ((inet_aton(address, &a) == 1) && (strlen(address) <= 15)) { char sz[7 + 15 + 1]; sprintf(sz, "::FFFF:%s", address); res = getaddrinfo_bind(sck, port, sz); if (res == 0) { return 0; } } LOG(LOG_LEVEL_ERROR, "g_tcp_bind_address(%d, %s, %s) Failed!", sck, port, address); return -1; } return 0; } #else int g_tcp_bind_address(int sck, const char *port, const char *address) { struct sockaddr_in s; memset(&s, 0, sizeof(struct sockaddr_in)); s.sin_family = AF_INET; s.sin_port = htons((tui16)atoi(port)); s.sin_addr.s_addr = INADDR_ANY; if (inet_aton(address, &s.sin_addr) < 0) { return -1; /* bad address */ } return bind(sck, (struct sockaddr *)&s, sizeof(struct sockaddr_in)); } #endif /*****************************************************************************/ /* returns error, zero is good */ int g_sck_listen(int sck) { return listen(sck, 2); } /*****************************************************************************/ int g_sck_accept(int sck) { int ret; union sock_info sock_info; socklen_t sock_len = sizeof(sock_info); memset(&sock_info, 0, sock_len); ret = accept(sck, (struct sockaddr *)&sock_info, &sock_len); if (ret > 0) { char description[MAX_PEER_DESCSTRLEN]; get_peer_description(&sock_info, description, sizeof(description)); LOG(LOG_LEVEL_INFO, "Socket %d: connection accepted from %s", ret, description); } return ret; } /*****************************************************************************/ const char * g_sck_get_peer_ip_address(int sck, char *ip, unsigned int bytes, unsigned short *port) { if (bytes > 0) { int ok = 0; union sock_info sock_info; socklen_t sock_len = sizeof(sock_info); memset(&sock_info, 0, sock_len); if (getpeername(sck, (struct sockaddr *)&sock_info, &sock_len) == 0) { int family = sock_info.sa.sa_family; switch (family) { case AF_INET: { struct sockaddr_in *sa_in = &sock_info.sa_in; if (inet_ntop(family, &sa_in->sin_addr, ip, bytes) != NULL) { ok = 1; if (port != NULL) { *port = ntohs(sa_in->sin_port); } } break; } #if defined(XRDP_ENABLE_IPV6) case AF_INET6: { struct sockaddr_in6 *sa_in6 = &sock_info.sa_in6; if (inet_ntop(family, &sa_in6->sin6_addr, ip, bytes) != NULL) { ok = 1; if (port != NULL) { *port = ntohs(sa_in6->sin6_port); } } break; } #endif default: break; } } if (!ok) { ip[0] = '\0'; } } return ip; } /*****************************************************************************/ const char * g_sck_get_peer_description(int sck, char *desc, unsigned int bytes) { union sock_info sock_info; socklen_t sock_len = sizeof(sock_info); memset(&sock_info, 0, sock_len); if (getpeername(sck, (struct sockaddr *)&sock_info, &sock_len) == 0) { get_peer_description(&sock_info, desc, bytes); } return desc; } /*****************************************************************************/ void g_sleep(int msecs) { #if defined(_WIN32) Sleep(msecs); #else usleep(msecs * 1000); #endif } /*****************************************************************************/ int g_pipe(int fd[2]) { return pipe(fd); } /*****************************************************************************/ int g_sck_last_error_would_block(int sck) { #if defined(_WIN32) return WSAGetLastError() == WSAEWOULDBLOCK; #else return (errno == EWOULDBLOCK) || (errno == EAGAIN) || (errno == EINPROGRESS); #endif } /*****************************************************************************/ int g_sck_recv(int sck, void *ptr, unsigned int len, int flags) { #if defined(_WIN32) return recv(sck, (char *)ptr, len, flags); #else return recv(sck, ptr, len, flags); #endif } /*****************************************************************************/ int g_sck_send(int sck, const void *ptr, unsigned int len, int flags) { #if defined(_WIN32) return send(sck, (const char *)ptr, len, flags); #else return send(sck, ptr, len, flags); #endif } /*****************************************************************************/ int g_sck_recv_fd_set(int sck, void *ptr, unsigned int len, int fds[], unsigned int maxfd, unsigned int *fdcount) { int rv = -1; #if !defined(_WIN32) // The POSIX API gives us no way to see how much ancillary data is // present for recvmsg() - just use a big buffer. // // Use a union, so control_un.control is properly aligned. union { struct cmsghdr cm; unsigned char control[8192]; } control_un; struct msghdr msg = {0}; *fdcount = 0; /* Set up descriptor for vanilla data */ struct iovec iov[1] = { {ptr, len} }; msg.msg_iov = &iov[0]; msg.msg_iovlen = 1; /* Add in the ancillary data buffer */ msg.msg_control = control_un.control; msg.msg_controllen = sizeof(control_un.control); if ((rv = recvmsg(sck, &msg, 0)) > 0) { struct cmsghdr *cmsg; // Coverity: msg is 'tainted', so check msg.control and // msg.msg_controllen are sane (i.e. recvmsg() hasn't done // something odd) msg.msg_control = control_un.control; if (msg.msg_controllen > sizeof(control_un.control)) { msg.msg_controllen = sizeof(control_un.control); } if ((msg.msg_flags & MSG_CTRUNC) != 0) { LOG(LOG_LEVEL_WARNING, "Ancillary data on recvmsg() was truncated"); } // Iterate over the cmsghdr structures in the ancillary data for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; cmsg = CMSG_NXTHDR(&msg, cmsg)) { if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) { const unsigned char *data = CMSG_DATA(cmsg); unsigned int data_len = cmsg->cmsg_len - CMSG_LEN(0); // Check the data length doesn't point past the end of // control_un.control (see below). This shouldn't happen, // but is conceivable if the ancillary data is truncated // and the OS doesn't handle that properly. // // <-- (sizeof(control_un.control) --> // +------------------------------------+ // | | // +------------------------------------+ // ^ ^ // | | <- data_len -> // | | // control_un.control data unsigned int max_data_len = sizeof(control_un.control) - (data - control_un.control); if (len > max_data_len) { len = max_data_len; } // Process all the file descriptors in the structure while (data_len >= sizeof(int)) { int fd; memcpy(&fd, data, sizeof(int)); data += sizeof(int); data_len -= sizeof(int); if (*fdcount < maxfd) { fds[(*fdcount)++] = fd; } else { // No room in the user's buffer for this fd close(fd); } } } } } #endif /* !WIN32 */ return rv; } /*****************************************************************************/ int g_sck_send_fd_set(int sck, const void *ptr, unsigned int len, int fds[], unsigned int fdcount) { int rv = -1; #if !defined(_WIN32) struct msghdr msg = {0}; /* Set up descriptor for vanilla data */ struct iovec iov[1] = { {(void *)ptr, len} }; msg.msg_iov = &iov[0]; msg.msg_iovlen = 1; if (fdcount > 0) { unsigned int fdsize = sizeof(fds[0]) * fdcount; /* Payload size */ /* Allocate ancillary data structure */ msg.msg_controllen = CMSG_SPACE(fdsize); msg.msg_control = (struct cmsghdr *)g_malloc(msg.msg_controllen, 1); if (msg.msg_control == NULL) { /* Memory allocation failure */ LOG(LOG_LEVEL_ERROR, "Error allocating buffer for %u fds", fdcount); return -1; } /* Fill in the ancillary data structure */ struct cmsghdr *cmptr = CMSG_FIRSTHDR(&msg); cmptr->cmsg_len = CMSG_LEN(fdsize); cmptr->cmsg_level = SOL_SOCKET; cmptr->cmsg_type = SCM_RIGHTS; memcpy(CMSG_DATA(cmptr), fds, fdsize); } rv = sendmsg(sck, &msg, 0); g_free(msg.msg_control); #endif /* !WIN32 */ return rv; } /******************************************************************************/ int g_alloc_shm_map_fd(void **addr, int *fd, size_t size) { int lfd = -1; void *laddr; char name[128]; static unsigned int autoinc; snprintf(name, 128, "/%8.8X%8.8X", getpid(), autoinc++); lfd = shm_open(name, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); if (lfd == -1) { return 1; } shm_unlink(name); if (ftruncate(lfd, size) == -1) { close(lfd); return 2; } /* map fd to address space */ laddr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, lfd, 0); if (laddr == MAP_FAILED) { close(lfd); return 3; } *addr = laddr; *fd = lfd; return 0; } /*****************************************************************************/ /* returns boolean */ int g_sck_socket_ok(int sck) { int opt; socklen_t opt_len; opt_len = sizeof(opt); if (getsockopt(sck, SOL_SOCKET, SO_ERROR, (char *)(&opt), &opt_len) == 0) { if (opt == 0) { return 1; } } return 0; } /*****************************************************************************/ /* wait 'millis' milliseconds for the socket to be able to write */ /* returns boolean */ int g_sck_can_send(int sck, int millis) { int rv = 0; if (sck > 0) { struct pollfd pollfd; pollfd.fd = sck; pollfd.events = POLLOUT; pollfd.revents = 0; if (poll(&pollfd, 1, millis) > 0) { if ((pollfd.revents & POLLOUT) != 0) { rv = 1; } } } return rv; } /*****************************************************************************/ /* wait 'millis' milliseconds for the socket to be able to receive */ /* returns boolean */ int g_sck_can_recv(int sck, int millis) { int rv = 0; if (sck > 0) { struct pollfd pollfd; pollfd.fd = sck; pollfd.events = POLLIN; pollfd.revents = 0; if (poll(&pollfd, 1, millis) > 0) { if ((pollfd.revents & (POLLIN | POLLHUP)) != 0) { rv = 1; } } } return rv; } /*****************************************************************************/ int g_sck_select(int sck1, int sck2) { struct pollfd pollfd[2] = {0}; int rvmask[2] = {0}; /* Output masks corresponding to fds in pollfd */ unsigned int i = 0; int rv = 0; if (sck1 > 0) { pollfd[i].fd = sck1; pollfd[i].events = POLLIN; rvmask[i] = 1; ++i; } if (sck2 > 0) { pollfd[i].fd = sck2; pollfd[i].events = POLLIN; rvmask[i] = 2; ++i; } if (poll(pollfd, i, 0) > 0) { if ((pollfd[0].revents & (POLLIN | POLLHUP)) != 0) { rv |= rvmask[0]; } if ((pollfd[1].revents & (POLLIN | POLLHUP)) != 0) { rv |= rvmask[1]; } } return rv; } /*****************************************************************************/ /* returns boolean */ static int g_fd_can_read(int fd) { int rv = 0; if (fd > 0) { struct pollfd pollfd; pollfd.fd = fd; pollfd.events = POLLIN; pollfd.revents = 0; if (poll(&pollfd, 1, 0) > 0) { if ((pollfd.revents & (POLLIN | POLLHUP)) != 0) { rv = 1; } } } return rv; } /*****************************************************************************/ /* returns error */ /* O_NONBLOCK = 0x00000800 */ static int g_set_nonblock(int fd) { int error; int flags; error = fcntl(fd, F_GETFL); if (error < 0) { return 1; } flags = error; if ((flags & O_NONBLOCK) != O_NONBLOCK) { flags |= O_NONBLOCK; error = fcntl(fd, F_SETFL, flags); if (error < 0) { return 1; } } return 0; } /*****************************************************************************/ /* returns 0 on error */ tintptr g_create_wait_obj(const char *name) { #ifdef _WIN32 tintptr obj; obj = (tintptr)CreateEvent(0, 1, 0, name); return obj; #else int fds[2]; int error; error = pipe(fds); if (error != 0) { return 0; } if (g_set_nonblock(fds[0]) != 0) { close(fds[0]); close(fds[1]); return 0; } if (g_set_nonblock(fds[1]) != 0) { close(fds[0]); close(fds[1]); return 0; } g_file_set_cloexec(fds[0], 1); g_file_set_cloexec(fds[1], 1); return (fds[1] << 16) | fds[0]; #endif } /*****************************************************************************/ /* returns 0 on error */ tintptr g_create_wait_obj_from_socket(tintptr socket, int write) { #ifdef _WIN32 /* Create and return corresponding event handle for WaitForMultipleObjects */ WSAEVENT event; long lnetevent = 0; g_memset(&event, 0, sizeof(WSAEVENT)); event = WSACreateEvent(); lnetevent = (write ? FD_WRITE : FD_READ) | FD_CLOSE; if (WSAEventSelect(socket, event, lnetevent) == 0) { return (tbus)event; } else { return 0; } #else return socket; #endif } /*****************************************************************************/ void g_delete_wait_obj_from_socket(tintptr wait_obj) { #ifdef _WIN32 if (wait_obj == NULL_WAIT_OBJ) { return; } WSACloseEvent((HANDLE)wait_obj); #else #endif } /*****************************************************************************/ /* returns error */ int g_set_wait_obj(tintptr obj) { #ifdef _WIN32 #error "Win32 is no longer supported." #else int error; int fd; int written; int to_write; char buf[4] = "sig"; if (obj == NULL_WAIT_OBJ) { return 0; } fd = obj & USHRT_MAX; if (g_fd_can_read(fd)) { /* already signalled */ return 0; } fd = obj >> 16; to_write = sizeof(buf); written = 0; while (written < to_write) { error = write(fd, buf + written, to_write - written); if (error == -1) { error = errno; if ((error == EAGAIN) || (error == EWOULDBLOCK) || (error == EINPROGRESS) || (error == EINTR)) { /* ok */ } else { return 1; } } else if (error > 0 && error <= (int)sizeof(buf)) { written += error; } else { // Shouldn't get here. return 1; } } return 0; #endif } /*****************************************************************************/ /* returns error */ int g_reset_wait_obj(tintptr obj) { #ifdef _WIN32 if (obj == NULL_WAIT_OBJ) { return 0; } ResetEvent((HANDLE)obj); return 0; #else char buf[4]; int error; int fd; if (obj == NULL_WAIT_OBJ) { return 0; } fd = obj & 0xffff; while (g_fd_can_read(fd)) { error = read(fd, buf, 4); if (error == -1) { error = errno; if ((error == EAGAIN) || (error == EWOULDBLOCK) || (error == EINPROGRESS) || (error == EINTR)) { /* ok */ } else { return 1; } } else if (error == 0) { return 1; } } return 0; #endif } /*****************************************************************************/ /* returns boolean */ int g_is_wait_obj_set(tintptr obj) { #ifdef _WIN32 if (obj == NULL_WAIT_OBJ) { return 0; } if (WaitForSingleObject((HANDLE)obj, 0) == WAIT_OBJECT_0) { return 1; } return 0; #else if (obj == NULL_WAIT_OBJ) { return 0; } return g_fd_can_read(obj & 0xffff); #endif } /*****************************************************************************/ /* returns error */ int g_delete_wait_obj(tintptr obj) { #ifdef _WIN32 if (obj == NULL_WAIT_OBJ) { return 0; } /* Close event handle */ CloseHandle((HANDLE)obj); return 0; #else if (obj == 0) { return 0; } close(obj & 0xffff); close(obj >> 16); return 0; #endif } /*****************************************************************************/ /* returns error */ int g_obj_wait(tintptr *read_objs, int rcount, tintptr *write_objs, int wcount, int mstimeout) { #define MAX_HANDLES 256 #ifdef _WIN32 HANDLE handles[MAX_HANDLES]; DWORD count; DWORD error; int j; int i; j = 0; count = rcount + wcount; for (i = 0; i < rcount; i++) { handles[j++] = (HANDLE)(read_objs[i]); } for (i = 0; i < wcount; i++) { handles[j++] = (HANDLE)(write_objs[i]); } if (mstimeout < 0) { mstimeout = INFINITE; } error = WaitForMultipleObjects(count, handles, FALSE, mstimeout); if (error == WAIT_FAILED) { return 1; } return 0; #else struct pollfd pollfd[MAX_HANDLES]; int sck; int i; unsigned int j = 0; int rv = 1; if (read_objs == NULL && rcount != 0) { LOG(LOG_LEVEL_ERROR, "Programming error read_objs is null"); } else if (write_objs == NULL && wcount != 0) { LOG(LOG_LEVEL_ERROR, "Programming error write_objs is null"); } /* Check carefully for int overflow in passed-in counts */ else if ((unsigned int)rcount > MAX_HANDLES || (unsigned int)wcount > MAX_HANDLES || ((unsigned int)rcount + (unsigned int)wcount) > MAX_HANDLES) { LOG(LOG_LEVEL_ERROR, "Programming error too many handles"); } else { if (mstimeout < 0) { mstimeout = -1; } for (i = 0; i < rcount ; ++i) { sck = read_objs[i] & 0xffff; if (sck > 0) { pollfd[j].fd = sck; pollfd[j].events = POLLIN; ++j; } } for (i = 0; i < wcount; ++i) { sck = write_objs[i]; if (sck > 0) { pollfd[j].fd = sck; pollfd[j].events = POLLOUT; ++j; } } rv = (poll(pollfd, j, mstimeout) < 0); if (rv != 0) { /* these are not really errors */ if ((errno == EAGAIN) || (errno == EWOULDBLOCK) || (errno == EINPROGRESS) || (errno == EINTR)) /* signal occurred */ { rv = 0; } } } return rv; #endif #undef MAX_HANDLES } /*****************************************************************************/ void g_random(char *data, int len) { int fd; memset(data, 0x44, len); fd = open("/dev/urandom", O_RDONLY); if (fd == -1) { fd = open("/dev/random", O_RDONLY); } if (fd != -1) { if (read(fd, data, len) != len) { } close(fd); } } /*****************************************************************************/ int g_abs(int i) { return abs(i); } /*****************************************************************************/ int g_memcmp(const void *s1, const void *s2, int len) { return memcmp(s1, s2, len); } /*****************************************************************************/ /* returns -1 on error, else return handle or file descriptor */ int g_file_open_rw(const char *file_name) { #if defined(_WIN32) return (int)CreateFileA(file_name, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); #else return open(file_name, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); #endif } /*****************************************************************************/ /* returns -1 on error, else return handle or file descriptor */ int g_file_open_ex(const char *file_name, int aread, int awrite, int acreate, int atrunc) { #if defined(_WIN32) return -1; #else int rv; int flags; flags = 0; if (aread && awrite) { flags |= O_RDWR; } else if (aread) { flags |= O_RDONLY; } else if (awrite) { flags |= O_WRONLY; } if (acreate) { flags |= O_CREAT; } if (atrunc) { flags |= O_TRUNC; } rv = open(file_name, flags, S_IRUSR | S_IWUSR); return rv; #endif } /*****************************************************************************/ /* returns -1 on error, else return handle or file descriptor */ int g_file_open_ro(const char *file_name) { return g_file_open_ex(file_name, 1, 0, 0, 0); } /*****************************************************************************/ /* returns error, always 0 */ int g_file_close(int fd) { #if defined(_WIN32) CloseHandle((HANDLE)fd); #else close(fd); #endif return 0; } /*****************************************************************************/ int g_file_is_open(int fd) { return (fcntl(fd, F_GETFD) >= 0); } /*****************************************************************************/ /* read from file, returns the number of bytes read or -1 on error */ int g_file_read(int fd, char *ptr, int len) { #if defined(_WIN32) if (ReadFile((HANDLE)fd, (LPVOID)ptr, (DWORD)len, (LPDWORD)&len, 0)) { return len; } else { return -1; } #else return read(fd, ptr, len); #endif } /*****************************************************************************/ /* write to file, returns the number of bytes written or -1 on error */ int g_file_write(int fd, const char *ptr, int len) { #if defined(_WIN32) if (WriteFile((HANDLE)fd, (LPVOID)ptr, (DWORD)len, (LPDWORD)&len, 0)) { return len; } else { return -1; } #else return write(fd, ptr, len); #endif } /*****************************************************************************/ /* move file pointer, returns offset on success, -1 on failure */ int g_file_seek(int fd, int offset) { #if defined(_WIN32) int rv; rv = (int)SetFilePointer((HANDLE)fd, offset, 0, FILE_BEGIN); if (rv == (int)INVALID_SET_FILE_POINTER) { return -1; } else { return rv; } #else return (int)lseek(fd, offset, SEEK_SET); #endif } /*****************************************************************************/ /* move file pointer to end of file, plus an offset */ int g_file_seek_end(int fd, int offset) { #if defined(_WIN32) int rv; rv = (int)SetFilePointer((HANDLE)fd, offset, 0, FILE_END); if (rv == (int)INVALID_SET_FILE_POINTER) { return -1; } else { return rv; } #else return (int)lseek(fd, offset, SEEK_END); #endif } /*****************************************************************************/ /* do a write lock on a file */ /* return boolean */ int g_file_lock(int fd, int start, int len) { #if defined(_WIN32) return LockFile((HANDLE)fd, start, 0, len, 0); #else struct flock lock; lock.l_type = F_WRLCK; lock.l_whence = SEEK_SET; lock.l_start = start; lock.l_len = len; if (fcntl(fd, F_SETLK, &lock) == -1) { return 0; } return 1; #endif } /*****************************************************************************/ /* Gets the close-on-exec flag for a file descriptor */ int g_file_get_cloexec(int fd) { int rv = 0; int flags = fcntl(fd, F_GETFD); if (flags >= 0 && (flags & FD_CLOEXEC) != 0) { rv = 1; } return rv; } /*****************************************************************************/ /* Sets/clears the close-on-exec flag for a file descriptor */ /* return boolean */ int g_file_set_cloexec(int fd, int status) { int rv = 0; int current_flags = fcntl(fd, F_GETFD); if (current_flags >= 0) { int new_flags; if (status) { new_flags = current_flags | FD_CLOEXEC; } else { new_flags = current_flags & ~FD_CLOEXEC; } if (new_flags != current_flags) { rv = (fcntl(fd, F_SETFD, new_flags) >= 0); } } return rv; } /*****************************************************************************/ struct list * g_get_open_fds(int min, int max) { if (min < 0) { min = 0; } struct list *result = list_create(); if (result != NULL) { if (max < 0) { // sysconf() returns a long. Limit it to a sane value #define SANE_MAX 100000 long sc_max = sysconf(_SC_OPEN_MAX); max = (sc_max < 0) ? 0 : (sc_max > (long)SANE_MAX) ? SANE_MAX : sc_max; #undef SANE_MAX } // max and min are now both guaranteed to be >= 0 if (max > min) { struct pollfd *fds = g_new0(struct pollfd, max - min); int i; if (fds == NULL) { goto nomem; } for (i = min ; i < max ; ++i) { fds[i - min].fd = i; } if (poll(fds, max - min, 0) >= 0) { for (i = min ; i < max ; ++i) { if (fds[i - min].revents != POLLNVAL) { // Descriptor is open if (!list_add_item(result, i)) { g_free(fds); goto nomem; } } } } g_free(fds); } } return result; nomem: list_delete(result); return NULL; } /*****************************************************************************/ int g_file_map(int fd, int aread, int awrite, size_t length, void **addr) { int prot = 0; void *laddr; if (aread) { prot |= PROT_READ; } if (awrite) { prot |= PROT_WRITE; } laddr = mmap(NULL, length, prot, MAP_SHARED, fd, 0); if (laddr == MAP_FAILED) { return 1; } *addr = laddr; return 0; } /*****************************************************************************/ int g_munmap(void *addr, size_t length) { return munmap(addr, length); } /*****************************************************************************/ /* Converts a hex mask to a mode_t value */ #if !defined(_WIN32) static mode_t hex_to_mode_t(int hex) { mode_t mode = 0; mode |= (hex & 0x4000) ? S_ISUID : 0; mode |= (hex & 0x2000) ? S_ISGID : 0; mode |= (hex & 0x1000) ? S_ISVTX : 0; mode |= (hex & 0x0400) ? S_IRUSR : 0; mode |= (hex & 0x0200) ? S_IWUSR : 0; mode |= (hex & 0x0100) ? S_IXUSR : 0; mode |= (hex & 0x0040) ? S_IRGRP : 0; mode |= (hex & 0x0020) ? S_IWGRP : 0; mode |= (hex & 0x0010) ? S_IXGRP : 0; mode |= (hex & 0x0004) ? S_IROTH : 0; mode |= (hex & 0x0002) ? S_IWOTH : 0; mode |= (hex & 0x0001) ? S_IXOTH : 0; return mode; } #endif /*****************************************************************************/ /* Converts a mode_t value to a hex mask */ #if !defined(_WIN32) static int mode_t_to_hex(mode_t mode) { int hex = 0; hex |= (mode & S_ISUID) ? 0x4000 : 0; hex |= (mode & S_ISGID) ? 0x2000 : 0; hex |= (mode & S_ISVTX) ? 0x1000 : 0; hex |= (mode & S_IRUSR) ? 0x0400 : 0; hex |= (mode & S_IWUSR) ? 0x0200 : 0; hex |= (mode & S_IXUSR) ? 0x0100 : 0; hex |= (mode & S_IRGRP) ? 0x0040 : 0; hex |= (mode & S_IWGRP) ? 0x0020 : 0; hex |= (mode & S_IXGRP) ? 0x0010 : 0; hex |= (mode & S_IROTH) ? 0x0004 : 0; hex |= (mode & S_IWOTH) ? 0x0002 : 0; hex |= (mode & S_IXOTH) ? 0x0001 : 0; return hex; } #endif /*****************************************************************************/ /* Duplicates a file descriptor onto another one using the semantics * of dup2() */ /* return boolean */ int g_file_duplicate_on(int fd, int target_fd) { int rv = (dup2(fd, target_fd) >= 0); if (rv < 0) { LOG(LOG_LEVEL_ERROR, "Can't clone file %d as file %d [%s]", fd, target_fd, g_get_strerror()); } return rv; } /*****************************************************************************/ /* returns error */ int g_chmod_hex(const char *filename, int flags) { #if defined(_WIN32) return 0; #else mode_t m = hex_to_mode_t(flags); return chmod(filename, m); #endif } /*****************************************************************************/ /* returns error */ int g_umask_hex(int flags) { #if defined(_WIN32) return flags; #else mode_t m = hex_to_mode_t(flags); m = umask(m); return mode_t_to_hex(m); #endif } /*****************************************************************************/ /* returns error, zero is ok */ int g_chown(const char *name, int uid, int gid) { return chown(name, uid, gid); } /*****************************************************************************/ /* returns error, always zero */ int g_mkdir(const char *dirname) { #if defined(_WIN32) return 0; #else return mkdir(dirname, S_IRWXU); #endif } /*****************************************************************************/ /* gets the current working directory and puts up to maxlen chars in dirname always returns 0 */ char * g_get_current_dir(char *dirname, int maxlen) { #if defined(_WIN32) GetCurrentDirectoryA(maxlen, dirname); return 0; #else if (getcwd(dirname, maxlen) == 0) { } return 0; #endif } /*****************************************************************************/ /* returns error, zero on success and -1 on failure */ int g_set_current_dir(const char *dirname) { #if defined(_WIN32) if (SetCurrentDirectoryA(dirname)) { return 0; } else { return -1; } #else return chdir(dirname); #endif } /*****************************************************************************/ /* returns boolean, non zero if the file exists */ int g_file_exist(const char *filename) { #if defined(_WIN32) return 0; // use FileAge(filename) <> -1 #else return access(filename, F_OK) == 0; #endif } /*****************************************************************************/ /* returns boolean, non zero if the file is readable */ int g_file_readable(const char *filename) { #if defined(_WIN32) return _waccess(filename, 04) == 0; #else return access(filename, R_OK) == 0; #endif } /*****************************************************************************/ /* returns boolean, non zero if the directory exists */ int g_directory_exist(const char *dirname) { #if defined(_WIN32) return 0; // use GetFileAttributes and check return value // is not -1 and FILE_ATTRIBUTE_DIRECTORY bit is set #else struct stat st; if (stat(dirname, &st) == 0) { return S_ISDIR(st.st_mode); } else { return 0; } #endif } /*****************************************************************************/ /* returns boolean, non zero if the file exists and is a readable executable */ int g_executable_exist(const char *exename) { return access(exename, R_OK | X_OK) == 0; } /*****************************************************************************/ /* returns boolean, non zero if the socket exists */ int g_socket_exist(const char *sockname) { struct stat st; if (stat(sockname, &st) == 0) { return S_ISSOCK(st.st_mode); } else { return 0; } } /*****************************************************************************/ /* returns boolean */ int g_create_dir(const char *dirname) { #if defined(_WIN32) return CreateDirectoryA(dirname, 0); // test this #else return mkdir(dirname, 0777) == 0; #endif } /*****************************************************************************/ /* will try to create directories up to last / in name example /tmp/a/b/c/readme.txt will try to create /tmp/a/b/c returns boolean */ int g_create_path(const char *path) { char *pp; char *sp; char *copypath; int status; status = 1; copypath = g_strdup(path); pp = copypath; sp = strchr(pp, '/'); while (sp != 0) { if (sp != pp) { *sp = 0; if (!g_directory_exist(copypath)) { // Create and check again to avoid a race with another // process making the same traversal (void)g_create_dir(copypath); if (!g_directory_exist(copypath)) { status = 0; break; } } *sp = '/'; } pp = sp + 1; sp = strchr(pp, '/'); } g_free(copypath); return status; } /*****************************************************************************/ /* returns boolean */ int g_remove_dir(const char *dirname) { #if defined(_WIN32) return RemoveDirectoryA(dirname); // test this #else return rmdir(dirname) == 0; #endif } /*****************************************************************************/ /* returns non zero if the file was deleted */ int g_file_delete(const char *filename) { #if defined(_WIN32) return DeleteFileA(filename); #else return unlink(filename) != -1; #endif } /*****************************************************************************/ /* returns file size, -1 on error */ int g_file_get_size(const char *filename) { #if defined(_WIN32) return -1; #else struct stat st; if (stat(filename, &st) == 0) { return (int)(st.st_size); } else { return -1; } #endif } /*****************************************************************************/ /* returns device number, -1 on error */ int g_file_get_device_number(const char *filename) { #if defined(_WIN32) return -1; #else struct stat st; if (stat(filename, &st) == 0) { return (int)(st.st_dev); } else { return -1; } #endif } /*****************************************************************************/ /* returns inode number, -1 on error */ int g_file_get_inode_num(const char *filename) { #if defined(_WIN32) return -1; #else struct stat st; if (stat(filename, &st) == 0) { return (int)(st.st_ino); } else { return -1; } #endif } /*****************************************************************************/ long g_load_library(char *in) { #if defined(_WIN32) return (long)LoadLibraryA(in); #else return (long)dlopen(in, RTLD_LOCAL | RTLD_LAZY); #endif } /*****************************************************************************/ int g_free_library(long lib) { if (lib == 0) { return 0; } #if defined(_WIN32) return FreeLibrary((HMODULE)lib); #else return dlclose((void *)lib); #endif } /*****************************************************************************/ /* returns NULL if not found */ void * g_get_proc_address(long lib, const char *name) { if (lib == 0) { return 0; } #if defined(_WIN32) return GetProcAddress((HMODULE)lib, name); #else return dlsym((void *)lib, name); #endif } /*****************************************************************************/ /* does not work in win32 */ int g_system(const char *aexec) { #if defined(_WIN32) return 0; #else return system(aexec); #endif } /*****************************************************************************/ /* does not work in win32 */ char * g_get_strerror(void) { #if defined(_WIN32) return 0; #else return strerror(errno); #endif } /*****************************************************************************/ int g_get_errno(void) { #if defined(_WIN32) return GetLastError(); #else return errno; #endif } /*****************************************************************************/ /* does not work in win32 */ #define ARGS_STR_LEN 1024 int g_execvp(const char *p1, char *args[]) { #if defined(_WIN32) return 0; #else int rv; char args_str[ARGS_STR_LEN]; int args_len; args_len = 0; while (args[args_len] != NULL) { args_len++; } g_strnjoin(args_str, ARGS_STR_LEN, " ", (const char **) args, args_len); LOG(LOG_LEVEL_DEBUG, "Calling exec (excutable: %s, arguments: %s)", p1, args_str); rv = execvp(p1, args); /* should not get here */ int saved_errno = errno; LOG(LOG_LEVEL_ERROR, "Error calling exec (excutable: %s, arguments: %s) " "returned errno: %d, description: %s", p1, args_str, g_get_errno(), g_get_strerror()); errno = saved_errno; return rv; #endif } /*****************************************************************************/ int g_execvp_list(const char *file, struct list *argv) { int rv = -1; /* Push a terminating NULL onto the list for the system call */ if (!list_add_item(argv, (tintptr)NULL)) { LOG(LOG_LEVEL_ERROR, "No memory for exec to terminate list"); errno = ENOMEM; } else { /* Read the argv argument straight from the list */ rv = g_execvp(file, (char **)argv->items); /* should not get here */ list_remove_item(argv, argv->count - 1); // Lose terminating NULL } return rv; } /*****************************************************************************/ /* does not work in win32 */ int g_execlp3(const char *a1, const char *a2, const char *a3) { #if defined(_WIN32) return 0; #else int rv; const char *args[] = {a2, a3, NULL}; char args_str[ARGS_STR_LEN]; g_strnjoin(args_str, ARGS_STR_LEN, " ", args, 2); LOG(LOG_LEVEL_DEBUG, "Calling exec (executable: %s, arguments: %s)", a1, args_str); g_rm_temp_dir(); rv = execlp(a1, a2, a3, (void *)0); /* should not get here */ LOG(LOG_LEVEL_ERROR, "Error calling exec (executable: %s, arguments: %s) " "returned errno: %d, description: %s", a1, args_str, g_get_errno(), g_get_strerror()); return rv; #endif } /*****************************************************************************/ /* does not work in win32 */ unsigned int g_set_alarm(void (*func)(int), unsigned int secs) { #if defined(_WIN32) return 0; #else struct sigaction action; /* Cancel any previous alarm to prevent a race */ unsigned int rv = alarm(0); if (func == NULL) { action.sa_handler = SIG_DFL; action.sa_flags = 0; } else { action.sa_handler = func; action.sa_flags = SA_RESTART; } sigemptyset (&action.sa_mask); sigaction(SIGALRM, &action, NULL); if (func != NULL && secs > 0) { (void)alarm(secs); } return rv; #endif } /*****************************************************************************/ /* does not work in win32 */ void g_signal_child_stop(void (*func)(int)) { #if defined(_WIN32) #else struct sigaction action; if (func == NULL) { action.sa_handler = SIG_DFL; action.sa_flags = 0; } else { action.sa_handler = func; // Don't need to know when children are stopped or started action.sa_flags = (SA_RESTART | SA_NOCLDSTOP); } sigemptyset (&action.sa_mask); sigaction(SIGCHLD, &action, NULL); #endif } /*****************************************************************************/ void g_signal_segfault(void (*func)(int)) { #if defined(_WIN32) #else struct sigaction action; if (func == NULL) { action.sa_handler = SIG_DFL; action.sa_flags = 0; } else { action.sa_handler = func; action.sa_flags = SA_RESETHAND; // This is a one-shot } sigemptyset (&action.sa_mask); sigaction(SIGSEGV, &action, NULL); #endif } /*****************************************************************************/ /* does not work in win32 */ void g_signal_hang_up(void (*func)(int)) { #if defined(_WIN32) #else struct sigaction action; if (func == NULL) { action.sa_handler = SIG_DFL; action.sa_flags = 0; } else { action.sa_handler = func; action.sa_flags = SA_RESTART; } sigemptyset (&action.sa_mask); sigaction(SIGHUP, &action, NULL); #endif } /*****************************************************************************/ /* does not work in win32 */ void g_signal_user_interrupt(void (*func)(int)) { #if defined(_WIN32) #else struct sigaction action; if (func == NULL) { action.sa_handler = SIG_DFL; action.sa_flags = 0; } else { action.sa_handler = func; action.sa_flags = SA_RESTART; } sigemptyset (&action.sa_mask); sigaction(SIGINT, &action, NULL); #endif } /*****************************************************************************/ /* does not work in win32 */ void g_signal_terminate(void (*func)(int)) { #if defined(_WIN32) #else struct sigaction action; if (func == NULL) { action.sa_handler = SIG_DFL; action.sa_flags = 0; } else { action.sa_handler = func; action.sa_flags = SA_RESTART; } sigemptyset (&action.sa_mask); sigaction(SIGTERM, &action, NULL); #endif } /*****************************************************************************/ /* does not work in win32 */ void g_signal_pipe(void (*func)(int)) { #if defined(_WIN32) #else struct sigaction action; if (func == NULL) { action.sa_handler = SIG_DFL; action.sa_flags = 0; } else { action.sa_handler = func; action.sa_flags = SA_RESTART; } sigemptyset (&action.sa_mask); sigaction(SIGPIPE, &action, NULL); #endif } /*****************************************************************************/ /* does not work in win32 */ void g_signal_usr1(void (*func)(int)) { #if defined(_WIN32) #else struct sigaction action; if (func == NULL) { action.sa_handler = SIG_DFL; action.sa_flags = 0; } else { action.sa_handler = func; action.sa_flags = SA_RESTART; } sigemptyset (&action.sa_mask); sigaction(SIGUSR1, &action, NULL); #endif } /*****************************************************************************/ /* does not work in win32 */ int g_fork(void) { #if defined(_WIN32) return 0; #else int rv; rv = fork(); if (rv == -1) /* error */ { LOG(LOG_LEVEL_ERROR, "Process fork failed with errno: %d, description: %s", g_get_errno(), g_get_strerror()); } return rv; #endif } /*****************************************************************************/ /* does not work in win32 */ int g_setgid(int pid) { #if defined(_WIN32) return 0; #else return setgid(pid); #endif } /*****************************************************************************/ /* Used by daemonizing code */ /* returns error, zero is success, non zero is error */ int g_drop_privileges(const char *user, const char *group) { int rv = 1; int uid; int gid; if (g_getuser_info_by_name(user, &uid, NULL, NULL, NULL, NULL) != 0) { LOG(LOG_LEVEL_ERROR, "Unable to get UID for user '%s' [%s]", user, g_get_strerror()); } else if (g_getgroup_info(group, &gid) != 0) { LOG(LOG_LEVEL_ERROR, "Unable to get GID for group '%s' [%s]", group, g_get_strerror()); } else if (initgroups(user, gid) != 0) { LOG(LOG_LEVEL_ERROR, "Unable to init groups for '%s' [%s]", user, g_get_strerror()); } else if (g_setgid(gid) != 0) { LOG(LOG_LEVEL_ERROR, "Unable to set group to '%s' [%s]", group, g_get_strerror()); } else if (g_setuid(uid) != 0) { LOG(LOG_LEVEL_ERROR, "Unable to set user to '%s' [%s]", user, g_get_strerror()); } else { rv = 0; } return rv; } /*****************************************************************************/ /* returns error, zero is success, non zero is error */ /* does not work in win32 */ int g_initgroups(const char *username) { #if defined(_WIN32) return 0; #else int gid; int error = g_getuser_info_by_name(username, NULL, &gid, NULL, NULL, NULL); if (error == 0) { error = initgroups(username, gid); } return error; #endif } /*****************************************************************************/ /* does not work in win32 */ /* returns user id */ int g_getuid(void) { #if defined(_WIN32) return 0; #else return getuid(); #endif } /*****************************************************************************/ /* does not work in win32 */ /* returns user id */ int g_getgid(void) { #if defined(_WIN32) return 0; #else return getgid(); #endif } /*****************************************************************************/ /* does not work in win32 */ /* On success, zero is returned. On error, -1 is returned */ int g_setuid(int pid) { #if defined(_WIN32) return 0; #else return setuid(pid); #endif } /*****************************************************************************/ int g_setsid(void) { #if defined(_WIN32) return -1; #else return setsid(); #endif } /*****************************************************************************/ int g_getlogin(char *name, unsigned int len) { #if defined(_WIN32) return -1; #else return getlogin_r(name, len); #endif } /*****************************************************************************/ int g_setlogin(const char *name) { #ifdef BSD return setlogin(name); #else return -1; #endif } /*****************************************************************************/ #ifdef HAVE_SETUSERCONTEXT int g_set_allusercontext(int uid) { int rv; struct passwd *pwd = getpwuid(uid); if (pwd == NULL) { LOG(LOG_LEVEL_ERROR, "No password entry for UID %d", uid); rv = 1; } else { rv = setusercontext(NULL, pwd, uid, LOGIN_SETALL); if (rv != 0) { LOG(LOG_LEVEL_ERROR, "setusercontext(%d) failed [%s]", uid, g_get_strerror()); } } return (rv != 0); /* Return 0 or 1 */ } #endif /*****************************************************************************/ /* does not work in win32 returns pid of process that exits or zero if signal occurred a proc_exit_status struct can optionally be passed in to get the exit status of the child */ int g_waitchild(struct proc_exit_status *e) { #if defined(_WIN32) return 0; #else int wstat; int rv; struct proc_exit_status dummy; if (e == NULL) { e = &dummy; // Set this, then throw it away } e->reason = E_PXR_UNEXPECTED; e->val = 0; rv = waitpid(-1, &wstat, WNOHANG); if (rv == -1) { if (errno == EINTR) { /* This shouldn't happen as signal handlers use SA_RESTART */ rv = 0; } } else if (WIFEXITED(wstat)) { e->reason = E_PXR_STATUS_CODE; e->val = WEXITSTATUS(wstat); } else if (WIFSIGNALED(wstat)) { e->reason = E_PXR_SIGNAL; e->val = WTERMSIG(wstat); } return rv; #endif } /*****************************************************************************/ /* does not work in win32 returns pid of process that exits or <= 0 if no process was found Note that signal handlers are established with BSD-style semantics, so this call is NOT interrupted by a signal */ int g_waitpid(int pid) { #if defined(_WIN32) return 0; #else int rv = 0; if (pid < 0) { rv = -1; } else { rv = waitpid(pid, 0, 0); } return rv; #endif } /*****************************************************************************/ /* does not work in win32 returns exit status code of child process with pid Note that signal handlers are established with BSD-style semantics, so this call is NOT interrupted by a signal */ struct proc_exit_status g_waitpid_status(int pid) { struct proc_exit_status exit_status = { .reason = E_PXR_UNEXPECTED, .val = 0 }; #if !defined(_WIN32) if (pid > 0) { int rv; int status; LOG(LOG_LEVEL_DEBUG, "waiting for pid %d to exit", pid); rv = waitpid(pid, &status, 0); if (rv != -1) { if (WIFEXITED(status)) { exit_status.reason = E_PXR_STATUS_CODE; exit_status.val = WEXITSTATUS(status); } if (WIFSIGNALED(status)) { exit_status.reason = E_PXR_SIGNAL; exit_status.val = WTERMSIG(status); } } else { LOG(LOG_LEVEL_WARNING, "wait for pid %d returned unknown result", pid); } } #endif return exit_status; } /*****************************************************************************/ int g_setpgid(int pid, int pgid) { int rv = setpgid(pid, pgid); if (rv < 0) { if (pid == 0) { pid = getpid(); } LOG(LOG_LEVEL_ERROR, "Can't set process group ID of %d to %d [%s]", pid, pgid, g_get_strerror()); } return rv; } /*****************************************************************************/ /* does not work in win32 */ void g_clearenv(void) { #if defined(HAVE_CLEARENV) clearenv(); #elif defined(_WIN32) #elif defined(BSD) extern char **environ; environ[0] = 0; #else extern char **environ; environ = 0; #endif } /*****************************************************************************/ /* does not work in win32 */ int g_setenv(const char *name, const char *value, int rewrite) { #if defined(_WIN32) return 0; #else return setenv(name, value, rewrite); #endif } /*****************************************************************************/ /* does not work in win32 */ void g_setenv_log(const char *name, const char *value, int rewrite) { #if defined(_WIN32) return 0; #else if (setenv(name, value, rewrite) != 0) { LOG(LOG_LEVEL_WARNING, "Unable to set environment variable '%s' [%s]", name, g_get_strerror()); } #endif } /*****************************************************************************/ /* does not work in win32 */ char * g_getenv(const char *name) { #if defined(_WIN32) return 0; #else return getenv(name); #endif } /*****************************************************************************/ int g_exit(int exit_code) { exit(exit_code); return 0; } /*****************************************************************************/ int g_getpid(void) { #if defined(_WIN32) return (int)GetCurrentProcessId(); #else return (int)getpid(); #endif } /*****************************************************************************/ /* does not work in win32 */ int g_sigterm(int pid) { #if defined(_WIN32) return 0; #else return kill(pid, SIGTERM); #endif } /*****************************************************************************/ int g_pid_is_active(int pid) { return (kill(pid, 0) == 0); } /*****************************************************************************/ /* does not work in win32 */ int g_sighup(int pid) { #if defined(_WIN32) return 0; #else return kill(pid, SIGHUP); #endif } /*****************************************************************************/ /* returns 0 if ok */ /* the caller is responsible to free the buffs */ /* does not work in win32 */ int g_getuser_info_by_name(const char *username, int *uid, int *gid, char **shell, char **dir, char **gecos) { int rv = 1; #if !defined(_WIN32) if (username == NULL) { LOG(LOG_LEVEL_ERROR, "g_getuser_info_by_name() called for NULL user"); } else { struct passwd *pwd_1 = getpwnam(username); if (pwd_1 != 0) { rv = 0; if (uid != 0) { *uid = pwd_1->pw_uid; } if (gid != 0) { *gid = pwd_1->pw_gid; } if (shell != 0) { *shell = g_strdup(pwd_1->pw_shell); } if (dir != 0) { *dir = g_strdup(pwd_1->pw_dir); } if (gecos != 0) { *gecos = g_strdup(pwd_1->pw_gecos); } } } #endif return rv; } /*****************************************************************************/ /* returns 0 if ok */ /* the caller is responsible to free the buffs */ /* does not work in win32 */ int g_getuser_info_by_uid(int uid, char **username, int *gid, char **shell, char **dir, char **gecos) { #if defined(_WIN32) return 1; #else struct passwd *pwd_1; pwd_1 = getpwuid(uid); if (pwd_1 != 0) { if (username != NULL) { *username = g_strdup(pwd_1->pw_name); } if (gid != 0) { *gid = pwd_1->pw_gid; } if (shell != 0) { *shell = g_strdup(pwd_1->pw_shell); } if (dir != 0) { *dir = g_strdup(pwd_1->pw_dir); } if (gecos != 0) { *gecos = g_strdup(pwd_1->pw_gecos); } return 0; } return 1; #endif } /*****************************************************************************/ /* returns 0 if ok */ /* does not work in win32 */ int g_getgroup_info(const char *groupname, int *gid) { #if defined(_WIN32) return 1; #else struct group *g; g = getgrnam(groupname); if (g != 0) { if (gid != 0) { *gid = g->gr_gid; } return 0; } return 1; #endif } /*****************************************************************************/ #ifdef HAVE_GETGROUPLIST int g_check_user_in_group(const char *username, int gid, int *ok) { int rv = 1; struct passwd *pwd_1 = getpwnam(username); if (pwd_1 != NULL) { // Get number of groups for user // // Some implementations of getgrouplist() (i.e. muslc) don't // allow ngroups to be <1 on entry int ngroups = 1; GETGROUPLIST_T dummy; getgrouplist(username, pwd_1->pw_gid, &dummy, &ngroups); if (ngroups > 0) // Should always be true { GETGROUPLIST_T *grouplist; grouplist = (GETGROUPLIST_T *)malloc(ngroups * sizeof(grouplist[0])); if (grouplist != NULL) { // Now get the actual groups. The number of groups returned // by this call is not necessarily the same as the number // returned by the first call. int allocgroups = ngroups; getgrouplist(username, pwd_1->pw_gid, grouplist, &ngroups); ngroups = MIN(ngroups, allocgroups); rv = 0; *ok = 0; int i; for (i = 0 ; i < ngroups; ++i) { if (grouplist[i] == (GETGROUPLIST_T)gid) { *ok = 1; break; } } free(grouplist); } } } return rv; } /*****************************************************************************/ #else // HAVE_GETGROUPLIST int g_check_user_in_group(const char *username, int gid, int *ok) { #if defined(_WIN32) return 1; #else int i; struct passwd *pwd_1 = getpwnam(username); struct group *groups = getgrgid(gid); if (pwd_1 == NULL || groups == NULL) { return 1; } if (pwd_1->pw_gid == gid) { *ok = 1; } else { *ok = 0; i = 0; while (0 != groups->gr_mem[i]) { if (0 == g_strcmp(groups->gr_mem[i], username)) { *ok = 1; break; } i++; } } return 0; #endif } #endif // HAVE_GETGROUPLIST /*****************************************************************************/ unsigned int g_get_elapsed_ms(void) { unsigned int result = 0; struct timespec tp; if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0) { result = (unsigned int)tp.tv_sec * 1000; // POSIX 1003.1-2004 specifies that tv_nsec is a long (i.e. a // signed type), but can only contain [0..999,999,999] result += tp.tv_nsec / 1000000; } return result; } /******************************************************************************/ /******************************************************************************/ struct bmp_magic { char magic[2]; }; struct bmp_hdr { unsigned int size; /* file size in bytes */ unsigned short reserved1; unsigned short reserved2; unsigned int offset; /* offset to image data, in bytes */ }; struct dib_hdr { unsigned int hdr_size; int width; int height; unsigned short nplanes; unsigned short bpp; unsigned int compress_type; unsigned int image_size; int hres; int vres; unsigned int ncolors; unsigned int nimpcolors; }; /******************************************************************************/ int g_save_to_bmp(const char *filename, char *data, int stride_bytes, int width, int height, int depth, int bits_per_pixel) { struct bmp_magic bm; struct bmp_hdr bh; struct dib_hdr dh; int bytes; int fd; int index; int i1; int pixel; int extra; int file_stride_bytes; char *line; char *line_ptr; if ((depth == 24) && (bits_per_pixel == 32)) { } else if ((depth == 32) && (bits_per_pixel == 32)) { } else { LOG(LOG_LEVEL_ERROR, "g_save_to_bpp: unimplemented for: depth %d, bits_per_pixel %d", depth, bits_per_pixel); return 1; } bm.magic[0] = 'B'; bm.magic[1] = 'M'; /* scan lines are 32 bit aligned, bottom 2 bits must be zero */ file_stride_bytes = width * ((depth + 7) / 8); extra = file_stride_bytes; extra = extra & 3; extra = (4 - extra) & 3; file_stride_bytes += extra; bh.size = sizeof(bm) + sizeof(bh) + sizeof(dh) + height * file_stride_bytes; bh.reserved1 = 0; bh.reserved2 = 0; bh.offset = sizeof(bm) + sizeof(bh) + sizeof(dh); dh.hdr_size = sizeof(dh); dh.width = width; dh.height = height; dh.nplanes = 1; dh.bpp = depth; dh.compress_type = 0; dh.image_size = height * file_stride_bytes; dh.hres = 0xb13; dh.vres = 0xb13; dh.ncolors = 0; dh.nimpcolors = 0; fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); if (fd == -1) { LOG(LOG_LEVEL_ERROR, "g_save_to_bpp: open error"); return 1; } bytes = write(fd, &bm, sizeof(bm)); if (bytes != sizeof(bm)) { LOG(LOG_LEVEL_ERROR, "g_save_to_bpp: write error"); } bytes = write(fd, &bh, sizeof(bh)); if (bytes != sizeof(bh)) { LOG(LOG_LEVEL_ERROR, "g_save_to_bpp: write error"); } bytes = write(fd, &dh, sizeof(dh)); if (bytes != sizeof(dh)) { LOG(LOG_LEVEL_ERROR, "g_save_to_bpp: write error"); } data += stride_bytes * height; data -= stride_bytes; if ((depth == 24) && (bits_per_pixel == 32)) { line = (char *) g_malloc_nofail(file_stride_bytes); memset(line, 0, file_stride_bytes); for (index = 0; index < height; index++) { line_ptr = line; for (i1 = 0; i1 < width; i1++) { pixel = ((int *)data)[i1]; *(line_ptr++) = (pixel >> 0) & 0xff; *(line_ptr++) = (pixel >> 8) & 0xff; *(line_ptr++) = (pixel >> 16) & 0xff; } bytes = write(fd, line, file_stride_bytes); if (bytes != file_stride_bytes) { LOG(LOG_LEVEL_ERROR, "g_save_to_bpp: write error"); } data -= stride_bytes; } free(line); } else if (depth == bits_per_pixel) { for (index = 0; index < height; index++) { bytes = write(fd, data, width * (bits_per_pixel / 8)); if (bytes != width * (bits_per_pixel / 8)) { LOG(LOG_LEVEL_ERROR, "g_save_to_bpp: write error"); } data -= stride_bytes; } } else { LOG(LOG_LEVEL_ERROR, "g_save_to_bpp: unimplemented for: depth %d, bits_per_pixel %d", depth, bits_per_pixel); } close(fd); return 0; } /*****************************************************************************/ /* returns pointer or nil on error */ void * g_shmat(int shmid) { #if defined(_WIN32) return 0; #else return shmat(shmid, 0, 0); #endif } /*****************************************************************************/ /* returns -1 on error 0 on success */ int g_shmdt(const void *shmaddr) { #if defined(_WIN32) return -1; #else return shmdt(shmaddr); #endif } /*****************************************************************************/ /* returns -1 on error 0 on success */ int g_gethostname(char *name, int len) { return gethostname(name, len); } static unsigned char g_reverse_byte[0x100] = { 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff }; /*****************************************************************************/ /* mirror each byte while copying */ int g_mirror_memcpy(void *dst, const void *src, int len) { tui8 *dst8; const tui8 *src8; dst8 = (tui8 *) dst; src8 = (const tui8 *) src; while (len > 0) { *dst8 = g_reverse_byte[*src8]; dst8++; src8++; len--; } return 0; } /*****************************************************************************/ int g_tcp4_socket(void) { #if defined(XRDP_ENABLE_IPV6ONLY) return -1; #else return socket(AF_INET, SOCK_STREAM, 0); #endif } /*****************************************************************************/ int g_tcp4_bind_address(int sck, const char *port, const char *address) { #if defined(XRDP_ENABLE_IPV6ONLY) return -1; #else struct sockaddr_in s; memset(&s, 0, sizeof(s)); s.sin_family = AF_INET; s.sin_addr.s_addr = htonl(INADDR_ANY); s.sin_port = htons((uint16_t) atoi(port)); if (inet_aton(address, &s.sin_addr) < 0) { return -1; /* bad address */ } if (bind(sck, (struct sockaddr *) &s, sizeof(s)) < 0) { return -1; } return 0; #endif } /*****************************************************************************/ int g_tcp6_socket(void) { #if defined(XRDP_ENABLE_IPV6) int rv; int option_value; socklen_t option_len; rv = socket(AF_INET6, SOCK_STREAM, 0); if (rv < 0) { return -1; } option_len = sizeof(option_value); if (getsockopt(rv, IPPROTO_IPV6, IPV6_V6ONLY, (char *) &option_value, &option_len) == 0) { #if defined(XRDP_ENABLE_IPV6ONLY) if (option_value == 0) { option_value = 1; #else if (option_value != 0) { option_value = 0; #endif option_len = sizeof(option_value); if (setsockopt(rv, IPPROTO_IPV6, IPV6_V6ONLY, (char *) &option_value, option_len) < 0) { } } } return rv; #else return -1; #endif } /*****************************************************************************/ int g_tcp6_bind_address(int sck, const char *port, const char *address) { #if defined(XRDP_ENABLE_IPV6) int rv; int error; struct addrinfo hints; struct addrinfo *list; struct addrinfo *i; rv = -1; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_flags = 0; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; error = getaddrinfo(address, port, &hints, &list); if (error == 0) { i = list; while ((i != NULL) && (rv < 0)) { rv = bind(sck, i->ai_addr, i->ai_addrlen); i = i->ai_next; } freeaddrinfo(list); } else { return -1; } return rv; #else return -1; #endif } /*****************************************************************************/ /* returns error, zero is success, non zero is error */ /* only works in linux */ int g_no_new_privs(void) { #if defined(HAVE_SYS_PRCTL_H) && defined(PR_SET_NO_NEW_PRIVS) /* * PR_SET_NO_NEW_PRIVS requires Linux kernel 3.5 and newer. */ return prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); #else return 0; #endif } /*****************************************************************************/ int g_fips_mode_enabled(void) { int rv = 0; #if defined (__linux) char buff[16]; int fd = open("/proc/sys/crypto/fips_enabled", O_RDONLY); if (fd >= 0) { ssize_t res = read(fd, buff, sizeof(buff)); if (res > 0 && (size_t)res < sizeof(buff)) { rv = (buff[0] != '0'); } close(fd); } #endif return rv; } /*****************************************************************************/ void g_qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *)) { qsort(base, nitems, size, compar); } /*****************************************************************************/ struct list * g_readdir(const char *dir) { DIR *handle; struct list *result = NULL; struct dirent *dent; int saved_errno; errno = 0; // See readdir(3) if ((handle = opendir(dir)) != NULL && (result = list_create()) != NULL) { result->auto_free = 1; while (1) { errno = 0; dent = readdir(handle); if (dent == NULL) { break; // errno = 0 for end-of-dir, or != 0 for error } // Ignore '.' and '..' if (dent->d_name[0] == '.' && dent->d_name[1] == '\0') { continue; } if (dent->d_name[0] == '.' && dent->d_name[1] == '.' && dent->d_name[2] == '\0') { continue; } if (!list_add_strdup(result, dent->d_name)) { // Memory allocation failure errno = ENOMEM; break; } } } saved_errno = errno; if (errno != 0) { list_delete(result); result = NULL; } if (handle != NULL) { closedir(handle); } errno = saved_errno; return result; } /******************************************************************************/ oom_type g_set_out_of_memory_handler(oom_type new_handler) { oom_type old_handler = g_out_of_memory_handler; g_out_of_memory_handler = new_handler; return old_handler; } /******************************************************************************/ static void out_of_memory(void) { if (g_out_of_memory_handler != NULL) { g_out_of_memory_handler(); _exit(1); } else { abort(); } } /******************************************************************************/ void * g_malloc_nofail(size_t size) { void *res = malloc(size); if (res == NULL) { LOG(LOG_LEVEL_ALWAYS, "g_malloc_nofail() can't allocate %zu bytes", size); out_of_memory(); } return res; } /******************************************************************************/ void * g_calloc_nofail(size_t nmemb, size_t size) { void *res = calloc(nmemb, size); if (res == NULL) { LOG(LOG_LEVEL_ALWAYS, "g_calloc_nofail() can't allocate %zu * %zu bytes", nmemb, size); out_of_memory(); } return res; } ================================================ FILE: common/os_calls.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * generic operating system calls */ #if !defined(OS_CALLS_H) #define OS_CALLS_H #include "arch.h" enum proc_exit_reason { E_PXR_STATUS_CODE = 0, ///< 'val' contains exit status E_PXR_SIGNAL, ///< 'val' contains a signal number E_PXR_UNEXPECTED }; struct proc_exit_status { enum proc_exit_reason reason; int val; }; struct list; /** Out-of-memory handler type */ typedef void (*oom_type)(void); #define g_tcp_can_recv g_sck_can_recv #define g_tcp_can_send g_sck_can_send #define g_tcp_recv g_sck_recv #define g_tcp_send g_sck_send #define g_tcp_close g_sck_close #define g_tcp_last_error_would_block g_sck_last_error_would_block #define g_tcp_set_non_blocking g_sck_set_non_blocking #define g_tcp_local_socket g_sck_local_socket #define g_tcp_local_connect g_sck_local_connect #define g_tcp_listen g_sck_listen #define g_tcp_local_bind g_sck_local_bind #define g_tcp_select g_sck_select #define g_close_wait_obj g_delete_wait_obj int g_rm_temp_dir(void); void g_init(const char *app_name); void g_deinit(void); void g_printf(const char *format, ...) printflike(1, 2); void g_sprintf(char *dest, const char *format, ...) \ printflike(2, 3); int g_snprintf(char *dest, int len, const char *format, ...) \ printflike(3, 4); void g_writeln(const char *format, ...) printflike(1, 2); void g_write(const char *format, ...) printflike(1, 2); void g_hexdump(const char *p, int len); int g_getchar(void); int g_tcp_set_no_delay(int sck); int g_tcp_set_keepalive(int sck); int g_tcp_socket(void); int g_sck_set_send_buffer_bytes(int sck, int bytes); int g_sck_get_send_buffer_bytes(int sck, int *bytes); int g_sck_set_recv_buffer_bytes(int sck, int bytes); int g_sck_get_recv_buffer_bytes(int sck, int *bytes); /** * Set SO_REUSEADDR for a socket * * Use before binding, if appropriate. * @param sck Socket * @return 0 for success */ int g_sck_set_reuseaddr(int sck); int g_sck_local_socket(void); int g_sck_local_socketpair(int sck[2]); int g_sck_vsock_socket(void); int g_sck_get_peer_cred(int sck, int *pid, int *uid, int *gid); void g_sck_close(int sck); int g_tcp_connect(int sck, const char *address, const char *port); int g_sck_local_connect(int sck, const char *port); int g_sck_set_non_blocking(int sck); int g_tcp_bind(int sck, const char *port); int g_sck_local_bind(int sck, const char *port); int g_sck_vsock_bind(int sck, const char *port); int g_sck_vsock_bind_address(int sck, const char *port, const char *address); int g_tcp_bind_address(int sck, const char *port, const char *address); int g_sck_listen(int sck); int g_sck_accept(int sck); int g_sck_recv(int sck, void *ptr, unsigned int len, int flags); int g_sck_send(int sck, const void *ptr, unsigned int len, int flags); /** * Receives data and file descriptors on a unix domain socket * * @param sck - Socket to receive data + file descriptors from * @param ptr - Pointer to buffer for incoming data * @param len - Length of data. Must be > 0 * @param[out] fds - Array of file descriptors * @param [in] maxfd - Max number of elements in fds * @param[out] fdcount - Actual number of file descriptors received * @return Bytes received, or < 0 for error. * * If the result is > 0 but less than len, the file descriptors have * been received. Get the rest of the data with normal g_sck_recv() calls. * * fdcount may be more that maxfd. This indicates that more file descriptors * were received than there was space for. The excess file descriptors * are closed and discarded. */ int g_sck_recv_fd_set(int sck, void *ptr, unsigned int len, int fds[], unsigned int maxfd, unsigned int *fdcount); /** * Sends data and file descriptors on a unix domain socket * * @param sck - Socket to send data + file descriptors on * @param ptr - Data to send * @param len - Length of data. Must be > 0 * @param fds - Array of file descriptors * @param fdcount - Number of file descriptors * @return Bytes sent, or < 0 for error. * * If the result is > 0 but less than len, the file descriptors have * been sent. Send the rest of the data with normal g_sck_send() calls. */ int g_sck_send_fd_set(int sck, const void *ptr, unsigned int len, int fds[], unsigned int fdcount); int g_alloc_shm_map_fd(void **addr, int *fd, size_t size); int g_sck_last_error_would_block(int sck); int g_sck_socket_ok(int sck); /** * Checks socket writeability with an optional wait * * @param sck - Socket to check * @param millis - Maximum milliseconds to wait for writeability to be true * * @note The wait time may not be reached in the event of an incoming signal * so do not use this call to impose a hard timeout */ int g_sck_can_send(int sck, int millis); /** * Checks socket readability with an optional wait * * @param sck - Socket to check * @param millis - Maximum milliseconds to wait for readability to be true * * @note The wait time may not be reached in the event of an incoming signal * so do not use this call to impose a hard timeout */ int g_sck_can_recv(int sck, int millis); int g_sck_select(int sck1, int sck2); /** * Gets the IP address of a connected peer, if it has one * @param sck File descriptor for peer * @param ip buffer to write IP address to * @param bytes Size of ip buffer. Should be at least MAX_IP_ADDRSTRLEN * @param[out] port Optional variable to receive the port number * @return Pointer to IP for convenience * * If the peer has no IP address (for example, it is a Unix Domain Socket), * or the specified buffer is too small, the returned string is "" */ const char * g_sck_get_peer_ip_address(int sck, char *ip, unsigned int bytes, unsigned short *port); /** * Gets a description for a connected peer * @param sck File descriptor for peer * @param desc buffer to write description to * @param bytes Size of description buffer. Should be at least * MAX_PEER_DESCSTRLEN * @return Pointer to desc for convenience * * Unlike g_sck_get_peer_ip_address(), this will return a * description of some sort for any socket type. */ const char * g_sck_get_peer_description(int sck, char *desc, unsigned int bytes); /** * Sleep for the specified number of milli-seconds * @param msecs Milli-seconds * * If a signal is processed, it is possible that this call will * sleep for less than the specified number of milli-seconds. This * is platform-specific */ void g_sleep(int msecs); int g_pipe(int fd[2]); // Wait objects with this value are ignored by // g_set_wait_obj() / g_reset_wait_obj() / g_is_wait_obj_set() / // g_delete_wait_obj() #define NULL_WAIT_OBJ (tintptr)0 tintptr g_create_wait_obj(const char *name); tintptr g_create_wait_obj_from_socket(tintptr socket, int write); void g_delete_wait_obj_from_socket(tintptr wait_obj); int g_set_wait_obj(tintptr obj); int g_reset_wait_obj(tintptr obj); int g_is_wait_obj_set(tintptr obj); int g_delete_wait_obj(tintptr obj); /** * Wait for the specified readable and writeable objs * * The wait finishes when at least one of the objects becomes * readable or writeable * * @param read_objs Array of read objects * @param rcount Number of elements in read_objs * @param write_objs Array of write objects * @param wcount Number of elements in write_objs * @param mstimeout Timeout in milliseconds. < 0 means an infinite timeout. * * @return 0 for success. The objects will need to be polled to * find out what is readable or writeable. * * An mstimeout of zero will return immediately, although * error conditions may be checked for. */ int g_obj_wait(tintptr *read_objs, int rcount, tintptr *write_objs, int wcount, int mstimeout); void g_random(char *data, int len); int g_abs(int i); int g_memcmp(const void *s1, const void *s2, int len); int g_file_open_rw(const char *file_name); int g_file_open_ex(const char *file_name, int aread, int awrite, int acreate, int atrunc); int g_file_open_ro(const char *file_name); int g_file_close(int fd); /** * Returns 1 if a file is open (i.e. the file descriptor is valid) * @param fd File descriptor * @return 1 for file open, 0 for not open */ int g_file_is_open(int fd); int g_file_read(int fd, char *ptr, int len); int g_file_write(int fd, const char *ptr, int len); int g_file_seek(int fd, int offset); int g_file_seek_end(int fd, int offset); int g_file_lock(int fd, int start, int len); int g_file_map(int fd, int aread, int awrite, size_t length, void **addr); int g_munmap(void *addr, size_t length); int g_file_duplicate_on(int fd, int target_fd); int g_file_get_cloexec(int fd); int g_file_set_cloexec(int fd, int status); /** * Get a list of open file descriptors * * @param min Min FD to consider * @param max Max FD to consider (+1), or -1 for no limit * @result Array of file descriptors, in ascending order. * * Call delete_list() on the result when you've finished with it. */ struct list *g_get_open_fds(int min, int max); int g_chmod_hex(const char *filename, int flags); int g_umask_hex(int flags); int g_chown(const char *name, int uid, int gid); int g_mkdir(const char *dirname); char *g_get_current_dir(char *dirname, int maxlen); int g_set_current_dir(const char *dirname); int g_file_exist(const char *filename); int g_file_readable(const char *filename); int g_directory_exist(const char *dirname); int g_executable_exist(const char *dirname); int g_socket_exist(const char *dirname); int g_create_dir(const char *dirname); int g_create_path(const char *path); int g_remove_dir(const char *dirname); int g_file_delete(const char *filename); int g_file_get_size(const char *filename); int g_file_get_device_number(const char *filename); int g_file_get_inode_num(const char *filename); long g_load_library(char *in); int g_free_library(long lib); void *g_get_proc_address(long lib, const char *name); int g_system(const char *aexec); char *g_get_strerror(void); int g_get_errno(void); int g_execvp(const char *p1, char *args[]); /** * Issues an execvp() call * * @param file Executable * @param argv Argument list for executable. * * argv does not need to be NULL terminated - the call takes care * of this. * * @return Only if an error has occurred - use g_get_errno() or equivalent */ int g_execvp_list(const char *file, struct list *argv); int g_execlp3(const char *a1, const char *a2, const char *a3); /** * Set an alarm using SIGALRM * @param func Signal handler, or NULL to cancel an alarm * @param secs Number of seconds until an alarm is raised * @return Number of seconds remaining before a previously requested * alarm is raised */ unsigned int g_set_alarm(void (*func)(int), unsigned int secs); /** * Set a handler up for SIGCHLD * @param func signal handler, or NULL to restore the default handler * The handler remains in place until explicitly replaced. */ void g_signal_child_stop(void (*func)(int)); /** * Set a handler up for SIGSEGV * @param func signal handler, or NULL to restore the default handler * The handler can only be called once, at which point the * default handler is restored. This is to avoid infinite loops */ void g_signal_segfault(void (*func)(int)); /** * Set a handler up for SIGHUP * @param func signal handler, or NULL to restore the default handler * The handler remains in place until explicitly replaced. */ void g_signal_hang_up(void (*func)(int)); /** * Set a handler up for SIGINT * @param func signal handler, or NULL to restore the default handler * The handler remains in place until explicitly replaced. */ void g_signal_user_interrupt(void (*func)(int)); /** * Set a handler up for SIGTERM * @param func signal handler, or NULL to restore the default handler * The handler remains in place until explicitly replaced. */ void g_signal_terminate(void (*func)(int)); /** * Set a handler up for SIGPIPE * @param func signal handler, or NULL to restore the default handler * The handler remains in place until explicitly replaced. */ void g_signal_pipe(void (*func)(int)); /** * Set a handler up for SIGUSR1 * @param func signal handler, or NULL to restore the default handler * The handler remains in place until explicitly replaced. */ void g_signal_usr1(void (*func)(int)); int g_fork(void); int g_setgid(int pid); int g_drop_privileges(const char *user, const char *group); int g_initgroups(const char *user); int g_getuid(void); int g_getgid(void); int g_setuid(int pid); int g_setsid(void); int g_getlogin(char *name, unsigned int len); int g_setlogin(const char *name); #ifdef HAVE_SETUSERCONTEXT /** Sets the login user context (BSD systems only) * @param uid UID of suer * @return 0 for success */ int g_set_allusercontext(int uid); #endif int g_waitchild(struct proc_exit_status *e); int g_waitpid(int pid); struct proc_exit_status g_waitpid_status(int pid); /* * Sets the process group ID of the indicated process to the specified value. * (POSIX.1) * * Errors are logged. * * May do nothing if process groups are not supported */ int g_setpgid(int pid, int pgid); void g_clearenv(void); int g_setenv(const char *name, const char *value, int rewrite); char *g_getenv(const char *name); /** * Calls g_setenv(), logging failures * * @param name Name to set * @param value String to set $name to * @param rewrite Set to non-zero to allow rewriting of existing names * * Unlike g_setenv() this function returns no value. Use this function if the * only reasonable thing to do on failure is to log it. */ void g_setenv_log(const char *name, const char *value, int rewrite); int g_exit(int exit_code); int g_getpid(void); int g_sigterm(int pid); int g_sighup(int pid); /* * Is a particular PID active? * @param pid PID to check * Returns boolean */ int g_pid_is_active(int pid); int g_getuser_info_by_name(const char *username, int *uid, int *gid, char **shell, char **dir, char **gecos); int g_getuser_info_by_uid(int uid, char **username, int *gid, char **shell, char **dir, char **gecos); int g_getgroup_info(const char *groupname, int *gid); /** * Checks whether a user is in the specified group * @param username Name of user * @param gid GID of group * @param[out] ok Whether user is in group * @return Non-zero if a system error occurred. In this instance OK is not set * * Primary group of username is also checked */ int g_check_user_in_group(const char *username, int gid, int *ok); /** * Gets elapsed milliseconds since some arbitrary point in the past * * The returned value is unaffected by leap-seconds or time zone changes. * * @return elaped ms since some arbitrary point * * Calculate the duration of a task by calling this routine before and * after the task, and subtracting the two values. * * The value wraps every so often (every 49.7 days on a 32-bit system), * but as we are using unsigned arithmetic, the difference of any of these * two values can be used to calculate elapsed time, whether-or-not a wrap * occurs during the interval - provided of course the time being measured * is less than the total wrap-around interval. */ unsigned int g_get_elapsed_ms(void); int g_save_to_bmp(const char *filename, char *data, int stride_bytes, int width, int height, int depth, int bits_per_pixel); void *g_shmat(int shmid); int g_shmdt(const void *shmaddr); int g_gethostname(char *name, int len); int g_mirror_memcpy(void *dst, const void *src, int len); int g_tcp4_socket(void); int g_tcp4_bind_address(int sck, const char *port, const char *address); int g_tcp6_socket(void); int g_tcp6_bind_address(int sck, const char *port, const char *address); int g_no_new_privs(void); /** * Query whether FIPS mode is enabled * * In FIPS mode, some cryptographic algorithms are disabled * * @return 1 -> FIPS mode enabled, 0 -> FIPS mode disabled or unknown */ int g_fips_mode_enabled(void); void g_qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *)); /** * Returns a list of the filenames contained within a directory * * @param dir Name of directory * @return list of directory entry names * * If NULL is returned, further information may be available in errno. No * other errors are specifically logged. * The special files '.' and '..' are not returned. */ struct list * g_readdir(const char *dir); /** Set the out-of-memory handler * @param new_handler Function to call if a memory allocation fails * @result old handler or NULL if none. * * After calling an out-of-memory handler, the program exits * If no out-of-memory handler is set, the program aborts * * Only use this function if there is urgent cleaning-up that must be done * before the program exits. */ oom_type g_set_out_of_memory_handler(oom_type new_handler); /** Allocate memory with error-checking * * @param size Size of memory to allocate * @return Allocated memory * * If memory cannot be allocated, the out-of-memory handler is called and * the program exits * * Only use this function if you are unable to handle an out-of-memory * condition. */ void * g_malloc_nofail(size_t size); /** Allocate memory with error-checking * * @param nmemb Number of elements to allocate * @param size Size of each element * @return Allocated memory * * If memory cannot be allocated, the out-of-memory handler is called and * the program exits * * Only use this function if you are unable to handle an out-of-memory * condition. */ void * g_calloc_nofail(size_t nmemb, size_t size); /* glib-style wrappers */ #define g_new(struct_type, n_structs) \ (struct_type *) g_malloc_nofail(sizeof(struct_type) * (n_structs)) #define g_new0(struct_type, n_structs) \ (struct_type *) g_calloc_nofail((n_structs), sizeof(struct_type)) /* remove these when no longer used */ #define g_malloc(_size, _zero) \ (_zero ? g_calloc_nofail(1, _size) : g_malloc_nofail(_size)) #define g_free free #define g_memset memset #define g_memcpy memcpy #define g_memmove memmove #endif ================================================ FILE: common/parse.c ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) 2021 Matt Burt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Enforce stream primitive checking */ #if defined(HAVE_CONFIG_H) #include #endif #include #include "arch.h" #include "parse.h" #include "log.h" #include "string_calls.h" #include "unicode_defines.h" /******************************************************************************/ #if defined(B_ENDIAN) || defined(NEED_ALIGN) #define out_uint16_le_unchecked(s, v) do \ { \ *((s)->p) = (unsigned char)((v) >> 0); \ (s)->p++; \ *((s)->p) = (unsigned char)((v) >> 8); \ (s)->p++; \ } while (0) #else #define out_uint16_le_unchecked(s, v) do \ { \ *((unsigned short*)((s)->p)) = (unsigned short)(v); \ (s)->p += 2; \ } while (0) #endif /******************************************************************************/ #if defined(B_ENDIAN) || defined(NEED_ALIGN) #define in_uint16_le_unchecked(s, v) do \ { \ (v) = (unsigned short) \ ( \ (*((unsigned char*)((s)->p + 0)) << 0) | \ (*((unsigned char*)((s)->p + 1)) << 8) \ ); \ (s)->p += 2; \ } while (0) #else #define in_uint16_le_unchecked(s, v) do \ { \ (v) = *((unsigned short*)((s)->p)); \ (s)->p += 2; \ } while (0) #endif /******************************************************************************/ void parser_stream_overflow_check(const struct stream *s, int n, int is_out, const char *file, int line) { /* Sanity checks */ if (n < 0) { LOG(LOG_LEVEL_ALWAYS, "%s:%d " "stream primitive called with negative n=%d", file, line, n); abort(); } if (is_out) { /* Output overflow */ if (!s_check_rem_out(s, n)) { LOG(LOG_LEVEL_ALWAYS, "%s:%d Stream output buffer overflow. " "Size=%d, pos=%d, requested=%d", file, line, s->size, (int)(s->p - s->data), n); abort(); } } else { /* Input overflow */ if (!s_check_rem(s, n)) { LOG(LOG_LEVEL_ALWAYS, "%s:%d Stream input buffer overflow. " "Max=%d, pos=%d, requested=%d", file, line, (int)(s->end - s->data), (int)(s->p - s->data), n); abort(); } } } /******************************************************************************/ void out_utf8_as_utf16_le_proc(struct stream *s, const char *v, unsigned int vn, const char *file, int line) { // Expansion of S_CHECK_REM_OUT(s, ) using passed-in // file and line #ifdef USE_DEVEL_STREAMCHECK int octet_cnt = utf8_as_utf16_word_count(v, vn) * 2; parser_stream_overflow_check(s, octet_cnt, 1, file, line); #endif while (vn > 0) { char32_t c32 = utf8_get_next_char(&v, &vn); char16_t low; if (c32 < 0x10000) { low = (char16_t)c32; } else { /* Need a surrogate pair */ low = LOW_SURROGATE_FROM_C32(c32); char16_t high = HIGH_SURROGATE_FROM_C32(c32); out_uint16_le_unchecked(s, high); } out_uint16_le_unchecked(s, low); } } /******************************************************************************/ /** * Gets the next Unicode character from a code stream * @param s Stream * @return Unicode character * * Non-characters and illegally coded characters are mapped to * UCS_REPLACEMENT_CHARACTER * * @pre Two bytes are assumed to be available on the stram on entry */ static char32_t get_c32_from_stream(struct stream *s) { char32_t c32 = UCS_REPLACEMENT_CHARACTER; // Assume failure char16_t w; in_uint16_le_unchecked(s, w); if (IS_HIGH_SURROGATE(w)) { if (s_check_rem(s, 2)) { char16_t low; in_uint16_le_unchecked(s, low); if (IS_LOW_SURROGATE(low)) { /* Valid surrogate pair */ char32_t v = C32_FROM_SURROGATE_PAIR(low, w); /* Ignore some values which can be successfully encoded * in this way */ if (!IS_PLANE_END_NON_CHARACTER(c32)) { c32 = v; } } else { /* Invalid low surrogate - pop character back */ s->p -= 2; } } } else if (!IS_LOW_SURROGATE(w) && !IS_PLANE_END_NON_CHARACTER(w) && !IS_ARABIC_NON_CHARACTER(w)) { /* Character from the Basic Multilingual Plane */ c32 = (char32_t)w; } return c32; } /******************************************************************************/ unsigned int in_utf16_le_fixed_as_utf8_proc(struct stream *s, unsigned int n, char *v, unsigned int vn, const char *file, int line) { unsigned int rv = 0; char32_t c32; char u8str[MAXLEN_UTF8_CHAR]; unsigned int u8len; char *saved_s_end = s->end; // Expansion of S_CHECK_REM(s, n*2) using passed-in file and line #ifdef USE_DEVEL_STREAMCHECK parser_stream_overflow_check(s, n * 2, 0, file, line); #endif // Temporarily set the stream end pointer to allow us to use // s_check_rem() when reading in UTF-16 words if (s->end - s->p > (int)(n * 2)) { s->end = s->p + (int)(n * 2); } while (s_check_rem(s, 2)) { c32 = get_c32_from_stream(s); u8len = utf_char32_to_utf8(c32, u8str); if (u8len + 1 <= vn) { /* Room for this character and a terminator. Add the character */ unsigned int i; for (i = 0 ; i < u8len ; ++i) { v[i] = u8str[i]; } vn -= u8len; v += u8len; } else if (vn > 1) { /* We've skipped a character, but there's more than one byte * remaining in the output buffer. Mark the output buffer as * full so we don't get a smaller character being squeezed into * the remaining space */ vn = 1; } rv += u8len; } // Restore stream to full length s->end = saved_s_end; if (vn > 0) { *v = '\0'; } ++rv; return rv; } /******************************************************************************/ unsigned int in_utf16_le_fixed_as_utf8_length(struct stream *s, unsigned int n) { char *saved_s_p = s->p; unsigned int rv = in_utf16_le_fixed_as_utf8(s, n, NULL, 0); s->p = saved_s_p; return rv; } /******************************************************************************/ unsigned int in_utf16_le_terminated_as_utf8(struct stream *s, char *v, unsigned int vn) { unsigned int rv = 0; char32_t c32; char u8str[MAXLEN_UTF8_CHAR]; unsigned int u8len; while (s_check_rem(s, 2)) { c32 = get_c32_from_stream(s); if (c32 == 0) { break; // Terminator encountered } u8len = utf_char32_to_utf8(c32, u8str); if (u8len + 1 <= vn) { /* Room for this character and a terminator. Add the character */ unsigned int i; for (i = 0 ; i < u8len ; ++i) { v[i] = u8str[i]; } vn -= u8len; v += u8len; } else if (vn > 1) { /* We've skipped a character, but there's more than one byte * remaining in the output buffer. Mark the output buffer as * full so we don't get a smaller character being squeezed into * the remaining space */ vn = 1; } rv += u8len; } if (vn > 0) { *v = '\0'; } ++rv; return rv; } /******************************************************************************/ unsigned int in_utf16_le_terminated_as_utf8_length(struct stream *s) { char *saved_s_p = s->p; unsigned int rv = in_utf16_le_terminated_as_utf8(s, NULL, 0); s->p = saved_s_p; return rv; } ================================================ FILE: common/parse.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Parsing structs and macros * * based on parse.h from rdesktop * this is a super fast stream method, you bet * needed functions g_malloc, g_free, g_memset, g_memcpy */ #if !defined(PARSE_H) #define PARSE_H #include "arch.h" #include "log.h" /* Check the config_ac.h file is included so we know whether to enable the * development macros */ #ifndef CONFIG_AC_H # error config_ac.h not visible in parse.h #endif #if defined(L_ENDIAN) #elif defined(B_ENDIAN) #else #error Unknown endianness. #endif /* parser state */ struct stream { char *p; char *end; char *data; int size; int pad0; /* offsets of various headers */ char *iso_hdr; char *mcs_hdr; char *sec_hdr; char *rdp_hdr; char *channel_hdr; /* other */ char *next_packet; struct stream *next; int *source; }; /** Check arguments to stream primitives * * This adds a function call overhead to every stream primitive and is * intended for development only * * @param s stream * @param n Bytes being requested for input/output * @param is_out (0=input, !0=output) * @param file __file__for caller * @param line __line__ for caller * * On any kind of violation a message is output and the program is * aborted. */ void parser_stream_overflow_check(const struct stream *s, int n, int is_out, const char *file, int line); #ifdef USE_DEVEL_STREAMCHECK # define S_CHECK_REM(s,n) \ parser_stream_overflow_check((s), (n), 0, __FILE__, __LINE__) # define S_CHECK_REM_OUT(s,n) \ parser_stream_overflow_check((s), (n), 1, __FILE__, __LINE__) #else # define S_CHECK_REM(s,n) # define S_CHECK_REM_OUT(s,n) #endif /******************************************************************************/ /** * Copies a UTF-8 string to a stream as little-endian UTF-16 * * @param s Stream * @param v UTF-8 string * @param vn Length of UTF-8 string. * @param file Caller location (from __FILE__) * @param line Caller location (from __LINE__) * * Caller is expected to check there is room for the result in s */ void out_utf8_as_utf16_le_proc(struct stream *s, const char *v, unsigned int vn, const char *file, int line); #define out_utf8_as_utf16_le(s,v,vn) \ out_utf8_as_utf16_le_proc((s), (v), (vn), __FILE__, __LINE__) /******************************************************************************/ /** * Copies a fixed-size little-endian UTF-16 string from a stream as UTF-8 * * @param s Stream * @param n Number of 16-bit words to copy * @param v Pointer to result buffer * @param vn Max size of result buffer * * @return number of characters which would be written to v, INCLUDING * an additional terminator. This can be used to check for a buffer * overflow. A terminator is added whether or not the input * includes one. * * Output is unconditionally NULL-terminated. * Input is not checked for NULLs - these are copied verbatim */ unsigned int in_utf16_le_fixed_as_utf8_proc(struct stream *s, unsigned int n, char *v, unsigned int vn, const char *file, int line); #define in_utf16_le_fixed_as_utf8(s,n,v,vn) \ in_utf16_le_fixed_as_utf8_proc((s), (n), (v), (vn), __FILE__, __LINE__) /******************************************************************************/ /** * Returns the size of the buffer needed to store a fixed-size * little-endian UTF-16 string in a stream as a UTF-8 string * * @param s Stream * @param n Number of 16-bit words to consider * @return number of characters needed to store the UTF-8 string. This * includes a terminator, which is written whether the parsed * string includes one or not. * @post Stream position is not moved between start and end of this call */ unsigned int in_utf16_le_fixed_as_utf8_length(struct stream *s, unsigned int n); /******************************************************************************/ /** * Copies a terminated little-endian UTF-16 string from a stream as UTF-8 * * @param s Stream * @param v Pointer to result buffer * @param vn Max size of result buffer * * @return number of characters which would be written to v, INCLUDING * the terminator. This can be used to check for a buffer overflow. * * Output is unconditionally NULL-terminated. * Input processing stops when a NULL is encountered, or the end of the buffer * is reached. */ unsigned int in_utf16_le_terminated_as_utf8(struct stream *s, char *v, unsigned int vn); /******************************************************************************/ /** * Returns the size of the buffer needed to store a terminated * little-endian UTF-16 string in a stream as a terminated UTF-8 string * * @param s Stream * @return number of characters needed to store the UTF-8 string, * including the terminator * @post Stream position is not moved between start and end of this call * * Input processing stops when a NULL is encountered, or the end of the buffer * is reached. */ unsigned int in_utf16_le_terminated_as_utf8_length(struct stream *s); /******************************************************************************/ #define s_check_rem(s, n) ((s)->p + (n) <= (s)->end) /******************************************************************************/ /** * @returns true if there are at least n bytes remaining in the stream, * else false and logs an error message */ #define s_check_rem_and_log(s, n, msg_prefix) \ ( s_check_rem((s), (n)) ? \ 1 : \ LOG(LOG_LEVEL_ERROR, \ "%s Not enough bytes in the stream: expected %d, remaining %d", \ (msg_prefix), (n), s_rem(s)) \ && 0 ) /******************************************************************************/ #define s_check_rem_out(s, n) ((s)->p + (n) <= (s)->data + (s)->size) /******************************************************************************/ /** * @returns true if there are at least n bytes remaining in the stream, * else false and logs an error message */ #define s_check_rem_out_and_log(s, n, msg_prefix) \ ( s_check_rem_out((s), (n)) ? \ 1 : \ LOG(LOG_LEVEL_ERROR, \ "%s Not enough bytes in the stream: expected %d, remaining %d", \ (msg_prefix), (n), s_rem_out(s)) \ && 0 ) /******************************************************************************/ #define s_check_end(s) ((s)->p == (s)->end) /******************************************************************************/ /** * @returns true if there are exactly 0 bytes remaining in the stream, * else false and logs an error message */ #define s_check_end_and_log(s, msg_prefix) \ ( s_check_end((s)) ? \ 1 : \ LOG(LOG_LEVEL_ERROR, \ "%s Expected to be at the end of the stream, " \ "but there are %d bytes remaining", \ (msg_prefix), s_rem(s)) \ && 0 ) /******************************************************************************/ #define s_rem(s) ((int) ((s)->end - (s)->p)) /******************************************************************************/ #define s_rem_out(s) ((int) ((s)->data + (s)->size - (s)->p)) /******************************************************************************/ #define make_stream(s) \ (s) = (struct stream*)g_malloc(sizeof(struct stream), 1) /******************************************************************************/ #define init_stream(s, v) do \ { \ if ((v) > (s)->size) \ { \ g_free((s)->data); \ (s)->data = (char*)g_malloc((v), 0); \ (s)->size = (v); \ } \ (s)->p = (s)->data; \ (s)->end = (s)->data; \ (s)->next_packet = 0; \ } while (0) /******************************************************************************/ #define free_stream(s) do \ { \ if ((s) != 0) \ { \ g_free((s)->data); \ } \ g_free((s)); \ } while (0) /******************************************************************************/ #define s_push_layer(s, h, n) do \ { \ (s)->h = (s)->p; \ (s)->p += (n); \ } while (0) /******************************************************************************/ #define s_pop_layer(s, h) \ (s)->p = (s)->h /******************************************************************************/ #define s_mark_end(s) \ (s)->end = (s)->p #define in_sint8(s, v) do \ { \ S_CHECK_REM((s), 1); \ (v) = *((signed char*)((s)->p)); \ (s)->p++; \ } while (0) /******************************************************************************/ #define in_uint8(s, v) do \ { \ S_CHECK_REM((s), 1); \ (v) = *((unsigned char*)((s)->p)); \ (s)->p++; \ } while (0) /******************************************************************************/ #define in_uint8_peek(s, v) do \ { \ S_CHECK_REM((s), 1); \ v = *s->p; \ } while (0) /******************************************************************************/ #if defined(B_ENDIAN) || defined(NEED_ALIGN) #define in_sint16_le(s, v) do \ { \ S_CHECK_REM((s), 2); \ (v) = (signed short) \ ( \ (*((unsigned char*)((s)->p + 0)) << 0) | \ (*((unsigned char*)((s)->p + 1)) << 8) \ ); \ (s)->p += 2; \ } while (0) #else #define in_sint16_le(s, v) do \ { \ S_CHECK_REM((s), 2); \ (v) = *((signed short*)((s)->p)); \ (s)->p += 2; \ } while (0) #endif /******************************************************************************/ #if defined(B_ENDIAN) || defined(NEED_ALIGN) #define in_uint16_le(s, v) do \ { \ S_CHECK_REM((s), 2); \ (v) = (unsigned short) \ ( \ (*((unsigned char*)((s)->p + 0)) << 0) | \ (*((unsigned char*)((s)->p + 1)) << 8) \ ); \ (s)->p += 2; \ } while (0) #else #define in_uint16_le(s, v) do \ { \ S_CHECK_REM((s), 2); \ (v) = *((unsigned short*)((s)->p)); \ (s)->p += 2; \ } while (0) #endif /******************************************************************************/ #define in_uint16_be(s, v) do \ { \ S_CHECK_REM((s), 2); \ (v) = *((unsigned char*)((s)->p)); \ (s)->p++; \ (v) <<= 8; \ (v) |= *((unsigned char*)((s)->p)); \ (s)->p++; \ } while (0) /******************************************************************************/ #if defined(B_ENDIAN) || defined(NEED_ALIGN) #define in_uint32_le(s, v) do \ { \ S_CHECK_REM((s), 4); \ (v) = (unsigned int) \ ( \ (*((unsigned char*)((s)->p + 0)) << 0) | \ (*((unsigned char*)((s)->p + 1)) << 8) | \ (*((unsigned char*)((s)->p + 2)) << 16) | \ (*((unsigned char*)((s)->p + 3)) << 24) \ ); \ (s)->p += 4; \ } while (0) #else #define in_uint32_le(s, v) do \ { \ S_CHECK_REM((s), 4); \ (v) = *((unsigned int*)((s)->p)); \ (s)->p += 4; \ } while (0) #endif /******************************************************************************/ #if defined(B_ENDIAN) || defined(NEED_ALIGN) #define in_uint64_le(s, v) do \ { \ S_CHECK_REM((s), 8); \ (v) = (tui64) \ ( \ (((tui64)(*((unsigned char*)((s)->p + 0)))) << 0) | \ (((tui64)(*((unsigned char*)((s)->p + 1)))) << 8) | \ (((tui64)(*((unsigned char*)((s)->p + 2)))) << 16) | \ (((tui64)(*((unsigned char*)((s)->p + 3)))) << 24) | \ (((tui64)(*((unsigned char*)((s)->p + 4)))) << 32) | \ (((tui64)(*((unsigned char*)((s)->p + 5)))) << 40) | \ (((tui64)(*((unsigned char*)((s)->p + 6)))) << 48) | \ (((tui64)(*((unsigned char*)((s)->p + 7)))) << 56) \ ); \ (s)->p += 8; \ } while (0) #else #define in_uint64_le(s, v) do \ { \ S_CHECK_REM((s), 8); \ (v) = *((tui64*)((s)->p)); \ (s)->p += 8; \ } while (0) #endif /******************************************************************************/ #define in_uint32_be(s, v) do \ { \ S_CHECK_REM((s), 4); \ (v) = *((unsigned char*)((s)->p)); \ (s)->p++; \ (v) <<= 8; \ (v) |= *((unsigned char*)((s)->p)); \ (s)->p++; \ (v) <<= 8; \ (v) |= *((unsigned char*)((s)->p)); \ (s)->p++; \ (v) <<= 8; \ (v) |= *((unsigned char*)((s)->p)); \ (s)->p++; \ } while (0) /******************************************************************************/ #define out_uint8(s, v) do \ { \ S_CHECK_REM_OUT((s), 1); \ *((s)->p) = (unsigned char)(v); \ (s)->p++; \ } while (0) /******************************************************************************/ #if defined(B_ENDIAN) || defined(NEED_ALIGN) #define out_uint16_le(s, v) do \ { \ S_CHECK_REM_OUT((s), 2); \ *((s)->p) = (unsigned char)((v) >> 0); \ (s)->p++; \ *((s)->p) = (unsigned char)((v) >> 8); \ (s)->p++; \ } while (0) #else #define out_uint16_le(s, v) do \ { \ S_CHECK_REM_OUT((s), 2); \ *((unsigned short*)((s)->p)) = (unsigned short)(v); \ (s)->p += 2; \ } while (0) #endif /******************************************************************************/ #define out_uint16_be(s, v) do \ { \ S_CHECK_REM_OUT((s), 2); \ *((s)->p) = (unsigned char)((v) >> 8); \ (s)->p++; \ *((s)->p) = (unsigned char)((v) >> 0); \ (s)->p++; \ } while (0) /******************************************************************************/ #if defined(B_ENDIAN) || defined(NEED_ALIGN) #define out_uint32_le(s, v) do \ { \ S_CHECK_REM_OUT((s), 4); \ *((s)->p) = (unsigned char)((v) >> 0); \ (s)->p++; \ *((s)->p) = (unsigned char)((v) >> 8); \ (s)->p++; \ *((s)->p) = (unsigned char)((v) >> 16); \ (s)->p++; \ *((s)->p) = (unsigned char)((v) >> 24); \ (s)->p++; \ } while (0) #else #define out_uint32_le(s, v) do \ { \ S_CHECK_REM_OUT((s), 4); \ *((unsigned int*)((s)->p)) = (v); \ (s)->p += 4; \ } while (0) #endif /******************************************************************************/ #if defined(B_ENDIAN) || defined(NEED_ALIGN) #define out_uint64_le(s, v) do \ { \ S_CHECK_REM_OUT((s), 8); \ *((s)->p) = (unsigned char)((v) >> 0); \ (s)->p++; \ *((s)->p) = (unsigned char)((v) >> 8); \ (s)->p++; \ *((s)->p) = (unsigned char)((v) >> 16); \ (s)->p++; \ *((s)->p) = (unsigned char)((v) >> 24); \ (s)->p++; \ *((s)->p) = (unsigned char)((v) >> 32); \ (s)->p++; \ *((s)->p) = (unsigned char)((v) >> 40); \ (s)->p++; \ *((s)->p) = (unsigned char)((v) >> 48); \ (s)->p++; \ *((s)->p) = (unsigned char)((v) >> 56); \ (s)->p++; \ } while (0) #else #define out_uint64_le(s, v) do \ { \ S_CHECK_REM_OUT((s), 8); \ *((tui64*)((s)->p)) = (v); \ (s)->p += 8; \ } while (0) #endif /******************************************************************************/ #define out_uint32_be(s, v) do \ { \ S_CHECK_REM_OUT((s), 4); \ *((s)->p) = (unsigned char)((v) >> 24); \ s->p++; \ *((s)->p) = (unsigned char)((v) >> 16); \ s->p++; \ *((s)->p) = (unsigned char)((v) >> 8); \ s->p++; \ *((s)->p) = (unsigned char)(v); \ (s)->p++; \ } while (0) /******************************************************************************/ // Platform-endian out_uint32 #if defined(B_ENDIAN) #define out_uint32_pe(s, v) out_uint32_be(s, v) #else #define out_uint32_pe(s, v) out_uint32_le(s, v) #endif /******************************************************************************/ #define in_uint8p(s, v, n) do \ { \ S_CHECK_REM((s), (n)); \ (v) = (s)->p; \ (s)->p += (n); \ } while (0) /******************************************************************************/ #define in_uint8a(s, v, n) do \ { \ S_CHECK_REM((s), (n)); \ g_memcpy((v), (s)->p, (n)); \ (s)->p += (n); \ } while (0) /******************************************************************************/ #define in_uint8s(s, n) do \ { \ S_CHECK_REM((s), (n)); \ (s)->p += (n); \ } while (0); /******************************************************************************/ #define out_uint8p(s, v, n) do \ { \ S_CHECK_REM_OUT((s), (n)); \ g_memcpy((s)->p, (v), (n)); \ (s)->p += (n); \ } while (0) /******************************************************************************/ #define out_uint8a(s, v, n) \ out_uint8p((s), (v), (n)) /******************************************************************************/ #define out_uint8s(s, n) do \ { \ S_CHECK_REM_OUT((s), (n)); \ g_memset((s)->p, 0, (n)); \ (s)->p += (n); \ } while (0) /* * @brief allocate a new stream * * @param _s opaque handle to the new stream * @param _l length of new stream ******************************************************************************/ #define xstream_new(_s, _l) \ do \ { \ make_stream((_s)); \ init_stream((_s), (_l)); \ } while (0) /** * @brief release a previously allocated stream * * @param _s opaque handle returned by stream_new() *****************************************************************************/ #define xstream_free(_s) free_stream(_s) #define xstream_skip_u8(_s, _n) in_uint8s(_s, _n) #define xstream_rd_u8(_s, _var) in_uint8(_s, _var) #define xstream_rd_u16_le(_s, _var) in_uint16_le(_s, _var) #define xstream_rd_u32_le(_s, _var) in_uint32_le(_s, _var) #define xstream_rd_s8_le(_s, _var) in_sint8(_s, _var) #define xstream_rd_s16_le(_s, _var) in_sint16_le(_s, _var) #define xstream_rd_s32_le(_s, _var) TODO #define xstream_wr_u8(_s, _var) out_uint8(_s, _var) #define xstream_wr_u16_le(_s, _var) out_uint16_le(_s, _var) #define xstream_wr_u32_le(_s, _var) out_uint32_le(_s, _var) #define xstream_wr_s8(_s, _var) TODO #define xstream_wr_s16_le(_s, _var) TODO #define xstream_wr_s32_le(_s, _var) TODO #define xstream_rd_u64_le(_s, _v) \ do \ { \ _v = \ (tui64)(*((unsigned char *)_s->p)) | \ (((tui64) (*(((unsigned char *)_s->p) + 1))) << 8) | \ (((tui64) (*(((unsigned char *)_s->p) + 2))) << 16) | \ (((tui64) (*(((unsigned char *)_s->p) + 3))) << 24) | \ (((tui64) (*(((unsigned char *)_s->p) + 4))) << 32) | \ (((tui64) (*(((unsigned char *)_s->p) + 5))) << 40) | \ (((tui64) (*(((unsigned char *)_s->p) + 6))) << 48) | \ (((tui64) (*(((unsigned char *)_s->p) + 7))) << 56); \ _s->p += 8; \ } while (0) #define xstream_wr_u64_le(_s, _v) \ do \ { \ *(((unsigned char *) _s->p) + 0) = (unsigned char) ((_v >> 0) & 0xff); \ *(((unsigned char *) _s->p) + 1) = (unsigned char) ((_v >> 8) & 0xff); \ *(((unsigned char *) _s->p) + 2) = (unsigned char) ((_v >> 16) & 0xff); \ *(((unsigned char *) _s->p) + 3) = (unsigned char) ((_v >> 24) & 0xff); \ *(((unsigned char *) _s->p) + 4) = (unsigned char) ((_v >> 32) & 0xff); \ *(((unsigned char *) _s->p) + 5) = (unsigned char) ((_v >> 40) & 0xff); \ *(((unsigned char *) _s->p) + 6) = (unsigned char) ((_v >> 48) & 0xff); \ *(((unsigned char *) _s->p) + 7) = (unsigned char) ((_v >> 56) & 0xff); \ _s->p += 8; \ } while (0) /* copy data into stream */ #define xstream_copyin(_s, _dest, _len) \ do \ { \ g_memcpy((_s)->p, (_dest), (_len)); \ (_s)->p += (_len); \ } while (0) /* copy data out of stream */ #define xstream_copyout(_dest, _s, _len) \ do \ { \ g_memcpy((_dest), (_s)->p, (_len)); \ (_s)->p += (_len); \ } while (0) #define xstream_rd_string(_dest, _s, _len) \ do \ { \ g_memcpy((_dest), (_s)->p, (_len)); \ (_s)->p += (_len); \ } while (0) #define xstream_wr_string(_s, _src, _len) \ do \ { \ g_memcpy((_s)->p, (_src), (_len)); \ (_s)->p += (_len); \ } while (0) #define xstream_len(_s) (int) ((_s)->p - (_s)->data) #define xstream_seek(_s, _len) (_s)->p += (_len) #endif ================================================ FILE: common/pixman-region.c ================================================ /* * Copyright 1987, 1988, 1989, 1998 The Open Group * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation. * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Except as contained in this notice, the name of The Open Group shall not be * used in advertising or otherwise to promote the sale, use or other dealings * in this Software without prior written authorization from The Open Group. * * Copyright 1987, 1988, 1989 by * Digital Equipment Corporation, Maynard, Massachusetts. * * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * * Copyright © 1998 Keith Packard * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Keith Packard not be used in * advertising or publicity pertaining to distribution of the software without * specific, written prior permission. Keith Packard makes no * representations about the suitability of this software for any purpose. It * is provided "as is" without express or implied warranty. * * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ #ifndef PIXMAN_REGION_MAX #error "This file should be #included from pixman-region16.c, not compiled directly" #endif #ifndef CONFIG_AC_H #error "config_ac.h not visible in pixman-region.c" #endif #define PIXREGION_NIL(reg) ((reg)->data && !(reg)->data->numRects) /* not a region */ #define PIXREGION_NAR(reg) ((reg)->data == pixman_broken_data) #define PIXREGION_NUMRECTS(reg) ((reg)->data ? (reg)->data->numRects : 1) #define PIXREGION_SIZE(reg) ((reg)->data ? (reg)->data->size : 0) #define PIXREGION_RECTS(reg) \ ((reg)->data ? (box_type_t *)((reg)->data + 1) \ : &(reg)->extents) #define PIXREGION_BOXPTR(reg) ((box_type_t *)((reg)->data + 1)) #define PIXREGION_BOX(reg, i) (&PIXREGION_BOXPTR (reg)[i]) #define PIXREGION_TOP(reg) PIXREGION_BOX (reg, (reg)->data->numRects) #define PIXREGION_END(reg) PIXREGION_BOX (reg, (reg)->data->numRects - 1) #define GOOD_RECT(rect) ((rect)->x1 < (rect)->x2 && (rect)->y1 < (rect)->y2) #define BAD_RECT(rect) ((rect)->x1 > (rect)->x2 || (rect)->y1 > (rect)->y2) /* This file is included by pixman-region16.c which defines PREFIX(x). * This check allows cppcheck 2.x to scan this file separately */ #ifndef PREFIX #define PREFIX(x) pixman_region##x #endif #ifdef USE_DEVEL_LOGGING pixman_bool_t PREFIX(_selfcheck) (region_type_t *reg); #define GOOD(reg) \ do \ { \ if (!PREFIX (_selfcheck (reg))) \ _pixman_log_error (FUNC, "Malformed region " # reg); \ } while (0) #else #define GOOD(reg) #endif static const box_type_t PREFIX (_empty_box_) = { 0, 0, 0, 0 }; static const region_data_type_t PREFIX (_empty_data_) = { 0, 0 }; #if defined (__llvm__) && !defined (__clang__) static const volatile region_data_type_t PREFIX (_broken_data_) = { 0, 0 }; #else static const region_data_type_t PREFIX (_broken_data_) = { 0, 0 }; #endif static box_type_t *pixman_region_empty_box = (box_type_t *) &PREFIX (_empty_box_); static region_data_type_t *pixman_region_empty_data = (region_data_type_t *) &PREFIX (_empty_data_); static region_data_type_t *pixman_broken_data = (region_data_type_t *) &PREFIX (_broken_data_); static pixman_bool_t pixman_break (region_type_t *region); /* * The functions in this file implement the Region abstraction used extensively * throughout the X11 sample server. A Region is simply a set of disjoint * (non-overlapping) rectangles, plus an "extent" rectangle which is the * smallest single rectangle that contains all the non-overlapping rectangles. * * A Region is implemented as a "y-x-banded" array of rectangles. This array * imposes two degrees of order. First, all rectangles are sorted by top side * y coordinate first (y1), and then by left side x coordinate (x1). * * Furthermore, the rectangles are grouped into "bands". Each rectangle in a * band has the same top y coordinate (y1), and each has the same bottom y * coordinate (y2). Thus all rectangles in a band differ only in their left * and right side (x1 and x2). Bands are implicit in the array of rectangles: * there is no separate list of band start pointers. * * The y-x band representation does not minimize rectangles. In particular, * if a rectangle vertically crosses a band (the rectangle has scanlines in * the y1 to y2 area spanned by the band), then the rectangle may be broken * down into two or more smaller rectangles stacked one atop the other. * * ----------- ----------- * | | | | band 0 * | | -------- ----------- -------- * | | | | in y-x banded | | | | band 1 * | | | | form is | | | | * ----------- | | ----------- -------- * | | | | band 2 * -------- -------- * * An added constraint on the rectangles is that they must cover as much * horizontal area as possible: no two rectangles within a band are allowed * to touch. * * Whenever possible, bands will be merged together to cover a greater vertical * distance (and thus reduce the number of rectangles). Two bands can be merged * only if the bottom of one touches the top of the other and they have * rectangles in the same places (of the same width, of course). * * Adam de Boor wrote most of the original region code. Joel McCormack * substantially modified or rewrote most of the core arithmetic routines, and * added pixman_region_validate in order to support several speed improvements * to pixman_region_validate_tree. Bob Scheifler changed the representation * to be more compact when empty or a single rectangle, and did a bunch of * gratuitous reformatting. Carl Worth did further gratuitous reformatting * while re-merging the server and client region code into libpixregion. * Soren Sandmann did even more gratuitous reformatting. */ /* true iff two Boxes overlap */ #define EXTENTCHECK(r1, r2) \ (!( ((r1)->x2 <= (r2)->x1) || \ ((r1)->x1 >= (r2)->x2) || \ ((r1)->y2 <= (r2)->y1) || \ ((r1)->y1 >= (r2)->y2) ) ) /* true iff (x,y) is in Box */ #define INBOX(r, x, y) \ ( ((r)->x2 > x) && \ ((r)->x1 <= x) && \ ((r)->y2 > y) && \ ((r)->y1 <= y) ) /* true iff Box r1 contains Box r2 */ #define SUBSUMES(r1, r2) \ ( ((r1)->x1 <= (r2)->x1) && \ ((r1)->x2 >= (r2)->x2) && \ ((r1)->y1 <= (r2)->y1) && \ ((r1)->y2 >= (r2)->y2) ) static size_t PIXREGION_SZOF (size_t n) { size_t size = n * sizeof(box_type_t); if (n > UINT32_MAX / sizeof(box_type_t)) { return 0; } if (sizeof(region_data_type_t) > UINT32_MAX - size) { return 0; } return size + sizeof(region_data_type_t); } static region_data_type_t * alloc_data (size_t n) { size_t sz = PIXREGION_SZOF (n); if (!sz) { return NULL; } return (region_data_type_t *) malloc(sz); } #define FREE_DATA(reg) if ((reg)->data && (reg)->data->size) free ((reg)->data) #define RECTALLOC_BAIL(region, n, bail) \ do \ { \ if (!(region)->data || \ (((region)->data->numRects + (n)) > (region)->data->size)) \ { \ if (!pixman_rect_alloc (region, n)) \ goto bail; \ } \ } while (0) #define RECTALLOC(region, n) \ do \ { \ if (!(region)->data || \ (((region)->data->numRects + (n)) > (region)->data->size)) \ { \ if (!pixman_rect_alloc (region, n)) { \ return FALSE; \ } \ } \ } while (0) #define ADDRECT(next_rect, nx1, ny1, nx2, ny2) \ do \ { \ next_rect->x1 = nx1; \ next_rect->y1 = ny1; \ next_rect->x2 = nx2; \ next_rect->y2 = ny2; \ next_rect++; \ } \ while (0) #define NEWRECT(region, next_rect, nx1, ny1, nx2, ny2) \ do \ { \ if (!(region)->data || \ ((region)->data->numRects == (region)->data->size)) \ { \ if (!pixman_rect_alloc (region, 1)) \ return FALSE; \ next_rect = PIXREGION_TOP (region); \ } \ ADDRECT (next_rect, nx1, ny1, nx2, ny2); \ region->data->numRects++; \ critical_if_fail (region->data->numRects <= region->data->size); \ } while (0) #define DOWNSIZE(reg, numRects) \ do \ { \ if (((numRects) < ((reg)->data->size >> 1)) && \ ((reg)->data->size > 50)) \ { \ region_data_type_t * new_data; \ size_t data_size = PIXREGION_SZOF (numRects); \ \ if (!data_size) \ { \ new_data = NULL; \ } \ else \ { \ new_data = (region_data_type_t *) \ realloc ((reg)->data, data_size); \ } \ \ if (new_data) \ { \ new_data->size = (numRects); \ (reg)->data = new_data; \ } \ } \ } while (0) PIXMAN_EXPORT void PREFIX (_init) (region_type_t *region) { region->extents = *pixman_region_empty_box; region->data = pixman_region_empty_data; } PIXMAN_EXPORT void PREFIX (_init_rect) (region_type_t *region, int x, int y, unsigned int width, unsigned int height) { region->extents.x1 = x; region->extents.y1 = y; region->extents.x2 = x + width; region->extents.y2 = y + height; if (!GOOD_RECT (®ion->extents)) { if (BAD_RECT (®ion->extents)) { _pixman_log_error (FUNC, "Invalid rectangle passed"); } PREFIX (_init) (region); return; } region->data = NULL; } PIXMAN_EXPORT void PREFIX (_fini) (region_type_t *region) { GOOD (region); FREE_DATA (region); } PIXMAN_EXPORT box_type_t * PREFIX (_rectangles) (region_type_t *region, int *n_rects) { if (n_rects) { *n_rects = PIXREGION_NUMRECTS (region); } return PIXREGION_RECTS (region); } static pixman_bool_t pixman_break (region_type_t *region) { FREE_DATA (region); region->extents = *pixman_region_empty_box; region->data = pixman_broken_data; return FALSE; } static pixman_bool_t pixman_rect_alloc (region_type_t *region, int n) { region_data_type_t *data; if (!region->data) { n++; region->data = alloc_data (n); if (!region->data) { return pixman_break (region); } region->data->numRects = 1; *PIXREGION_BOXPTR (region) = region->extents; } else if (!region->data->size) { region->data = alloc_data (n); if (!region->data) { return pixman_break (region); } region->data->numRects = 0; } else { size_t data_size; if (n == 1) { n = region->data->numRects; if (n > 500) /* XXX pick numbers out of a hat */ { n = 250; } } n += region->data->numRects; data_size = PIXREGION_SZOF (n); if (!data_size) { data = NULL; } else { data = (region_data_type_t *) realloc (region->data, PIXREGION_SZOF (n)); } if (!data) { return pixman_break (region); } region->data = data; } region->data->size = n; return TRUE; } static PIXMAN_EXPORT pixman_bool_t PREFIX (_copy) (region_type_t *dst, region_type_t *src) { GOOD (dst); GOOD (src); if (dst == src) { return TRUE; } dst->extents = src->extents; if (!src->data || !src->data->size) { FREE_DATA (dst); dst->data = src->data; return TRUE; } if (!dst->data || (dst->data->size < src->data->numRects)) { FREE_DATA (dst); dst->data = alloc_data (src->data->numRects); if (!dst->data) { return pixman_break (dst); } dst->data->size = src->data->numRects; } dst->data->numRects = src->data->numRects; memmove ((char *)PIXREGION_BOXPTR (dst), (char *)PIXREGION_BOXPTR (src), dst->data->numRects * sizeof(box_type_t)); return TRUE; } /*====================================================================== * Generic Region Operator *====================================================================*/ /*- *----------------------------------------------------------------------- * pixman_coalesce -- * Attempt to merge the boxes in the current band with those in the * previous one. We are guaranteed that the current band extends to * the end of the rects array. Used only by pixman_op. * * Results: * The new index for the previous band. * * Side Effects: * If coalescing takes place: * - rectangles in the previous band will have their y2 fields * altered. * - region->data->numRects will be decreased. * *----------------------------------------------------------------------- */ static inline int pixman_coalesce (region_type_t *region, /* Region to coalesce */ int prev_start, /* Index of start of previous band */ int cur_start) /* Index of start of current band */ { box_type_t *prev_box; /* Current box in previous band */ box_type_t *cur_box; /* Current box in current band */ int numRects; /* Number rectangles in both bands */ int y2; /* Bottom of current band */ /* * Figure out how many rectangles are in the band. */ numRects = cur_start - prev_start; critical_if_fail (numRects == region->data->numRects - cur_start); if (!numRects) { return cur_start; } /* * The bands may only be coalesced if the bottom of the previous * matches the top scanline of the current. */ prev_box = PIXREGION_BOX (region, prev_start); cur_box = PIXREGION_BOX (region, cur_start); if (prev_box->y2 != cur_box->y1) { return cur_start; } /* * Make sure the bands have boxes in the same places. This * assumes that boxes have been added in such a way that they * cover the most area possible. I.e. two boxes in a band must * have some horizontal space between them. */ y2 = cur_box->y2; do { if ((prev_box->x1 != cur_box->x1) || (prev_box->x2 != cur_box->x2)) { return (cur_start); } prev_box++; cur_box++; numRects--; } while (numRects); /* * The bands may be merged, so set the bottom y of each box * in the previous band to the bottom y of the current band. */ numRects = cur_start - prev_start; region->data->numRects -= numRects; do { prev_box--; prev_box->y2 = y2; numRects--; } while (numRects); return prev_start; } /* Quicky macro to avoid trivial reject procedure calls to pixman_coalesce */ #define COALESCE(new_reg, prev_band, cur_band) \ do \ { \ if (cur_band - prev_band == new_reg->data->numRects - cur_band) \ prev_band = pixman_coalesce (new_reg, prev_band, cur_band); \ else \ prev_band = cur_band; \ } while (0) /*- *----------------------------------------------------------------------- * pixman_region_append_non_o -- * Handle a non-overlapping band for the union and subtract operations. * Just adds the (top/bottom-clipped) rectangles into the region. * Doesn't have to check for subsumption or anything. * * Results: * None. * * Side Effects: * region->data->numRects is incremented and the rectangles overwritten * with the rectangles we're passed. * *----------------------------------------------------------------------- */ static inline pixman_bool_t pixman_region_append_non_o (region_type_t *region, box_type_t *r, box_type_t *r_end, int y1, int y2) { box_type_t *next_rect; int new_rects; new_rects = r_end - r; critical_if_fail (y1 < y2); critical_if_fail (new_rects != 0); /* Make sure we have enough space for all rectangles to be added */ RECTALLOC (region, new_rects); next_rect = PIXREGION_TOP (region); region->data->numRects += new_rects; do { critical_if_fail (r->x1 < r->x2); ADDRECT (next_rect, r->x1, y1, r->x2, y2); r++; } while (r != r_end); return TRUE; } #define FIND_BAND(r, r_band_end, r_end, ry1) \ do \ { \ ry1 = r->y1; \ r_band_end = r + 1; \ while ((r_band_end != r_end) && (r_band_end->y1 == ry1)) { \ r_band_end++; \ } \ } while (0) #define APPEND_REGIONS(new_reg, r, r_end) \ do \ { \ int new_rects; \ if ((new_rects = r_end - r)) { \ RECTALLOC_BAIL (new_reg, new_rects, bail); \ memmove ((char *)PIXREGION_TOP (new_reg), (char *)r, \ new_rects * sizeof(box_type_t)); \ new_reg->data->numRects += new_rects; \ } \ } while (0) /*- *----------------------------------------------------------------------- * pixman_op -- * Apply an operation to two regions. Called by pixman_region_union, pixman_region_inverse, * pixman_region_subtract, pixman_region_intersect.... Both regions MUST have at least one * rectangle, and cannot be the same object. * * Results: * TRUE if successful. * * Side Effects: * The new region is overwritten. * overlap set to TRUE if overlap_func ever returns TRUE. * * Notes: * The idea behind this function is to view the two regions as sets. * Together they cover a rectangle of area that this function divides * into horizontal bands where points are covered only by one region * or by both. For the first case, the non_overlap_func is called with * each the band and the band's upper and lower extents. For the * second, the overlap_func is called to process the entire band. It * is responsible for clipping the rectangles in the band, though * this function provides the boundaries. * At the end of each band, the new region is coalesced, if possible, * to reduce the number of rectangles in the region. * *----------------------------------------------------------------------- */ typedef pixman_bool_t (*overlap_proc_ptr) (region_type_t *region, box_type_t *r1, box_type_t *r1_end, box_type_t *r2, box_type_t *r2_end, int y1, int y2); static pixman_bool_t pixman_op (region_type_t *new_reg, /* Place to store result */ region_type_t *reg1, /* First region in operation */ region_type_t *reg2, /* 2d region in operation */ overlap_proc_ptr overlap_func, /* Function to call for over- * lapping bands */ int append_non1, /* Append non-overlapping bands * in region 1 ? */ int append_non2 /* Append non-overlapping bands * in region 2 ? */ ) { box_type_t *r1; /* Pointer into first region */ box_type_t *r2; /* Pointer into 2d region */ box_type_t *r1_end; /* End of 1st region */ box_type_t *r2_end; /* End of 2d region */ int ybot; /* Bottom of intersection */ int ytop; /* Top of intersection */ region_data_type_t *old_data; /* Old data for new_reg */ int prev_band; /* Index of start of * previous band in new_reg */ int cur_band; /* Index of start of current * band in new_reg */ box_type_t *r1_band_end; /* End of current band in r1 */ box_type_t *r2_band_end; /* End of current band in r2 */ int top; /* Top of non-overlapping band */ int bot; /* Bottom of non-overlapping band*/ int r1y1; /* Temps for r1->y1 and r2->y1 */ int r2y1; int new_size; int numRects; /* * Break any region computed from a broken region */ if (PIXREGION_NAR (reg1) || PIXREGION_NAR (reg2)) { return pixman_break (new_reg); } /* * Initialization: * set r1, r2, r1_end and r2_end appropriately, save the rectangles * of the destination region until the end in case it's one of * the two source regions, then mark the "new" region empty, allocating * another array of rectangles for it to use. */ r1 = PIXREGION_RECTS (reg1); new_size = PIXREGION_NUMRECTS (reg1); r1_end = r1 + new_size; numRects = PIXREGION_NUMRECTS (reg2); r2 = PIXREGION_RECTS (reg2); r2_end = r2 + numRects; critical_if_fail (r1 != r1_end); critical_if_fail (r2 != r2_end); old_data = (region_data_type_t *)NULL; if (((new_reg == reg1) && (new_size > 1)) || ((new_reg == reg2) && (numRects > 1))) { old_data = new_reg->data; new_reg->data = pixman_region_empty_data; } /* guess at new size */ if (numRects > new_size) { new_size = numRects; } new_size <<= 1; if (!new_reg->data) { new_reg->data = pixman_region_empty_data; } else if (new_reg->data->size) { new_reg->data->numRects = 0; } if (new_size > new_reg->data->size) { if (!pixman_rect_alloc (new_reg, new_size)) { free (old_data); return FALSE; } } /* * Initialize ybot. * In the upcoming loop, ybot and ytop serve different functions depending * on whether the band being handled is an overlapping or non-overlapping * band. * In the case of a non-overlapping band (only one of the regions * has points in the band), ybot is the bottom of the most recent * intersection and thus clips the top of the rectangles in that band. * ytop is the top of the next intersection between the two regions and * serves to clip the bottom of the rectangles in the current band. * For an overlapping band (where the two regions intersect), ytop clips * the top of the rectangles of both regions and ybot clips the bottoms. */ ybot = MIN (r1->y1, r2->y1); /* * prev_band serves to mark the start of the previous band so rectangles * can be coalesced into larger rectangles. qv. pixman_coalesce, above. * In the beginning, there is no previous band, so prev_band == cur_band * (cur_band is set later on, of course, but the first band will always * start at index 0). prev_band and cur_band must be indices because of * the possible expansion, and resultant moving, of the new region's * array of rectangles. */ prev_band = 0; do { /* * This algorithm proceeds one source-band (as opposed to a * destination band, which is determined by where the two regions * intersect) at a time. r1_band_end and r2_band_end serve to mark the * rectangle after the last one in the current band for their * respective regions. */ critical_if_fail (r1 != r1_end); critical_if_fail (r2 != r2_end); FIND_BAND (r1, r1_band_end, r1_end, r1y1); FIND_BAND (r2, r2_band_end, r2_end, r2y1); /* * First handle the band that doesn't intersect, if any. * * Note that attention is restricted to one band in the * non-intersecting region at once, so if a region has n * bands between the current position and the next place it overlaps * the other, this entire loop will be passed through n times. */ if (r1y1 < r2y1) { if (append_non1) { top = MAX (r1y1, ybot); bot = MIN (r1->y2, r2y1); if (top != bot) { cur_band = new_reg->data->numRects; if (!pixman_region_append_non_o (new_reg, r1, r1_band_end, top, bot)) { goto bail; } COALESCE (new_reg, prev_band, cur_band); } } ytop = r2y1; } else if (r2y1 < r1y1) { if (append_non2) { top = MAX (r2y1, ybot); bot = MIN (r2->y2, r1y1); if (top != bot) { cur_band = new_reg->data->numRects; if (!pixman_region_append_non_o (new_reg, r2, r2_band_end, top, bot)) { goto bail; } COALESCE (new_reg, prev_band, cur_band); } } ytop = r1y1; } else { ytop = r1y1; } /* * Now see if we've hit an intersecting band. The two bands only * intersect if ybot > ytop */ ybot = MIN (r1->y2, r2->y2); if (ybot > ytop) { cur_band = new_reg->data->numRects; if (!(*overlap_func)(new_reg, r1, r1_band_end, r2, r2_band_end, ytop, ybot)) { goto bail; } COALESCE (new_reg, prev_band, cur_band); } /* * If we've finished with a band (y2 == ybot) we skip forward * in the region to the next band. */ if (r1->y2 == ybot) { r1 = r1_band_end; } if (r2->y2 == ybot) { r2 = r2_band_end; } } while (r1 != r1_end && r2 != r2_end); /* * Deal with whichever region (if any) still has rectangles left. * * We only need to worry about banding and coalescing for the very first * band left. After that, we can just group all remaining boxes, * regardless of how many bands, into one final append to the list. */ if ((r1 != r1_end) && append_non1) { /* Do first non_overlap1Func call, which may be able to coalesce */ FIND_BAND (r1, r1_band_end, r1_end, r1y1); cur_band = new_reg->data->numRects; if (!pixman_region_append_non_o (new_reg, r1, r1_band_end, MAX (r1y1, ybot), r1->y2)) { goto bail; } COALESCE (new_reg, prev_band, cur_band); /* Just append the rest of the boxes */ APPEND_REGIONS (new_reg, r1_band_end, r1_end); } else if ((r2 != r2_end) && append_non2) { /* Do first non_overlap2Func call, which may be able to coalesce */ FIND_BAND (r2, r2_band_end, r2_end, r2y1); cur_band = new_reg->data->numRects; if (!pixman_region_append_non_o (new_reg, r2, r2_band_end, MAX (r2y1, ybot), r2->y2)) { goto bail; } COALESCE (new_reg, prev_band, cur_band); /* Append rest of boxes */ APPEND_REGIONS (new_reg, r2_band_end, r2_end); } free (old_data); if (!(numRects = new_reg->data->numRects)) { FREE_DATA (new_reg); new_reg->data = pixman_region_empty_data; } else if (numRects == 1) { new_reg->extents = *PIXREGION_BOXPTR (new_reg); FREE_DATA (new_reg); new_reg->data = (region_data_type_t *)NULL; } else { DOWNSIZE (new_reg, numRects); } return TRUE; bail: free (old_data); return pixman_break (new_reg); } /*- *----------------------------------------------------------------------- * pixman_set_extents -- * Reset the extents of a region to what they should be. Called by * pixman_region_subtract and pixman_region_intersect as they can't * figure it out along the way or do so easily, as pixman_region_union can. * * Results: * None. * * Side Effects: * The region's 'extents' structure is overwritten. * *----------------------------------------------------------------------- */ static void pixman_set_extents (region_type_t *region) { box_type_t *box, *box_end; if (!region->data) { return; } if (!region->data->size) { region->extents.x2 = region->extents.x1; region->extents.y2 = region->extents.y1; return; } box = PIXREGION_BOXPTR (region); box_end = PIXREGION_END (region); /* * Since box is the first rectangle in the region, it must have the * smallest y1 and since box_end is the last rectangle in the region, * it must have the largest y2, because of banding. Initialize x1 and * x2 from box and box_end, resp., as good things to initialize them * to... */ region->extents.x1 = box->x1; region->extents.y1 = box->y1; region->extents.x2 = box_end->x2; region->extents.y2 = box_end->y2; critical_if_fail (region->extents.y1 < region->extents.y2); while (box <= box_end) { if (box->x1 < region->extents.x1) { region->extents.x1 = box->x1; } if (box->x2 > region->extents.x2) { region->extents.x2 = box->x2; } box++; } critical_if_fail (region->extents.x1 < region->extents.x2); } /*====================================================================== * Region Intersection *====================================================================*/ /*- *----------------------------------------------------------------------- * pixman_region_intersect_o -- * Handle an overlapping band for pixman_region_intersect. * * Results: * TRUE if successful. * * Side Effects: * Rectangles may be added to the region. * *----------------------------------------------------------------------- */ /*ARGSUSED*/ static pixman_bool_t pixman_region_intersect_o (region_type_t *region, box_type_t *r1, box_type_t *r1_end, box_type_t *r2, box_type_t *r2_end, int y1, int y2) { int x1; int x2; box_type_t *next_rect; next_rect = PIXREGION_TOP (region); critical_if_fail (y1 < y2); critical_if_fail (r1 != r1_end && r2 != r2_end); do { x1 = MAX (r1->x1, r2->x1); x2 = MIN (r1->x2, r2->x2); /* * If there's any overlap between the two rectangles, add that * overlap to the new region. */ if (x1 < x2) { NEWRECT (region, next_rect, x1, y1, x2, y2); } /* * Advance the pointer(s) with the leftmost right side, since the next * rectangle on that list may still overlap the other region's * current rectangle. */ if (r1->x2 == x2) { r1++; } if (r2->x2 == x2) { r2++; } } while ((r1 != r1_end) && (r2 != r2_end)); return TRUE; } PIXMAN_EXPORT pixman_bool_t PREFIX (_intersect) (region_type_t *new_reg, region_type_t *reg1, region_type_t *reg2) { GOOD (reg1); GOOD (reg2); GOOD (new_reg); /* check for trivial reject */ if (PIXREGION_NIL (reg1) || PIXREGION_NIL (reg2) || !EXTENTCHECK (®1->extents, ®2->extents)) { /* Covers about 20% of all cases */ FREE_DATA (new_reg); new_reg->extents.x2 = new_reg->extents.x1; new_reg->extents.y2 = new_reg->extents.y1; if (PIXREGION_NAR (reg1) || PIXREGION_NAR (reg2)) { new_reg->data = pixman_broken_data; return FALSE; } else { new_reg->data = pixman_region_empty_data; } } else if (!reg1->data && !reg2->data) { /* Covers about 80% of cases that aren't trivially rejected */ new_reg->extents.x1 = MAX (reg1->extents.x1, reg2->extents.x1); new_reg->extents.y1 = MAX (reg1->extents.y1, reg2->extents.y1); new_reg->extents.x2 = MIN (reg1->extents.x2, reg2->extents.x2); new_reg->extents.y2 = MIN (reg1->extents.y2, reg2->extents.y2); FREE_DATA (new_reg); new_reg->data = (region_data_type_t *)NULL; } else if (!reg2->data && SUBSUMES (®2->extents, ®1->extents)) { return PREFIX (_copy) (new_reg, reg1); } else if (!reg1->data && SUBSUMES (®1->extents, ®2->extents)) { return PREFIX (_copy) (new_reg, reg2); } else if (reg1 == reg2) { return PREFIX (_copy) (new_reg, reg1); } else { /* General purpose intersection */ if (!pixman_op (new_reg, reg1, reg2, pixman_region_intersect_o, FALSE, FALSE)) { return FALSE; } pixman_set_extents (new_reg); } GOOD (new_reg); return (TRUE); } #define MERGERECT(r) \ do \ { \ if (r->x1 <= x2) \ { \ /* Merge with current rectangle */ \ if (x2 < r->x2) \ x2 = r->x2; \ } \ else \ { \ /* Add current rectangle, start new one */ \ NEWRECT (region, next_rect, x1, y1, x2, y2); \ x1 = r->x1; \ x2 = r->x2; \ } \ r++; \ } while (0) /*====================================================================== * Region Union *====================================================================*/ /*- *----------------------------------------------------------------------- * pixman_region_union_o -- * Handle an overlapping band for the union operation. Picks the * left-most rectangle each time and merges it into the region. * * Results: * TRUE if successful. * * Side Effects: * region is overwritten. * overlap is set to TRUE if any boxes overlap. * *----------------------------------------------------------------------- */ static pixman_bool_t pixman_region_union_o (region_type_t *region, box_type_t *r1, box_type_t *r1_end, box_type_t *r2, box_type_t *r2_end, int y1, int y2) { box_type_t *next_rect; int x1; /* left and right side of current union */ int x2; critical_if_fail (y1 < y2); critical_if_fail (r1 != r1_end && r2 != r2_end); next_rect = PIXREGION_TOP (region); /* Start off current rectangle */ if (r1->x1 < r2->x1) { x1 = r1->x1; x2 = r1->x2; r1++; } else { x1 = r2->x1; x2 = r2->x2; r2++; } while (r1 != r1_end && r2 != r2_end) { if (r1->x1 < r2->x1) { MERGERECT (r1); } else { MERGERECT (r2); } } /* Finish off whoever (if any) is left */ if (r1 != r1_end) { do { MERGERECT (r1); } while (r1 != r1_end); } else if (r2 != r2_end) { do { MERGERECT (r2); } while (r2 != r2_end); } /* Add current rectangle */ NEWRECT (region, next_rect, x1, y1, x2, y2); return TRUE; } PIXMAN_EXPORT pixman_bool_t PREFIX (_union) (region_type_t *new_reg, region_type_t *reg1, region_type_t *reg2) { /* Return TRUE if some overlap * between reg1, reg2 */ GOOD (reg1); GOOD (reg2); GOOD (new_reg); /* checks all the simple cases */ /* * Region 1 and 2 are the same */ if (reg1 == reg2) { return PREFIX (_copy) (new_reg, reg1); } /* * Region 1 is empty */ if (PIXREGION_NIL (reg1)) { if (PIXREGION_NAR (reg1)) { return pixman_break (new_reg); } if (new_reg != reg2) { return PREFIX (_copy) (new_reg, reg2); } return TRUE; } /* * Region 2 is empty */ if (PIXREGION_NIL (reg2)) { if (PIXREGION_NAR (reg2)) { return pixman_break (new_reg); } if (new_reg != reg1) { return PREFIX (_copy) (new_reg, reg1); } return TRUE; } /* * Region 1 completely subsumes region 2 */ if (!reg1->data && SUBSUMES (®1->extents, ®2->extents)) { if (new_reg != reg1) { return PREFIX (_copy) (new_reg, reg1); } return TRUE; } /* * Region 2 completely subsumes region 1 */ if (!reg2->data && SUBSUMES (®2->extents, ®1->extents)) { if (new_reg != reg2) { return PREFIX (_copy) (new_reg, reg2); } return TRUE; } if (!pixman_op (new_reg, reg1, reg2, pixman_region_union_o, TRUE, TRUE)) { return FALSE; } new_reg->extents.x1 = MIN (reg1->extents.x1, reg2->extents.x1); new_reg->extents.y1 = MIN (reg1->extents.y1, reg2->extents.y1); new_reg->extents.x2 = MAX (reg1->extents.x2, reg2->extents.x2); new_reg->extents.y2 = MAX (reg1->extents.y2, reg2->extents.y2); GOOD (new_reg); return TRUE; } /*====================================================================== * Batch Rectangle Union *====================================================================*/ #define EXCHANGE_RECTS(a, b) \ { \ box_type_t t; \ t = rects[a]; \ rects[a] = rects[b]; \ rects[b] = t; \ } /*====================================================================== * Region Subtraction *====================================================================*/ /*- *----------------------------------------------------------------------- * pixman_region_subtract_o -- * Overlapping band subtraction. x1 is the left-most point not yet * checked. * * Results: * TRUE if successful. * * Side Effects: * region may have rectangles added to it. * *----------------------------------------------------------------------- */ /*ARGSUSED*/ static pixman_bool_t pixman_region_subtract_o (region_type_t *region, box_type_t *r1, box_type_t *r1_end, box_type_t *r2, box_type_t *r2_end, int y1, int y2) { box_type_t *next_rect; int x1; x1 = r1->x1; critical_if_fail (y1 < y2); critical_if_fail (r1 != r1_end && r2 != r2_end); next_rect = PIXREGION_TOP (region); do { if (r2->x2 <= x1) { /* * Subtrahend entirely to left of minuend: go to next subtrahend. */ r2++; } else if (r2->x1 <= x1) { /* * Subtrahend precedes minuend: nuke left edge of minuend. */ x1 = r2->x2; if (x1 >= r1->x2) { /* * Minuend completely covered: advance to next minuend and * reset left fence to edge of new minuend. */ r1++; if (r1 != r1_end) { x1 = r1->x1; } } else { /* * Subtrahend now used up since it doesn't extend beyond * minuend */ r2++; } } else if (r2->x1 < r1->x2) { /* * Left part of subtrahend covers part of minuend: add uncovered * part of minuend to region and skip to next subtrahend. */ critical_if_fail (x1 < r2->x1); NEWRECT (region, next_rect, x1, y1, r2->x1, y2); x1 = r2->x2; if (x1 >= r1->x2) { /* * Minuend used up: advance to new... */ r1++; if (r1 != r1_end) { x1 = r1->x1; } } else { /* * Subtrahend used up */ r2++; } } else { /* * Minuend used up: add any remaining piece before advancing. */ if (r1->x2 > x1) { NEWRECT (region, next_rect, x1, y1, r1->x2, y2); } r1++; if (r1 != r1_end) { x1 = r1->x1; } } } while ((r1 != r1_end) && (r2 != r2_end)); /* * Add remaining minuend rectangles to region. */ while (r1 != r1_end) { critical_if_fail (x1 < r1->x2); NEWRECT (region, next_rect, x1, y1, r1->x2, y2); r1++; if (r1 != r1_end) { x1 = r1->x1; } } return TRUE; } /*- *----------------------------------------------------------------------- * pixman_region_subtract -- * Subtract reg_s from reg_m and leave the result in reg_d. * S stands for subtrahend, M for minuend and D for difference. * * Results: * TRUE if successful. * * Side Effects: * reg_d is overwritten. * *----------------------------------------------------------------------- */ PIXMAN_EXPORT pixman_bool_t PREFIX (_subtract) (region_type_t *reg_d, region_type_t *reg_m, region_type_t *reg_s) { GOOD (reg_m); GOOD (reg_s); GOOD (reg_d); /* check for trivial rejects */ if (PIXREGION_NIL (reg_m) || PIXREGION_NIL (reg_s) || !EXTENTCHECK (®_m->extents, ®_s->extents)) { if (PIXREGION_NAR (reg_s)) { return pixman_break (reg_d); } return PREFIX (_copy) (reg_d, reg_m); } else if (reg_m == reg_s) { FREE_DATA (reg_d); reg_d->extents.x2 = reg_d->extents.x1; reg_d->extents.y2 = reg_d->extents.y1; reg_d->data = pixman_region_empty_data; return TRUE; } /* Add those rectangles in region 1 that aren't in region 2, do yucky subtraction for overlaps, and just throw away rectangles in region 2 that aren't in region 1 */ if (!pixman_op (reg_d, reg_m, reg_s, pixman_region_subtract_o, TRUE, FALSE)) { return FALSE; } /* * Can't alter reg_d's extents before we call pixman_op because * it might be one of the source regions and pixman_op depends * on the extents of those regions being unaltered. Besides, this * way there's no checking against rectangles that will be nuked * due to coalescing, so we have to examine fewer rectangles. */ pixman_set_extents (reg_d); GOOD (reg_d); return TRUE; } /*====================================================================== * Region Inversion *====================================================================*/ PIXMAN_EXPORT int PREFIX (_not_empty) (region_type_t *region) { GOOD (region); return (!PIXREGION_NIL (region)); } PIXMAN_EXPORT box_type_t * PREFIX (_extents) (region_type_t *region) { GOOD (region); return (®ion->extents); } #ifdef USE_DEVEL_LOGGING /* * Clip a list of scanlines to a region. The caller has allocated the * space. FSorted is non-zero if the scanline origins are in ascending order. * * returns the number of new, clipped scanlines. * * NB: For xrdp this function is only used if we are running devel logging */ PIXMAN_EXPORT pixman_bool_t PREFIX (_selfcheck) (region_type_t *reg) { int i, numRects; if ((reg->extents.x1 > reg->extents.x2) || (reg->extents.y1 > reg->extents.y2)) { return FALSE; } numRects = PIXREGION_NUMRECTS (reg); if (!numRects) { return ((reg->extents.x1 == reg->extents.x2) && (reg->extents.y1 == reg->extents.y2) && (reg->data->size || (reg->data == pixman_region_empty_data))); } else if (numRects == 1) { return (!reg->data); } else { box_type_t *pbox_p, *pbox_n; box_type_t box; pbox_p = PIXREGION_RECTS (reg); box = *pbox_p; box.y2 = pbox_p[numRects - 1].y2; pbox_n = pbox_p + 1; for (i = numRects; --i > 0; pbox_p++, pbox_n++) { if ((pbox_n->x1 >= pbox_n->x2) || (pbox_n->y1 >= pbox_n->y2)) { return FALSE; } if (pbox_n->x1 < box.x1) { box.x1 = pbox_n->x1; } if (pbox_n->x2 > box.x2) { box.x2 = pbox_n->x2; } if ((pbox_n->y1 < pbox_p->y1) || ((pbox_n->y1 == pbox_p->y1) && ((pbox_n->x1 < pbox_p->x2) || (pbox_n->y2 != pbox_p->y2)))) { return FALSE; } } return ((box.x1 == reg->extents.x1) && (box.x2 == reg->extents.x2) && (box.y1 == reg->extents.y1) && (box.y2 == reg->extents.y2)); } } #endif // USE_DEVEL_LOGGING ================================================ FILE: common/pixman-region.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2016 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * region, from pixman.h */ #ifndef PIXMAN_PIXMAN_H__ #define PIXMAN_PIXMAN_H__ typedef int pixman_bool_t; struct pixman_region16_data { long size; long numRects; }; struct pixman_box16 { signed short x1, y1, x2, y2; }; struct pixman_region16 { struct pixman_box16 extents; struct pixman_region16_data *data; }; enum _pixman_region_overlap_t { PIXMAN_REGION_OUT, PIXMAN_REGION_IN, PIXMAN_REGION_PART }; typedef enum _pixman_region_overlap_t pixman_region_overlap_t; typedef struct pixman_region16_data pixman_region16_data_t; typedef struct pixman_box16 pixman_box16_t; typedef struct pixman_region16 pixman_region16_t; /* creation/destruction */ void pixman_region_init (pixman_region16_t *region); void pixman_region_init_rect (pixman_region16_t *region, int x, int y, unsigned int width, unsigned int height); void pixman_region_fini (pixman_region16_t *region); pixman_bool_t pixman_region_union (pixman_region16_t *new_reg, pixman_region16_t *reg1, pixman_region16_t *reg2); pixman_bool_t pixman_region_subtract (pixman_region16_t *reg_d, pixman_region16_t *reg_m, pixman_region16_t *reg_s); pixman_bool_t pixman_region_intersect (pixman_region16_t *new_reg, pixman_region16_t *reg1, pixman_region16_t *reg2); pixman_box16_t *pixman_region_rectangles (pixman_region16_t *region, int *n_rects); pixman_bool_t pixman_region_not_empty (pixman_region16_t *region); pixman_box16_t *pixman_region_extents (pixman_region16_t *region); #endif ================================================ FILE: common/pixman-region16.c ================================================ /* * Copyright © 2008 Red Hat, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Red Hat, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior * permission. Red Hat, Inc. makes no representations about the * suitability of this software for any purpose. It is provided "as * is" without express or implied warranty. * * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Soren Sandmann */ /* taken from pixman 0.34 altered to compile without all of pixman */ #if defined(HAVE_CONFIG_H) #include "config_ac.h" #endif #include #include #include #if defined(HAVE_STDINT_H) #include #endif #include "pixman-region.h" #if !defined(UINT32_MAX) #define UINT32_MAX (4294967295U) #endif #if !defined(INT16_MIN) #define INT16_MIN (-32767-1) #endif #if !defined(INT16_MAX) #define INT16_MAX (32767) #endif #define PIXMAN_EXPORT #define FALSE 0 #define TRUE 1 #define MIN(x1, x2) ((x1) < (x2) ? (x1) : (x2)) #define MAX(x1, x2) ((x1) > (x2) ? (x1) : (x2)) typedef pixman_box16_t box_type_t; typedef pixman_region16_data_t region_data_type_t; typedef pixman_region16_t region_type_t; typedef signed int overflow_int_t; #define PREFIX(x) pixman_region##x #define PIXMAN_REGION_MAX INT16_MAX #define PIXMAN_REGION_MIN INT16_MIN #define FUNC "func" #define critical_if_fail(expr) static int _pixman_log_error(const char *func, const char *format, ...) { return 0; } #include "pixman-region.c" ================================================ FILE: common/rail.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2012-2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #if !defined(_RAIL_H) #define _RAIL_H /* ORDER_TYPE_WINDOW WINDOW_ORDER_TYPE_WINDOW WINDOW_ORDER_ICON WINDOW_ORDER_CACHED_ICON WINDOW_ORDER_STATE_DELETED WINDOW_ORDER_STATE_NEW on WINDOW_ORDER_STATE_NEW off WINDOW_ORDER_TYPE_NOTIFY WINDOW_ORDER_STATE_DELETED WINDOW_ORDER_STATE_NEW on WINDOW_ORDER_STATE_NEW off WINDOW_ORDER_TYPE_DESKTOP WINDOW_ORDER_FIELD_DESKTOP_NONE on WINDOW_ORDER_FIELD_DESKTOP_NONE off */ /* Window Order Header Flags */ #define WINDOW_ORDER_TYPE_WINDOW 0x01000000 #define WINDOW_ORDER_TYPE_NOTIFY 0x02000000 #define WINDOW_ORDER_TYPE_DESKTOP 0x04000000 #define WINDOW_ORDER_STATE_NEW 0x10000000 #define WINDOW_ORDER_STATE_DELETED 0x20000000 #define WINDOW_ORDER_FIELD_OWNER 0x00000002 #define WINDOW_ORDER_FIELD_STYLE 0x00000008 #define WINDOW_ORDER_FIELD_SHOW 0x00000010 #define WINDOW_ORDER_FIELD_TITLE 0x00000004 #define WINDOW_ORDER_FIELD_CLIENT_AREA_OFFSET 0x00004000 #define WINDOW_ORDER_FIELD_CLIENT_AREA_SIZE 0x00010000 #define WINDOW_ORDER_FIELD_RP_CONTENT 0x00020000 #define WINDOW_ORDER_FIELD_ROOT_PARENT 0x00040000 #define WINDOW_ORDER_FIELD_WND_OFFSET 0x00000800 #define WINDOW_ORDER_FIELD_WND_CLIENT_DELTA 0x00008000 #define WINDOW_ORDER_FIELD_WND_SIZE 0x00000400 #define WINDOW_ORDER_FIELD_WND_RECTS 0x00000100 #define WINDOW_ORDER_FIELD_VIS_OFFSET 0x00001000 #define WINDOW_ORDER_FIELD_VISIBILITY 0x00000200 #define WINDOW_ORDER_FIELD_ICON_BIG 0x00002000 #define WINDOW_ORDER_ICON 0x40000000 #define WINDOW_ORDER_CACHED_ICON 0x80000000 #define WINDOW_ORDER_FIELD_NOTIFY_VERSION 0x00000008 #define WINDOW_ORDER_FIELD_NOTIFY_TIP 0x00000001 #define WINDOW_ORDER_FIELD_NOTIFY_INFO_TIP 0x00000002 #define WINDOW_ORDER_FIELD_NOTIFY_STATE 0x00000004 #define WINDOW_ORDER_FIELD_DESKTOP_NONE 0x00000001 #define WINDOW_ORDER_FIELD_DESKTOP_HOOKED 0x00000002 #define WINDOW_ORDER_FIELD_DESKTOP_ARC_COMPLETED 0x00000004 #define WINDOW_ORDER_FIELD_DESKTOP_ARC_BEGAN 0x00000008 #define WINDOW_ORDER_FIELD_DESKTOP_ZORDER 0x00000010 #define WINDOW_ORDER_FIELD_DESKTOP_ACTIVE_WND 0x00000020 struct rail_icon_info { int bpp; int width; int height; int cmap_bytes; int mask_bytes; int data_bytes; char *mask; char *cmap; char *data; }; struct rail_window_rect { short left; short top; short right; short bottom; }; struct rail_notify_icon_infotip { int timeout; int flags; char *text; char *title; }; struct rail_window_state_order { int owner_window_id; int style; int extended_style; int show_state; char *title_info; int client_offset_x; int client_offset_y; int client_area_width; int client_area_height; int rp_content; int root_parent_handle; int window_offset_x; int window_offset_y; int window_client_delta_x; int window_client_delta_y; int window_width; int window_height; int num_window_rects; struct rail_window_rect *window_rects; int visible_offset_x; int visible_offset_y; int num_visibility_rects; struct rail_window_rect *visibility_rects; }; struct rail_notify_state_order { int version; char *tool_tip; struct rail_notify_icon_infotip infotip; int state; int icon_cache_entry; int icon_cache_id; struct rail_icon_info icon_info; }; struct rail_monitored_desktop_order { int active_window_id; int num_window_ids; int *window_ids; }; #endif ================================================ FILE: common/scancode.c ================================================ /** * Copyright (C) 2022 Matt Burt, all xrdp contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ /** * @file common/scancode.c * @brief Scancode handling */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include "scancode.h" struct scancode_to_keycode { unsigned short scancode; // 0x1xx implies an extended key unsigned char keycode; }; #define ELEMENTS(x) (sizeof(x) / sizeof(x[0])) // Sources:- // file:/usr/share/X11/xkb/keycodes/evdev // https://wiki.osdev.org/PS/2_Keyboard // https://www.kbdlayout.info/ static const struct scancode_to_keycode evdev_scancode_to_keycode_map[] = { // Virtual XKB // Key (US) Symbol // -------- ------ { 0x001, 9 }, // VK_ESCAPE ESC { 0x002, 10 }, // VK_1 AE01 { 0x003, 11 }, // VK_2 AE02 { 0x004, 12 }, // VK_3 AE03 { 0x005, 13 }, // VK_4 AE04 { 0x006, 14 }, // VK_5 AE05 { 0x007, 15 }, // VK_6 AE06 { 0x008, 16 }, // VK_7 AE07 { 0x009, 17 }, // VK_8 AE08 { 0x00a, 18 }, // VK_9 AE09 { 0x00b, 19 }, // VK_0 AE10 { 0x00c, 20 }, // VK_OEM_MINUS AE11 { 0x00d, 21 }, // VK_OEM_PLUS AE12 { 0x00e, 22 }, // VK_BACK BKSP { 0x00f, 23 }, // VK_TAB TAB { 0x010, 24 }, // VK_Q AD01 { 0x011, 25 }, // VK_W AD02 { 0x012, 26 }, // VK_E AD03 { 0x013, 27 }, // VK_R AD04 { 0x014, 28 }, // VK_T AD05 { 0x015, 29 }, // VK_Y AD06 { 0x016, 30 }, // VK_U AD07 { 0x017, 31 }, // VK_I AD08 { 0x018, 32 }, // VK_O AD09 { 0x019, 33 }, // VK_P AD10 { 0x01a, 34 }, // VK_OEM_4 AD11 { 0x01b, 35 }, // VK_OEM_6 AD12 { 0x01c, 36 }, // VK_RETURN RTRN { 0x01d, 37 }, // VK_LCONTROL LCTL { 0x01e, 38 }, // VK_A AC01 { 0x01f, 39 }, // VK_S AC02 { 0x020, 40 }, // VK_D AC03 { 0x021, 41 }, // VK_F AC04 { 0x022, 42 }, // VK_G AC05 { 0x023, 43 }, // VK_H AC06 { 0x024, 44 }, // VK_J AC07 { 0x025, 45 }, // VK_K AC08 { 0x026, 46 }, // VK_L AC09 { 0x027, 47 }, // VK_OEM_1 AC10 { 0x028, 48 }, // VK_OEM_7 AC11 { 0x029, 49 }, // VK_OEM_3 TLDE { 0x02a, 50 }, // VK_LSHIFT LFSH { 0x02b, 51 }, // VK_OEM_5 BKSL { 0x02c, 52 }, // VK_Z AB01 { 0x02d, 53 }, // VK_X AB02 { 0x02e, 54 }, // VK_C AB03 { 0x02f, 55 }, // VK_V AB04 { 0x030, 56 }, // VK_B AB05 { 0x031, 57 }, // VK_N AB06 { 0x032, 58 }, // VK_M AB07 { 0x033, 59 }, // VK_OEM_COMMA AB08 { 0x034, 60 }, // VK_OEM_PERIOD AB09 { 0x035, 61 }, // VK_OEM_2 AB10 { 0x036, 62 }, // VK_RSHIFT RTSH { 0x037, 63 }, // VK_MULTIPLY KPMU { 0x038, 64 }, // VK_LMENU LALT { 0x039, 65 }, // VK_SPACE SPCE { 0x03a, 66 }, // VK_CAPITAL CAPS { 0x03b, 67 }, // VK_F1 FK01 { 0x03c, 68 }, // VK_F2 FK02 { 0x03d, 69 }, // VK_F3 FK03 { 0x03e, 70 }, // VK_F4 FK04 { 0x03f, 71 }, // VK_F5 FK05 { 0x040, 72 }, // VK_F6 FK06 { 0x041, 73 }, // VK_F7 FK07 { 0x042, 74 }, // VK_F8 FK08 { 0x043, 75 }, // VK_F9 FK09 { 0x044, 76 }, // VK_F10 FK10 { 0x045, 77 }, // VK_NUMLOCK NMLK { 0x046, 78 }, // VK_SCROLL SCLK { 0x047, 79 }, // VK_HOME KP7 { 0x048, 80 }, // VK_UP KP8 { 0x049, 81 }, // VK_PRIOR KP9 { 0x04a, 82 }, // VK_SUBTRACT KPSU { 0x04b, 83 }, // VK_LEFT KP4 { 0x04c, 84 }, // VK_CLEAR KP5 { 0x04d, 85 }, // VK_RIGHT KP6 { 0x04e, 86 }, // VK_ADD KPAD { 0x04f, 87 }, // VK_END KP1 { 0x050, 88 }, // VK_DOWN KP2 { 0x051, 89 }, // VK_NEXT KP3 { 0x052, 90 }, // VK_INSERT KP0 { 0x053, 91 }, // VK_DELETE KPDL { 0x056, 94 }, // VK_OEM_102 LSGT { 0x057, 95 }, // VK_F11 FK11 { 0x058, 96 }, // VK_F12 FK12 { 0x070, 101 }, // - HKTG { 0x073, 97 }, // VK_ABNT_C1 AB11 { 0x079, 100 }, // - HENK { 0x07b, 102 }, // VK_OEM_PA1 MUHE { 0x07d, 132 }, // - AE13 { 0x07e, 129 }, // VK_ABNT_C2 KPPT (Brazil ABNT2) { 0x110, 173 }, // VK_MEDIA_PREV_TRACK I173 (KEY_PREVIOUSSONG) { 0x119, 171 }, // VK_MEDIA_NEXT_TRACK I171 (KEY_NEXTSONG) { 0x11c, 104 }, // VK_RETURN KPEN { 0x11d, 105 }, // VK_RCONTROL RCTL { 0x120, 121 }, // VK_VOLUME_MUTE MUTE { 0x121, 148 }, // VK_LAUNCH_APP2 I148 (KEY_CALC) { 0x122, 172 }, // VK_PLAY_PAUSE I172 (KEY_PLAYPAUSE) { 0x124, 174 }, // VK_MEDIA_STOP I174 (KEY_STOPCD) { 0x12e, 122 }, // VK_VOLUME_DOWN VOL- { 0x130, 123 }, // VK_VOLUME_UP VOL+ { 0x132, 180 }, // VK_BROWSER_HOME I180 (KEY_HOMEPAGE) { 0x135, 106 }, // VK_DIVIDE KPDV { 0x137, 107 }, // VK_SNAPSHOT PRSC { 0x138, 108 }, // VK_RMENU RALT { 0x147, 110 }, // VK_HOME HOME { 0x148, 111 }, // VK_UP UP { 0x149, 112 }, // VK_PRIOR PGUP (KEY_COMPUTER) { 0x14b, 113 }, // VK_LEFT LEFT { 0x14d, 114 }, // VK_RIGHT RGHT { 0x14f, 115 }, // VK_END END { 0x150, 116 }, // VK_DOWN DOWN { 0x151, 117 }, // VK_NEXT PGDN { 0x152, 118 }, // VK_INSERT INS { 0x153, 119 }, // VK_DELETE DELE { 0x15b, 133 }, // VK_LWIN LWIN { 0x15c, 134 }, // VK_RWIN RWIN { 0x15d, 135 }, // VK_APPS COMP { 0x165, 225 }, // VK_BROWSER_SEARCH I225 (KEY_SEARCH) { 0x166, 164 }, // VK_BROWSER_FAVORITES I164 (KEY_BOOKMARKS) { 0x16b, 165 }, // VK_LAUNCH_APP1 I165 (KEY_COMPUTER) { 0x16c, 163 }, // VK_LAUNCH_MAIL I163 (KEY_MAIL) { 0x21d, 127 } // VK_PAUSE PAUS (KEY_PAUSE) }; // Sources:- // file:/usr/share/X11/xkb/keycodes/xfree86 // https://wiki.osdev.org/PS/2_Keyboard // https://www.kbdlayout.info/ static const struct scancode_to_keycode base_scancode_to_keycode_map[] = { // Virtual XKB // Key (US) Symbol // -------- ------ { 0x001, 9 }, // VK_ESCAPE ESC { 0x002, 10 }, // VK_1 AE01 { 0x003, 11 }, // VK_2 AE02 { 0x004, 12 }, // VK_3 AE03 { 0x005, 13 }, // VK_4 AE04 { 0x006, 14 }, // VK_5 AE05 { 0x007, 15 }, // VK_6 AE06 { 0x008, 16 }, // VK_7 AE07 { 0x009, 17 }, // VK_8 AE08 { 0x00a, 18 }, // VK_9 AE09 { 0x00b, 19 }, // VK_0 AE10 { 0x00c, 20 }, // VK_OEM_MINUS AE11 { 0x00d, 21 }, // VK_OEM_PLUS AE12 { 0x00e, 22 }, // VK_BACK BKSP { 0x00f, 23 }, // VK_TAB TAB { 0x010, 24 }, // VK_Q AD01 { 0x011, 25 }, // VK_W AD02 { 0x012, 26 }, // VK_E AD03 { 0x013, 27 }, // VK_R AD04 { 0x014, 28 }, // VK_T AD05 { 0x015, 29 }, // VK_Y AD06 { 0x016, 30 }, // VK_U AD07 { 0x017, 31 }, // VK_I AD08 { 0x018, 32 }, // VK_O AD09 { 0x019, 33 }, // VK_P AD10 { 0x01a, 34 }, // VK_OEM_4 AD11 { 0x01b, 35 }, // VK_OEM_6 AD12 { 0x01c, 36 }, // VK_RETURN RTRN { 0x01d, 37 }, // VK_LCONTROL LCTL { 0x01e, 38 }, // VK_A AC01 { 0x01f, 39 }, // VK_S AC02 { 0x020, 40 }, // VK_D AC03 { 0x021, 41 }, // VK_F AC04 { 0x022, 42 }, // VK_G AC05 { 0x023, 43 }, // VK_H AC06 { 0x024, 44 }, // VK_J AC07 { 0x025, 45 }, // VK_K AC08 { 0x026, 46 }, // VK_L AC09 { 0x027, 47 }, // VK_OEM_1 AC10 { 0x028, 48 }, // VK_OEM_7 AC11 { 0x029, 49 }, // VK_OEM_3 TLDE { 0x02a, 50 }, // VK_LSHIFT LFSH { 0x02b, 51 }, // VK_OEM_5 BKSL { 0x02c, 52 }, // VK_Z AB01 { 0x02d, 53 }, // VK_X AB02 { 0x02e, 54 }, // VK_C AB03 { 0x02f, 55 }, // VK_V AB04 { 0x030, 56 }, // VK_B AB05 { 0x031, 57 }, // VK_N AB06 { 0x032, 58 }, // VK_M AB07 { 0x033, 59 }, // VK_OEM_COMMA AB08 { 0x034, 60 }, // VK_OEM_PERIOD AB09 { 0x035, 61 }, // VK_OEM_2 AB10 { 0x036, 62 }, // VK_RSHIFT RTSH { 0x037, 63 }, // VK_MULTIPLY KPMU { 0x038, 64 }, // VK_LMENU LALT { 0x039, 65 }, // VK_SPACE SPCE { 0x03a, 66 }, // VK_CAPITAL CAPS { 0x03b, 67 }, // VK_F1 FK01 { 0x03c, 68 }, // VK_F2 FK02 { 0x03d, 69 }, // VK_F3 FK03 { 0x03e, 70 }, // VK_F4 FK04 { 0x03f, 71 }, // VK_F5 FK05 { 0x040, 72 }, // VK_F6 FK06 { 0x041, 73 }, // VK_F7 FK07 { 0x042, 74 }, // VK_F8 FK08 { 0x043, 75 }, // VK_F9 FK09 { 0x044, 76 }, // VK_F10 FK10 { 0x045, 77 }, // VK_NUMLOCK NMLK { 0x046, 78 }, // VK_SCROLL SCLK { 0x047, 79 }, // VK_HOME KP7 { 0x048, 80 }, // VK_UP KP8 { 0x049, 81 }, // VK_PRIOR KP9 { 0x04a, 82 }, // VK_SUBTRACT KPSU { 0x04b, 83 }, // VK_LEFT KP4 { 0x04c, 84 }, // VK_CLEAR KP5 { 0x04d, 85 }, // VK_RIGHT KP6 { 0x04e, 86 }, // VK_ADD KPAD { 0x04f, 87 }, // VK_END KP1 { 0x050, 88 }, // VK_DOWN KP2 { 0x051, 89 }, // VK_NEXT KP3 { 0x052, 90 }, // VK_INSERT KP0 { 0x053, 91 }, // VK_DELETE KPDL { 0x056, 94 }, // VK_OEM_102 LSGT { 0x057, 95 }, // VK_F11 FK11 { 0x058, 96 }, // VK_F12 FK12 { 0x070, 208 }, // - HKTG { 0x073, 211 }, // VK_ABNT_C1 AB11 { 0x079, 129 }, // - XFER { 0x07b, 131 }, // VK_OEM_PA1 NFER { 0x07d, 133 }, // - AE13 { 0x07e, 134 }, // VK_ABNT_C2 KPPT (Brazil ABNT2) { 0x11c, 108 }, // VK_RETURN KPEN { 0x11d, 109 }, // VK_RCONTROL RCTL { 0x120, 141 }, // VK_VOLUME_MUTE MUTE { 0x12e, 142 }, // VK_VOLUME_DOWN VOL- { 0x130, 143 }, // VK_VOLUME_UP VOL+ { 0x135, 112 }, // VK_DIVIDE KPDV { 0x137, 121 }, // VK_SNAPSHOT PRSC { 0x138, 113 }, // VK_RMENU RALT { 0x147, 97 }, // VK_HOME HOME { 0x148, 98 }, // VK_UP UP { 0x149, 99 }, // VK_PRIOR PGUP (KEY_COMPUTER) { 0x14b, 100 }, // VK_LEFT LEFT { 0x14d, 102 }, // VK_RIGHT RGHT { 0x14f, 103 }, // VK_END END { 0x150, 104 }, // VK_DOWN DOWN { 0x151, 105 }, // VK_NEXT PGDN { 0x152, 106 }, // VK_INSERT INS { 0x153, 107 }, // VK_DELETE DELE { 0x15b, 115 }, // VK_LWIN LWIN { 0x15c, 116 }, // VK_RWIN RWIN { 0x15d, 117 }, // VK_APPS COMP { 0x21d, 110 } // VK_PAUSE PAUS (KEY_PAUSE) }; struct map_settings { const struct scancode_to_keycode *map; const char *name; unsigned int size; }; enum settings_index { SI_EVDEV = 0, SI_BASE }; const struct map_settings global_settings[] = { { // SI_EVDEV .map = evdev_scancode_to_keycode_map, .name = "evdev", .size = ELEMENTS(evdev_scancode_to_keycode_map), }, { // SI_BASE .map = base_scancode_to_keycode_map, .name = "base", .size = ELEMENTS(base_scancode_to_keycode_map) } }; // Default mapping set is "evdev" const struct map_settings *settings = &global_settings[SI_EVDEV]; /*****************************************************************************/ int scancode_to_index(unsigned short scancode) { if (scancode <= 0x7f) { return scancode; } if (scancode <= 0xff) { // 0x80 - 0xff : Invalid code return -1; } if (scancode <= 0x177) { // 01x100 - 0x177 : Move bit 9 to bit 8 return (scancode & 0x7f) | 0x80; } if (scancode == SCANCODE_PAUSE_KEY) { return SCANCODE_INDEX_PAUSE_KEY; } // This leaves the following which are all rejected // 0x178 - 0x17f (currently unused). These would map to indexes 0xf8 // to 0xff which we are reserving for extended1 keys. // 0x180 - 0x1ff Illegal format // >0x200 Anything not mentioned explicitly above (e.g. // SCANCODE_PAUSE_KEY) return -1; } /*****************************************************************************/ unsigned short scancode_from_index(int index) { unsigned short result = index & 0xff; if (result == SCANCODE_INDEX_PAUSE_KEY) { result = SCANCODE_PAUSE_KEY; } else if ((result & 0x80) != 0) { result ^= 0x180; // Clear bit 7, set bit 8 } return result; } /*****************************************************************************/ unsigned short scancode_to_x11_keycode(unsigned short scancode) { unsigned int min = 0; unsigned int max = settings->size; unsigned short rv = 0; // Check scancode is in range of map if (scancode >= settings->map[min].scancode && scancode <= settings->map[max - 1].scancode) { // Use a binary chop to locate the correct index // in logarithmic time. while (1) { unsigned int index = (min + max) / 2; if (scancode == settings->map[index].scancode) { rv = settings->map[index].keycode; break; } // Adjust min or max, checking for end // of iteration if (scancode < settings->map[index].scancode) { max = index; } else if (min == index) { // We've already checked this value break; } else { min = index; } } } return rv; } /*****************************************************************************/ unsigned short scancode_get_next(unsigned int *iter) { unsigned short rv = 0; if (*iter < settings->size) { rv = settings->map[*iter].scancode; ++(*iter); } return rv; } /*****************************************************************************/ int scancode_set_keycode_set(const char *kk_set) { int rv = 0; if (kk_set == NULL) { rv = 1; } else if (strncmp(kk_set, "evdev", 5) == 0) { settings = &global_settings[SI_EVDEV]; } else if (strncmp(kk_set, "base", 4) == 0) { settings = &global_settings[SI_BASE]; } else if (strncmp(kk_set, "xfree86", 7) == 0) { settings = &global_settings[SI_BASE]; } else { rv = 1; } return rv; } /*****************************************************************************/ const char * scancode_get_keycode_set(void) { return settings->name; } /*****************************************************************************/ const char * scancode_get_xkb_rules(void) { // Currently supported keycods map directly to the same name for // the rules which use them. return settings->name; } ================================================ FILE: common/scancode.h ================================================ /** * Copyright (C) 2024 Matt Burt, all xrdp contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @file common/scancode.h * @brief Scancode handling * * This module provides functionality for the following:- * 1) Mapping from TS_KEYBOARD_EVENT PDU values to an 'RDP scancode' * 2) Handling RDP scancodes * 3) Convert between RDP scancodes and X11 keycodes. * * The values received in TS_KEYBOARD_EVENT PDUs are largely the same as * Windows scancodes. These are indirectly documented in the Microsoft * "Keyboard Scan Code Specification", Rev 1.3a (March 16th 2000) and * are otherwise known as "Scan code set 1" scancodes. This document no * longer appears to be available directly from the Microsoft website. * * A TS_KEYBOARD_EVENT_PDU contains two important values:- * 1) key_code This is not unique. For example, left-shift and * right-shift share a key_code of 0x2a * 2) keyboard_flags Among other flags, contains KBDFLAGS_EXTENDED and * KBDFLAGS_EXTENDED1. These combine with the key_code * to allow a specific key to be determined. * * An 'RDP scancode' as defined by this module is a mapping of the * Windows key_code and keyboard_flags into a single value which * represents a unique key. For example:- * Left control : key_code=0x1d, KBDFLAGS_EXTENDED=0 scancode = 0x1d * Right control : key_code=0x1d, KBDFLAGS_EXTENDED=1 scancode = 0x11d * * This model of unique keys more closely maps what X11 does with its * own keycodes. * * X11 keycodes are the X11 equivalent of RDP scancodes. In general, these * are specific to an X server. In practice however, these are nowadays * handled by the XKB extension and only two sets are in common use:- * - evdev : Linux, FreeBSD and possibly others * - base : Everything else. * * This module presents a single source of truth for conversions between * RDP scancodes and X11 keycodes. */ #if !defined(SCANCODE_H) #define SCANCODE_H #include "xrdp_scancode_defs.h" enum { /** * Scancodes for keys used in the code are defined in the global * file xrdp_scancode_defs.h */ /** * Scancode indexes for some of the keys in xrdp_scancode_defs.h */ SCANCODE_INDEX_LSHIFT_KEY = SCANCODE_LSHIFT_KEY, SCANCODE_INDEX_RSHIFT_KEY = SCANCODE_RSHIFT_KEY, SCANCODE_INDEX_RALT_KEY = (SCANCODE_RALT_KEY & 0x7f) | 0x80, SCANCODE_INDEX_PAUSE_KEY = 0xf8, // 0xf9 - 0xff reserved for future extended1 mappings /** * Maximum value returned by scancode_to_index() */ SCANCODE_MAX_INDEX = 255 }; /** * Convert a scancode to an index * @param scancode scancode in the range 0x00 - 0x2ff * @return index in the range 0..SCANCODE_MAX_INDEX (inclusive) or -1 * * This function converts a 10-bit scancode into an 8-bit array index, * independent of the currently loaded keymap * * This is possible as the scancodes from 0x80 - 0x2ff are sparsely allocated. * * For scancodes in the range 0x00 - 0x7f, the index is identical to the * scancode. This includes scancodes for all the keys affected by * numlock. */ int scancode_to_index(unsigned short scancode); /** * Convert an index back to a scancode. * @param index in the range 0..SCANCODE_MAX_INDEX * * @result scancode which is mapped to the index value * * The result is always a valid scancode, even if the index is * not valid. */ unsigned short scancode_from_index(int index); /** * Looks up an RDP scancode and converts to an x11 keycode * * @param scancode Scancode. Extended scancodes have bit 9 set * (i.e. are in 0x100 - 0x1ff). Extended1 scancodes * (currently just the pause key) are in the range 0x200-0x2ff * @return keycode, or 0 for no keycode */ unsigned short scancode_to_x11_keycode(unsigned short scancode); /** * Gets the next valid scancode from the list of valid scancodes * @param iter Value (initialised to zero), used to iterate * over available scancodes. * @return Next valid scancode, or zero. * * The iterator is updated on a successful call. Use like this:- * * iter = 0; * while ((scancode = scancode_get_next(&iter)) != 0) * { * . . . * } */ unsigned short scancode_get_next(unsigned int *iter); /** * Sets the keycode set used for the scancode translation * * @param kk_set "evdev", "base", or something more * complex (e.g. "evdev+aliases(qwerty)") * @result 0 for success */ int scancode_set_keycode_set(const char *kk_set); /** * Gets the keycode set used for the scancode translation * * @result "evdev", or "base" */ const char * scancode_get_keycode_set(void); /** * Gets the XKB rules set which can be used to access the currently * loaded keycode set * * @result "evdev", or "base" */ const char * scancode_get_xkb_rules(void); #endif /* SCANCODE_H */ ================================================ FILE: common/set_int.c ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2021 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ /** * @file common/set_int.c * @brief Handle a set of integer values (definitions) */ #if defined(HAVE_CONFIG_H) #include #endif #include #include "arch.h" #include "set_int.h" #include "log.h" // Type to use for the bitmap in the set. This should be an // optimum type for the platform, to improve search performance for // sparse sets. The type must be unsigned for defined behaviour on // right-shift. typedef unsigned int word_type; #define BITS_PER_WORD (sizeof(word_type) * 8) struct set_int { int min; int max; size_t word_count; #ifdef __cplusplus word_type bits[1]; #else word_type bits[]; #endif }; /*****************************************************************************/ struct set_int * set_int_init(int min, int max) { struct set_int *result = NULL; if (max < min) { LOG(LOG_LEVEL_ERROR, "Tried to create a set with max(%d) < min(%d)", max, min); } else { // Calculate the number of words needed for the bits; size_t word_count = (max - min) / BITS_PER_WORD + 1; result = (struct set_int *)malloc( offsetof(struct set_int, bits) + word_count * sizeof(word_type)); if (result == NULL) { LOG(LOG_LEVEL_ERROR, "Out of memory constructing a set(%d, %d)", min, max); } else { result->min = min; result->max = max; result->word_count = word_count; set_int_remove_all(result); } } return result; } /*****************************************************************************/ void set_int_delete(struct set_int *set) { free(set); } /*****************************************************************************/ void set_int_add(struct set_int *set, int val) { if (set != NULL && val >= set->min && val <= set->max) { size_t index = (val - set->min) / BITS_PER_WORD; unsigned int bit = (val - set->min) % BITS_PER_WORD; set->bits[index] |= 1 << bit; } } /*****************************************************************************/ void set_int_remove(struct set_int *set, int val) { if (set != NULL && val >= set->min && val <= set->max) { size_t index = (val - set->min) / BITS_PER_WORD; unsigned int bit = (val - set->min) % BITS_PER_WORD; set->bits[index] &= ~(1 << bit); } } /*****************************************************************************/ int set_int_contains(const struct set_int *set, int val) { int result = 0; if (set != NULL && val >= set->min && val <= set->max) { size_t index = (val - set->min) / BITS_PER_WORD; unsigned int bit = (val - set->min) % BITS_PER_WORD; result = (set->bits[index] >> bit) & 1; } return result; } /*****************************************************************************/ void set_int_add_all(struct set_int *set) { if (set != NULL) { memset(set->bits, 0xff, set->word_count * sizeof(set->bits[0])); } } /*****************************************************************************/ void set_int_remove_all(struct set_int *set) { if (set != NULL) { memset(set->bits, 0, set->word_count * sizeof(set->bits[0])); } } /*****************************************************************************/ int set_int_get_next(const struct set_int *set, int *val) { // Sanity checks if (set == NULL || *val >= set->max) { return 0; } // Work out the next likely value int next = (*val < set->min) ? set->min : (*val) + 1; // Convert that to an index and bit size_t index = (next - set->min) / BITS_PER_WORD; unsigned int bit = (next - set->min) % BITS_PER_WORD; // Any bits left in the current word? word_type w = set->bits[index] >> bit; if (w == 0) { // Look for the next word with set bits do { ++index; if (index >= set->word_count) { return 0; } } while (set->bits[index] == 0); w = set->bits[index]; bit = 0; } // If we get here, w is guaranteed to have at least one set bit while ((w & 1) == 0) { w = w >> 1; ++bit; } // Now the index and bit are pointing to the // next set bit in the bitmap next = index * BITS_PER_WORD + bit + set->min; // Turn back into a value int result = (next <= set->max); // Must be in range. if (result) { *val = next; } return result;; } ================================================ FILE: common/set_int.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2021 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ /** * @file common/set_int.h * @brief Handle a set of integer values (declarations) */ #ifndef SET_INT_H #define SET_INT_H #include "arch.h" struct set_int; /** * Construct a set capable of holding integer values * * At most one copy of each vlue will be held in the set * * @param min Lowest value which will be added to the set * @param max highest value which will be added to the set * * @return new set * * NULL is returned for no memory, or if min > max * * The set is initially empty */ struct set_int * set_int_init(int min, int max); /** * Destroy a set * * @param set set to destroy */ void set_int_delete(struct set_int *set); /** * Adds a value to a set * * @param set set * @param val value to add * * values outside of the initial max..max range will be silently ignored */ void set_int_add(struct set_int *set, int val); /** * Removes a value from a set * * @param set set * @param val value to remove * * It is not an error to remove a value which isn't in the set */ void set_int_remove(struct set_int *set, int val); /** * Tests whether a set contains a particular value * * @param set set * @param val value to test * * @return != 0 if the value is in the set */ int set_int_contains(const struct set_int *set, int val); /** * Adds all values in the range min..max to a set * * @param set set */ void set_int_add_all(struct set_int *set); /** * Removes all values in the range min..max from a set * * @param set set */ void set_int_remove_all(struct set_int *set); /** * Gets the next value from a set * * @param set set * @param[in,out] val Value to search from * @return != 0 if another value was found * * On success, the val parameter is replaced with the next highest * value from the set. */ int set_int_get_next(const struct set_int *set, int *val); #endif // SET_INT_H ================================================ FILE: common/ssl_calls.c ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2014 * Copyright (C) Idan Freiberg 2013-2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * ssl calls */ #if defined(HAVE_CONFIG_H) #include #endif #include /* needed for openssl headers */ #include #include #include #include #include #include #include #include #include #include #include "os_calls.h" #include "string_calls.h" #include "arch.h" #include "ssl_calls.h" #include "trans.h" #include "log.h" #define SSL_WANT_READ_WRITE_TIMEOUT 100 /* * Globals used by openssl 3 and later */ #if OPENSSL_VERSION_NUMBER >= 0x30000000L static EVP_MD *g_md_md5; /* MD5 message digest */ static EVP_MD *g_md_sha1; /* SHA1 message digest */ static EVP_CIPHER *g_cipher_des_ede3_cbc; /* DES3 CBC cipher */ static EVP_MAC *g_mac_hmac; /* HMAC MAC */ #endif #if OPENSSL_VERSION_NUMBER >= 0x10101000L #define HAS_KEYLOG_CALLBACK /* SSL_CTX_set_keylog_callback() is available */ static char *g_keylog_filename = NULL; #endif /* definition of ssl_tls */ struct ssl_tls { SSL *ssl; /* SSL * */ SSL_CTX *ctx; /* SSL_CTX * */ char *cert; char *key; struct trans *trans; tintptr rwo; /* wait obj */ int error_logged; /* Error has already been logged */ }; #if OPENSSL_VERSION_NUMBER < 0x10100000L static inline HMAC_CTX * HMAC_CTX_new(void) { HMAC_CTX *hmac_ctx = g_new(HMAC_CTX, 1); HMAC_CTX_init(hmac_ctx); return hmac_ctx; } static inline void HMAC_CTX_free(HMAC_CTX *hmac_ctx) { HMAC_CTX_cleanup(hmac_ctx); g_free(hmac_ctx); } static inline void RSA_get0_key(const RSA *key, const BIGNUM **n, const BIGNUM **e, const BIGNUM **d) { *n = key->n; *d = key->d; } static inline int DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g) { /* If the fields p and g in d are NULL, the corresponding input * parameters MUST be non-NULL. q may remain NULL. */ if ((dh->p == NULL && p == NULL) || (dh->g == NULL && g == NULL)) { return 0; } if (p != NULL) { BN_free(dh->p); dh->p = p; } if (q != NULL) { BN_free(dh->q); dh->q = q; } if (g != NULL) { BN_free(dh->g); dh->g = g; } if (q != NULL) { dh->length = BN_num_bits(q); } return 1; } #endif /* OPENSSL_VERSION_NUMBER >= 0x10100000L */ /*****************************************************************************/ static void dump_error_stack(const char *prefix) { /* Dump the error stack from the SSL library */ unsigned long code; char buff[256]; while ((code = ERR_get_error()) != 0L) { ERR_error_string_n(code, buff, sizeof(buff)); LOG(LOG_LEVEL_ERROR, "%s: %s", prefix, buff); } } /*****************************************************************************/ /* As above, but used for TLS connection errors where only the first error is logged */ static void dump_ssl_error_stack(struct ssl_tls *self) { if (!self->error_logged) { dump_error_stack("SSL"); self->error_logged = 1; } } /*****************************************************************************/ int ssl_init(void) { SSL_load_error_strings(); SSL_library_init(); return 0; } /*****************************************************************************/ int ssl_finish(void) { #if OPENSSL_VERSION_NUMBER >= 0x30000000L /* De-allocate any allocated globals * For OpenSSL 3, these can all safely be passed a NULL pointer */ EVP_MD_free(g_md_md5); g_md_md5 = NULL; EVP_MD_free(g_md_sha1); g_md_sha1 = NULL; EVP_CIPHER_free(g_cipher_des_ede3_cbc); g_cipher_des_ede3_cbc = NULL; EVP_MAC_free(g_mac_hmac); g_mac_hmac = NULL; #endif #ifdef HAS_KEYLOG_CALLBACK free(g_keylog_filename); g_keylog_filename = NULL; #endif return 0; } /*****************************************************************************/ int ssl_set_pre_master_secret_logfile(const char *filename) { int rv = 0; #ifdef HAS_KEYLOG_CALLBACK int fd = -1; /* Remove any existing setting */ free(g_keylog_filename); g_keylog_filename = NULL; if (filename == NULL || filename[0] == '\0') { /* all done */ } else if (filename[0] != '/') { LOG(LOG_LEVEL_ERROR, "TLS pre-master log file must start with '/'"); } else if ((fd = g_file_open_rw(filename)) < 0) { /* Can't open file for writing. We'll log a single error here * rather than lots of errors in the callback */ LOG(LOG_LEVEL_ERROR, "Can't write TLS pre-master secrets to %s [%s]", filename, g_get_strerror()); } else if (g_file_close(fd) != 0) { /* Ignore this one */ } else if (g_chmod_hex(filename, 0x640) != 0) { LOG(LOG_LEVEL_WARNING, "Can't set expected permissions on %s [%s]", filename, g_get_strerror()); } else if ((g_keylog_filename = g_strdup(filename)) == NULL) { LOG(LOG_LEVEL_ERROR, "Out of memory setting TLS pre-master log"); } else { rv = 1; } #else LOG(LOG_LEVEL_WARNING, "This system is unable to log TLS pre-master secrets"); #endif return rv; } /*****************************************************************************/ /* Log the pre-master secret for debugging purposes */ #ifdef HAS_KEYLOG_CALLBACK static void log_pre_master_secret(const SSL *ssl, const char *line) { if (g_keylog_filename != NULL && g_keylog_filename[0] == '/') { int fd = g_file_open_rw(g_keylog_filename); if (fd < 0) { LOG(LOG_LEVEL_ERROR, "Can't write pre-master secret to %s [ %s]", g_keylog_filename, g_get_strerror()); } else { g_file_seek_end(fd, 0); g_file_write(fd, line, strlen(line)); g_file_write(fd, "\n", 1); (void)g_file_close(fd); } } } #endif // HAS_KEYLOG_CALLBACK /*****************************************************************************/ /* rc4 stuff * * For OpenSSL 3.0, the rc4 encryption algorithm is only provided by the * legacy provider (see crypto(7)). Since RC4 is so simple, we can implement * it directly rather than having to load the legacy provider. This will * avoids problems if running on a system where openssl has been built * without the legacy provider */ #if OPENSSL_VERSION_NUMBER >= 0x30000000L struct rc4_data { /* See https://en.wikipedia.org/wiki/RC4 */ unsigned char S[256]; int i; int j; }; #endif /*****************************************************************************/ void * ssl_rc4_info_create(void) { #if OPENSSL_VERSION_NUMBER < 0x30000000L return g_malloc(sizeof(RC4_KEY), 1); #else return g_malloc(sizeof(struct rc4_data), 1); #endif } /*****************************************************************************/ void ssl_rc4_info_delete(void *rc4_info) { g_free(rc4_info); } /*****************************************************************************/ void ssl_rc4_set_key(void *rc4_info, const char *key, int len) { #if OPENSSL_VERSION_NUMBER < 0x30000000L RC4_set_key((RC4_KEY *)rc4_info, len, (tui8 *)key); #else unsigned char *S = ((struct rc4_data *)rc4_info)->S; int i; int j = 0; unsigned char t; for (i = 0 ; i < 256; ++i) { S[i] = i; } for (i = 0 ; i < 256; ++i) { j = (j + S[i] + key[i % len]) & 0xff; t = S[i]; S[i] = S[j]; S[j] = t; } ((struct rc4_data *)rc4_info)->i = 0; ((struct rc4_data *)rc4_info)->j = 0; #endif } /*****************************************************************************/ void ssl_rc4_crypt(void *rc4_info, char *data, int len) { #if OPENSSL_VERSION_NUMBER < 0x30000000L RC4((RC4_KEY *)rc4_info, len, (tui8 *)data, (tui8 *)data); #else unsigned char *S = ((struct rc4_data *)rc4_info)->S; int i = ((struct rc4_data *)rc4_info)->i; int j = ((struct rc4_data *)rc4_info)->j; unsigned char *p = (unsigned char *)data; unsigned char t; unsigned char k; /* * Do some loop-unrolling for performance. Here are the steps * for each byte */ #define RC4_ROUND \ i = (i + 1) & 0xff; \ j = (j + S[i]) & 0xff; \ t = S[i]; \ S[i] = S[j]; \ S[j] = t; \ k = S[(S[i] + S[j]) & 0xff]; \ *p++ ^= k while (len >= 8) { RC4_ROUND; RC4_ROUND; RC4_ROUND; RC4_ROUND; RC4_ROUND; RC4_ROUND; RC4_ROUND; RC4_ROUND; len -= 8; } while (len-- > 0) { RC4_ROUND; } ((struct rc4_data *)rc4_info)->i = i; ((struct rc4_data *)rc4_info)->j = j; #endif } /* sha1 stuff */ /*****************************************************************************/ void * ssl_sha1_info_create(void) { #if OPENSSL_VERSION_NUMBER < 0x30000000L return g_malloc(sizeof(SHA_CTX), 1); #else /* * If we can't get the digest loaded, there's a problem with the * library providers, so there's no point in us returning anything useful. * If we do load the digest, it's used later */ if (g_md_sha1 == NULL) { if ((g_md_sha1 = EVP_MD_fetch(NULL, "sha1", NULL)) == NULL) { dump_error_stack("sha1"); return NULL; } } return (void *)EVP_MD_CTX_new(); #endif } /*****************************************************************************/ void ssl_sha1_info_delete(void *sha1_info) { #if OPENSSL_VERSION_NUMBER < 0x30000000L g_free(sha1_info); #else EVP_MD_CTX_free((EVP_MD_CTX *)sha1_info); #endif } /*****************************************************************************/ void ssl_sha1_clear(void *sha1_info) { #if OPENSSL_VERSION_NUMBER < 0x30000000L SHA1_Init((SHA_CTX *)sha1_info); #else if (sha1_info != NULL) { EVP_DigestInit_ex((EVP_MD_CTX *)sha1_info, g_md_sha1, NULL); } #endif } /*****************************************************************************/ void ssl_sha1_transform(void *sha1_info, const char *data, int len) { #if OPENSSL_VERSION_NUMBER < 0x30000000L SHA1_Update((SHA_CTX *)sha1_info, data, len); #else if (sha1_info != NULL) { EVP_DigestUpdate((EVP_MD_CTX *)sha1_info, data, len); } #endif } /*****************************************************************************/ void ssl_sha1_complete(void *sha1_info, char *data) { #if OPENSSL_VERSION_NUMBER < 0x30000000L SHA1_Final((tui8 *)data, (SHA_CTX *)sha1_info); #else if (sha1_info != NULL) { EVP_DigestFinal_ex((EVP_MD_CTX *)sha1_info, (unsigned char *)data, NULL); } #endif } /* md5 stuff */ /*****************************************************************************/ void * ssl_md5_info_create(void) { #if OPENSSL_VERSION_NUMBER < 0x30000000L return g_malloc(sizeof(MD5_CTX), 1); #else /* * If we can't get the digest loaded, there's a problem with the * library providers, so there's no point in us returning anything useful. * If we do load the digest, it's used later */ if (g_md_md5 == NULL) { if ((g_md_md5 = EVP_MD_fetch(NULL, "md5", NULL)) == NULL) { dump_error_stack("md5"); return NULL; } } return (void *)EVP_MD_CTX_new(); #endif } /*****************************************************************************/ void ssl_md5_info_delete(void *md5_info) { #if OPENSSL_VERSION_NUMBER < 0x30000000L g_free(md5_info); #else EVP_MD_CTX_free((EVP_MD_CTX *)md5_info); #endif } /*****************************************************************************/ void ssl_md5_clear(void *md5_info) { #if OPENSSL_VERSION_NUMBER < 0x30000000L MD5_Init((MD5_CTX *)md5_info); #else if (md5_info != NULL) { EVP_DigestInit_ex((EVP_MD_CTX *)md5_info, g_md_md5, NULL); } #endif } /*****************************************************************************/ void ssl_md5_transform(void *md5_info, const char *data, int len) { #if OPENSSL_VERSION_NUMBER < 0x30000000L MD5_Update((MD5_CTX *)md5_info, data, len); #else if (md5_info != NULL) { EVP_DigestUpdate((EVP_MD_CTX *)md5_info, data, len); } #endif } /*****************************************************************************/ void ssl_md5_complete(void *md5_info, char *data) { #if OPENSSL_VERSION_NUMBER < 0x30000000L MD5_Final((tui8 *)data, (MD5_CTX *)md5_info); #else if (md5_info != NULL) { EVP_DigestFinal_ex((EVP_MD_CTX *)md5_info, (unsigned char *)data, NULL); } #endif } /* FIPS stuff */ /*****************************************************************************/ void * ssl_des3_encrypt_info_create(const char *key, const char *ivec) { EVP_CIPHER_CTX *des3_ctx; const tui8 *lkey; const tui8 *livec; #if OPENSSL_VERSION_NUMBER >= 0x30000000L /* * For these versions of OpenSSL, there are no long-term guarantees the * DES3 cipher will be available. We'll try to load it here so we * can log any errors */ if (g_cipher_des_ede3_cbc == NULL) { g_cipher_des_ede3_cbc = EVP_CIPHER_fetch(NULL, "des-ede3-cbc", NULL); if (g_cipher_des_ede3_cbc == NULL) { dump_error_stack("DES-EDE3-CBC"); return NULL; } } #endif des3_ctx = EVP_CIPHER_CTX_new(); lkey = (const tui8 *) key; livec = (const tui8 *) ivec; #if OPENSSL_VERSION_NUMBER < 0x30000000L EVP_EncryptInit_ex(des3_ctx, EVP_des_ede3_cbc(), NULL, lkey, livec); #else EVP_EncryptInit_ex(des3_ctx, g_cipher_des_ede3_cbc, NULL, lkey, livec); #endif EVP_CIPHER_CTX_set_padding(des3_ctx, 0); return des3_ctx; } /*****************************************************************************/ void * ssl_des3_decrypt_info_create(const char *key, const char *ivec) { EVP_CIPHER_CTX *des3_ctx; const tui8 *lkey; const tui8 *livec; #if OPENSSL_VERSION_NUMBER >= 0x30000000L /* * For these versions of OpenSSL, there are no long-term guarantees the * DES3 cipher will be available. We'll try to load it here so we * can log any errors */ if (g_cipher_des_ede3_cbc == NULL) { g_cipher_des_ede3_cbc = EVP_CIPHER_fetch(NULL, "des-ede3-cbc", NULL); if (g_cipher_des_ede3_cbc == NULL) { dump_error_stack("DES-EDE3-CBC"); return NULL; } } #endif des3_ctx = EVP_CIPHER_CTX_new(); lkey = (const tui8 *) key; livec = (const tui8 *) ivec; #if OPENSSL_VERSION_NUMBER < 0x30000000L EVP_DecryptInit_ex(des3_ctx, EVP_des_ede3_cbc(), NULL, lkey, livec); #else EVP_DecryptInit_ex(des3_ctx, g_cipher_des_ede3_cbc, NULL, lkey, livec); #endif EVP_CIPHER_CTX_set_padding(des3_ctx, 0); return des3_ctx; } /*****************************************************************************/ void ssl_des3_info_delete(void *des3) { EVP_CIPHER_CTX *des3_ctx; des3_ctx = (EVP_CIPHER_CTX *) des3; if (des3_ctx != 0) { EVP_CIPHER_CTX_free(des3_ctx); } } /*****************************************************************************/ int ssl_des3_encrypt(void *des3, int length, const char *in_data, char *out_data) { EVP_CIPHER_CTX *des3_ctx; int len; const tui8 *lin_data; tui8 *lout_data; des3_ctx = (EVP_CIPHER_CTX *) des3; if (des3_ctx != NULL) { lin_data = (const tui8 *) in_data; lout_data = (tui8 *) out_data; len = 0; EVP_EncryptUpdate(des3_ctx, lout_data, &len, lin_data, length); } return 0; } /*****************************************************************************/ int ssl_des3_decrypt(void *des3, int length, const char *in_data, char *out_data) { EVP_CIPHER_CTX *des3_ctx; int len; const tui8 *lin_data; tui8 *lout_data; des3_ctx = (EVP_CIPHER_CTX *) des3; if (des3_ctx != NULL) { lin_data = (const tui8 *) in_data; lout_data = (tui8 *) out_data; len = 0; EVP_DecryptUpdate(des3_ctx, lout_data, &len, lin_data, length); } return 0; } /*****************************************************************************/ void * ssl_hmac_info_create(void) { #if OPENSSL_VERSION_NUMBER < 0x30000000L return (HMAC_CTX *)HMAC_CTX_new(); #else /* Need a MAC algorithm loaded */ if (g_mac_hmac == NULL) { if ((g_mac_hmac = EVP_MAC_fetch(NULL, "hmac", NULL)) == NULL) { dump_error_stack("hmac"); return NULL; } } return (void *)EVP_MAC_CTX_new(g_mac_hmac); #endif } /*****************************************************************************/ void ssl_hmac_info_delete(void *hmac) { #if OPENSSL_VERSION_NUMBER < 0x30000000L HMAC_CTX *hmac_ctx; hmac_ctx = (HMAC_CTX *) hmac; if (hmac_ctx != 0) { HMAC_CTX_free(hmac_ctx); } #else EVP_MAC_CTX_free((EVP_MAC_CTX *)hmac); #endif } /*****************************************************************************/ void ssl_hmac_sha1_init(void *hmac, const char *data, int len) { #if OPENSSL_VERSION_NUMBER < 0x30000000L HMAC_CTX *hmac_ctx; hmac_ctx = (HMAC_CTX *) hmac; HMAC_Init_ex(hmac_ctx, data, len, EVP_sha1(), NULL); #else if (hmac != NULL) { char digest[] = "sha1"; OSSL_PARAM params[3]; size_t n = 0; params[n++] = OSSL_PARAM_construct_utf8_string("digest", digest, 0); params[n++] = OSSL_PARAM_construct_end(); if (EVP_MAC_init((EVP_MAC_CTX *)hmac, (unsigned char *)data, len, params) == 0) { dump_error_stack("hmac-sha1"); } } #endif } /*****************************************************************************/ void ssl_hmac_transform(void *hmac, const char *data, int len) { #if OPENSSL_VERSION_NUMBER < 0x30000000L HMAC_CTX *hmac_ctx; const tui8 *ldata; hmac_ctx = (HMAC_CTX *) hmac; ldata = (const tui8 *) data; HMAC_Update(hmac_ctx, ldata, len); #else if (hmac != NULL) { EVP_MAC_update((EVP_MAC_CTX *)hmac, (unsigned char *)data, len); } #endif } /*****************************************************************************/ void ssl_hmac_complete(void *hmac, char *data, int len) { #if OPENSSL_VERSION_NUMBER < 0x30000000L HMAC_CTX *hmac_ctx; tui8 *ldata; tui32 llen; hmac_ctx = (HMAC_CTX *) hmac; ldata = (tui8 *) data; llen = len; HMAC_Final(hmac_ctx, ldata, &llen); #else if (hmac != NULL) { EVP_MAC_final((EVP_MAC_CTX *)hmac, (unsigned char *)data, NULL, len); } #endif } /*****************************************************************************/ static void ssl_reverse_it(char *p, int len) { int i; int j; char temp; i = 0; j = len - 1; while (i < j) { temp = p[i]; p[i] = p[j]; p[j] = temp; i++; j--; } } /*****************************************************************************/ int ssl_mod_exp(char *out, int out_len, const char *in, int in_len, const char *mod, int mod_len, const char *exp, int exp_len) { BN_CTX *ctx; BIGNUM *lmod; BIGNUM *lexp; BIGNUM *lin; BIGNUM *lout; int rv; char *l_out; char *l_in; char *l_mod; char *l_exp; l_out = (char *)g_malloc(out_len, 1); l_in = (char *)g_malloc(in_len, 1); l_mod = (char *)g_malloc(mod_len, 1); l_exp = (char *)g_malloc(exp_len, 1); g_memcpy(l_in, in, in_len); g_memcpy(l_mod, mod, mod_len); g_memcpy(l_exp, exp, exp_len); ssl_reverse_it(l_in, in_len); ssl_reverse_it(l_mod, mod_len); ssl_reverse_it(l_exp, exp_len); ctx = BN_CTX_new(); lmod = BN_new(); lexp = BN_new(); lin = BN_new(); lout = BN_new(); BN_bin2bn((tui8 *)l_mod, mod_len, lmod); BN_bin2bn((tui8 *)l_exp, exp_len, lexp); BN_bin2bn((tui8 *)l_in, in_len, lin); BN_mod_exp(lout, lin, lexp, lmod, ctx); rv = BN_bn2bin(lout, (tui8 *)l_out); if (rv <= out_len) { ssl_reverse_it(l_out, rv); g_memcpy(out, l_out, out_len); } else { rv = 0; } BN_free(lin); BN_free(lout); BN_free(lexp); BN_free(lmod); BN_CTX_free(ctx); g_free(l_out); g_free(l_in); g_free(l_mod); g_free(l_exp); return rv; } /*****************************************************************************/ /* returns error generates a new rsa key exp is passed in and mod and pri are passed out */ int ssl_gen_key_xrdp1(int key_size_in_bits, const char *exp, int exp_len, char *mod, int mod_len, char *pri, int pri_len) { BIGNUM *my_e; char *lexp; char *lmod; char *lpri; int error; int len; int diff; if ((exp_len != 4) || ((mod_len != 64) && (mod_len != 256)) || ((pri_len != 64) && (pri_len != 256))) { return 1; } diff = 0; lexp = (char *)g_malloc(exp_len, 1); lmod = (char *)g_malloc(mod_len, 1); lpri = (char *)g_malloc(pri_len, 1); g_memcpy(lexp, exp, exp_len); ssl_reverse_it(lexp, exp_len); my_e = BN_new(); BN_bin2bn((tui8 *)lexp, exp_len, my_e); #if OPENSSL_VERSION_NUMBER < 0x30000000L const BIGNUM *n = NULL; const BIGNUM *d = NULL; RSA *my_key = RSA_new(); error = RSA_generate_key_ex(my_key, key_size_in_bits, my_e, 0) == 0; /* After this call, n and d point directly into my_key, and are valid * until my_key is free'd */ RSA_get0_key(my_key, &n, NULL, &d); #else BIGNUM *n = NULL; BIGNUM *d = NULL; OSSL_PARAM params[] = { OSSL_PARAM_construct_int("bits", &key_size_in_bits), OSSL_PARAM_construct_end() }; EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_from_name(NULL, "RSA", NULL); EVP_PKEY *pkey = NULL; if (pctx != NULL && EVP_PKEY_keygen_init(pctx) > 0 && EVP_PKEY_CTX_set_params(pctx, params) > 0 && EVP_PKEY_generate(pctx, &pkey) > 0 && EVP_PKEY_get_bn_param(pkey, "n", &n) > 0 && EVP_PKEY_get_bn_param(pkey, "d", &d) > 0) { error = 0; } else { error = 1; } EVP_PKEY_CTX_free(pctx); EVP_PKEY_free(pkey); #endif if (error == 0) { len = BN_num_bytes(n); error = (len < 1) || (len > mod_len); diff = mod_len - len; } if (error == 0) { BN_bn2bin(n, (tui8 *)(lmod + diff)); ssl_reverse_it(lmod, mod_len); } if (error == 0) { len = BN_num_bytes(d); error = (len < 1) || (len > pri_len); diff = pri_len - len; } if (error == 0) { BN_bn2bin(d, (tui8 *)(lpri + diff)); ssl_reverse_it(lpri, pri_len); } if (error == 0) { g_memcpy(mod, lmod, mod_len); g_memcpy(pri, lpri, pri_len); } BN_free(my_e); #if OPENSSL_VERSION_NUMBER < 0x30000000L RSA_free(my_key); #else BN_free(n); BN_clear_free(d); #endif g_free(lexp); g_free(lmod); g_free(lpri); return error; } /*****************************************************************************/ /** static DH parameter, can be used if no custom parameter is specified see also * https://wiki.openssl.org/index.php/Diffie-Hellman_parameters * https://wiki.openssl.org/index.php/Manual:SSL_CTX_set_tmp_dh_callback(3) * * We dont do this for OpenSSL 3 - we use SSL_CTX_set_dh_auto() instead, as this * can cater for different key sizes on the certificate */ #if OPENSSL_VERSION_NUMBER < 0x30000000L static DH *ssl_get_dh2236() { static unsigned char dh2236_p[] = { 0x0E, 0xF8, 0x69, 0x0B, 0x35, 0x2F, 0x62, 0x59, 0xF7, 0xAF, 0x4E, 0x19, 0xB5, 0x9B, 0xD2, 0xEB, 0x33, 0x78, 0x1D, 0x43, 0x1D, 0xB6, 0xE4, 0xA3, 0x63, 0x47, 0x6A, 0xD4, 0xA8, 0x28, 0x11, 0x8C, 0x3F, 0xC8, 0xF1, 0x32, 0x2B, 0x5D, 0x9F, 0xF8, 0xA6, 0xCA, 0x21, 0x71, 0xDE, 0x30, 0xD7, 0xB5, 0xD6, 0xA4, 0xC2, 0xEE, 0xC0, 0x49, 0x30, 0xE7, 0x8C, 0x9B, 0x1A, 0x5A, 0x08, 0x2A, 0x11, 0x84, 0xE2, 0xC8, 0x36, 0x6C, 0xDC, 0x06, 0x79, 0x59, 0x51, 0xA4, 0xA0, 0x8F, 0xE1, 0x20, 0x94, 0x80, 0xAC, 0x6D, 0xFD, 0x3B, 0xA6, 0xA6, 0x70, 0x51, 0x93, 0x59, 0x28, 0x51, 0x54, 0xA3, 0xC5, 0x15, 0x44, 0x2C, 0x12, 0xE7, 0x95, 0x62, 0x0E, 0x65, 0x2F, 0x8C, 0x0D, 0xF8, 0x63, 0x52, 0x00, 0x2A, 0xA5, 0xD7, 0x59, 0xEF, 0x13, 0x18, 0x33, 0x25, 0xBC, 0xAD, 0xC8, 0x0A, 0x72, 0x8D, 0x26, 0x63, 0xD5, 0xB3, 0xBC, 0x43, 0x35, 0x0B, 0x5D, 0xC7, 0xCA, 0x45, 0x17, 0x06, 0x24, 0x71, 0xCA, 0x20, 0x73, 0xE8, 0x18, 0xD3, 0x8E, 0xE9, 0xE9, 0x8F, 0x67, 0xC0, 0x2C, 0x14, 0x7E, 0x41, 0x18, 0x6C, 0x74, 0x72, 0x56, 0x34, 0xC0, 0xDB, 0xDD, 0x85, 0x8B, 0xE0, 0x99, 0xE8, 0x5E, 0xC8, 0xF7, 0xD1, 0x0C, 0xF8, 0x83, 0x34, 0x37, 0x9E, 0x01, 0xDF, 0x1C, 0xD9, 0xE9, 0x95, 0xC1, 0x4C, 0x64, 0x37, 0x9B, 0xF5, 0x8F, 0x99, 0x97, 0x55, 0x68, 0x2E, 0x23, 0xB0, 0x35, 0xF3, 0xA5, 0x97, 0x92, 0xA0, 0x6D, 0xB4, 0xF8, 0xD8, 0x47, 0xCE, 0x3F, 0x0B, 0x36, 0x0E, 0xEB, 0x13, 0x15, 0xFD, 0x4F, 0x98, 0x4F, 0x14, 0x26, 0xE2, 0xAC, 0xD9, 0x42, 0xC6, 0x43, 0x8A, 0x95, 0x6B, 0x2B, 0x44, 0x38, 0x7F, 0x60, 0x97, 0x77, 0xD8, 0x7C, 0x6F, 0x5D, 0x62, 0x7C, 0xE1, 0xC8, 0x83, 0x12, 0x8B, 0x5E, 0x5E, 0xC7, 0x5E, 0xD5, 0x60, 0xF3, 0x2F, 0xFC, 0xFE, 0x70, 0xAC, 0x58, 0x3A, 0x3C, 0x18, 0x15, 0x54, 0x84, 0xA8, 0xAA, 0x41, 0x26, 0x7B, 0xE0, 0xA3, }; static unsigned char dh2236_g[] = { 0x02, }; DH *dh = DH_new(); if (dh == NULL) { return NULL; } BIGNUM *p = BN_bin2bn(dh2236_p, sizeof(dh2236_p), NULL); BIGNUM *g = BN_bin2bn(dh2236_g, sizeof(dh2236_g), NULL); if (p == NULL || g == NULL) { BN_free(p); BN_free(g); DH_free(dh); return NULL; } // p, g are freed later by DH_free() if (0 == DH_set0_pqg(dh, p, NULL, g)) { BN_free(p); BN_free(g); DH_free(dh); return NULL; } return dh; } #endif /* OPENSSL_VERSION_NUMBER < 0x30000000L */ /*****************************************************************************/ struct ssl_tls * ssl_tls_create(struct trans *trans, const char *key, const char *cert) { struct ssl_tls *self; int pid; char buf[1024]; self = (struct ssl_tls *) g_malloc(sizeof(struct ssl_tls), 1); if (self != NULL) { self->trans = trans; self->cert = (char *) cert; self->key = (char *) key; pid = g_getpid(); g_snprintf(buf, 1024, "xrdp_%8.8x_tls_rwo", pid); self->rwo = g_create_wait_obj(buf); } return self; } /*****************************************************************************/ static int ssl_tls_log_error(struct ssl_tls *self, const char *func, int value) { int result = 1; int ssl_error = SSL_get_error(self->ssl, value); if (ssl_error == SSL_ERROR_WANT_READ || ssl_error == SSL_ERROR_WANT_WRITE) { result = 0; } else if (!self->error_logged) { switch (ssl_error) { case SSL_ERROR_ZERO_RETURN: LOG(LOG_LEVEL_ERROR, "%s: Server closed TLS connection", func); break; case SSL_ERROR_SYSCALL: LOG(LOG_LEVEL_ERROR, "%s: I/O error", func); break; case SSL_ERROR_SSL: LOG(LOG_LEVEL_ERROR, "%s: Failure in SSL library " "(protocol error?)", func); break; default: LOG(LOG_LEVEL_ERROR, "%s: Unknown SSL error", func); break; } dump_ssl_error_stack(self); /* Sets self->error_logged */ } return result; } /**************************************************************************//** * Log an attempt to use an encrypted file * * For example, a private key could have a password set on it. We don't * support this. */ static int log_encrypted_file_unsupported(char *buf, int size, int rwflag, void *u) { LOG(LOG_LEVEL_ERROR, "Encryption is not supported for %s", (const char *)u); return -1; /* See pem_password_cb(3ssl) */ } /*****************************************************************************/ int ssl_tls_accept(struct ssl_tls *self, long ssl_protocols, const char *tls_ciphers, int (*is_term)(void)) { int connection_status; long options = 0; ERR_clear_error(); /** * SSL_OP_NO_SSLv2 * SSLv3 is used by, eg. Microsoft RDC for Mac OS X. */ options |= SSL_OP_NO_SSLv2; /** * Disable SSL protocols not listed in ssl_protocols. */ options |= ssl_protocols; #if defined(SSL_OP_NO_COMPRESSION) /** * SSL_OP_NO_COMPRESSION: * * The Microsoft RDP server does not advertise support * for TLS compression, but alternative servers may support it. * This was observed between early versions of the FreeRDP server * and the FreeRDP client, and caused major performance issues, * which is why we're disabling it. */ options |= SSL_OP_NO_COMPRESSION; #endif /** * SSL_OP_TLS_BLOCK_PADDING_BUG: * * The Microsoft RDP server does *not* support TLS padding. * It absolutely needs to be disabled otherwise it won't work. */ options |= SSL_OP_TLS_BLOCK_PADDING_BUG; /** * SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS: * * Just like TLS padding, the Microsoft RDP server does not * support empty fragments. This needs to be disabled. */ options |= SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS; self->ctx = SSL_CTX_new(SSLv23_server_method()); if (self->ctx == NULL) { LOG(LOG_LEVEL_ERROR, "Unable to negotiate a TLS connection with the client"); dump_ssl_error_stack(self); return 1; } /* set context options */ SSL_CTX_set_mode(self->ctx, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER | SSL_MODE_ENABLE_PARTIAL_WRITE); SSL_CTX_set_options(self->ctx, options); /* set DH parameters */ #if OPENSSL_VERSION_NUMBER < 0x30000000L DH *dh = ssl_get_dh2236(); if (dh == NULL) { LOG(LOG_LEVEL_ERROR, "Unable to generate DHE parameters for TLS"); return 1; } if (SSL_CTX_set_tmp_dh(self->ctx, dh) != 1) { LOG(LOG_LEVEL_ERROR, "Unable to setup DHE parameters for TLS"); dump_ssl_error_stack(self); return 1; } DH_free(dh); // ok to free, copied into ctx by SSL_CTX_set_tmp_dh() #endif #if (OPENSSL_VERSION_NUMBER >= 0x10000020L) && \ OPENSSL_VERSION_NUMBER < (0x10100000L) // SSL_CTX_set_ecdh_auto() added in OpenSSL 1.0.2 and // removed for OpenSSL 1.1.0 if (!SSL_CTX_set_ecdh_auto(self->ctx, 1)) { LOG(LOG_LEVEL_WARNING, "TLS ecdh auto failed to be enabled"); } #endif if (g_strlen(tls_ciphers) > 1) { LOG(LOG_LEVEL_TRACE, "tls_ciphers=%s", tls_ciphers); if (SSL_CTX_set_cipher_list(self->ctx, tls_ciphers) == 0) { LOG(LOG_LEVEL_ERROR, "Invalid TLS cipher options %s", tls_ciphers); dump_ssl_error_stack(self); return 1; } } SSL_CTX_set_read_ahead(self->ctx, 0); /* * We don't currently handle encrypted private keys - set a callback * to tell the user if one is provided */ SSL_CTX_set_default_passwd_cb(self->ctx, log_encrypted_file_unsupported); SSL_CTX_set_default_passwd_cb_userdata(self->ctx, self->key); if (SSL_CTX_use_PrivateKey_file(self->ctx, self->key, SSL_FILETYPE_PEM) <= 0) { LOG(LOG_LEVEL_ERROR, "Error loading TLS private key from %s", self->key); dump_ssl_error_stack(self); return 1; } SSL_CTX_set_default_passwd_cb(self->ctx, NULL); SSL_CTX_set_default_passwd_cb_userdata(self->ctx, NULL); if (SSL_CTX_use_certificate_chain_file(self->ctx, self->cert) <= 0) { LOG(LOG_LEVEL_ERROR, "Error loading TLS certificate chain from %s", self->cert); dump_ssl_error_stack(self); return 1; } /* * Don't call SSL_check_private_key() for openSSL prior to 1.0.2, as * certificate chains are not handled in the same way - see * SSL_CTX_check_private_key(3ssl) */ #if OPENSSL_VERSION_NUMBER >= 0x10002000L if (!SSL_CTX_check_private_key(self->ctx)) { LOG(LOG_LEVEL_ERROR, "Private key %s and certificate %s do not match", self->key, self->cert); dump_ssl_error_stack(self); return 1; } #endif #ifdef HAS_KEYLOG_CALLBACK SSL_CTX_set_keylog_callback(self->ctx, log_pre_master_secret); #endif // HAS_KEYLOG_CALLBACK self->ssl = SSL_new(self->ctx); if (self->ssl == NULL) { LOG(LOG_LEVEL_ERROR, "Unable to create an SSL structure"); dump_ssl_error_stack(self); return 1; } if (SSL_set_fd(self->ssl, self->trans->sck) < 1) { LOG(LOG_LEVEL_ERROR, "Unable to set up an SSL structure on fd %d", (int)self->trans->sck); dump_ssl_error_stack(self); return 1; } while (1) { /* * Make sure the error queue is clear before (re-) attempting the * accept. If the accept is successful, the error queue will * remain clear for normal SSL operation */ ERR_clear_error(); connection_status = SSL_accept(self->ssl); if (connection_status <= 0) { if (ssl_tls_log_error(self, "SSL_accept", connection_status)) { return 1; } /** * retry when SSL_get_error returns: * SSL_ERROR_WANT_READ * SSL_ERROR_WANT_WRITE */ switch (SSL_get_error(self->ssl, connection_status)) { case SSL_ERROR_WANT_READ: g_sck_can_recv(self->trans->sck, SSL_WANT_READ_WRITE_TIMEOUT); break; case SSL_ERROR_WANT_WRITE: g_sck_can_send(self->trans->sck, SSL_WANT_READ_WRITE_TIMEOUT); break; } if (is_term != NULL && (*is_term)()) { return 1; } } else { break; } } LOG(LOG_LEVEL_TRACE, "TLS connection accepted"); return 0; } /*****************************************************************************/ /* returns error, */ int ssl_tls_disconnect(struct ssl_tls *self) { int status; if (self == NULL) { return 0; } if (self->ssl == NULL) { return 0; } status = SSL_shutdown(self->ssl); if (status != 1) { status = SSL_shutdown(self->ssl); if (status <= 0) { if (ssl_tls_log_error(self, "SSL_shutdown", status)) { return 1; } /** * retry when SSL_get_error returns: * SSL_ERROR_WANT_READ * SSL_ERROR_WANT_WRITE */ } } return 0; } /*****************************************************************************/ void ssl_tls_delete(struct ssl_tls *self) { if (self != NULL) { if (self->ssl) { SSL_free(self->ssl); } if (self->ctx) { SSL_CTX_free(self->ctx); } g_delete_wait_obj(self->rwo); g_free(self); } } /*****************************************************************************/ int ssl_tls_read(struct ssl_tls *tls, char *data, int length) { int status; int break_flag; while (1) { status = SSL_read(tls->ssl, data, length); switch (SSL_get_error(tls->ssl, status)) { case SSL_ERROR_NONE: break_flag = 1; break; /** * retry when SSL_get_error returns: * SSL_ERROR_WANT_READ * SSL_ERROR_WANT_WRITE */ case SSL_ERROR_WANT_READ: g_sck_can_recv(tls->trans->sck, SSL_WANT_READ_WRITE_TIMEOUT); continue; case SSL_ERROR_WANT_WRITE: g_sck_can_send(tls->trans->sck, SSL_WANT_READ_WRITE_TIMEOUT); continue; /* socket closed */ case SSL_ERROR_ZERO_RETURN: return 0; default: ssl_tls_log_error(tls, "SSL_read", status); status = -1; break_flag = 1; break; } if (break_flag) { break; } } if (SSL_pending(tls->ssl) > 0) { g_set_wait_obj(tls->rwo); } return status; } /*****************************************************************************/ int ssl_tls_write(struct ssl_tls *tls, const char *data, int length) { int status; int break_flag; while (1) { status = SSL_write(tls->ssl, data, length); switch (SSL_get_error(tls->ssl, status)) { case SSL_ERROR_NONE: break_flag = 1; break; /** * retry when SSL_get_error returns: * SSL_ERROR_WANT_READ * SSL_ERROR_WANT_WRITE */ case SSL_ERROR_WANT_READ: g_sck_can_recv(tls->trans->sck, SSL_WANT_READ_WRITE_TIMEOUT); continue; case SSL_ERROR_WANT_WRITE: g_sck_can_send(tls->trans->sck, SSL_WANT_READ_WRITE_TIMEOUT); continue; /* socket closed */ case SSL_ERROR_ZERO_RETURN: return 0; default: ssl_tls_log_error(tls, "SSL_write", status); status = -1; break_flag = 1; break; } if (break_flag) { break; } } return status; } /*****************************************************************************/ /* returns boolean */ int ssl_tls_can_recv(struct ssl_tls *tls, int sck, int millis) { if (SSL_pending(tls->ssl) > 0) { return 1; } g_reset_wait_obj(tls->rwo); return g_sck_can_recv(sck, millis); } /*****************************************************************************/ const char * ssl_get_version(const struct ssl_tls *ssl) { return SSL_get_version(ssl->ssl); } /*****************************************************************************/ const char * ssl_get_cipher_name(const struct ssl_tls *ssl) { return SSL_get_cipher_name(ssl->ssl); } /*****************************************************************************/ tintptr ssl_get_rwo(const struct ssl_tls *ssl) { return ssl->rwo; } /*****************************************************************************/ int ssl_get_protocols_from_string(const char *str, long *ssl_protocols) { long protocols; long bad_protocols; int rv; if ((str == NULL) || (ssl_protocols == NULL)) { return 1; } rv = 0; protocols = 0; #if defined(SSL_OP_NO_SSLv3) protocols |= SSL_OP_NO_SSLv3; #endif #if defined(SSL_OP_NO_TLSv1) protocols |= SSL_OP_NO_TLSv1; #endif #if defined(SSL_OP_NO_TLSv1_1) protocols |= SSL_OP_NO_TLSv1_1; #endif #if defined(SSL_OP_NO_TLSv1_2) protocols |= SSL_OP_NO_TLSv1_2; #endif #if defined(SSL_OP_NO_TLSv1_3) protocols |= SSL_OP_NO_TLSv1_3; #endif bad_protocols = protocols; if (g_pos(str, ",TLSv1.3,") >= 0) { #if defined(SSL_OP_NO_TLSv1_3) LOG(LOG_LEVEL_DEBUG, "TLSv1.3 enabled"); protocols &= ~SSL_OP_NO_TLSv1_3; #else LOG(LOG_LEVEL_WARNING, "TLSv1.3 enabled by config, " "but not supported by system OpenSSL"); rv |= (1 << 6); #endif } if (g_pos(str, ",TLSv1.2,") >= 0) { #if defined(SSL_OP_NO_TLSv1_2) LOG(LOG_LEVEL_DEBUG, "TLSv1.2 enabled"); protocols &= ~SSL_OP_NO_TLSv1_2; #else LOG(LOG_LEVEL_WARNING, "TLSv1.2 enabled by config, " "but not supported by system OpenSSL"); rv |= (1 << 1); #endif } if (g_pos(str, ",TLSv1.1,") >= 0) { #if defined(SSL_OP_NO_TLSv1_1) LOG(LOG_LEVEL_DEBUG, "TLSv1.1 enabled"); protocols &= ~SSL_OP_NO_TLSv1_1; #else LOG(LOG_LEVEL_WARNING, "TLSv1.1 enabled by config, " "but not supported by system OpenSSL"); rv |= (1 << 2); #endif } if (g_pos(str, ",TLSv1,") >= 0) { #if defined(SSL_OP_NO_TLSv1) LOG(LOG_LEVEL_DEBUG, "TLSv1 enabled"); protocols &= ~SSL_OP_NO_TLSv1; #else LOG(LOG_LEVEL_WARNING, "TLSv1 enabled by config, " "but not supported by system OpenSSL"); rv |= (1 << 3); #endif } if (g_pos(str, ",SSLv3,") >= 0) { #if defined(SSL_OP_NO_SSLv3) LOG(LOG_LEVEL_DEBUG, "SSLv3 enabled"); protocols &= ~SSL_OP_NO_SSLv3; #else LOG(LOG_LEVEL_WARNING, "SSLv3 enabled by config, " "but not supported by system OpenSSL"); rv |= (1 << 4); #endif } if (protocols == bad_protocols) { LOG(LOG_LEVEL_WARNING, "No SSL/TLS protocols enabled. " "At least one protocol should be enabled to accept " "TLS connections."); rv |= (1 << 5); } *ssl_protocols = protocols; return rv; } /*****************************************************************************/ const char *get_openssl_version(void) { #if OPENSSL_VERSION_NUMBER < 0x10100000L return SSLeay_version(SSLEAY_VERSION); #else return OpenSSL_version(OPENSSL_VERSION); #endif } ================================================ FILE: common/ssl_calls.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2014 * Copyright (C) Idan Freiberg 2013-2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #if !defined(SSL_CALLS_H) #define SSL_CALLS_H #include "arch.h" /* Incomplete types */ struct ssl_tls; struct trans; int ssl_init(void); int ssl_finish(void); /** * Sets a log file for recording TLS pre-master secrets * * @param filename Filename to log secrets in * @return != 0 if the log was successfully set */ int ssl_set_pre_master_secret_logfile(const char *filename); void * ssl_rc4_info_create(void); void ssl_rc4_info_delete(void *rc4_info); void ssl_rc4_set_key(void *rc4_info, const char *key, int len); void ssl_rc4_crypt(void *rc4_info, char *data, int len); void * ssl_sha1_info_create(void); void ssl_sha1_info_delete(void *sha1_info); void ssl_sha1_clear(void *sha1_info); void ssl_sha1_transform(void *sha1_info, const char *data, int len); void ssl_sha1_complete(void *sha1_info, char *data); void * ssl_md5_info_create(void); void ssl_md5_info_delete(void *md5_info); void ssl_md5_clear(void *md5_info); void ssl_md5_transform(void *md5_info, const char *data, int len); void ssl_md5_complete(void *md5_info, char *data); void * ssl_des3_encrypt_info_create(const char *key, const char *ivec); void * ssl_des3_decrypt_info_create(const char *key, const char *ivec); void ssl_des3_info_delete(void *des3); int ssl_des3_encrypt(void *des3, int length, const char *in_data, char *out_data); int ssl_des3_decrypt(void *des3, int length, const char *in_data, char *out_data); void * ssl_hmac_info_create(void); void ssl_hmac_info_delete(void *hmac); void ssl_hmac_sha1_init(void *hmac, const char *data, int len); void ssl_hmac_transform(void *hmac, const char *data, int len); void ssl_hmac_complete(void *hmac, char *data, int len); int ssl_mod_exp(char *out, int out_len, const char *in, int in_len, const char *mod, int mod_len, const char *exp, int exp_len); int ssl_gen_key_xrdp1(int key_size_in_bits, const char *exp, int exp_len, char *mod, int mod_len, char *pri, int pri_len); /* xrdp_tls.c */ struct ssl_tls * ssl_tls_create(struct trans *trans, const char *key, const char *cert); int ssl_tls_accept(struct ssl_tls *self, long ssl_protocols, const char *tls_ciphers, int (*is_term)(void)); int ssl_tls_disconnect(struct ssl_tls *self); void ssl_tls_delete(struct ssl_tls *self); int ssl_tls_read(struct ssl_tls *tls, char *data, int length); int ssl_tls_write(struct ssl_tls *tls, const char *data, int length); int ssl_tls_can_recv(struct ssl_tls *tls, int sck, int millis); const char * ssl_get_version(const struct ssl_tls *ssl); const char * ssl_get_cipher_name(const struct ssl_tls *ssl); int ssl_get_protocols_from_string(const char *str, long *ssl_protocols); const char * get_openssl_version(void); tintptr ssl_get_rwo(const struct ssl_tls *ssl); #endif ================================================ FILE: common/string_calls.c ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2020 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * The strlcpy implementation is taken from OpenBSD and reformatted. The * original has the following notice attached:- * | * | Copyright (c) 1998, 2015 Todd C. Miller * | * | Permission to use, copy, modify, and distribute this software for any * | purpose with or without fee is hereby granted, provided that the above * | copyright notice and this permission notice appear in all copies. * | * | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.* * * generic string handling calls */ #if defined(HAVE_CONFIG_H) #include "config_ac.h" #endif #include #include #include #include #include #include "log.h" #include "os_calls.h" #include "string_calls.h" #include "defines.h" #include "unicode_defines.h" unsigned int g_format_info_string(char *dest, unsigned int len, const char *format, const struct info_string_tag map[]) { unsigned int result = 0; const char *copy_from; /* Data to add to output */ unsigned int copy_len; /* Length of above */ unsigned int skip; /* Date to skip over in format string */ const char *p; const struct info_string_tag *m; for ( ; *format != '\0'; format += skip) { if (*format == '%') { char ch = *(format + 1); if (ch == '%') { /* '%%' in format - replace with single '%' */ copy_from = format; copy_len = 1; skip = 2; } else if (ch == '\0') { /* Percent at end of string - ignore */ copy_from = NULL; copy_len = 0; skip = 1; } else { /* Look up the character in the map, assuming failure */ copy_from = NULL; copy_len = 0; skip = 2; for (m = map ; m->ch != '\0' ; ++m) { if (ch == m->ch) { copy_from = m->val; copy_len = strlen(copy_from); break; } } } } else if ((p = strchr(format, '%')) != NULL) { /* Copy up to the next '%' */ copy_from = format; copy_len = p - format; skip = copy_len; } else { /* Copy the rest of the format string */ copy_from = format; copy_len = strlen(format); skip = copy_len; } /* Update the result before any truncation */ result += copy_len; /* Do we have room in the output buffer for any more data? We * must always write a terminator if possible */ if (len > 1) { if (copy_len > (len - 1)) { copy_len = len - 1; } memcpy(dest, copy_from, copy_len); dest += copy_len; len -= copy_len; } } /* Room for a terminator? */ if (len > 0) { *dest = '\0'; } return result; } /******************************************************************************/ const char * g_bool2text(int value) { return value ? "true" : "false"; } /*****************************************************************************/ int g_text2bool(const char *s) { if ( (g_atoi(s) != 0) || (0 == g_strcasecmp(s, "true")) || (0 == g_strcasecmp(s, "on")) || (0 == g_strcasecmp(s, "yes"))) { return 1; } return 0; } /*****************************************************************************/ static int get_display_num_from_display(const char *display_text) { int rv = -1; const char *p; /* Skip over the hostname part of the DISPLAY */ if (display_text != NULL && (p = strchr(display_text, ':')) != NULL) { ++p; /* Skip the ':' */ /* Cater for the (still supported) double-colon. See * https://www.x.org/releases/X11R7.7/doc/libX11/libX11/libX11.html */ if (*p == ':') { ++p; } /* Check it starts with a digit, to avoid oddities like DISPLAY=":zz.0" * being parsed successfully */ if (isdigit(*p)) { rv = g_atoi(p); } } return rv; } /*****************************************************************************/ int g_get_display_string_from_x11_display(int display_num, char buff[], unsigned int bufflen) { unsigned int res = g_snprintf(buff, bufflen, "X11-%d", display_num); return (res >= bufflen) ? -1 : 0; } /*****************************************************************************/ int g_get_x11_display_from_display_string(const char *display_str) { int result = -1; if (display_str != NULL) { if (display_str[0] == 'X' && display_str[1] == '1' && display_str[2] == '1' && display_str[3] == '-' && isdigit(display_str[4])) { result = g_atoi(display_str + 4); } } return result; } /*****************************************************************************/ int g_get_display_string(char buff[], unsigned int bufflen) { const char *str; const char *p = NULL; int rv = 0; if ((str = g_getenv("WAYLAND_DISPLAY")) != NULL) { // Return the unqualified part of the name p = strrchr(str, '/'); p = (p != NULL) ? (p + 1) : str; if (strlcpy(buff, p, bufflen) >= bufflen) { rv = -1; /* Buffer overflow */ } } else if ((str = g_getenv("DISPLAY")) != NULL) { int n = get_display_num_from_display(str); if (n >= 0) { if ((unsigned int)g_snprintf(buff, bufflen, "X11-%d", n) >= bufflen) { rv = -1; /* Buffer overflow */ } } else { rv = g_get_display_string_from_x11_display(n, buff, bufflen); } } else { rv = -1; } return rv; } /*****************************************************************************/ /* returns length of text */ int g_strlen(const char *text) { if (text == NULL) { return 0; } return strlen(text); } /*****************************************************************************/ /* locates char in text */ char * g_strchr(const char *text, int c) { if (text == NULL) { return 0; } /* Cast needed to compile with C++ */ return (char *)strchr(text, c); } /*****************************************************************************/ /* locates char in text */ char * g_strrchr(const char *text, int c) { if (text == NULL) { return 0; } /* Cast needed to compile with C++ */ return (char *)strrchr(text, c); } /*****************************************************************************/ /* locates char in text with length */ char * g_strnchr(const char *text, int c, int len) { if (text == NULL || len <= 0) { return NULL; } return (char *)memchr(text, c, len); } /*****************************************************************************/ /* returns dest */ char * g_strcpy(char *dest, const char *src) { if (src == 0 && dest != 0) { dest[0] = 0; return dest; } if (dest == 0 || src == 0) { return 0; } return strcpy(dest, src); } /*****************************************************************************/ /* returns dest */ char * g_strncpy(char *dest, const char *src, int len) { char *rv; if (src == 0 && dest != 0) { dest[0] = 0; return dest; } if (dest == 0 || src == 0) { return 0; } rv = strncpy(dest, src, len); dest[len] = 0; return rv; } /*****************************************************************************/ /* returns dest */ char * g_strcat(char *dest, const char *src) { if (dest == 0 || src == 0) { return dest; } return strcat(dest, src); } /*****************************************************************************/ /* returns dest */ char * g_strncat(char *dest, const char *src, int len) { if (dest == 0 || src == 0) { return dest; } return strncat(dest, src, len); } /*****************************************************************************/ /* if in = 0, return 0 else return newly alloced copy of in */ char * g_strdup(const char *in) { int len; char *p; if (in == 0) { return 0; } len = g_strlen(in); p = (char *)g_malloc(len + 1, 0); if (p != NULL) { g_strcpy(p, in); } return p; } /*****************************************************************************/ /* if in = 0, return 0 else return newly alloced copy of input string * if the input string is larger than maxlen the returned string will be * truncated. All strings returned will include null termination*/ char * g_strndup(const char *in, const unsigned int maxlen) { unsigned int len; char *p; if (in == 0) { return 0; } len = g_strlen(in); if (len > maxlen) { len = maxlen - 1; } p = (char *)g_malloc(len + 2, 0); if (p != NULL) { g_strncpy(p, in, len + 1); } return p; } /*****************************************************************************/ int g_strcmp(const char *c1, const char *c2) { return strcmp(c1, c2); } /*****************************************************************************/ int g_strncmp(const char *c1, const char *c2, int len) { return strncmp(c1, c2, len); } /*****************************************************************************/ /* compare up to delim */ int g_strncmp_d(const char *s1, const char *s2, const char delim, int n) { char c1; char c2; c1 = 0; c2 = 0; while (n > 0) { c1 = *(s1++); c2 = *(s2++); if ((c1 == 0) || (c1 != c2) || (c1 == delim) || (c2 == delim)) { return c1 - c2; } n--; } return c1 - c2; } /*****************************************************************************/ int g_strcasecmp(const char *c1, const char *c2) { #if defined(_WIN32) return stricmp(c1, c2); #else return strcasecmp(c1, c2); #endif } /*****************************************************************************/ int g_strncasecmp(const char *c1, const char *c2, int len) { #if defined(_WIN32) return strnicmp(c1, c2, len); #else return strncasecmp(c1, c2, len); #endif } /*****************************************************************************/ int g_atoi(const char *str) { if (str == 0) { return 0; } return atoi(str); } /*****************************************************************************/ /* As g_atoi() but allows for hexadecimal too */ int g_atoix(const char *str) { int base = 10; if (str == NULL) { str = "0"; } while (isspace(*str)) { ++str; } if (*str == '0' && tolower(*(str + 1)) == 'x') { str += 2; base = 16; } //coverity[OVERRUN:FALSE] return strtol(str, NULL, base); } /*****************************************************************************/ #if !defined(HAVE_STRLCPY) size_t strlcpy(char *dst, const char *src, size_t dsize) { const char *osrc = src; size_t nleft = dsize; /* Copy as many bytes as will fit. */ if (nleft != 0) { while (--nleft != 0) { if ((*dst++ = *src++) == '\0') { break; } } } /* Not enough room in dst, add NUL and traverse rest of src. */ if (nleft == 0) { if (dsize != 0) { *dst = '\0'; /* NUL-terminate dst */ } while (*src++) { ; } } return (src - osrc - 1); /* count does not include NUL */ } #endif /*****************************************************************************/ unsigned int g_htoi(const char *str) { unsigned int rv = 0; while (*str != '\0') { char c = *str; unsigned int val; if (c >= '0' && c <= '9') { val = c - '0'; } else if (c >= 'A' && c <= 'F') { val = (c - 'A' + 10); } else if (c >= 'a' && c <= 'f') { val = (c - 'a' + 10); } else { break; // Unrecognised character } rv = (rv << 4) | val; ++str; } return rv; } /*****************************************************************************/ /* returns number of bytes copied into out_str */ int g_bytes_to_hexstr(const void *bytes, int num_bytes, char *out_str, int bytes_out_str) { int rv; int index; char *lout_str; const tui8 *lbytes; rv = 0; lbytes = (const tui8 *) bytes; lout_str = out_str; for (index = 0; index < num_bytes; index++) { if (bytes_out_str < 3) { break; } g_snprintf(lout_str, bytes_out_str, "%2.2x", lbytes[index]); lout_str += 2; bytes_out_str -= 2; rv += 2; } return rv; } /*****************************************************************************/ /* convert a byte array into a hex dump */ char * g_bytes_to_hexdump(const char *src, int len) { unsigned char *line; int i; int dump_number_lines; int dump_line_length; int dump_length; int dump_offset; int thisline; int offset; char *dump_buffer; #define HEX_DUMP_SOURCE_BYTES_PER_LINE (16) #ifdef _WIN32 #define HEX_DUMP_NEWLINE_SIZE (2) #else #ifdef _MACOS #define HEX_DUMP_NEWLINE_SIZE (1) #else #define HEX_DUMP_NEWLINE_SIZE (1) #endif #endif dump_line_length = (4 + 3 /* = 4 offset + 3 space */ + ((2 + 1) * HEX_DUMP_SOURCE_BYTES_PER_LINE) /* + (2 hex char + 1 space) per source byte */ + 2 /* + 2 space */ + HEX_DUMP_SOURCE_BYTES_PER_LINE + HEX_DUMP_NEWLINE_SIZE); dump_number_lines = (len / HEX_DUMP_SOURCE_BYTES_PER_LINE) + 1; /* +1 to round up */ dump_length = (dump_number_lines * dump_line_length /* hex dump lines */ + 1); /* terminating NULL */ dump_buffer = (char *)g_malloc(dump_length, 1); if (dump_buffer == NULL) { LOG_DEVEL(LOG_LEVEL_WARNING, "Failed to allocate buffer for hex dump of size %d", dump_length); return NULL; } line = (unsigned char *)src; offset = 0; dump_offset = 0; while (offset < len) { g_sprintf(dump_buffer + dump_offset, "%04x ", offset); dump_offset += 7; thisline = len - offset; if (thisline > HEX_DUMP_SOURCE_BYTES_PER_LINE) { thisline = HEX_DUMP_SOURCE_BYTES_PER_LINE; } for (i = 0; i < thisline; i++) { g_sprintf(dump_buffer + dump_offset, "%02x ", line[i]); dump_offset += 3; } for (; i < HEX_DUMP_SOURCE_BYTES_PER_LINE; i++) { dump_buffer[dump_offset++] = ' '; dump_buffer[dump_offset++] = ' '; dump_buffer[dump_offset++] = ' '; } dump_buffer[dump_offset++] = ' '; dump_buffer[dump_offset++] = ' '; for (i = 0; i < thisline; i++) { dump_buffer[dump_offset++] = (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.'; } for (; i < HEX_DUMP_SOURCE_BYTES_PER_LINE; i++) { dump_buffer[dump_offset++] = ' '; } #ifdef _WIN32 dump_buffer[dump_offset++] = '\r'; dump_buffer[dump_offset++] = '\n'; #else #ifdef _MACOS dump_buffer[dump_offset++] = '\r'; #else dump_buffer[dump_offset++] = '\n'; #endif #endif offset += thisline; line += thisline; if (dump_offset % dump_line_length != 0) { LOG_DEVEL(LOG_LEVEL_WARNING, "BUG: dump_offset (%d) at the end of a line is not a " "multiple of the line length (%d)", dump_offset, dump_line_length); } } if (dump_offset > dump_length) { LOG_DEVEL(LOG_LEVEL_WARNING, "BUG: dump_offset (%d) is larger than the dump_buffer length (%d)", dump_offset, dump_length); dump_buffer[0] = '\0'; return dump_buffer; } /* replace the last new line with the end of the string since log_message will add a new line */ dump_buffer[dump_offset - HEX_DUMP_NEWLINE_SIZE] = '\0'; return dump_buffer; } /*****************************************************************************/ int g_pos(const char *str, const char *to_find) { const char *pp; pp = strstr(str, to_find); if (pp == 0) { return -1; } return (pp - str); } /*****************************************************************************/ char * g_strstr(const char *haystack, const char *needle) { if (haystack == NULL || needle == NULL) { return NULL; } /* Cast needed to compile with C++ */ return (char *)strstr(haystack, needle); } /*****************************************************************************/ /* returns error */ int g_strtrim(char *str, int trim_flags) { #define TRIMMABLE_CHAR(c) ((unsigned char)(c) <= ' ') int rv = 0; int index; int j; switch (trim_flags) { case 4: /* trim through */ j = 0; for (index = 0; str[index] != '\0'; index++) { if (!TRIMMABLE_CHAR(str[index])) { str[j++] = str[index]; } } str[j] = '\0'; break; case 3: /* trim both */ rv = g_strtrim(str, 1) || g_strtrim(str, 2); break; case 2: /* trim right */ index = strlen(str); while (index > 0 && TRIMMABLE_CHAR(str[index - 1])) { --index; } str[index] = '\0'; break; case 1: /* trim left */ index = 0; while (str[index] != '\0' && TRIMMABLE_CHAR(str[index])) { ++index; } if (index > 0) { memmove(str, str + index, strlen(str) + 1 - index); } break; default: rv = 1; } return rv; #undef TRIMMABLE_CHAR } /*****************************************************************************/ char * g_strnjoin(char *dest, int dest_len, const char *joiner, const char *src[], int src_len) { int len; int joiner_len; int i = 0; int dest_remaining; char *dest_pos = dest; char *dest_end; if (dest == NULL || dest_len < 1) { return dest; } if (src == NULL || src_len < 1) { dest[0] = '\0'; return dest; } dest[0] = '\0'; dest_end = dest + dest_len - 1; joiner_len = g_strlen(joiner); for (i = 0; i < src_len - 1 && dest_pos < dest_end; i++) { len = g_strlen(src[i]); dest_remaining = dest_end - dest_pos; g_strncat(dest_pos, src[i], dest_remaining); dest_pos += MIN(len, dest_remaining); if (dest_pos < dest_end) { dest_remaining = dest_end - dest_pos; g_strncat(dest_pos, joiner, dest_remaining); dest_pos += MIN(joiner_len, dest_remaining); } } if (i == src_len - 1 && dest_pos < dest_end) { g_strncat(dest_pos, src[i], dest_end - dest_pos); } return dest; } /*****************************************************************************/ int g_bitmask_to_str(int bitmask, const struct bitmask_string bitdefs[], char delim, char *buff, int bufflen) { int rlen = 0; /* Returned length */ if (bufflen <= 0) /* Caller error */ { rlen = -1; } else { char *p = buff; /* Find the last writeable character in the buffer */ const char *last = buff + (bufflen - 1); const struct bitmask_string *b; for (b = &bitdefs[0] ; b->mask != 0; ++b) { if ((bitmask & b->mask) != 0) { if (p > buff) { /* Not first item - append separator */ if (p < last) { *p++ = delim; } ++rlen; } int slen = g_strlen(b->str); int copylen = MIN(slen, last - p); g_memcpy(p, b->str, copylen); p += copylen; rlen += slen; /* Remove the bit so we can check for undefined bits later*/ bitmask &= ~b->mask; } } if (bitmask != 0) { /* Bits left which aren't named by the user */ if (p > buff) { if (p < last) { *p++ = delim; } ++rlen; } /* This call will terminate the return buffer */ rlen += g_snprintf(p, last - p + 1, "0x%x", bitmask); } else { *p = '\0'; } } return rlen; } /*****************************************************************************/ int g_str_to_bitmask(const char *str, const struct bitmask_string bitdefs[], const char *delim, char *unrecognised, int unrecognised_len) { char *properties = NULL; char *p = NULL; int mask = 0; if (unrecognised_len < 1) { /* No space left to tell unrecognised tokens */ return 0; } if (!unrecognised) { return 0; } /* ensure not to return with uninitialized buffer */ unrecognised[0] = '\0'; if (!str || !bitdefs || !delim) { return 0; } properties = g_strdup(str); if (!properties) { return 0; } p = strtok(properties, delim); while (p != NULL) { g_strtrim(p, 3); const struct bitmask_string *b; int found = 0; for (b = &bitdefs[0] ; b->str != NULL; ++b) { if (0 == g_strcasecmp(p, b->str)) { mask |= b->mask; found = 1; break; } } if (found == 0) { int length = g_strlen(unrecognised); if (length > 0) { /* adding ",property" */ if (length + g_strlen(p) + 1 < unrecognised_len) { unrecognised[length] = delim[0]; length += 1; g_strcpy(unrecognised + length, p); } } else if (g_strlen(p) < unrecognised_len) { g_strcpy(unrecognised, p); } } p = strtok(NULL, delim); } g_free(properties); return mask; } /*****************************************************************************/ int g_bitmask_to_charstr(int bitmask, const struct bitmask_char bitdefs[], char *buff, int bufflen, int *rest) { int rlen = 0; /* Returned length */ if (bufflen <= 0) /* Caller error */ { rlen = -1; } else { char *p = buff; /* Find the last writeable character in the buffer */ const char *last = buff + (bufflen - 1); const struct bitmask_char *b; for (b = &bitdefs[0] ; b->c != '\0'; ++b) { if ((bitmask & b->mask) != 0) { if (p < last) { *p++ = b->c; } ++rlen; /* Remove the bit so we don't report it back */ bitmask &= ~b->mask; } } *p = '\0'; if (rest != NULL) { *rest = bitmask; } } return rlen; } /*****************************************************************************/ int g_charstr_to_bitmask(const char *str, const struct bitmask_char bitdefs[], char *unrecognised, int unrecognised_len) { int bitmask = 0; const char *cp; int j = 0; if (str != NULL && bitdefs != NULL) { for (cp = str ; *cp != '\0' ; ++cp) { const struct bitmask_char *b; char c = toupper(*cp); for (b = &bitdefs[0] ; b->c != '\0'; ++b) { if (toupper(b->c) == c) { bitmask |= b->mask; break; } } if (b->c == '\0') { if (unrecognised != NULL && j < (unrecognised_len - 1)) { unrecognised[j++] = *cp; } } } } if (unrecognised != NULL && j < unrecognised_len) { unrecognised[j] = '\0'; } return bitmask; } /*****************************************************************************/ /* * Looks for a simple mapping of signal number to name */ static const char * find_sig_name(int signum) { typedef struct { int num; const char *name; } sig_to_name_type; // Map a string 'zzz' to { SIGzzz, "zzz"} for making // typo-free sig_to_name_type objects # define DEFSIG(sig) { SIG ## sig, # sig } // Entries in this array are taken from // The Single UNIX ® Specification, Version 2 (1997) // plus additions from specific operating systems. // // The SUS requires these to be positive integer constants with a // macro definition. Note that SIGRTMIN and SIGRTMAX on Linux are // NOT constants, so have to be handled separately. static const sig_to_name_type sigmap[] = { // Names from SUS v2, in the order they are listed in that document // that *should* be defined everywhere // // Commented out definitions below are NOT used everywhere DEFSIG(ABRT), DEFSIG(ALRM), DEFSIG(FPE), DEFSIG(HUP), DEFSIG(ILL), DEFSIG(INT), DEFSIG(KILL), DEFSIG(PIPE), DEFSIG(QUIT), DEFSIG(SEGV), DEFSIG(TERM), DEFSIG(USR1), DEFSIG(USR2), DEFSIG(CHLD), DEFSIG(CONT), DEFSIG(STOP), DEFSIG(TSTP), DEFSIG(TTIN), DEFSIG(TTOU), DEFSIG(BUS), /* DEFSIG(POLL), */ /* DEFSIG(PROF), */ DEFSIG(SYS), DEFSIG(TRAP), DEFSIG(URG), DEFSIG(VTALRM), DEFSIG(XCPU), DEFSIG(XFSZ), // SIGPOLL and SIGPROF are marked as obselescent in 1003.1-2017, // Also SIGPOLL isn't in *BSD operating systems which use SIGIO #ifdef SIGPOLL DEFSIG(POLL), #endif #ifdef SIGPROF DEFSIG(PROF), #endif // BSD signals (from FreeBSD/OpenBSD sys/signal.h and // Darwin/Illumos signal.h) #ifdef SIGEMT DEFSIG(EMT), #endif #ifdef SIGIO DEFSIG(IO), #endif #ifdef SIGWINCH DEFSIG(WINCH), #endif #ifdef SIGINFO DEFSIG(INFO), #endif #ifdef SIGTHR DEFSIG(THR), #endif #ifdef SIGLIBRT DEFSIG(LIBRT), #endif #ifdef SIGPWR DEFSIG(PWR), #endif #ifdef SIGWAITING DEFSIG(WAITING), #endif #ifdef SIGLWP DEFSIG(LWP), #endif // Linux additions to *BSD (signal(7)) #ifdef SIGLOST DEFSIG(LOST), #endif #ifdef SIGSTKFLT DEFSIG(STKFLT), #endif // Terminator {0, NULL} #undef DEFSIG }; const sig_to_name_type *p; for (p = &sigmap[0] ; p->name != NULL ; ++p) { if (p->num == signum) { return p->name; } } // These aren't constants on Linux #ifdef SIGRTMIN if (signum == SIGRTMIN) { return "RTMIN"; } #endif #ifdef SIGRTMAX if (signum == SIGRTMAX) { return "RTMAX"; } #endif return NULL; } /*****************************************************************************/ char * g_sig2text(int signum, char sigstr[]) { if (signum >= 0) { const char *name = find_sig_name(signum); if (name != NULL) { g_snprintf(sigstr, MAXSTRSIGLEN, "SIG%s", name); return sigstr; } #if defined(SIGRTMIN) && defined(SIGRTMAX) if (signum > SIGRTMIN && signum < SIGRTMAX) { g_snprintf(sigstr, MAXSTRSIGLEN, "SIGRTMIN+%d", signum - SIGRTMIN); return sigstr; } #endif } // If all else fails... g_snprintf(sigstr, MAXSTRSIGLEN, "SIG#%d", signum); return sigstr; } /*****************************************************************************/ char32_t utf8_get_next_char(const char **utf8str_ref, unsigned int *len_ref) { /* * Macro used to parse a continuation character * @param cp Character Pointer (incremented on success) * @param end One character past end of input string, or NULL * @param value The value we're constructing * @param finish_label Where to go in the event of an error */ #define PARSE_CONTINUATION_CHARACTER(cp, end, value, finish_label) \ { \ /* Error if we're out of data, or this char isn't a continuation */ \ if (cp == end || !IS_VALID_CONTINUATION_CHAR(*cp)) \ { \ value = UCS_REPLACEMENT_CHARACTER; \ goto finish_label; \ } \ value = (value) << 6 | (*cp & 0x3f); \ ++cp; \ } char32_t rv; /* Easier to work with unsigned chars and no indirection */ const unsigned char *cp = (const unsigned char *)*utf8str_ref; const unsigned char *end = (len_ref != NULL) ? cp + *len_ref : NULL; if (cp == end) { return 0; // Pathological case } unsigned int c0 = *cp++; if (c0 < 0x80) { rv = c0; } else if (c0 < 0xc0) { /* Unexpected continuation character */ rv = UCS_REPLACEMENT_CHARACTER; } else if (c0 < 0xe0) { /* Valid start character for sequence of length 2 * U-00000080 – U-000007FF */ rv = (c0 & 0x1f); PARSE_CONTINUATION_CHARACTER(cp, end, rv, finish); if (rv < 0x80 || INVALID_UNICODE_80_TO_7FF(rv)) { rv = UCS_REPLACEMENT_CHARACTER; } } else if (c0 < 0xf0) { /* Valid start character for sequence of length 3 * U-00000800 – U-0000FFFF */ rv = (c0 & 0xf); PARSE_CONTINUATION_CHARACTER(cp, end, rv, finish); PARSE_CONTINUATION_CHARACTER(cp, end, rv, finish); if (rv < 0x800 || INVALID_UNICODE_800_TO_FFFF(rv)) { rv = UCS_REPLACEMENT_CHARACTER; } } else if (c0 < 0xf8) { /* Valid start character for sequence of length 4 * U-00010000 – U-0001FFFFF */ rv = (c0 & 0x7); PARSE_CONTINUATION_CHARACTER(cp, end, rv, finish); PARSE_CONTINUATION_CHARACTER(cp, end, rv, finish); PARSE_CONTINUATION_CHARACTER(cp, end, rv, finish); if (rv < 0x10000 || INVALID_UNICODE_10000_TO_1FFFFF(rv)) { rv = UCS_REPLACEMENT_CHARACTER; } } else if (c0 < 0xfc) { /* Valid start character for sequence of length 5 * U-00200000 – U-03FFFFFF */ rv = (c0 & 0x3); PARSE_CONTINUATION_CHARACTER(cp, end, rv, finish); PARSE_CONTINUATION_CHARACTER(cp, end, rv, finish); PARSE_CONTINUATION_CHARACTER(cp, end, rv, finish); PARSE_CONTINUATION_CHARACTER(cp, end, rv, finish); // These values are currently unsupported rv = UCS_REPLACEMENT_CHARACTER; } else if (c0 < 0xfe) { /* Valid start character for sequence of length 6 * U-04000000 – U-7FFFFFFF */ rv = (c0 & 0x1); PARSE_CONTINUATION_CHARACTER(cp, end, rv, finish); PARSE_CONTINUATION_CHARACTER(cp, end, rv, finish); PARSE_CONTINUATION_CHARACTER(cp, end, rv, finish); PARSE_CONTINUATION_CHARACTER(cp, end, rv, finish); PARSE_CONTINUATION_CHARACTER(cp, end, rv, finish); // These values are currently unsupported rv = UCS_REPLACEMENT_CHARACTER; } else { // Invalid characters rv = UCS_REPLACEMENT_CHARACTER; } finish: if (len_ref) { *len_ref -= ((const char *)cp - *utf8str_ref); } *utf8str_ref = (const char *)cp; return rv; #undef PARSE_CONTINUATION_CHARACTER } /*****************************************************************************/ unsigned int utf_char32_to_utf8(char32_t c32, char *u8str) { unsigned int rv; if (INVALID_UNICODE(c32)) { c32 = UCS_REPLACEMENT_CHARACTER; } if (c32 < 0x80) { rv = 1; if (u8str != NULL) { u8str[0] = (char)c32; } } else if (c32 < 0x800) { rv = 2; // 11 bits. Five in first byte, six in second if (u8str != NULL) { u8str[1] = (c32 & 0x3f) | 0x80; c32 >>= 6; u8str[0] = (c32 & 0x1f) | 0xc0; } } else if (c32 < 0xffff) { rv = 3; // 16 bits. Four in first byte, six in second and third if (u8str != NULL) { u8str[2] = (c32 & 0x3f) | 0x80; c32 >>= 6; u8str[1] = (c32 & 0x3f) | 0x80; c32 >>= 6; u8str[0] = (c32 & 0xf) | 0xe0; } } else { rv = 4; // 21 bits. Three in first byte, six in second, third and fourth if (u8str != NULL) { u8str[3] = (c32 & 0x3f) | 0x80; c32 >>= 6; u8str[2] = (c32 & 0x3f) | 0x80; c32 >>= 6; u8str[1] = (c32 & 0x3f) | 0x80; c32 >>= 6; u8str[0] = (c32 & 0x7) | 0xf0; } } return rv; } /*****************************************************************************/ unsigned int utf8_char_count(const char *utf8str) { unsigned int rv = 0; char32_t c; if (utf8str != NULL) { while ((c = utf8_get_next_char(&utf8str, NULL)) != 0) { ++rv; } } return rv; } /*****************************************************************************/ unsigned int utf8_as_utf16_word_count(const char *utf8str, unsigned int len) { unsigned int rv = 0; while (len > 0) { char32_t c = utf8_get_next_char(&utf8str, &len); // Characters not in the BMP (i.e. over 0xffff) need a high/low // surrogate pair rv += (c >= 0x10000) ? 2 : 1; } return rv; } /*****************************************************************************/ int utf8_add_char_at(char *utf8str, unsigned int len, char32_t c32, unsigned int index) { int rv = 0; char c8[MAXLEN_UTF8_CHAR]; unsigned int c8len = utf_char32_to_utf8(c32, c8); // Find out where to insert the character char *insert_pos = utf8str; while (index > 0 && *insert_pos != '\0') { utf8_get_next_char((const char **)&insert_pos, NULL); --index; } // Did we get to where we need to be? if (index == 0) { unsigned int bytes_to_move = strlen(insert_pos) + 1; // Include terminator // Is there room to insert the character? // // <----------- len ----------> // <--> (bytes_to_move) // +----------------------------+ // |ABCDEFGHIJLMN\0 | // +----------------------------+ // ^ ^ // +-utf8str +-insert_pos // if ((insert_pos - utf8str) + bytes_to_move + c8len <= len) { memmove(insert_pos + c8len, insert_pos, bytes_to_move); memcpy(insert_pos, c8, c8len); rv = 1; } } return rv; } /*****************************************************************************/ char32_t utf8_remove_char_at(char *utf8str, unsigned int index) { int rv = 0; // Find out where to remove the character char *remove_pos = utf8str; while (index > 0) { // Any characters left in string? if (*remove_pos == '\0') { break; } utf8_get_next_char((const char **)&remove_pos, NULL); --index; } // Did we get to where we need to be? if (index == 0) { // Find the position after the character char *after_pos = remove_pos; rv = utf8_get_next_char((const char **)&after_pos, NULL); // Move everything up memmove(remove_pos, after_pos, strlen(after_pos) + 1); } return rv; } ================================================ FILE: common/string_calls.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2020 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * generic string handling calls */ #if !defined(STRING_CALLS_H) #define STRING_CALLS_H #include "arch.h" /** * Map a character to a string value * * This structure is used by g_format_info_string() to specify the * string which could be output for %'ch', where ch is a character */ struct info_string_tag { char ch; const char *val; }; #define INFO_STRING_END_OF_LIST { '\0', NULL } /** * Map a bitmask to a string value * * * This structure is used by g_bitmask_to_str() to specify the * string for each bit in the bitmask */ struct bitmask_string { int mask; const char *str; }; #define BITMASK_STRING_END_OF_LIST { 0, NULL } /** * Map a bitmask to a char value * * * This structure is used by g_bitmask_to_charstr() to specify the * char for each bit in the bitmask */ struct bitmask_char { int mask; char c; }; #define BITMASK_CHAR_END_OF_LIST { 0, '\0' } enum { // See g_sig2text() // Must be able to hold "SIG#%d" for INT_MIN // // ((sizeof(int) * 5 + 1) / 2) provides a very slight overestimate of // the bytes requires to store a decimal expansion of 'int':- // sizeof INT_MAX display bytes ((sizeof(int) * 5 + 1) // (int) needed / 2) // ------ ------- ------------- --------------------------- // 1 127 3 3 // 2 32767 5 5 // 3 8388607 7 8 // 4 2147483637 10 10 // 8 9*(10**18) 19 20 // 16 2*(10**38) 39 40 // 32 6*(10**76) 77 80 MAXSTRSIGLEN = (3 + 1 + 1 + ((sizeof(int) * 5 + 1) / 2) + 1) }; /* * Significant Universal Character Set (Unicode) characters */ enum { UCS_WHITE_SQUARE = 0x25a1, UCS_REPLACEMENT_CHARACTER = 0xfffd }; /** * Processes a format string for general info * * @param[out] dest Destination buffer * @param[in] len Length of buffer, including space for a terminator * @param[in] format Format string to process * @param[in] map Array of struct info_string_tag. * * Where a '%' is encountered in the format string, the map is scanned * and the corresponding string is copied instead of '%'. * * '%%' is always replaced with a single '%' in the output. % strings * not present in the map are ignored. * * The map is terminated with INFO_STRING_END_OF_LIST * * Caller can check for buffer truncation by comparing the result with * the buffer length (as in snprintf()) */ unsigned int g_format_info_string(char *dest, unsigned int len, const char *format, const struct info_string_tag map[]); /** * Converts a boolean to a string for output * * @param[in] value Value to convert * @return String representation */ const char * g_bool2text(int value); /** * Converts a string to a boolean value * * @param[in] s String to convert * @return machine representation */ int g_text2bool(const char *s); /** * Joins an array of strings into a single string. * * Note: The joiner is placed between each source string. The joiner is not * placed after the last source string. If there is only one source string, * then the result string will be equal to the source string. * * Note: any content that is present in dest will be overwritten with the new * joined string. * * Note: If the destination array is not large enough to hold the entire * contents of the joined string, then the joined string will be truncated * to fit in the destination array. * * @param[out] dest The destination array to write the joined string into. * @param[in] dest_len The max number of characters to write to the destination * array including the terminating null. Must be > 0 * @param[in] joiner The string to concatenate between each source string. * The joiner string may be NULL which is processed as a zero length string. * @param[in] src An array of strings to join. The array must be non-null. * Array items may be NULL and are processed as zero length strings. * @param[in] src_len The number of strings to join in the src array. Must be > 0 * @return A pointer to the beginning of the joined string (ie. returns dest). */ char * g_strnjoin(char *dest, int dest_len, const char *joiner, const char *src[], int src_len); /** * Converts a binary array into a hux dump suitable for displaying to a user. * * The format of the hex dump is: * 0000 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 ................ * /\ /\ /\ * | | | * | | ascii representation of bytes * | hex representation of bytes * offset from beginning of the byte array in hex * * Note: the ascii representation uses '.' for all non-printable * characters (eg. below 32 or above 127). * * Note: the string contains embedded new lines, but is not new line terminated. * * @param[in] src Value to convert * @param[in] len The number of bytes in src to convert * @return string containing the hex dump that must be free'd by the caller */ char * g_bytes_to_hexdump(const char *src, int len); /** * Converts an X11 display number to a display string * * @param display_num X11 display unmber * @param buff Buffer for result * @param bufflen size of above * @return != 0 if the result doesn't fit */ int g_get_display_string_from_x11_display(int display_num, char buff[], unsigned int bufflen); /** * Converts a display string to an X11 display number * * @param display_str Display string * @return X11 display number, or -1 if the display string isn't X11 */ int g_get_x11_display_from_display_string(const char *display_str); /** * Extracts the display string from either DISPLAY or WAYLAND_DISPLAY * * @param buff Buffer for result * @param bufflen Length of above buffer * * Returned buffer will be (e.g.) "X11-10" for X11 or "wayland-1" for Wayland * * @result != 0 if the string could not be found or parsed */ int g_get_display_string(char buff[], unsigned int bufflen); /** * Converts a bitmask into a string for output purposes * * Similar to g_bitmask_to_charstr(), but tokens are strings, separated * by delimiters. * * @param bitmask Bitmask to convert * @param bitdefs Definitions for strings for bits * @param delim Delimiter to use between strings * @param buff Output buff * @param bufflen Length of buff, including terminator '`\0' * * @return Total length excluding terminator which would be written, as * in snprintf(). Can be used to check for overflow * * @note Any undefined bits in the bitmask are appended to the output as * a hexadecimal constant. */ int g_bitmask_to_str(int bitmask, const struct bitmask_string bitdefs[], char delim, char *buff, int bufflen); /*** * Converts a string containing a series of tokens to a bitmask. * * Similar to g_charstr_to_bitmask(), but tokens are strings, separated * by delimiters. * * @param str Input string * @param bitdefs Array mapping tokens to bitmask values * @param delim Delimiter for tokens in str * @param[out] unrecognised Buffer for any unrecognised tokens * @param unrecognised_len Length of unrecognised including '\0'; * @return bitmask value for recognised tokens */ int g_str_to_bitmask(const char *str, const struct bitmask_string bitdefs[], const char *delim, char *unrecognised, int unrecognised_len); /** * Converts a bitmask into a string for output purposes * * Similar to g_bitmask_to_str(), but tokens are individual characters, and * there are no delimiters. * * @param bitmask Bitmask to convert * @param bitdefs Definitions for strings for bits * @param buff Output buff * @param bufflen Length of buff, including terminator '`\0' * @param[out] rest Any unused bits which weren't covered by bitdefs. * May be NULL. * * @return Total length excluding terminator which would be written, as * in snprintf(). Can be used to check for overflow * * @note Any undefined bits in the bitmask are appended to the output as * a hexadecimal constant. */ int g_bitmask_to_charstr(int bitmask, const struct bitmask_char bitdefs[], char *buff, int bufflen, int *rest); /*** * Converts a string containing a series of characters to a bitmask. * * Similar to g_str_to_bitmask(), but tokens are individual characters, and * there are no delimiters. * * @param str Input string * @param bitdefs Array mapping tokens to bitmask values * @param[out] unrecognised Buffer for any unrecognised tokens * @param unrecognised_len Length of unrecognised including '\0'; * @return bitmask value for recognised tokens */ int g_charstr_to_bitmask(const char *str, const struct bitmask_char bitdefs[], char *unrecognised, int unrecognised_len); int g_strlen(const char *text); char *g_strchr(const char *text, int c); char *g_strrchr(const char *text, int c); char *g_strnchr(const char *text, int c, int len); char *g_strcpy(char *dest, const char *src); char *g_strncpy(char *dest, const char *src, int len); char *g_strcat(char *dest, const char *src); char *g_strncat(char *dest, const char *src, int len); char *g_strdup(const char *in); char *g_strndup(const char *in, const unsigned int maxlen); int g_strcmp(const char *c1, const char *c2); int g_strncmp(const char *c1, const char *c2, int len); int g_strncmp_d(const char *c1, const char *c2, const char delim, int len); int g_strcasecmp(const char *c1, const char *c2); int g_strncasecmp(const char *c1, const char *c2, int len); int g_atoi(const char *str); /* Non-standard but useful functions */ #if !defined(HAVE_STRLCPY) size_t strlcpy(char *dst, const char *src, size_t dsize); #endif /** * Extends g_atoi(), Converts decimal and hexadecimal number String to integer * * Prefix hexadecimal numbers with '0x' * * @param str String to convert to an integer * @return int Integer expression of a string */ int g_atoix(const char *str); /** * Converts a hex string to an integer * @param str pointer to Hex string containing only hex digits * @return value, converted from hex * * This function is intended to be used as an analogue to the standard * function atoi(). It performs no error checking of its own */ unsigned int g_htoi(const char *str); int g_bytes_to_hexstr(const void *bytes, int num_bytes, char *out_str, int bytes_out_str); int g_pos(const char *str, const char *to_find); char *g_strstr(const char *haystack, const char *needle); /** trim spaces and tabs, anything <= space * * @param str (assumed to be UTF-8) * @param trim_flags 1 trim left, 2 trim right, 3 trim both, 4 trim through * @return != 0 - trim_flags not recognised * this will always shorten the string or not change it */ int g_strtrim(char *str, int trim_flags); /** * Maps a signal number to a string, i.e. SIGHUP -> "SIGHUP" * * @param signum Signal number * @param sigstr buffer for result * @return sigstr, for convenience * * Buffer is assumed to be at least MAXSTRSIGLEN * * The string "SIG#" is returned for unrecognised signums */ char *g_sig2text(int signum, char sigstr[]); /** * Get the next Unicode character from a UTF-8 string * * @param utf8str_ref UTF 8 string [by reference] * @param len_ref Length of string [by reference] or NULL * @return Unicode character * * On return, utf8str and len are updated to point past the decoded character. * Unrecognised characters are mapped to UCS_REPLACEMENT_CHARACTER * * len is not needed if your utf8str has a terminator, or is known to * be well-formed. */ char32_t utf8_get_next_char(const char **utf8str_ref, unsigned int *len_ref); /** * Convert a Unicode character to UTF-8 * @param c32 Unicode character * @param u8str buffer containing at least MAXLEN_UTF8_CHAR bytes for result * @return Number of bytes written to u8str. Can be NULL if only the * length is needed. * * The bytes written to u8str are unterminated */ #define MAXLEN_UTF8_CHAR 4 unsigned int utf_char32_to_utf8(char32_t c32, char *u8str); /** * Returns the number of Unicode characters in a UTF-8 string * @param utf8str UTF-8 string * @result Number of Unicode characters in the string (terminator not included) */ unsigned int utf8_char_count(const char *utf8str); /** * Returns the number of UTF-16 words required to store a UTF-8 string * @param utf8str UTF-8 string * @param len Length of UTF-8 string * @result number of words to store UTF-8 string as UTF-16. */ unsigned int utf8_as_utf16_word_count(const char *utf8str, unsigned int len); /** * Add a Unicode character into a UTF-8 string * @param utf8str Pointer to UTF-8 string * @param len Length of buffer for UTF-8 string (includes NULL) * @param c32 character to add * @param index Where to add the codepoint * @return 1 for success, 0 if no character was inserted * * This routine has to parse the string as it goes, so can be slow. */ int utf8_add_char_at(char *utf8str, unsigned int len, char32_t c32, unsigned int index); /** * Remove a Unicode character from a UTF-8 string * @param utf8str Pointer to UTF-8 string * @param index Where to remove the codepoint from (0-based) * @return Character removed, or 0 if no character was removed * * This routine has to parse the string as it goes, so can be slow. */ char32_t utf8_remove_char_at(char *utf8str, unsigned int index); #endif ================================================ FILE: common/thread_calls.c ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * thread calls */ #if defined(HAVE_CONFIG_H) #include #endif #if defined(_WIN32) #include #elif defined(__APPLE__) #include #include #include #else #include #include #endif #include "arch.h" #include "log.h" #include "thread_calls.h" #include "os_calls.h" /*****************************************************************************/ /* returns error */ #if defined(_WIN32) int tc_thread_create(unsigned long (__stdcall *start_routine)(void *), void *arg) { int rv = 0; DWORD thread_id = 0; HANDLE thread = (HANDLE)0; /* CreateThread returns handle or zero on error */ thread = CreateThread(0, 0, start_routine, arg, 0, &thread_id); rv = !thread; CloseHandle(thread); return rv; } #else int tc_thread_create(void *(* start_routine)(void *), void *arg) { int rv = 0; pthread_t thread = (pthread_t)0; g_memset(&thread, 0x00, sizeof(pthread_t)); /* pthread_create returns error */ rv = pthread_create(&thread, 0, start_routine, arg); if (!rv) { rv = pthread_detach(thread); } return rv; } #endif /*****************************************************************************/ tbus tc_get_threadid(void) { #if defined(_WIN32) return (tbus)GetCurrentThreadId(); #else return (tbus)pthread_self(); #endif } /*****************************************************************************/ /* returns boolean */ int tc_threadid_equal(tbus tid1, tbus tid2) { #if defined(_WIN32) return tid1 == tid2; #else return pthread_equal((pthread_t)tid1, (pthread_t)tid2); #endif } /*****************************************************************************/ tbus tc_mutex_create(void) { #if defined(_WIN32) return (tbus)CreateMutex(0, 0, 0); #else pthread_mutex_t *lmutex; lmutex = (pthread_mutex_t *)g_malloc(sizeof(pthread_mutex_t), 0); pthread_mutex_init(lmutex, 0); return (tbus)lmutex; #endif } /*****************************************************************************/ void tc_mutex_delete(tbus mutex) { #if defined(_WIN32) CloseHandle((HANDLE)mutex); #else pthread_mutex_t *lmutex; lmutex = (pthread_mutex_t *)mutex; if (lmutex != NULL) { pthread_mutex_destroy(lmutex); g_free(lmutex); } #endif } /*****************************************************************************/ int tc_mutex_lock(tbus mutex) { #if defined(_WIN32) WaitForSingleObject((HANDLE)mutex, INFINITE); #else if (mutex != 0) { pthread_mutex_lock((pthread_mutex_t *)mutex); } else { LOG(LOG_LEVEL_ERROR, "Attempt made to lock NULL mutex"); } #endif return 0; } /*****************************************************************************/ int tc_mutex_unlock(tbus mutex) { int rv = 0; #if defined(_WIN32) ReleaseMutex((HANDLE)mutex); #else if (mutex != 0) { rv = pthread_mutex_unlock((pthread_mutex_t *)mutex); } #endif return rv; } /*****************************************************************************/ tbus tc_sem_create(int init_count) { #if defined(_WIN32) HANDLE sem; sem = CreateSemaphore(0, init_count, init_count + 10, 0); return (tbus)sem; #elif defined(__APPLE__) dispatch_semaphore_t sem = dispatch_semaphore_create(init_count); return (tbus)sem; #else sem_t *sem = (sem_t *)NULL; sem = (sem_t *)g_malloc(sizeof(sem_t), 0); sem_init(sem, 0, init_count); return (tbus)sem; #endif } /*****************************************************************************/ void tc_sem_delete(tbus sem) { #if defined(_WIN32) CloseHandle((HANDLE)sem); #elif defined(__APPLE__) dispatch_release((dispatch_semaphore_t)sem); #else sem_t *lsem; lsem = (sem_t *)sem; sem_destroy(lsem); g_free(lsem); #endif } /*****************************************************************************/ int tc_sem_dec(tbus sem) { #if defined(_WIN32) WaitForSingleObject((HANDLE)sem, INFINITE); return 0; #elif defined(__APPLE__) dispatch_semaphore_wait((dispatch_semaphore_t)sem, DISPATCH_TIME_FOREVER); return 0; #else sem_wait((sem_t *)sem); return 0; #endif } /*****************************************************************************/ int tc_sem_inc(tbus sem) { #if defined(_WIN32) ReleaseSemaphore((HANDLE)sem, 1, 0); return 0; #elif defined(__APPLE__) dispatch_semaphore_signal((dispatch_semaphore_t)sem); return 0; #else sem_post((sem_t *)sem); return 0; #endif } ================================================ FILE: common/thread_calls.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * thread calls */ #if !defined(THREAD_CALLS_H) #define THREAD_CALLS_H #include "arch.h" int tc_thread_create(THREAD_RV (THREAD_CC *start_routine)(void *), void *arg); tbus tc_get_threadid(void); int tc_threadid_equal(tbus tid1, tbus tid2); tbus tc_mutex_create(void); void tc_mutex_delete(tbus mutex); int tc_mutex_lock(tbus mutex); int tc_mutex_unlock(tbus mutex); tbus tc_sem_create(int init_count); void tc_sem_delete(tbus sem); int tc_sem_dec(tbus sem); int tc_sem_inc(tbus sem); #endif ================================================ FILE: common/timers.c ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2025 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ /** * @file common/timers.h * @brief Timers and related functions (declarations) * @author Matt Burt */ #if defined(HAVE_CONFIG_H) #include "config_ac.h" #endif #include "os_calls.h" #include "timers.h" struct timers_oneshot { unsigned int add_time; // Time event was added from_g_get_elapsed_ms() int trigger_time; }; /******************************************************************************/ struct timers_oneshot * timers_oneshot_init(int ms) { struct timers_oneshot *t = (struct timers_oneshot *)malloc(sizeof(*t)); if (t != NULL) { t->add_time = g_get_elapsed_ms(); t->trigger_time = (ms <= 0) ? 0 : ms; } return t; } /******************************************************************************/ int timers_oneshot_get_remaining(struct timers_oneshot *timer, unsigned int now) { int rv = -1; if (timer != NULL) { if (timer->trigger_time == 0) { rv = 0; } else { rv = timer->trigger_time - (int)(now - timer->add_time); if (rv <= 0) { rv = 0; // (pathological) Make sure the timer doesn't stop // triggering if it isn't attended to for the rollover // period (~20 days for a 32-bit timer). timer->trigger_time = 0; } } } return rv; } /******************************************************************************/ void timers_oneshot_update_poll(struct timers_oneshot *timer, unsigned int now, int *timeout) { if (timer != NULL && timeout != NULL) { int remaining = timers_oneshot_get_remaining(timer, now); if (*timeout < 0 || *timeout > remaining) { *timeout = remaining; } } } ================================================ FILE: common/timers.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2025 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ /** * @file common/timers.h * @brief Timers and related functions (declarations) * @author Matt Burt */ #ifndef TIMERS_H #define TIMERS_H #include "arch.h" struct timers_oneshot; /** * Initialise a one-shot timer * @param ms Milliseconds until timer fires (>= 0) * @return pointer to timer * * Returns NULL if no memory. * * When the timer is no longer required, it can simply be passed to free() */ struct timers_oneshot * timers_oneshot_init(int ms); /** * Return ms remaining on a one-shot timer * @param timer pointer to timer (or NULL) * @param now Value of g_get_elapsed_ms() * @return remaining ms * * Once this routine has returned 0 for a particular timer, it will never * return anything else. Don't pass anything to 'now' apart from a recent * value from g_get_elapsed_ms() * * If the timer is NULL, -1 is returned. */ int timers_oneshot_get_remaining(struct timers_oneshot *timer, unsigned int now); /** * Variant of timers_oneshot_get_remaining() for g_obj_wait() * @param timer pointer to timer (or NULL) * @param now Value of g_get_elapsed_ms() * @param[in,out] timeout timeout * * Use this to update a timeout passed to g_obj_wait() (or poll()). The * timeout is updated if the timer will fire before the current timeout. */ void timers_oneshot_update_poll(struct timers_oneshot *timer, unsigned int now, int *timeout); #endif // TIMERS_H ================================================ FILE: common/trans.c ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * generic transport */ #if defined(HAVE_CONFIG_H) #include #endif #include #include "os_calls.h" #include "string_calls.h" #include "trans.h" #include "arch.h" #include "parse.h" #include "ssl_calls.h" #include "log.h" #define MAX_SBYTES 0 /** Time between polls of is_term when connecting */ #define CONNECT_TERM_POLL_MS 3000 /** Time we wait before another connect() attempt if one fails immediately */ #define CONNECT_DELAY_ON_FAIL_MS 2000 /*****************************************************************************/ static int trans_tls_recv(struct trans *self, char *ptr, int len) { if (self->tls == NULL) { return 1; } return ssl_tls_read(self->tls, ptr, len); } /*****************************************************************************/ static int trans_tls_send(struct trans *self, const char *data, int len) { if (self->tls == NULL) { return 1; } return ssl_tls_write(self->tls, data, len); } /*****************************************************************************/ static int trans_tls_can_recv(struct trans *self, int sck, int millis) { if (self->tls == NULL) { return 1; } return ssl_tls_can_recv(self->tls, sck, millis); } /*****************************************************************************/ static int trans_tcp_recv(struct trans *self, char *ptr, int len) { return g_tcp_recv(self->sck, ptr, len, 0); } /*****************************************************************************/ static int trans_tcp_send(struct trans *self, const char *data, int len) { return g_tcp_send(self->sck, data, len, 0); } /*****************************************************************************/ static int trans_tcp_can_recv(struct trans *self, int sck, int millis) { return g_sck_can_recv(sck, millis); } /*****************************************************************************/ struct trans * trans_create(int mode, int in_size, int out_size) { struct trans *self = (struct trans *) NULL; self = (struct trans *) g_malloc(sizeof(struct trans), 1); if (self != NULL) { self->sck = -1; make_stream(self->in_s); init_stream(self->in_s, in_size); make_stream(self->out_s); init_stream(self->out_s, out_size); self->mode = mode; self->tls = 0; /* assign tcp calls by default */ self->trans_recv = trans_tcp_recv; self->trans_send = trans_tcp_send; self->trans_can_recv = trans_tcp_can_recv; } return self; } /*****************************************************************************/ void trans_delete(struct trans *self) { if (self == 0) { return; } /* Call the user-specified destructor if one exists */ if (self->extra_destructor != NULL) { self->extra_destructor(self); } free_stream(self->in_s); free_stream(self->out_s); if (self->sck >= 0) { g_tcp_close(self->sck); } self->sck = -1; if (self->listen_filename != 0) { g_file_delete(self->listen_filename); g_free(self->listen_filename); } if (self->tls != 0) { ssl_tls_delete(self->tls); } g_free(self); } /*****************************************************************************/ void trans_delete_from_child(struct trans *self) { if (self == 0) { return; } if (self->listen_filename != 0) { g_free(self->listen_filename); self->listen_filename = 0; } trans_delete(self); } /*****************************************************************************/ int trans_get_wait_objs(struct trans *self, tbus *objs, int *count) { if (self == 0) { return 1; } if (self->status != TRANS_STATUS_UP) { return 1; } objs[*count] = self->sck; (*count)++; if (self->tls != NULL && (objs[*count] = ssl_get_rwo(self->tls)) != 0) { (*count)++; } return 0; } /*****************************************************************************/ int trans_get_wait_objs_rw(struct trans *self, tbus *robjs, int *rcount, tbus *wobjs, int *wcount, int *timeout) { if (self == 0) { return 1; } if (self->status != TRANS_STATUS_UP) { return 1; } if ((self->si != 0) && (self->si->source[self->my_source] > MAX_SBYTES)) { } else { if (trans_get_wait_objs(self, robjs, rcount) != 0) { return 1; } } if (self->wait_s != 0) { wobjs[*wcount] = self->sck; (*wcount)++; } return 0; } /*****************************************************************************/ static int trans_send_waiting(struct trans *self, int block) { struct stream *temp_s; int bytes; int sent; int timeout; int cont; timeout = block ? 100 : 0; cont = 1; while (cont) { if (self->wait_s != 0) { temp_s = self->wait_s; if (g_tcp_can_send(self->sck, timeout)) { bytes = (int) (temp_s->end - temp_s->p); sent = self->trans_send(self, temp_s->p, bytes); if (sent > 0) { temp_s->p += sent; if (temp_s->source != 0) { temp_s->source[0] -= sent; } if (temp_s->p >= temp_s->end) { self->wait_s = temp_s->next; free_stream(temp_s); } } else if (sent == 0) { return 1; } else { if (!g_tcp_last_error_would_block(self->sck)) { return 1; } } } else if (block) { /* check for term here */ if (self->is_term != 0) { if (self->is_term()) { /* term */ return 1; } } } } else { break; } cont = block; } return 0; } /*****************************************************************************/ int trans_check_wait_objs(struct trans *self) { tbus in_sck; struct trans *in_trans = (struct trans *) NULL; int read_bytes; unsigned int to_read; unsigned int read_so_far; int rv = 0; enum xrdp_source cur_source; if (self == 0) { return 1; } if (self->status != TRANS_STATUS_UP) { return 1; } rv = 0; if (self->type1 == TRANS_TYPE_LISTENER) /* listening */ { if (g_sck_can_recv(self->sck, 0)) { in_sck = g_sck_accept(self->sck); if (in_sck == -1) { if (g_tcp_last_error_would_block(self->sck)) { /* ok, but shouldn't happen */ } else { /* error */ self->status = TRANS_STATUS_DOWN; return 1; } } if (in_sck != -1) { if (self->trans_conn_in != 0) /* is function assigned */ { in_trans = trans_create(self->mode, self->in_s->size, self->out_s->size); in_trans->sck = in_sck; in_trans->type1 = TRANS_TYPE_SERVER; in_trans->status = TRANS_STATUS_UP; in_trans->is_term = self->is_term; g_file_set_cloexec(in_sck, 1); g_sck_set_non_blocking(in_sck); if (self->trans_conn_in(self, in_trans) != 0) { trans_delete(in_trans); } } else { g_tcp_close(in_sck); } } } } else /* connected server or client (2 or 3) */ { if (self->si != 0 && self->si->source[self->my_source] > MAX_SBYTES) { } else if (self->trans_can_recv(self, self->sck, 0)) { /* CVE-2022-23479 - check a malicious caller hasn't managed * to set the header_size to an unreasonable value */ if (self->header_size > (unsigned int)self->in_s->size) { LOG(LOG_LEVEL_ERROR, "trans_check_wait_objs: Reading %u bytes beyond buffer", self->header_size - (unsigned int)self->in_s->size); self->status = TRANS_STATUS_DOWN; return 1; } cur_source = XRDP_SOURCE_NONE; if (self->si != 0) { cur_source = self->si->cur_source; self->si->cur_source = self->my_source; } read_so_far = self->in_s->end - self->in_s->data; to_read = self->header_size - read_so_far; if (to_read > 0) { read_bytes = self->trans_recv(self, self->in_s->end, to_read); if (read_bytes == -1) { if (g_tcp_last_error_would_block(self->sck)) { /* ok, but shouldn't happen */ } else { /* error */ self->status = TRANS_STATUS_DOWN; if (self->si != 0) { self->si->cur_source = cur_source; } return 1; } } else if (read_bytes == 0) { /* error */ self->status = TRANS_STATUS_DOWN; if (self->si != 0) { self->si->cur_source = cur_source; } return 1; } else { self->in_s->end += read_bytes; } } read_so_far = self->in_s->end - self->in_s->data; if (read_so_far == self->header_size) { if (self->trans_data_in != 0) { rv = self->trans_data_in(self); if (self->no_stream_init_on_data_in == 0) { init_stream(self->in_s, 0); } } } if (self->si != 0) { self->si->cur_source = cur_source; } } if (trans_send_waiting(self, 0) != 0) { /* error */ self->status = TRANS_STATUS_DOWN; return 1; } } return rv; } /*****************************************************************************/ int trans_force_read_s(struct trans *self, struct stream *in_s, int size) { int rcvd; if (self->status != TRANS_STATUS_UP || size < 0 || !s_check_rem_out(in_s, size)) { return 1; } while (size > 0) { rcvd = self->trans_recv(self, in_s->end, size); if (rcvd == -1) { if (g_tcp_last_error_would_block(self->sck)) { if (!self->trans_can_recv(self, self->sck, 100)) { /* check for term here */ if (self->is_term != 0) { if (self->is_term()) { /* term */ self->status = TRANS_STATUS_DOWN; return 1; } } } } else { /* error */ self->status = TRANS_STATUS_DOWN; return 1; } } else if (rcvd == 0) { /* error */ self->status = TRANS_STATUS_DOWN; return 1; } else { in_s->end += rcvd; size -= rcvd; } } return 0; } /*****************************************************************************/ int trans_force_read(struct trans *self, int size) { return trans_force_read_s(self, self->in_s, size); } /*****************************************************************************/ int trans_force_write_s(struct trans *self, struct stream *out_s) { int size; int total; int sent; if (self->status != TRANS_STATUS_UP) { return 1; } size = (int) (out_s->end - out_s->data); total = 0; if (trans_send_waiting(self, 1) != 0) { self->status = TRANS_STATUS_DOWN; return 1; } while (total < size) { sent = self->trans_send(self, out_s->data + total, size - total); if (sent == -1) { if (g_tcp_last_error_would_block(self->sck)) { if (!g_tcp_can_send(self->sck, 100)) { /* check for term here */ if (self->is_term != 0) { if (self->is_term()) { /* term */ self->status = TRANS_STATUS_DOWN; return 1; } } } } else { /* error */ self->status = TRANS_STATUS_DOWN; return 1; } } else if (sent == 0) { /* error */ self->status = TRANS_STATUS_DOWN; return 1; } else { total = total + sent; } } return 0; } /*****************************************************************************/ int trans_force_write(struct trans *self) { return trans_force_write_s(self, self->out_s); } /*****************************************************************************/ int trans_write_copy_s(struct trans *self, struct stream *out_s) { int size; int sent; struct stream *wait_s; struct stream *temp_s; char *out_data; if (self->status != TRANS_STATUS_UP) { return 1; } /* try to send any left over */ if (trans_send_waiting(self, 0) != 0) { /* error */ self->status = TRANS_STATUS_DOWN; return 1; } out_data = out_s->data; size = (int) (out_s->end - out_s->data); if (self->wait_s == 0) { /* if no left over, try to send this new data */ if (g_tcp_can_send(self->sck, 0)) { sent = self->trans_send(self, out_s->data, size); if (sent > 0) { out_data += sent; size -= sent; } else if (sent == 0) { return 1; } else { if (!g_tcp_last_error_would_block(self->sck)) { return 1; } } } } if (size < 1) { return 0; } /* did not send right away, have to copy */ make_stream(wait_s); init_stream(wait_s, size); if (self->si != 0) { if ((self->si->cur_source != XRDP_SOURCE_NONE) && (self->si->cur_source != self->my_source)) { self->si->source[self->si->cur_source] += size; wait_s->source = self->si->source + self->si->cur_source; } } out_uint8a(wait_s, out_data, size); s_mark_end(wait_s); wait_s->p = wait_s->data; if (self->wait_s == 0) { self->wait_s = wait_s; } else { temp_s = self->wait_s; while (temp_s->next != 0) { temp_s = temp_s->next; } temp_s->next = wait_s; } return 0; } /*****************************************************************************/ int trans_write_copy(struct trans *self) { return trans_write_copy_s(self, self->out_s); } /*****************************************************************************/ /* Shim to apply the function signature of g_tcp_connect() * to g_tcp_local_connect() */ static int local_connect_shim(int fd, const char *server, const char *port) { return g_tcp_local_connect(fd, port); } /**************************************************************************//** * Waits for an asynchronous connect to complete. * @param self - Transport object * @param start_time Start time of connect (from g_get_elapsed_ms()) * @param timeout Total wait timeout * @return 0 - connect succeeded, 1 - Connect failed * * If the transport is set up for checking a termination object, this * on a regular basis. */ static int poll_for_async_connect(struct trans *self, unsigned int start_time, int timeout) { int rv = 1; int ms_remaining = timeout - (int)(g_get_elapsed_ms() - start_time); while (ms_remaining > 0) { int poll_time = ms_remaining; /* Lower bound for waiting for a result */ if (poll_time < 100) { poll_time = 100; } /* Limit the wait time if we need to poll for termination */ if (self->is_term != NULL && poll_time > CONNECT_TERM_POLL_MS) { poll_time = CONNECT_TERM_POLL_MS; } if (g_tcp_can_send(self->sck, poll_time)) { /* Connect has finished - return the socket status */ rv = g_sck_socket_ok(self->sck) ? 0 : 1; break; } /* Check for program termination */ if (self->is_term != NULL && self->is_term()) { break; } ms_remaining = timeout - (int)(g_get_elapsed_ms() - start_time); } return rv; } /*****************************************************************************/ int trans_connect(struct trans *self, const char *server, const char *port, int timeout) { unsigned int start_time = g_get_elapsed_ms(); int error; int ms_before_next_connect; int connect_errno = 0; /* * Function pointers which we use in the main loop to avoid * having to switch on the socket mode */ int (*f_alloc_socket)(void); int (*f_connect)(int fd, const char *server, const char *port); switch (self->mode) { case TRANS_MODE_TCP: f_alloc_socket = g_tcp_socket; f_connect = g_tcp_connect; break; case TRANS_MODE_UNIX: f_alloc_socket = g_tcp_local_socket; f_connect = local_connect_shim; break; default: LOG(LOG_LEVEL_ERROR, "Bad socket mode %d", self->mode); return 1; } while (1) { /* Check the program isn't terminating */ if (self->is_term != NULL && self->is_term()) { error = 1; break; } /* Allocate a new socket */ if (self->sck >= 0) { g_tcp_close(self->sck); } self->sck = f_alloc_socket(); if (self->sck < 0) { connect_errno = errno; error = 1; break; } /* Try to connect asynchronously */ g_file_set_cloexec(self->sck, 1); g_tcp_set_non_blocking(self->sck); error = f_connect(self->sck, server, port); connect_errno = errno; if (error == 0) { /* Connect was immediately successful */ break; } if (g_tcp_last_error_would_block(self->sck)) { /* Async connect is in progress */ if (poll_for_async_connect(self, start_time, timeout) == 0) { /* Async connect was successful */ error = 0; break; } /* No need to wait any more before the next connect attempt */ ms_before_next_connect = 0; } else { /* Connect failed immediately. Wait a bit before the next * attempt */ ms_before_next_connect = CONNECT_DELAY_ON_FAIL_MS; } /* Have we reached the total timeout yet? */ int ms_left = timeout - (int)(g_get_elapsed_ms() - start_time); if (ms_left <= 0) { error = 1; break; } /* Sleep a bit before trying again */ if (ms_before_next_connect > 0) { if (ms_before_next_connect > ms_left) { ms_before_next_connect = ms_left; } g_sleep(ms_before_next_connect); } } if (error != 0) { if (self->sck >= 0) { g_tcp_close(self->sck); self->sck = -1; } /* Ensure errno is representative of the last connection attempt */ errno = connect_errno; self->status = TRANS_STATUS_DOWN; } else { self->status = TRANS_STATUS_UP; /* ok */ self->type1 = TRANS_TYPE_CLIENT; /* client */ } return error; } /*****************************************************************************/ /** * @return 0 on success, 1 on failure */ int trans_listen_address(struct trans *self, const char *port, const char *address) { if (self->sck >= 0) { g_tcp_close(self->sck); } if (self->mode == TRANS_MODE_TCP) /* tcp */ { self->sck = g_tcp_socket(); if (self->sck < 0) { return 1; } g_file_set_cloexec(self->sck, 1); g_tcp_set_non_blocking(self->sck); g_sck_set_reuseaddr(self->sck); if (g_tcp_bind_address(self->sck, port, address) == 0) { if (g_tcp_listen(self->sck) == 0) { self->status = TRANS_STATUS_UP; /* ok */ self->type1 = TRANS_TYPE_LISTENER; /* listener */ return 0; } } } else if (self->mode == TRANS_MODE_UNIX) /* unix socket */ { g_free(self->listen_filename); self->listen_filename = 0; g_file_delete(port); self->sck = g_tcp_local_socket(); if (self->sck < 0) { return 1; } g_file_set_cloexec(self->sck, 1); g_tcp_set_non_blocking(self->sck); if (g_tcp_local_bind(self->sck, port) == 0) { self->listen_filename = g_strdup(port); if (g_tcp_listen(self->sck) == 0) { g_chmod_hex(port, 0x0660); self->status = TRANS_STATUS_UP; /* ok */ self->type1 = TRANS_TYPE_LISTENER; /* listener */ return 0; } } } else if (self->mode == TRANS_MODE_VSOCK) /* vsock socket */ { self->sck = g_sck_vsock_socket(); if (self->sck < 0) { return 1; } g_file_set_cloexec(self->sck, 1); g_tcp_set_non_blocking(self->sck); if (g_sck_vsock_bind_address(self->sck, port, address) == 0) { if (g_tcp_listen(self->sck) == 0) { self->status = TRANS_STATUS_UP; /* ok */ self->type1 = TRANS_TYPE_LISTENER; /* listener */ return 0; } } } else if (self->mode == TRANS_MODE_TCP4) /* tcp4 */ { self->sck = g_tcp4_socket(); if (self->sck < 0) { return 1; } g_file_set_cloexec(self->sck, 1); g_tcp_set_non_blocking(self->sck); g_sck_set_reuseaddr(self->sck); if (g_tcp4_bind_address(self->sck, port, address) == 0) { if (g_tcp_listen(self->sck) == 0) { self->status = TRANS_STATUS_UP; /* ok */ self->type1 = TRANS_TYPE_LISTENER; /* listener */ return 0; } } } else if (self->mode == TRANS_MODE_TCP6) /* tcp6 */ { self->sck = g_tcp6_socket(); if (self->sck < 0) { return 1; } g_file_set_cloexec(self->sck, 1); g_tcp_set_non_blocking(self->sck); g_sck_set_reuseaddr(self->sck); if (g_tcp6_bind_address(self->sck, port, address) == 0) { if (g_tcp_listen(self->sck) == 0) { self->status = TRANS_STATUS_UP; /* ok */ self->type1 = TRANS_TYPE_LISTENER; /* listener */ return 0; } } } return 1; } /*****************************************************************************/ int trans_listen(struct trans *self, const char *port) { return trans_listen_address(self, port, "0.0.0.0"); } /*****************************************************************************/ struct stream * trans_get_in_s(struct trans *self) { struct stream *rv = (struct stream *) NULL; if (self == NULL) { rv = (struct stream *) NULL; } else { rv = self->in_s; } return rv; } /*****************************************************************************/ struct stream * trans_get_out_s(struct trans *self, int size) { struct stream *rv = (struct stream *) NULL; if (self == NULL) { rv = (struct stream *) NULL; } else { init_stream(self->out_s, size); rv = self->out_s; } return rv; } /*****************************************************************************/ /* returns error */ int trans_set_tls_mode(struct trans *self, const char *key, const char *cert, long ssl_protocols, const char *tls_ciphers) { self->tls = ssl_tls_create(self, key, cert); if (self->tls == NULL) { LOG(LOG_LEVEL_ERROR, "trans_set_tls_mode: ssl_tls_create malloc error"); return 1; } if (ssl_tls_accept(self->tls, ssl_protocols, tls_ciphers, self->is_term) != 0) { LOG(LOG_LEVEL_ERROR, "trans_set_tls_mode: ssl_tls_accept failed"); return 1; } /* assign tls functions */ self->trans_recv = trans_tls_recv; self->trans_send = trans_tls_send; self->trans_can_recv = trans_tls_can_recv; self->ssl_protocol = ssl_get_version(self->tls); self->cipher_name = ssl_get_cipher_name(self->tls); return 0; } /*****************************************************************************/ /* returns error */ int trans_shutdown_tls_mode(struct trans *self) { if (self->tls != NULL) { return ssl_tls_disconnect(self->tls); } /* assign callback back to tcp cal */ self->trans_recv = trans_tcp_recv; self->trans_send = trans_tcp_send; self->trans_can_recv = trans_tcp_can_recv; return 0; } ================================================ FILE: common/trans.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * generic transport */ #if !defined(TRANS_H) #define TRANS_H #include "arch.h" #include "parse.h" #define TRANS_MODE_TCP 1 /* tcp6 if defined, else tcp4 */ #define TRANS_MODE_UNIX 2 #define TRANS_MODE_VSOCK 3 #define TRANS_MODE_TCP4 4 /* tcp4 only */ #define TRANS_MODE_TCP6 6 /* tcp6 only */ #define TRANS_TYPE_LISTENER 1 #define TRANS_TYPE_SERVER 2 #define TRANS_TYPE_CLIENT 3 #define TRANS_STATUS_DOWN 0 #define TRANS_STATUS_UP 1 struct trans; /* forward declaration */ struct xrdp_tls; typedef int (*ttrans_data_in)(struct trans *self); typedef int (*ttrans_conn_in)(struct trans *self, struct trans *new_self); typedef int (*tis_term)(void); typedef int (*trans_recv_proc) (struct trans *self, char *ptr, int len); typedef int (*trans_send_proc) (struct trans *self, const char *data, int len); typedef int (*trans_can_recv_proc) (struct trans *self, int sck, int millis); /* optional source info */ enum xrdp_source { XRDP_SOURCE_NONE = 0, XRDP_SOURCE_CLIENT, XRDP_SOURCE_SESMAN, XRDP_SOURCE_CHANSRV, XRDP_SOURCE_MOD, XORGXRDP_SOURCE_XORG, XORGXRDP_SOURCE_XRDP, XRDP_SOURCE_MAX_COUNT }; /* * @brief Provide flow control mechanism for (primarily) xrdp * * There is one of these data structures per-program. * * While input is being read from a 'struct trans' and processed, the * cur_source member is set to the my_source member from the transport. * During this processing, trans_write_copy() may be called to send output * on another struct trans. If this happens, and the output needs to be * buffered, trans_write_copy() can add the number of bytes generated by * the input trans to the source field for the cur_source. This allows us to * see how much output has been buffered for each input source. * * When the program assembles 'struct trans' objects to scan for input * (normally in trans_get_wait_objs()), it is able to see how much buffered * output is registered for each input. Inputs which have too much buffered * output owing are skipped, and not considered for input. * * This provides a simple means of providing back-pressure on an input * where the data it is providing is being processed and then sent out on * a much slower link. */ struct source_info { enum xrdp_source cur_source; int source[XRDP_SOURCE_MAX_COUNT]; }; struct trans { tbus sck; /* socket handle */ int mode; /* 1 tcp, 2 unix socket, 3 vsock */ int status; int type1; /* 1 listener 2 server 3 client */ ttrans_data_in trans_data_in; ttrans_conn_in trans_conn_in; void *callback_data; unsigned int header_size; struct stream *in_s; struct stream *out_s; char *listen_filename; tis_term is_term; /* used to test for exit */ struct stream *wait_s; int no_stream_init_on_data_in; int extra_flags; /* user defined */ void *extra_data; /* user defined */ void (*extra_destructor)(struct trans *); /* user defined */ struct ssl_tls *tls; const char *ssl_protocol; /* e.g. TLSv1, TLSv1.1, TLSv1.2, unknown */ const char *cipher_name; /* e.g. AES256-GCM-SHA384 */ trans_recv_proc trans_recv; trans_send_proc trans_send; trans_can_recv_proc trans_can_recv; struct source_info *si; enum xrdp_source my_source; }; struct trans * trans_create(int mode, int in_size, int out_size); void trans_delete(struct trans *self); void trans_delete_from_child(struct trans *self); int trans_get_wait_objs(struct trans *self, tbus *objs, int *count); int trans_get_wait_objs_rw(struct trans *self, tbus *robjs, int *rcount, tbus *wobjs, int *wcount, int *timeout); int trans_check_wait_objs(struct trans *self); int trans_force_read_s(struct trans *self, struct stream *in_s, int size); int trans_force_write_s(struct trans *self, struct stream *out_s); int trans_force_read(struct trans *self, int size); int trans_force_write(struct trans *self); int trans_write_copy(struct trans *self); int trans_write_copy_s(struct trans *self, struct stream *out_s); /** * Connect the transport to the specified destination * * @param self Transport * @param server Destination server (TCP transports only) * @param port TCP port, or UNIX socket to connect to * @param timeout in milli-seconds for the operation * @return 0 for success * * Multiple connection attempts may be made within the timeout period. * * If the operation is not successful, errno will have been set by * the last connection attempt. * * If the operation is successful, 0 is returned and self->status will * be TRANS_STATUS_UP */ int trans_connect(struct trans *self, const char *server, const char *port, int timeout); int trans_listen_address(struct trans *self, const char *port, const char *address); int trans_listen(struct trans *self, const char *port); struct stream * trans_get_in_s(struct trans *self); struct stream * trans_get_out_s(struct trans *self, int size); int trans_set_tls_mode(struct trans *self, const char *key, const char *cert, long ssl_protocols, const char *tls_ciphers); int trans_shutdown_tls_mode(struct trans *self); int trans_tcp_force_read_s(struct trans *self, struct stream *in_s, int size); #endif ================================================ FILE: common/unicode_defines.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @file common/unicode_defines.h * * Defines used internally by the implementations of the Unicode routines */ #if !defined(UNICODE_DEFINES_H) #define UNICODE_DEFINES_H /** * Is this byte a valid UTF-8 continuation character? */ #define IS_VALID_CONTINUATION_CHAR(c) ((c) >= 0x80 && (c) < 0xc0) /** * Is this character one of the end-of-plane non-characters? * * These are U+xFFFE and U+xFFFF for x in (0..10} */ #define IS_PLANE_END_NON_CHARACTER(c32) (((c32) & 0xfffe) == 0xfffe) /** * Is this character one of the additional non-characters? * * 32 additional non-charactersare defined in the * "Arabic Presentation Forms-A" Unicode block */ #define IS_ARABIC_NON_CHARACTER(c32) ((c32) >= 0xfdd0 && (c32) <= 0xfdef) // Invalid characters, based on UTF-8 decoding range // // By 'invalid' we mean characters that should not be encoded or // decoded when switching between UTF-8 and UTF-32 // // See "UTF-8 decoder capability and stress test" Markus Kuhn 2015-08-28 #define INVALID_UNICODE_0_TO_7F(c) (0) // No invalid characters #define INVALID_UNICODE_80_TO_7FF(c) (0) // No invalid characters #define INVALID_UNICODE_800_TO_FFFF(c) \ (((c) >= 0xd800 && (c) <= 0xdfff) || /* Surrogate pairs */ \ IS_ARABIC_NON_CHARACTER(c) || \ IS_PLANE_END_NON_CHARACTER(c)) #define INVALID_UNICODE_10000_TO_1FFFFF(c) \ (IS_PLANE_END_NON_CHARACTER(c) || (c) > 0x10ffff) // Returns true for all 'invalid' Unicode chars #define INVALID_UNICODE(c) \ ( \ INVALID_UNICODE_0_TO_7F(c) || \ INVALID_UNICODE_80_TO_7FF(c) || \ INVALID_UNICODE_800_TO_FFFF(c) || \ INVALID_UNICODE_10000_TO_1FFFFF(c) \ ) /** * Is this character a UTF-16 high surrogate? */ #define IS_HIGH_SURROGATE(u16) (((u16) & 0xfc00) == 0xd800) /** * Is this character a UTF-16 low surrogate? */ #define IS_LOW_SURROGATE(u16) (((u16) & 0xfc00) == 0xdc00) /** * Extract the UTF-16 high surrogate from a character */ #define HIGH_SURROGATE_FROM_C32(c32) \ (((((c32) - 0x10000) >> 10) & 0x3ff) | 0xd800) /** * Extract the UTF-16 low surrogate from a character */ #define LOW_SURROGATE_FROM_C32(c32) (((c32) & 0x3ff) | 0xdc00) /** * Reconstruct a character from a UTF-16 surrogate pair * * This macro cannot return values higher than 0x10ffff */ #define C32_FROM_SURROGATE_PAIR(low,high) \ ((char32_t)(((high) & 0x3ff) << 10) + ((low) & 0x3ff) + 0x10000) #endif // UNICODE_DEFINES_H ================================================ FILE: common/xrdp_client_info.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * xrdp / xserver info / caps */ #include "xrdp_constants.h" #include "ms-rdpbcgr.h" #if !defined(XRDP_CLIENT_INFO_H) #define XRDP_CLIENT_INFO_H /* * 2.2.1.3.6.1 Monitor Definition (TS_MONITOR_DEF) * 2.2.1.3.9.1 Monitor Attributes (TS_MONITOR_ATTRIBUTES) * 2.2.2.2.1 DISPLAYCONTROL_MONITOR_LAYOUT */ struct monitor_info { /* From 2.2.1.3.6.1 Monitor Definition (TS_MONITOR_DEF) */ int left; int top; int right; int bottom; int flags; /* From [MS-RDPEDISP] 2.2.2.2.1 DISPLAYCONTROL_MONITOR_LAYOUT, or * [MS-RDPBCGR] 2.2.1.3.9.1 (TS_MONITOR_ATTRIBUTES) */ unsigned int physical_width; unsigned int physical_height; unsigned int orientation; unsigned int desktop_scale_factor; unsigned int device_scale_factor; /* Derived setting */ unsigned int is_primary; }; /* xrdp keyboard overrids */ struct xrdp_keyboard_overrides { int type; int subtype; int layout; }; struct display_size_description { unsigned int monitorCount; /* 2.2.2.2 DISPLAYCONTROL_MONITOR_LAYOUT_PDU: number of monitors detected (max = 16) */ struct monitor_info minfo[CLIENT_MONITOR_DATA_MAXIMUM_MONITORS]; /* client monitor data */ struct monitor_info minfo_wm[CLIENT_MONITOR_DATA_MAXIMUM_MONITORS]; /* client monitor data, non-negative values */ unsigned int session_width; unsigned int session_height; }; /* Values used for the security_layer */ /* TODO: Make this an enum, and move it below xrdp_client_info */ #define SECURITY_LAYER_NEGOTIATE 0 #define SECURITY_LAYER_RDP 1 #define SECURITY_LAYER_TLS 2 enum client_resize_mode { CRMODE_NONE, CRMODE_SINGLE_SCREEN, CRMODE_MULTI_SCREEN }; enum xrdp_capture_code { CC_SIMPLE = 0, CC_SUF_A16 = 1, CC_SUF_RFX = 2, CC_SUF_A2 = 3, CC_GFX_PRO = 4, CC_GFX_A2 = 5 }; /** * Type describing Unicode input state */ enum unicode_input_state { UIS_UNSUPPORTED = 0, ///< Client does not support Unicode UIS_SUPPORTED, ///< Client supports Unicode, but it's not active UIS_ACTIVE ///< Unicode input is active }; enum xrdp_encoder_flags { NONE = 0, ENCODE_COMPLETE = 1 << 0, GFX_PROGRESSIVE_RFX = 1 << 1, GFX_H264 = 1 << 2, KEY_FRAME_REQUESTED = 1 << 3 }; /* Size definitions for some arrays in xrdp_client_info */ enum { CI_KBD_MODEL_SIZE = 16, CI_KBD_LAYOUT_SIZE = 16, CI_KBD_VARIANT_SIZE = 16, CI_KBD_OPTIONS_SIZE = 256, CI_KBD_XKB_RULES_SIZE = 32 }; /** * Information about the xrdp client * * Note to maintainers; this structure is no longer shared with * xorgxrdp. See common/xup_client_info.h for that structure. */ struct xrdp_client_info { int bpp; /* bitmap cache info */ int cache1_entries; int cache1_size; int cache2_entries; int cache2_size; int cache3_entries; int cache3_size; int bitmap_cache_persist_enable; /* 0 or 2 */ int bitmap_cache_version; /* ored 1 = original version, 2 = v2, 4 = v3 */ /* pointer info */ int pointer_cache_entries; /* other */ int use_bitmap_comp; int use_bitmap_cache; int op1; /* use smaller bitmap header, non cache */ int op2; /* use smaller bitmap header in bitmap cache */ int desktop_cache; int use_compact_packets; /* rdp5 smaller packets */ char client_name[INFO_CLIENT_NAME_BYTES_UTF8]; int build; int keylayout; char username[INFO_CLIENT_MAX_CB_LEN]; char password[INFO_CLIENT_MAX_CB_LEN]; char domain[INFO_CLIENT_MAX_CB_LEN]; char program[INFO_CLIENT_MAX_CB_LEN]; char directory[INFO_CLIENT_MAX_CB_LEN]; int rdp_compression; int rdp_autologin; int crypt_level; /* 1, 2, 3 = low, medium, high */ int channels_allowed; /* 0 = no channels 1 = channels */ int sound_code; /* 1 = leave sound at server */ int is_mce; int rdp5_performanceflags; int brush_cache_code; /* 0 = no cache 1 = 8x8 standard cache 2 = arbitrary dimensions */ int max_bpp; int jpeg; /* non standard bitmap cache v2 cap */ int offscreen_support_level; int offscreen_cache_size; int offscreen_cache_entries; int rfx; /* CAPSETTYPE_RAIL */ int rail_support_level; /* CAPSETTYPE_WINDOW */ int wnd_support_level; int wnd_num_icon_caches; int wnd_num_icon_cache_entries; /* codecs */ int rfx_codec_id; int rfx_prop_len; char rfx_prop[64]; int ns_codec_id; int ns_prop_len; char ns_prop[64]; int jpeg_codec_id; int jpeg_prop_len; char jpeg_prop[64]; int v3_codec_id; int rfx_min_pixel; char orders[XR_PRIMARY_ORDER_COUNT]; int order_flags_ex; int use_bulk_comp; int pointer_flags; /* 0 color, 1 new, 2 no new */ int use_fast_path; int require_credentials; /* when true, credentials *must* be passed on cmd line */ int security_layer; /* SECURITY_LAYER_* */ int vmconnect; /* Used when used from inside Hyper-V */ int multimon; /* 0 = deny , 1 = allow */ struct display_size_description display_sizes; int keyboard_type; int keyboard_subtype; int png_codec_id; int png_prop_len; char png_prop[64]; int vendor_flags[4]; int mcs_connection_type; int mcs_early_capability_flags; int max_fastpath_frag_bytes; int capture_format; char certificate[1024]; char key_file[1024]; /* X11 keyboard layout - inferred from keyboard type/subtype */ char model[CI_KBD_MODEL_SIZE]; char layout[CI_KBD_LAYOUT_SIZE]; char variant[CI_KBD_VARIANT_SIZE]; char options[CI_KBD_OPTIONS_SIZE]; char xkb_rules[CI_KBD_XKB_RULES_SIZE]; // A few x11 keycodes are needed by the xup module int x11_keycode_caps_lock; int x11_keycode_num_lock; int x11_keycode_scroll_lock; /* xorgxrdp: frame capture interval (milliseconds) */ int rfx_frame_interval; int h264_frame_interval; int normal_frame_interval; /* codec */ int h264_codec_id; int h264_prop_len; char h264_prop[64]; int use_frame_acks; int max_unacknowledged_frame_count; long ssl_protocols; char *tls_ciphers; char client_ip[MAX_PEER_ADDRSTRLEN]; char client_description[MAX_PEER_DESCSTRLEN]; int client_os_major; int client_os_minor; int no_orders_supported; int use_cache_glyph_v2; int rail_enable; // Mask of reasons why output may be suppressed // (see enum suppress_output_reason) unsigned int suppress_output_mask; int enable_token_login; char domain_user_separator[16]; /* xrdp.override_* values */ struct xrdp_keyboard_overrides xrdp_keyboard_overrides; /* These values are optionally send over as part of TS_UD_CS_CORE. * They can be used as a fallback for a single monitor session * if physical sizes are not available in the monitor-specific * data */ unsigned int session_physical_width; /* in mm */ unsigned int session_physical_height; /* in mm */ int large_pointer_support_flags; int gfx; // Can we resize the desktop by using a Deactivation-Reactivation Sequence? enum client_resize_mode client_resize_mode; enum unicode_input_state unicode_input_support; enum xrdp_capture_code capture_code; }; /* * Return true if output is suppressed for a particular reason */ #define OUTPUT_SUPPRESSED_FOR_REASON(ci,reason) \ (((ci)->suppress_output_mask & (unsigned int)reason) != 0) #endif ================================================ FILE: common/xrdp_constants.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * Miscellaneous protocol constants * * Copyright (C) Matthew Chapman 1999-2008 * Copyright (C) Jay Sorg 2004-2014 * Copyright (C) Kevin Zhou 2012 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #if !defined(XRDP_CONSTANTS_H) #define XRDP_CONSTANTS_H /* TCP port for Remote Desktop Protocol */ #define TCP_PORT_RDP 3389 /****************************************************************************** * * xrdp constants * * Constants defined in publicly available Microsoft documents are not * stored here, but are stored in the include files ms-*.h, where the name * of the file is the name of the document defining the constant. * * So for example, NTSTATUS values found in [MS-ERREF] are found in * ms-erref.h ******************************************************************************/ /** * Size of buffer including terminator for an IP address as returned * by g_sck_get_peer_ip_address(). See POSIX INET6_ADDRSTRLEN */ #define MAX_PEER_ADDRSTRLEN 46 /** * Max length of buffer containing an instance name used to * tag sessions for discrimination on reconnection. **/ #define MAX_XRDP_INSTANCE_NAMELEN 80 /** * Max length of buffer containing a Wayland or X11 display * name **/ #define MAX_DISPLAY_NAME_SIZE 32 /** * Size of buffer including terminator for a socket description, as * returned by g_sck_get_peer_description() * Currently the largest is an IPv6 address (INET6_ADDRSTRLEN), plus * []: characters */ #define MAX_PEER_DESCSTRLEN (46 + 2 + 1 + 5) /* * Number of bytes used to send a client name in the client core data * ([MS-RDPBCGR] 2.2.1.3.2). This is 15 characters plus a terminator in * UTF-16 */ #define INFO_CLIENT_NAME_BYTES_UTF16 ((15 + 1) * 2) /* * Number of bytes needed to store the client name as UTF-8. It is assumed * that the 15 Unicode characters in the name all occupy BMP codepoints * between U+0800 and U+FFFF. These codepoints all need three octets * in UTF-8 */ #define INFO_CLIENT_NAME_BYTES_UTF8 ((3 * 15) + 1) /** * Maximum length of a string including the mandatory null terminator * [MS-RDPBCGR] TS_INFO_PACKET(2.2.1.11.1.1) */ #define INFO_CLIENT_MAX_CB_LEN 512 #define XRDP_MAX_BITMAP_CACHE_ID 3 #define XRDP_MAX_BITMAP_CACHE_IDX 2000 #define XRDP_BITMAP_CACHE_ENTRIES 2048 /* * Constants come from ITU-T Recommendations */ #define ISO_PDU_CR 0xE0 /* X.224 Connection Request */ #define ISO_PDU_CC 0xD0 /* X.224 Connection Confirm */ #define ISO_PDU_DR 0x80 /* Disconnect Request */ #define ISO_PDU_DT 0xF0 /* Data */ #define ISO_PDU_ER 0x70 /* Error */ /* MCS PDU codes (T.125) */ #define MCS_EDRQ 1 /* Erect Domain Request */ #define MCS_DPUM 8 /* Disconnect Provider Ultimatum */ #define MCS_AURQ 10 /* Attach User Request */ #define MCS_AUCF 11 /* Attach User Confirm */ #define MCS_CJRQ 14 /* Channel Join Request */ #define MCS_CJCF 15 /* Channel Join Confirm */ #define MCS_SDRQ 25 /* Send Data Request */ #define MCS_SDIN 26 /* Send Data Indication */ /* xorgxrdp: frame capture interval (milliseconds) */ #define DEFAULT_RFX_FRAME_INTERVAL 32 #define DEFAULT_H264_FRAME_INTERVAL 16 #define DEFAULT_NORMAL_FRAME_INTERVAL 40 /****************************************************************************** * * Constants come from other Microsoft products * *****************************************************************************/ /* Sound format constants - see also RFC 2361 and MS-RDPAI */ #define WAVE_FORMAT_PCM 0x0001 #define WAVE_FORMAT_ADPCM 0x0002 #define WAVE_FORMAT_ALAW 0x0006 #define WAVE_FORMAT_MULAW 0x0007 #define WAVE_FORMAT_MPEGLAYER3 0x0055 #define WAVE_FORMAT_OPUS 0x0069 #define WAVE_FORMAT_AAC 0xA106 /* https://technet.microsoft.com/ja-jp/library/aa387685.aspx */ #define SEC_RSA_MAGIC 0x31415352 /* RSA1 */ /* NTSTATUS Values (MS-ERREF 2.3.1) */ /* used for RDPDR */ /* * not yet sorted out */ #define MCS_CONNECT_INITIAL 0x7f65 /* MCS BER: big endian, class=application (0x4000), constructed (0x2000), tag number > 30 (0x1f00), tag number=101 (0x0065) */ #define MCS_CONNECT_RESPONSE 0x7f66 /* MCS BER: application 102 */ #define BER_TAG_BOOLEAN 1 #define BER_TAG_INTEGER 2 #define BER_TAG_OCTET_STRING 4 #define BER_TAG_RESULT 10 #define MCS_TAG_DOMAIN_PARAMS 0x30 #define MCS_GLOBAL_CHANNEL 1003 #define MCS_USERCHANNEL_BASE 1001 /* RDP secure transport constants */ /* not used anywhere */ #define SEC_RANDOM_SIZE 32 #define SEC_MODULUS_SIZE 64 #define SEC_PADDING_SIZE 8 #define SEC_EXPONENT_SIZE 4 /* RDP licensing constants */ #define LICENCE_TOKEN_SIZE 10 #define LICENCE_HWID_SIZE 20 #define LICENCE_SIGNATURE_SIZE 16 /* See T.128 */ /* not used anywhere */ #define RDP_KEYPRESS 0 #define RDP_KEYRELEASE (KBD_FLAG_DOWN | KBD_FLAG_UP) /* Raster operation masks */ #define ROP2_S(rop3) (rop3 & 0xf) #define ROP2_P(rop3) ((rop3 & 0x3) | ((rop3 & 0x30) >> 2)) #define ROP2_COPY 0xc #define ROP2_XOR 0x6 #define ROP2_AND 0x8 #define ROP2_NXOR 0x9 #define ROP2_OR 0xe #define MIX_TRANSPARENT 0 #define MIX_OPAQUE 1 #define TEXT2_VERTICAL 0x04 #define TEXT2_IMPLICIT_X 0x20 /* RDP bitmap cache (version 2) constants */ #define BMPCACHE2_C0_CELLS 0x78 #define BMPCACHE2_C1_CELLS 0x78 #define BMPCACHE2_C2_CELLS 0x150 #define BMPCACHE2_NUM_PSTCELLS 0x9f6 #define PDU_FLAG_FIRST 0x01 #define PDU_FLAG_LAST 0x02 #define RDP_SOURCE "MSTSC" /* Keymap flags */ #define MapRightShiftMask (1 << 0) #define MapLeftShiftMask (1 << 1) #define MapShiftMask (MapRightShiftMask | MapLeftShiftMask) #define MapRightAltMask (1 << 2) #define MapLeftAltMask (1 << 3) #define MapAltGrMask MapRightAltMask #define MapRightCtrlMask (1 << 4) #define MapLeftCtrlMask (1 << 5) #define MapCtrlMask (MapRightCtrlMask | MapLeftCtrlMask) #define MapRightWinMask (1 << 6) #define MapLeftWinMask (1 << 7) #define MapWinMask (MapRightWinMask | MapLeftWinMask) #define MapNumLockMask (1 << 8) #define MapCapsLockMask (1 << 9) #define MapLocalStateMask (1 << 10) #define MapInhibitMask (1 << 11) #define MASK_ADD_BITS(var, mask) (var |= mask) #define MASK_REMOVE_BITS(var, mask) (var &= ~mask) #define MASK_HAS_BITS(var, mask) ((var & mask)>0) #define MASK_CHANGE_BIT(var, mask, active) \ (var = ((var & ~mask) | (active ? mask : 0))) /* Clipboard constants, "borrowed" from GCC system headers in the w32 cross compiler */ #define CF_TEXT 1 #define CF_BITMAP 2 #define CF_METAFILEPICT 3 #define CF_SYLK 4 #define CF_DIF 5 #define CF_TIFF 6 #define CF_OEMTEXT 7 #define CF_DIB 8 #define CF_PALETTE 9 #define CF_PENDATA 10 #define CF_RIFF 11 #define CF_WAVE 12 #define CF_UNICODETEXT 13 #define CF_ENHMETAFILE 14 #define CF_HDROP 15 #define CF_LOCALE 16 #define CF_MAX 17 #define CF_OWNERDISPLAY 128 #define CF_DSPTEXT 129 #define CF_DSPBITMAP 130 #define CF_DSPMETAFILEPICT 131 #define CF_DSPENHMETAFILE 142 #define CF_PRIVATEFIRST 512 #define CF_PRIVATELAST 767 #define CF_GDIOBJFIRST 768 #define CF_GDIOBJLAST 1023 /* RDPDR constants */ #define RDPDR_MAX_DEVICES 0x10 /* drawable types */ #define WND_TYPE_BITMAP 0 #define WND_TYPE_WND 1 #define WND_TYPE_SCREEN 2 #define WND_TYPE_BUTTON 3 #define WND_TYPE_IMAGE 4 #define WND_TYPE_EDIT 5 #define WND_TYPE_LABEL 6 #define WND_TYPE_COMBO 7 #define WND_TYPE_SPECIAL 8 #define WND_TYPE_LISTBOX 9 #define WND_TYPE_OFFSCREEN 10 /* button states */ #define BUTTON_STATE_UP 0 #define BUTTON_STATE_DOWN 1 /* touch gestures */ #define TOUCH_TWO_FINGERS_DOWN 0 #define TOUCH_TWO_FINGERS_UP 1 #define TOUCH_TWO_FINGERS_LEFT 2 #define TOUCH_TWO_FINGERS_RIGHT 3 /* messages */ #define WM_PAINT 3 #define WM_KEYDOWN 15 #define WM_KEYUP 16 #define WM_KEYBRD_SYNC 17 #define WM_MOUSEMOVE 100 #define WM_LBUTTONUP 101 #define WM_LBUTTONDOWN 102 #define WM_RBUTTONUP 103 #define WM_RBUTTONDOWN 104 #define WM_BUTTON3UP 105 #define WM_BUTTON3DOWN 106 #define WM_BUTTON4UP 107 #define WM_BUTTON4DOWN 108 #define WM_BUTTON5UP 109 #define WM_BUTTON5DOWN 110 #define WM_BUTTON6UP 111 #define WM_BUTTON6DOWN 112 #define WM_BUTTON7UP 113 #define WM_BUTTON7DOWN 114 #define WM_BUTTON8UP 115 #define WM_BUTTON8DOWN 116 #define WM_BUTTON9UP 117 #define WM_BUTTON9DOWN 118 #define WM_TOUCH_VSCROLL 140 #define WM_TOUCH_HSCROLL 141 #define WM_INVALIDATE 200 #define WM_CHANNEL_DATA 201 #define CB_ITEMCHANGE 300 #define FASTPATH_MAX_PACKET_SIZE 0x3fff // Since we're not guaranteed to have pixman, copy these directives. #define XRDP_PIXMAN_TYPE_ARGB 2 #define XRDP_PIXMAN_TYPE_ABGR 3 #define XRDP_PIXMAN_FORMAT(bpp,type,a,r,g,b) (((bpp) << 24) | \ ((type) << 16) | \ ((a) << 12) | \ ((r) << 8) | \ ((g) << 4) | \ ((b))) #define XRDP_a8b8g8r8 \ XRDP_PIXMAN_FORMAT(32, XRDP_PIXMAN_TYPE_ABGR, 8, 8, 8, 8) #define XRDP_a8r8g8b8 \ XRDP_PIXMAN_FORMAT(32, XRDP_PIXMAN_TYPE_ARGB, 8, 8, 8, 8) #define XRDP_r5g6b5 \ XRDP_PIXMAN_FORMAT(16, XRDP_PIXMAN_TYPE_ARGB, 0, 5, 6, 5) #define XRDP_a1r5g5b5 \ XRDP_PIXMAN_FORMAT(16, XRDP_PIXMAN_TYPE_ARGB, 1, 5, 5, 5) #define XRDP_r3g3b2 \ XRDP_PIXMAN_FORMAT(8, XRDP_PIXMAN_TYPE_ARGB, 0, 3, 3, 2) // The last used constant in pixman is 63, so use 64+ #define XRDP_nv12 \ XRDP_PIXMAN_FORMAT(12, 64, 0, 0, 0, 0) #define XRDP_i420 \ XRDP_PIXMAN_FORMAT(12, 65, 0, 0, 0, 0) #define XRDP_nv12_709fr \ XRDP_PIXMAN_FORMAT(12, 66, 0, 0, 0, 0) #define XRDP_yuv444_709fr \ XRDP_PIXMAN_FORMAT(32, 67, 0, 0, 0, 0) // https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-rdpegfx/8131c1bc-1af8-4907-a05a-f72f4581160f #define XRDP_yuv444_v1_stream_709fr \ XRDP_PIXMAN_FORMAT(32, 68, 0, 0, 0, 0) // https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-rdpegfx/781406c3-5e24-4f2b-b6ff-42b76bf64f6d #define XRDP_yuv444_v2_stream_709fr \ XRDP_PIXMAN_FORMAT(32, 69, 0, 0, 0, 0) #endif ================================================ FILE: common/xrdp_rail.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2012-2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #if !defined(_RAIL_H) #define _RAIL_H /* ORDER_TYPE_WINDOW WINDOW_ORDER_TYPE_WINDOW WINDOW_ORDER_ICON WINDOW_ORDER_CACHED_ICON WINDOW_ORDER_STATE_DELETED WINDOW_ORDER_STATE_NEW on WINDOW_ORDER_STATE_NEW off WINDOW_ORDER_TYPE_NOTIFY WINDOW_ORDER_STATE_DELETED WINDOW_ORDER_STATE_NEW on WINDOW_ORDER_STATE_NEW off WINDOW_ORDER_TYPE_DESKTOP WINDOW_ORDER_FIELD_DESKTOP_NONE on WINDOW_ORDER_FIELD_DESKTOP_NONE off */ /* Window Order Header Flags */ #define WINDOW_ORDER_TYPE_WINDOW 0x01000000 #define WINDOW_ORDER_TYPE_NOTIFY 0x02000000 #define WINDOW_ORDER_TYPE_DESKTOP 0x04000000 #define WINDOW_ORDER_STATE_NEW 0x10000000 #define WINDOW_ORDER_STATE_DELETED 0x20000000 #define WINDOW_ORDER_FIELD_OWNER 0x00000002 #define WINDOW_ORDER_FIELD_STYLE 0x00000008 #define WINDOW_ORDER_FIELD_SHOW 0x00000010 #define WINDOW_ORDER_FIELD_TITLE 0x00000004 #define WINDOW_ORDER_FIELD_CLIENT_AREA_OFFSET 0x00004000 #define WINDOW_ORDER_FIELD_CLIENT_AREA_SIZE 0x00010000 #define WINDOW_ORDER_FIELD_RP_CONTENT 0x00020000 #define WINDOW_ORDER_FIELD_ROOT_PARENT 0x00040000 #define WINDOW_ORDER_FIELD_WND_OFFSET 0x00000800 #define WINDOW_ORDER_FIELD_WND_CLIENT_DELTA 0x00008000 #define WINDOW_ORDER_FIELD_WND_SIZE 0x00000400 #define WINDOW_ORDER_FIELD_WND_RECTS 0x00000100 #define WINDOW_ORDER_FIELD_VIS_OFFSET 0x00001000 #define WINDOW_ORDER_FIELD_VISIBILITY 0x00000200 #define WINDOW_ORDER_FIELD_ICON_BIG 0x00002000 #define WINDOW_ORDER_ICON 0x40000000 #define WINDOW_ORDER_CACHED_ICON 0x80000000 #define WINDOW_ORDER_FIELD_NOTIFY_VERSION 0x00000008 #define WINDOW_ORDER_FIELD_NOTIFY_TIP 0x00000001 #define WINDOW_ORDER_FIELD_NOTIFY_INFO_TIP 0x00000002 #define WINDOW_ORDER_FIELD_NOTIFY_STATE 0x00000004 #define WINDOW_ORDER_FIELD_DESKTOP_NONE 0x00000001 #define WINDOW_ORDER_FIELD_DESKTOP_HOOKED 0x00000002 #define WINDOW_ORDER_FIELD_DESKTOP_ARC_COMPLETED 0x00000004 #define WINDOW_ORDER_FIELD_DESKTOP_ARC_BEGAN 0x00000008 #define WINDOW_ORDER_FIELD_DESKTOP_ZORDER 0x00000010 #define WINDOW_ORDER_FIELD_DESKTOP_ACTIVE_WND 0x00000020 struct rail_icon_info { int bpp; int width; int height; int cmap_bytes; int mask_bytes; int data_bytes; char *mask; char *cmap; char *data; }; struct rail_window_rect { short left; short top; short right; short bottom; }; struct rail_notify_icon_infotip { int timeout; int flags; char *text; char *title; }; struct rail_window_state_order { int owner_window_id; int style; int extended_style; int show_state; char *title_info; int client_offset_x; int client_offset_y; int client_area_width; int client_area_height; int rp_content; int root_parent_handle; int window_offset_x; int window_offset_y; int window_client_delta_x; int window_client_delta_y; int window_width; int window_height; int num_window_rects; struct rail_window_rect *window_rects; int visible_offset_x; int visible_offset_y; int num_visibility_rects; struct rail_window_rect *visibility_rects; }; struct rail_notify_state_order { int version; char *tool_tip; struct rail_notify_icon_infotip infotip; int state; int icon_cache_entry; int icon_cache_id; struct rail_icon_info icon_info; }; struct rail_monitored_desktop_order { int active_window_id; int num_window_ids; int *window_ids; }; #endif ================================================ FILE: common/xrdp_scancode_defs.h ================================================ /** * Copyright (C) 2024 Matt Burt, all xrdp contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @file common/xrdp_scancode_defs.h * @brief Scancode global definitions, shared with xorgxrdp */ #if !defined(XRDP_SCANCODE_DEFS_H) #define XRDP_SCANCODE_DEFS_H enum { /** * Scancodes for keys received from the RDP client */ SCANCODE_LSHIFT_KEY = 0x2a, SCANCODE_RSHIFT_KEY = 0x36, SCANCODE_LCTRL_KEY = 0x1d, SCANCODE_RCTRL_KEY = 0x11d, SCANCODE_CAPS_KEY = 0x3a, SCANCODE_NUMLOCK_KEY = 0x45, SCANCODE_SCROLL_KEY = 0x46, // Scroll lock SCANCODE_LALT_KEY = 0x38, SCANCODE_RALT_KEY = 0x138, SCANCODE_LWIN_KEY = 0x15b, SCANCODE_RWIN_KEY = 0x15c, SCANCODE_MENU_KEY = 0x15d, SCANCODE_ESC_KEY = 0x01, SCANCODE_BACKSPACE_KEY = 0x0e, SCANCODE_ENTER_KEY = 0x1c, SCANCODE_TAB_KEY = 0x0f, SCANCODE_PAUSE_KEY = 0x21d, SCANCODE_KP_ENTER_KEY = 0x11c, SCANCODE_KP_DEL_KEY = 0x53, SCANCODE_KP_1_KEY = 0x4f, SCANCODE_KP_2_KEY = 0x50, SCANCODE_KP_4_KEY = 0x4b, SCANCODE_KP_6_KEY = 0x4d, SCANCODE_KP_7_KEY = 0x47, SCANCODE_KP_8_KEY = 0x48, SCANCODE_LEFT_ARROW_KEY = 0x14b, SCANCODE_RIGHT_ARROW_KEY = 0x14d, SCANCODE_UP_ARROW_KEY = 0x148, SCANCODE_DOWN_ARROW_KEY = 0x150, SCANCODE_HOME_KEY = 0x147, SCANCODE_DEL_KEY = 0x153, SCANCODE_END_KEY = 0x14f, /** * Keys affected by numlock * (this is not the whole keypad) */ SCANCODE_MIN_NUMLOCK = SCANCODE_KP_7_KEY, SCANCODE_MAX_NUMLOCK = SCANCODE_KP_DEL_KEY }; // Convert key_code and flags values received from a TS_KEYBOARD_EVENT // into a value suitable for use by this module #define SCANCODE_FROM_KBD_EVENT(key_code,keyboard_flags) \ (((key_code) & 0x7f) | ((keyboard_flags) & 0x300)) // Convert a scancode used by this module back into a // TS_KEYBOARD_EVENT keyCode value #define SCANCODE_TO_KBD_EVENT_KEY_CODE(scancode) ((scancode) & 0x7f) // Convert a scancode used by this module back into a // TS_KEYBOARD_EVENT keyboardFlags value #define SCANCODE_TO_KBD_EVENT_KBD_FLAGS(scancode) ((scancode) & 0x300) #endif /* XRDP_SCANCODE_DEFS_H */ ================================================ FILE: common/xrdp_sockets.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * names of UNIX sockets for inter-process communication */ #if !defined(XRDP_SOCKETS_H) #define XRDP_SOCKETS_H /* XRDP_SOCKET_ROOT_PATH must be defined to include this file */ #ifdef __cppcheck__ /* avoid syntax errors */ # define XRDP_SOCKET_ROOT_PATH "/dummy" #elif !defined(XRDP_SOCKET_ROOT_PATH) # error "XRDP_SOCKET_ROOT_PATH must be defined" #endif /* Buffer size for code for fullpath declarations * * This needs to fit in the sun_path field of a sockaddr_un. POSIX * does not define this size, so the value below is the lower of * the FreeBSD/OpenBSD/NetBSD(104) and Linux(108) values */ #define XRDP_SOCKETS_MAXPATH 104 /* The socketdir is rooted at XRDP_SOCKET_ROOT_PATH. User-specific * sockets live in a user-specific sub-directory of this called * XRDP_SOCKET_PATH. The sub-directory is the UID of the user */ #define XRDP_SOCKET_PATH XRDP_SOCKET_ROOT_PATH "/%d" /* Sockets in XRDP_SOCKET_ROOT_PATH */ #define SCP_LISTEN_PORT_BASE_STR "sesman.socket" /* names of socket files within XRDP_SOCKET_PATH, qualified by * display name */ #define XRDP_CHANSRV_BASE_STR "xrdp_chansrv_socket_%s" #define CHANSRV_PORT_OUT_BASE_STR "xrdp_chansrv_audio_out_socket_%s" #define CHANSRV_PORT_IN_BASE_STR "xrdp_chansrv_audio_in_socket_%s" #define CHANSRV_API_BASE_STR "xrdpapi_%s" #define XRDP_X11RDP_BASE_STR "xrdp_display_%s" #define XRDP_DISCONNECT_BASE_STR "xrdp_disconnect_display_%s" /* fullpath declarations */ #define XRDP_CHANSRV_STR XRDP_SOCKET_PATH "/" XRDP_CHANSRV_BASE_STR #define CHANSRV_PORT_OUT_STR XRDP_SOCKET_PATH "/" CHANSRV_PORT_OUT_BASE_STR #define CHANSRV_PORT_IN_STR XRDP_SOCKET_PATH "/" CHANSRV_PORT_IN_BASE_STR #define CHANSRV_API_STR XRDP_SOCKET_PATH "/" CHANSRV_API_BASE_STR #define XRDP_X11RDP_STR XRDP_SOCKET_PATH "/" XRDP_X11RDP_BASE_STR #define XRDP_DISCONNECT_STR XRDP_SOCKET_PATH "/" XRDP_DISCONNECT_BASE_STR /* Where X11 stores its Unix Domain Sockets (unlikely to change) */ #define X11_UNIX_SOCKET_DIRECTORY "/tmp/.X11-unix" /* fullpath to an X11 display socket */ #define X11_UNIX_SOCKET_STR X11_UNIX_SOCKET_DIRECTORY "/X%d" #endif ================================================ FILE: common/xup_client_info.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2025 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @file common/xup_client_info.h * @brief Data shared with xorgxrdp */ #if !defined(XUP_CLIENT_INFO_H) #define XUP_CLIENT_INFO_H #include "xrdp_client_info.h" /** * Information about the xrdp client which is passed to xorgxrdp * * This is a subset of 'struct xrdp_client_info' * * @note If you change this structure, you MUST bump the * XUP_CLIENT_INFO_CURRENT_VERSION number so that the mismatch * can be detected. */ struct xup_client_info { int size; /* bytes for this structure */ int version; /* Should be XUP_CLIENT_INFO_CURRENT_VERSION */ int bpp; int jpeg; /* non standard bitmap cache v2 cap */ int offscreen_support_level; int offscreen_cache_size; int offscreen_cache_entries; char orders[XR_PRIMARY_ORDER_COUNT]; int order_flags_ex; int pointer_flags; /* 0 color, 1 new, 2 no new */ int large_pointer_support_flags; struct display_size_description display_sizes; enum xrdp_capture_code capture_code; int capture_format; /* X11 keyboard layout - inferred from keyboard type/subtype */ char model[CI_KBD_MODEL_SIZE]; char layout[CI_KBD_LAYOUT_SIZE]; char variant[CI_KBD_VARIANT_SIZE]; char options[CI_KBD_OPTIONS_SIZE]; char xkb_rules[CI_KBD_XKB_RULES_SIZE]; // A few x11 keycodes are needed by the xup module int x11_keycode_caps_lock; int x11_keycode_num_lock; int x11_keycode_scroll_lock; /* xorgxrdp: frame capture interval (milliseconds) */ int rfx_frame_interval; int h264_frame_interval; int normal_frame_interval; }; /* yyyymmdd of last incompatible change to xup_client_info */ #define XUP_CLIENT_INFO_CURRENT_VERSION 20250528 #endif // XUP_CLIENT_INFO_H ================================================ FILE: configure.ac ================================================ # Process this file with autoconf to produce a configure script AC_PREREQ([2.69]) AC_INIT([xrdp], [0.10.80], [xrdp-devel@googlegroups.com]) AC_DEFINE([VERSION_YEAR], 2025, [Copyright year]) AC_CONFIG_HEADERS(config_ac.h:config_ac-h.in) AM_INIT_AUTOMAKE([1.7.2 foreign]) AC_CONFIG_MACRO_DIR([m4]) AC_USE_SYSTEM_EXTENSIONS AC_PROG_CC AC_PROG_CXX AC_PROG_LN_S LT_INIT PKG_PROG_PKG_CONFIG if test "x$PKG_CONFIG" = "x"; then AC_MSG_ERROR([please install pkg-config]) fi AC_CONFIG_SUBDIRS([libpainter librfxcodec]) # Use silent rules by default if supported by Automake m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) case $host_os in *linux*) linux=yes ;; *kfreebsd*) linux=yes # only used in instfiles/ so that’s ok for us for now ;; *freebsd*) freebsd=yes ;; *netbsd*) netbsd=yes ;; *openbsd*) openbsd=yes ;; *darwin*) macos=yes ;; esac AM_CONDITIONAL(LINUX, [test "x$linux" = xyes]) AM_CONDITIONAL(FREEBSD, [test "x$freebsd" = xyes]) AM_CONDITIONAL(OPENBSD, [test "x$openbsd" = xyes]) AM_CONDITIONAL(NETBSD, [test "x$netbsd" = xyes]) AM_CONDITIONAL(MACOS, [test "x$macos" = xyes]) AC_CHECK_SIZEOF([int]) AC_CHECK_SIZEOF([long]) AC_CHECK_SIZEOF([void *]) AC_CHECK_SIZEOF([fsblkcnt_t],,[#include ]) # runstatedir not available for autoconf <= 2.69 if test "x$runstatedir" = "x" ; then runstatedir='${localstatedir}/run' fi AC_ARG_WITH([socketdir], [AS_HELP_STRING([--with-socketdir=DIR], [Use directory for UNIX sockets for XRDP sessions (default: RUNSTATEDIR/xrdp)])], [], [with_socketdir="$runstatedir/xrdp"]) AC_SUBST([socketdir], [$with_socketdir]) AC_ARG_WITH([systemdsystemunitdir], AS_HELP_STRING([--with-systemdsystemunitdir=DIR], [Directory for systemd service files, no to disable]), [], [ if test "x$linux" = xyes; then with_systemdsystemunitdir=$($PKG_CONFIG --variable=systemdsystemunitdir systemd) fi ]) if test "x$with_systemdsystemunitdir" != xno; then AC_SUBST([systemdsystemunitdir], [$with_systemdsystemunitdir]) fi AM_CONDITIONAL(HAVE_SYSTEMD, [test -n "$with_systemdsystemunitdir" -a "x$with_systemdsystemunitdir" != xno ]) AC_ARG_ENABLE(tests, AS_HELP_STRING([--enable-tests], [Ensure dependencies for the tests are installed]), [ensure_tests_deps=yes], []) AC_ARG_ENABLE(pam, AS_HELP_STRING([--enable-pam], [Build PAM support (default: yes)]), [], [enable_pam=yes]) AM_CONDITIONAL(SESMAN_NOPAM, [test x$enable_pam != xyes]) AC_ARG_ENABLE(vsock, AS_HELP_STRING([--enable-vsock], [Build AF_VSOCK support (default: no)]), [], [enable_vsock=no]) AC_ARG_ENABLE(ipv6, AS_HELP_STRING([--enable-ipv6], [Build IPv6 support (default: no, experimental)]), [], [enable_ipv6=no]) AC_ARG_ENABLE(ipv6only, AS_HELP_STRING([--enable-ipv6only], [Build IPv6-only (default: no)]), [], [enable_ipv6only=no]) AC_ARG_ENABLE(kerberos, AS_HELP_STRING([--enable-kerberos], [Build kerberos support (prefer --enable-pam if available) (default: no)]), [], [enable_kerberos=no]) AM_CONDITIONAL(SESMAN_KERBEROS, [test x$enable_kerberos = xyes]) AC_ARG_ENABLE(bsd, AS_HELP_STRING([--enable-bsd], [Build BSD auth support (default: no)]), [], [enable_bsd=no]) AM_CONDITIONAL(SESMAN_BSD, [test x$enable_bsd = xyes]) AC_ARG_ENABLE(pamuserpass, AS_HELP_STRING([--enable-pamuserpass], [Build PAM userpass support (default: no)]), [], [enable_pamuserpass=no]) AM_CONDITIONAL(SESMAN_PAMUSERPASS, [test x$enable_pamuserpass = xyes]) AC_ARG_ENABLE(pam-config, AS_HELP_STRING([--enable-pam-config=CONF], [Select PAM config to install: arch, debian, redhat, suse, freebsd, macos, unix (default: autodetect)])) # Development options. devel_all is first as this provides a default for # the others AC_ARG_ENABLE(devel_all, AS_HELP_STRING([--enable-devel-all], [Enable all development options (default: no)]), [devel_all=$enableval], [devel_all=no]) AC_ARG_ENABLE(devel_debug, AS_HELP_STRING([--enable-devel-debug], [Build exes with no optimisation and debugging symbols (default: no)]), [devel_debug=$enableval], [devel_debug=$devel_all]) AM_CONDITIONAL(DEVEL_DEBUG, [test x$devel_debug = xyes ]) AC_ARG_ENABLE(devel_logging, AS_HELP_STRING([--enable-devel-logging], [Enable development logging (default: no)]), [devel_logging=$enableval], [devel_logging=$devel_all]) AC_ARG_ENABLE(devel_streamcheck, AS_HELP_STRING([--enable-devel-streamcheck], [Add range-check/abort to stream primitives (default: no)]), [devel_streamcheck=$enableval], [devel_streamcheck=$devel_all]) AC_ARG_ENABLE(neutrinordp, AS_HELP_STRING([--enable-neutrinordp], [Build neutrinordp module (default: no)]), [], [enable_neutrinordp=no]) AM_CONDITIONAL(XRDP_NEUTRINORDP, [test x$enable_neutrinordp = xyes]) AC_ARG_ENABLE(ulalaca, AS_HELP_STRING([--enable-ulalaca], [Build ulalaca module (experimental) (default: no)]), [], [enable_ulalaca=no]) AM_CONDITIONAL(XRDP_ULALACA, [test x$enable_ulalaca = xyes]) AC_ARG_ENABLE(jpeg, AS_HELP_STRING([--enable-jpeg], [Build jpeg module (default: no)]), [], [enable_jpeg=no]) AM_CONDITIONAL(XRDP_JPEG, [test x$enable_jpeg = xyes]) AC_ARG_ENABLE(tjpeg, AS_HELP_STRING([--enable-tjpeg], [Build turbo jpeg module (default: no)]), [], [enable_tjpeg=no]) AM_CONDITIONAL(XRDP_TJPEG, [test x$enable_tjpeg = xyes]) AC_ARG_ENABLE(fuse, AS_HELP_STRING([--enable-fuse], [Build fuse(clipboard file / drive redir) (default: no)]), [], [enable_fuse=no]) AM_CONDITIONAL(XRDP_FUSE, [test x$enable_fuse = xyes]) AC_ARG_ENABLE(xrdpvr, AS_HELP_STRING([--enable-xrdpvr], [Build xrdpvr module (default: no)]), [], [enable_xrdpvr=no]) AM_CONDITIONAL(XRDP_XRDPVR, [test x$enable_xrdpvr = xyes]) AC_ARG_ENABLE(fdkaac, AS_HELP_STRING([--enable-fdkaac], [Build aac(audio codec) (default: no)]), [], [enable_fdkaac=no]) AM_CONDITIONAL(XRDP_FDK_AAC, [test x$enable_fdkaac = xyes]) AC_ARG_ENABLE(opus, AS_HELP_STRING([--enable-opus], [Build opus(audio codec) (default: no)]), [], [enable_opus=no]) AM_CONDITIONAL(XRDP_OPUS, [test x$enable_opus = xyes]) AC_ARG_ENABLE(mp3lame, AS_HELP_STRING([--enable-mp3lame], [Build lame mp3(audio codec) (default: no)]), [], [enable_mp3lame=no]) AM_CONDITIONAL(XRDP_MP3LAME, [test x$enable_mp3lame = xyes]) AC_ARG_ENABLE(ibus, AS_HELP_STRING([--enable-ibus], [Allow unicode input via IBus) (default: no)]), [], [enable_ibus=no]) AM_CONDITIONAL(XRDP_IBUS, [test x$enable_ibus = xyes]) AC_ARG_ENABLE(pixman, AS_HELP_STRING([--enable-pixman], [Use pixman library (default: no)]), [], [enable_pixman=no]) AM_CONDITIONAL(XRDP_PIXMAN, [test x$enable_pixman = xyes]) AC_ARG_ENABLE(x264, AS_HELP_STRING([--enable-x264], [Use x264 library (default: no)]), [], [enable_x264=no]) AM_CONDITIONAL(XRDP_X264, [test x$enable_x264 = xyes]) AC_ARG_ENABLE(openh264, AS_HELP_STRING([--enable-openh264], [Use Cisco OpenH264 library (default: no)]), [], [enable_openh264=no]) AM_CONDITIONAL(XRDP_OPENH264, [test x$enable_openh264 = xyes]) AC_ARG_ENABLE(nvenc, AS_HELP_STRING([--enable-nvenc], [Use nvenc library (default: no), env vars XRDP_NVENC_CFLAGS and XRDP_NVENC_LIBS should be set if used]), [], [enable_nvenc=no]) AM_CONDITIONAL(XRDP_NVENC, [test x$enable_nvenc = xyes]) AC_ARG_ENABLE(accel, AS_HELP_STRING([--enable-accel], [Build xrdp_accel_assist (default: no, auto set if --enable-nvenc)]), [], [enable_accel=no]) # AM_CONDITIONAL(XRDP_ACCEL, [test x$enable_accel = xyes]) later in this file AC_ARG_ENABLE(painter, AS_HELP_STRING([--disable-painter], [Do not use included painter library (default: no)]), [], [enable_painter=yes]) AM_CONDITIONAL(XRDP_PAINTER, [test x$enable_painter = xyes]) AC_ARG_ENABLE(rfxcodec, AS_HELP_STRING([--disable-rfxcodec], [Do not use included librfxcodec library (default: no)]), [], [enable_rfxcodec=yes]) AM_CONDITIONAL(XRDP_RFXCODEC, [test x$enable_rfxcodec = xyes]) AC_ARG_ENABLE(rdpsndaudin, AS_HELP_STRING([--enable-rdpsndaudin], [Use rdpsnd audio in (default: no)]), [], [enable_rdpsndaudin=no]) AM_CONDITIONAL(XRDP_RDPSNDAUDIN, [test x$enable_rdpsndaudin = xyes]) AC_ARG_ENABLE(utmp, AS_HELP_STRING([--enable-utmp], [Update utmp (default: no)]), [], [enable_utmp=no]) AM_CONDITIONAL(XRDP_UTMP, [test x$enable_utmp = xyes]) AC_ARG_WITH(imlib2, AS_HELP_STRING([--with-imlib2=ARG], [imlib2 library to use for non-BMP backgrounds (ARG=yes/no/)]),,) AC_ARG_WITH(freetype2, AS_HELP_STRING([--with-freetype2=ARG], [freetype2 library to use for rendering fonts (ARG=yes/no/)]),,) AC_ARG_ENABLE(smartcard, AS_HELP_STRING([--enable-smartcard], [Enable experimental smartcard code. Not for production. (default: no)]), [], [enable_smartcard=no]) AM_CONDITIONAL(XRDP_SMARTCARD, [test x$enable_smartcard = xyes]) # Obsolete options AC_ARG_ENABLE(xrdpdebug, AS_HELP_STRING([--enable-xrdpdebug], [This option is no longer supported - use --enable-devel-all])) if test "x$enable_xrdpdebug" != x; then AC_MSG_ERROR([--enable-xrdpdebug must be replaced with one or more --enable-devel-* options]) fi # configure compiler options and CFLAGS AX_GCC_FUNC_ATTRIBUTE([format]) AX_TYPE_SOCKLEN_T AX_CFLAGS_WARN_ALL AX_APPEND_COMPILE_FLAGS([-Wwrite-strings]) AX_APPEND_COMPILE_FLAGS([-Wmissing-prototypes], ,[-Werror]) AX_APPEND_COMPILE_FLAGS([-Wextra]) # xrdp uses many zero initializers (C99 6.7.8.21). These # require the warning regarding missing field initializers to # be disabled. AX_APPEND_COMPILE_FLAGS([-Wno-missing-field-initializers]) AX_APPEND_COMPILE_FLAGS([-Wno-unused-parameter]) AX_APPEND_COMPILE_FLAGS([-Wno-sign-compare]) AM_COND_IF([LINUX], [AX_APPEND_COMPILE_FLAGS([-Werror])]) # bsd has warnings that have not been fixed yet AM_COND_IF([DEVEL_DEBUG], [AX_APPEND_COMPILE_FLAGS([-g -O0])], [AX_APPEND_COMPILE_FLAGS([-O2])]) # Function setusercontext() is in BSD -lutil but N/A on Solaris or GNU systems AC_SEARCH_LIBS([setusercontext], [util]) # Define HAVE_XXXXX macros for some system functions AC_CHECK_FUNCS([setusercontext getgrouplist clearenv strlcpy]) # The type used by getgrouplist() is the same type used by getgroups() AC_TYPE_GETGROUPS # Don't fail without working nasm if rfxcodec is not enabled if test "x$enable_rfxcodec" != xyes; then with_simd=no export with_simd fi # Check if -ldl is needed to use dlopen() DLOPEN_LIBS= AC_CHECK_FUNC(dlopen, [], [AC_CHECK_LIB(dl, dlopen, [DLOPEN_LIBS=-ldl])]) AC_SUBST(DLOPEN_LIBS) # checking for openssl PKG_CHECK_MODULES([OPENSSL], [openssl >= 0.9.8], [], [AC_MSG_ERROR([please install libssl-dev or openssl-devel])]) # look for openssl binary OPENSSL_BIN=`$PKG_CONFIG --variable=exec_prefix openssl`/bin AC_PATH_PROGS([OPENSSL], [openssl], [:], [$OPENSSL_BIN:$PATH]) # checking for PAM variation # Linux-PAM is used in Linux systems # OpenPAM is used by FreeBSD, NetBSD, DragonFly BSD and OS X # OpenBSD uses BSD Authentication rather than both PAMs AC_CHECK_HEADER([security/_pam_types.h], [AC_DEFINE([HAVE__PAM_TYPES_H], 1, [Using Linux-PAM], [])]) AC_CHECK_HEADER([security/pam_constants.h], [AC_DEFINE([HAVE_PAM_CONSTANTS_H], 1, [Using OpenPAM], [])]) # shm_open may not be in the C library AC_SEARCH_LIBS([shm_open], [rt]) # Find imlib2 case "$with_imlib2" in '' | no) AC_MSG_NOTICE([imlib2 will not be supported]) use_imlib2=no ;; yes) PKG_CHECK_MODULES([IMLIB2], [imlib2 >= 1.4.5], [use_imlib2=yes], [AC_MSG_ERROR([please install libimlib2-dev or imlib2-devel])]) ;; /*) AC_MSG_CHECKING([for imlib2 in $with_imlib2]) if test -d $with_imlib2/lib; then IMLIB2_LIBS="-L$with_imlib2/lib -lImlib2" elif test -d $with_imlib2/lib64; then IMLIB2_LIBS="-L$with_imlib2/lib64 -lImlib2" else AC_MSG_RESULT([no]) AC_MSG_ERROR([Can't find libImlib2 in $with_imlib2]) fi if test -f $with_imlib2/include/Imlib2.h; then IMLIB2_CFLAGS="-I $with_imlib2/include" else AC_MSG_RESULT([no]) AC_MSG_ERROR([Can't find $with_imlib2/include/Imlib2.h]) fi AC_MSG_RESULT([yes]) AC_SUBST([IMLIB2_LIBS]) AC_SUBST([IMLIB2_CFLAGS]) use_imlib2=yes ;; *) AC_MSG_ERROR([--with-imlib2 needs yes/no or absolute path]) esac if test x$use_imlib2 = xyes; then AC_DEFINE([USE_IMLIB2],1, [Compile with imlib2 support]) fi # Find freetype2 # # The modversion used by pkgcheck does not correspond to the # freetype2 release. See docs/VERSIONS.TXT in the freetype2 # source for a table of correspondences. If you change one # of the below defines, change both. m4_define([FT2_REQUIRED_VERSION], [2_8_0]) m4_define([FT2_REQUIRED_MODVERSION], [20.0.14]) case "$with_freetype2" in '' | no) AC_MSG_NOTICE([freetype2 will not be supported]) use_freetype2=no ;; yes) PKG_CHECK_MODULES([FREETYPE2], [freetype2 >= FT2_REQUIRED_MODVERSION], [use_freetype2=yes], [AC_MSG_ERROR([please install version FT2_REQUIRED_VERSION or later of libfreetype6-dev or freetype-devel])]) ;; /*) AC_MSG_CHECKING([for freetype2 in $with_freetype2]) if test -d $with_freetype2/lib; then FREETYPE2_LIBS="-L$with_freetype2/lib -llibfreetype" elif test -d $with_freetype2/lib64; then FREETYPE2_LIBS="-L$with_freetype2/lib64 -llibfreetype" else AC_MSG_RESULT([no]) AC_MSG_ERROR([Can't find libfreetype in $with_freetype2]) fi if test -f $with_freetype2/include/freetype2/ft2build.h; then FREETYPE2_CFLAGS="-isystem $with_freetype2/include/freetype2" else AC_MSG_RESULT([no]) AC_MSG_ERROR([Can't find $with_freetype2/include/freetype2/ft2build.h]) fi AC_MSG_RESULT([yes]) AC_SUBST([FREETYPE2_LIBS]) AC_SUBST([FREETYPE2_CFLAGS]) use_freetype2=yes ;; *) AC_MSG_ERROR([--with-freetype2 needs yes/no or absolute path]) esac AM_CONDITIONAL([USE_FREETYPE2], [test "x$use_freetype2" = xyes]) # Check only one auth mechanism is specified, and give it a name auth_cnt=0 auth_mech="Builtin" AUTHMOD_OBJ=verify_user.lo AUTHMOD_LIB=-lcrypt if test x$enable_pam = xyes then auth_cnt=`expr $auth_cnt + 1` auth_mech="PAM" AUTHMOD_OBJ=verify_user_pam.lo AUTHMOD_LIB=-lpam fi if test x$enable_bsd = xyes then auth_cnt=`expr $auth_cnt + 1` auth_mech="BSD" AUTHMOD_OBJ=verify_user_bsd.lo AUTHMOD_LIB= fi if test x$enable_kerberos = xyes then auth_cnt=`expr $auth_cnt + 1` auth_mech="Kerberos" AUTHMOD_OBJ=verify_user_kerberos.lo AUTHMOD_LIB=-lkrb5 fi if test x$enable_pamuserpass = xyes then auth_cnt=`expr $auth_cnt + 1` auth_mech="PAM userpass" AUTHMOD_OBJ=verify_user_pam_userpass.lo AUTHMOD_LIB="-lpam -lpam_userpass" fi if test $auth_cnt -gt 1 then AC_MSG_ERROR([--enable-pam, --enable-bsd, --enable-pamuserpass and --enable-kerberos are mutually exclusive]) fi AC_SUBST([AUTHMOD_OBJ]) AC_SUBST([AUTHMOD_LIB]) # checking if pam should be autodetected. if test "x$enable_pam" = "xyes" then AC_CHECK_HEADER([security/pam_appl.h], [], [AC_MSG_ERROR([please install libpam0g-dev or pam-devel])]) if test "x$enable_pam_config" = "x"; then PAM_RULES="auto" else pam_config_file="$srcdir/instfiles/pam.d/xrdp-sesman.$enable_pam_config" if test -f "$pam_config_file"; then PAM_RULES="$enable_pam_config" else AC_MSG_ERROR([PAM file "$pam_config_file" is not available]) fi fi fi AC_SUBST(PAM_RULES) # Add define for development options to config_ac.h AC_DEFINE([CONFIG_AC_H],1, [Allow sources to check config_ac.h is included]) if test x$devel_logging = xyes then AC_DEFINE([USE_DEVEL_LOGGING],1,[Enable development logging]) fi if test x$devel_streamcheck = xyes then AC_DEFINE([USE_DEVEL_STREAMCHECK],1,[Enable development stream checking]) fi if test "x$enable_vsock" = "xyes" then enable_vsock=yes if test "x$freebsd" = "xyes" then # Determine if we have AF_HYPERV defined (FreeBSD 13+) AC_CHECK_DECL([AF_HYPERV], [AC_DEFINE([XRDP_ENABLE_VSOCK], 1, [Enable AF_HYPERV])], [], [#include ]) else AC_CHECK_HEADERS([linux/socket.h linux/vm_sockets.h], [AC_DEFINE([XRDP_ENABLE_VSOCK], 1, [Enable AF_VSOCK])], [], [#include ]) fi fi if test "x$enable_ipv6only" = "xyes" then enable_ipv6=yes AC_DEFINE([XRDP_ENABLE_IPV6ONLY],1,[Enable IPv6 only]) fi if test "x$enable_ipv6" = "xyes" then AC_DEFINE([XRDP_ENABLE_IPV6],1,[Enable IPv6]) fi AS_IF( [test "x$enable_neutrinordp" = "xyes"] , [PKG_CHECK_MODULES(FREERDP, freerdp >= 1.0.0)] ) # checking for libjpeg if test "x$enable_jpeg" = "xyes" then AC_CHECK_HEADER([jpeglib.h], [], [AC_MSG_ERROR([please install libjpeg-dev or libjpeg-devel])]) fi # checking for fuse if test "x$enable_fuse" = "xyes" then PKG_CHECK_MODULES([FUSE], [fuse3 >= 3.1.0], [], [AC_MSG_ERROR([please install libfuse3-dev or fuse3-devel])]) fi # checking for fdk aac if test "x$enable_fdkaac" = "xyes" then PKG_CHECK_MODULES([FDKAAC], [fdk-aac >= 0.1.0], [], [AC_MSG_ERROR([please install libfdk-aac-dev or fdk-aac-devel])]) fi # checking for opus if test "x$enable_opus" = "xyes" then AC_CHECK_HEADER([opus/opus.h], [], [AC_MSG_ERROR([please install libopus-dev or opus-devel])]) fi # checking for lame mp3 if test "x$enable_mp3lame" = "xyes" then AC_CHECK_HEADER([lame/lame.h], [], [AC_MSG_ERROR([please install libmp3lame-dev or lame-devel])]) fi # checking for ibus includes if test "x$enable_ibus" = "xyes" then PKG_CHECK_MODULES([IBUS], [ibus-1.0 >= 1.5], [], [AC_MSG_ERROR([please install libibus-1.0-dev or ibus-devel])]) # ibus uses dbus which depends on glib PKG_CHECK_MODULES([GLIB2], [glib-2.0 >= 2.56], [], [AC_MSG_ERROR([please install libglib2.0-dev or glib2.0-devel])]) fi AS_IF( [test "x$enable_pixman" = "xyes"] , [PKG_CHECK_MODULES(PIXMAN, pixman-1 >= 0.1.0)] ) AS_IF( [test "x$enable_x264" = "xyes"] , [PKG_CHECK_MODULES(XRDP_X264, x264 >= 0.3.0)] ) AS_IF( [test "x$enable_openh264" = "xyes"] , [PKG_CHECK_MODULES(XRDP_OPENH264, openh264 >= 2.0.0)] ) if test "x$enable_nvenc" = "xyes" then enable_accel=$enable_nvenc if test ! -z "$XRDP_NVENC_CFLAGS" then AC_SUBST(XRDP_NVENC_CFLAGS, ["$XRDP_NVENC_CFLAGS"]) fi if test ! -z "$XRDP_NVENC_LIBS" then AC_SUBST(XRDP_NVENC_LIBS, ["$XRDP_NVENC_LIBS"]) fi fi AM_CONDITIONAL(XRDP_ACCEL, [test x$enable_accel = xyes]) # checking for TurboJPEG if test "x$enable_tjpeg" = "xyes" then if test ! -z "$TURBOJPEG_PATH" then # env var TURBOJPEG_PATH has been defined, use that AC_CHECK_HEADER([$TURBOJPEG_PATH/include/turbojpeg.h], [], [AC_MSG_ERROR([could not find TurboJPEG in dir specified by env variable TURBOJPEG_PATH ($TURBOJPEG_PATH)])]) AC_SUBST(TurboJpegIncDir, ["-I$TURBOJPEG_PATH/include"]) AC_SUBST(TurboJpegLibDir, ["-L$TURBOJPEG_PATH/lib -Wl,-rpath -Wl,$TURBOJPEG_PATH/lib"]) elif test -e /opt/libjpeg-turbo/lib64 then # TurboJPEG has been installed to /opt on a 64 bit m/c AC_SUBST(TurboJpegIncDir, ["-I/opt/libjpeg-turbo/include"]) AC_SUBST(TurboJpegLibDir, ["-L/opt/libjpeg-turbo/lib64 -Wl,-rpath -Wl,/opt/libjpeg-turbo/lib64"]) elif test -e /opt/libjpeg-turbo/lib32 then # TurboJPEG has been installed to /opt on a 32 bit m/c AC_SUBST(TurboJpegIncDir, ["-I/opt/libjpeg-turbo/include"]) AC_SUBST(TurboJpegLibDir, ["-L/opt/libjpeg-turbo/lib32 -Wl,-rpath -Wl,/opt/libjpeg-turbo/lib32"]) else # check in default location AC_CHECK_HEADER([/usr/include/turbojpeg.h], [], [AC_MSG_ERROR([please install TurboJPEG ])]) AC_SUBST(TurboJpegIncDir, [""]) AC_SUBST(TurboJpegLibDir, [""]) fi fi AC_PATH_XTRA if test "x$no_x" == "xyes"; then AC_MSG_ERROR([please install libx11-dev or libX11-devel]) fi save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $X_CFLAGS" # checking for Xfixes AC_CHECK_HEADER([X11/extensions/Xfixes.h], [], [AC_MSG_ERROR([please install libxfixes-dev or libXfixes-devel])], [#include ]) # checking for Xrandr AC_CHECK_HEADER([X11/extensions/Xrandr.h], [], [AC_MSG_ERROR([please install libxrandr-dev or libXrandr-devel])], [#include ]) # checking for XKB AC_CHECK_HEADER([X11/extensions/XKBrules.h], [], [AC_MSG_ERROR([please install libxkbfile-dev or libxkbfile-devel])], [#include #include #include ]) if test "x$enable_utmp" = "xyes" then AC_CHECK_HEADERS(utmp.h utmpx.h) # Test for non-standard extensions in struct utmpx AXRDP_CHECK_UTMPX_MEMBER_EXISTS([ut_host], [HAVE_UTMPX_UT_HOST]) AXRDP_CHECK_UTMPX_MEMBER_EXISTS([ut_exit], [HAVE_UTMPX_UT_EXIT]) fi CFLAGS="$save_CFLAGS" # perform unit tests if libcheck and libmocka found perform_unit_tests=yes; # Assume packages will be found if test "x$ensure_tests_deps" == "xyes"; then PKG_CHECK_MODULES([CHECK], [check >= 0.10.0], [], [AC_MSG_ERROR([please install check, the unit test framework])]) # Check if cmocka is available - needed for unit testing PKG_CHECK_MODULES([CMOCKA], [cmocka], [], [AC_MSG_ERROR([please install cmocka, the mocking framework])]) else PKG_CHECK_MODULES([CHECK], [check >= 0.10.0], [], [perform_unit_tests=no]) PKG_CHECK_MODULES([CMOCKA], [cmocka], [], [perform_unit_tests=no]) fi if test "x$perform_unit_tests" == "xyes"; then AC_MSG_NOTICE([libcheck found, unit tests will be performed]) else AC_MSG_NOTICE([libcheck not found, unit tests will be skipped]) fi # -- end perform unit tests AC_SUBST([moduledir], '${libdir}/xrdp') AC_ARG_ENABLE([strict-locations], [AS_HELP_STRING([--enable-strict-locations], [Use standard Autoconf install directories unless overridden (default: use /etc and /var)])], [], [enable_strict_locations=no]) if test "x$enable_strict_locations" != "xyes"; then sysconfdir="/etc"; localstatedir="/var"; fi AC_ARG_WITH([pamconfdir], [AS_HELP_STRING([--with-pamconfdir=DIR], [Use directory for pam.d config (default: /etc/pam.d)])], [], [with_pamconfdir="$sysconfdir/pam.d"]) AC_SUBST([pamconfdir], [$with_pamconfdir]) AC_ARG_WITH([sysconfsubdir], [AS_HELP_STRING([--with-sysconfsubdir=DIR], [Use subdirectory for config files (default: xrdp)]))], [], [with_sysconfsubdir="xrdp"]) AC_SUBST([sysconfsubdir], [$with_sysconfsubdir]) PKG_INSTALLDIR AC_CHECK_HEADERS([sys/prctl.h uchar.h]) AC_CONFIG_FILES([ common/Makefile docs/Makefile docs/man/Makefile fontutils/Makefile genkeymap/Makefile instfiles/default/Makefile instfiles/init.d/Makefile instfiles/Makefile instfiles/pam.d/Makefile instfiles/pulse/Makefile instfiles/rc.d/Makefile keygen/Makefile waitforx/Makefile libipm/Makefile libxrdp/Makefile Makefile mc/Makefile neutrinordp/Makefile ulalaca/Makefile pkgconfig/Makefile pkgconfig/xrdp.pc pkgconfig/xrdp-uninstalled.pc sesman/libsesman/Makefile sesman/chansrv/Makefile sesman/Makefile sesman/sesexec/Makefile sesman/tools/Makefile tests/Makefile tests/common/Makefile tests/libipm/Makefile tests/libxrdp/Makefile tests/memtest/Makefile tests/xrdp/Makefile tools/Makefile tools/devel/Makefile tools/devel/tcp_proxy/Makefile tools/chkpriv/Makefile vnc/Makefile xrdpapi/Makefile xrdp/Makefile xrdpvr/Makefile xup/Makefile third_party/Makefile third_party/tomlc99/Makefile xrdp_accel_assist/Makefile ]) AC_REQUIRE_AUX_FILE([tap-driver.sh]) AC_OUTPUT echo "" echo "xrdp will be compiled with:" echo "" echo " mp3lame $enable_mp3lame" echo " opus $enable_opus" echo " fdkaac $enable_fdkaac" echo " jpeg $enable_jpeg" echo " turbo jpeg $enable_tjpeg" echo " rfxcodec $enable_rfxcodec" echo " x264 $enable_x264" echo " openh264 $enable_openh264" echo " nvenc $enable_nvenc" echo " accel $enable_accel" echo " painter $enable_painter" echo " pixman $enable_pixman" echo " fuse $enable_fuse" echo " ipv6 $enable_ipv6" echo " ipv6only $enable_ipv6only" echo " vsock $enable_vsock" echo " ibus $enable_ibus" echo " auth mechanism $auth_mech" echo " rdpsndaudin $enable_rdpsndaudin" echo " smartcard (not for production) $enable_smartcard" echo " utmp support $enable_utmp" if test x$enable_utmp = xyes; then echo " utmpx.ut_host $ac_cv_utmpx_has_ut_host" echo " utmpx.ut_exit $ac_cv_utmpx_has_ut_exit" fi if test -n "$with_systemdsystemunitdir" \ -a "x$with_systemdsystemunitdir" != xno; then echo " systemd support yes" echo " unit file directory $with_systemdsystemunitdir" else echo " systemd support no" fi echo echo " with imlib2 $use_imlib2" echo " with freetype2 $use_freetype2" echo echo " development logging $devel_logging" echo " development streamcheck $devel_streamcheck" echo "" echo " strict_locations $enable_strict_locations" echo " prefix $prefix" echo " exec_prefix $exec_prefix" echo " libdir $libdir" echo " bindir $bindir" echo " sysconfdir $sysconfdir" echo " sysconfdir+subdir $sysconfdir/$sysconfsubdir" echo " pamconfdir $pamconfdir" echo " localstatedir $localstatedir" echo " runstatedir $runstatedir" echo " socketdir $socketdir" echo "" echo " unit tests performable $perform_unit_tests" echo "" echo " CFLAGS = $CFLAGS" echo " LDFLAGS = $LDFLAGS" # xrdp_configure_options.h will be written to the build directory, not the source directory echo '#define XRDP_CONFIGURE_OPTIONS \' > ./xrdp_configure_options.h ./config.status --config | xargs -n 1 | sed -e 's/^/" /' -e 's/$/\\n" \\/' >> ./xrdp_configure_options.h echo '""' >> ./xrdp_configure_options.h ================================================ FILE: docs/Makefile.am ================================================ SUBDIRS = \ man ================================================ FILE: docs/man/.gitignore ================================================ *.[1-8] ================================================ FILE: docs/man/Makefile.am ================================================ man_MANS = \ xrdp-dis.1 \ gfx.toml.5 \ sesman.ini.5 \ xrdp.ini.5 \ xrdp-km.toml.5 \ xrdp.8 \ xrdp-chansrv.8 \ xrdp-genkeymap.8 \ xrdp-keygen.8 \ xrdp-sesadmin.8 \ xrdp-sesman.8 \ xrdp-sesrun.8 \ xrdp-dumpfv1.8 EXTRA_DIST = xrdp-mkfv1.8.in $(man_MANS:=.in) if USE_FREETYPE2 man_MANS += xrdp-mkfv1.8 endif SUBST_VARS = sed \ -e 's|@PACKAGE_VERSION[@]|$(PACKAGE_VERSION)|g' \ -e 's|@bindir[@]|$(bindir)|g' \ -e 's|@sbindir[@]|$(sbindir)|g' \ -e 's|@localstatedir[@]|$(localstatedir)|g' \ -e 's|@sysconfdir[@]|$(sysconfdir)|g' \ -e 's|@sysconfsubdir[@]|$(sysconfsubdir)|g' \ -e 's|@socketdir[@]|$(socketdir)|g' \ -e 's|@xrdpconfdir[@]|$(sysconfdir)/xrdp|g' \ -e 's|@xrdpdatadir[@]|$(datadir)/xrdp|g' \ -e 's|@xrdphomeurl[@]|http://www.xrdp.org/|g' subst_verbose = $(subst_verbose_@AM_V@) subst_verbose_ = $(subst_verbose_@AM_DEFAULT_V@) subst_verbose_0 = @echo " SUBST $@"; SUFFIXES = .in .in: $(subst_verbose)$(SUBST_VARS) $< > $@ CLEANFILES = $(man_MANS) ================================================ FILE: docs/man/gfx.toml.5.in ================================================ .\" .TH "gfx.toml" "8" "@PACKAGE_VERSION@" "xrdp team" "" .SH "NAME" \fBgfx.toml\fR \- Configuration file for xrdp(8) graphics pipeline extension .SH "DESCRIPTION" This file configures the detailed settings of the Graphics Pipeline Extension for xrdp(8). The file format is TOML. See the link in the SEE ALSO section for TOML syntax. The file contains following sections: .TP \fB[codec]\fR \- configure preferred codec and encoders for \fBxrdp\fR(8). .TP \fB[x264]\fR \- parameters for x264 encoder. .TP \fB[OpenH264]\fR \- parameters for Cisco OpenH264 encoder. .LP All options and values are case-sensitive, with some exception, and are described in detail below. .SH "CODEC" \fB[codec]\fR section defines preferred codec order and encoder. The options to be specified in this section are the following: .TP \fBorder\fR = \fI\fR Define the order in which codecs should be used, "H.264" and "RFX". Specify as an array of strings like \fB[ "H.264", "RFX ]\fR. Strings in the array are case-insensitive, while others are case-sensitive. .TP \fBh264_encoder\fR = \fI\fR Specify a preferred H.264 encoder, \fB"x264"\fR or \fB"OpenH264"\fR. This parameter takes effect only when more than one encoder is enabled at compile time. If only one H.264 encoder is enabled, the encoder will be used regardless the value of this parameter. Defaults to \fB"x264"\fR if not specified or if an invalid encoder is specified. The encoder name is case-insensitive. .SH "X264" \fB[x264]\fR section defines encoding parameters that will be passed to x264 encoder. See \fBx264 --fullhelp\fR for the detailed explanations of the parameters. The options to be specified in this section are following: .TP \fBpreset\fR = \fI\fR Select a preset encoding settings. Slower presets result in higher CPU usage but offer better screen image quality and require lower network bandwidth. Here are available presets: .B ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo Presets slower than \fBmedium\fR may not suitable for use with xrdp. .TP \fBtune\fR = \fI\fR Select a tune for source or situation. \fBzerolatency\fR is most appropriate for use with xrdp. Here are available options: .B film, grain, stillimage, psnr, ssim, fastdecode, zerolatency .TP \fBprofile\fR = \fI\fR Select a profile. Here are available options: .B main, baseline, high, high10, high422, high444 .TP \fBvbv_max_bitrate\fR = \fI\fR Set the maximum fill rate for the VBV (Video Buffering Vefifier) buffer in kbps. .TP \fBvbv_buffer_size\fR = \fI\fR Set the size of the VBV buffer size in kilobits. .TP \fBfps_num\fR = \fI\fR Set the fps numerator. .TP \fBfps_den\fR = \fI\fR Set the fps denominator. .TP \fBthreads = \fI\fR Specify how many CPU threads to use for H.264 encoding per screen (0 for auto). Carefully evaluate this value when configuring it to avoid exhausting the available threads. For example, if 3 users are connected simultaneously with dual screens, xrdp may use up to * 3 * 2 threads for H.264 encoding. Please also note that too many threads can hurt quality. .SH "OPENH264" \fB[OpenH264]\fR section defines encoding parameters that will be passed to OpenH264 encoder. The options to be specified in this section are following: .TP \fBEnableFrameSkip\fR = \fI\fR Allows the encoder to skip frames in order to keep the bitrate within the limits if it is about to exceed the maximum bitrate set by MaxBitrate. .TP \fBTargetBitrate\fR = \fI\fR Sets the target average bitrate (in bps) that the encoder will attempt to achieve throughout the encoding process. .TP \fBMaxBitrate\fR = \fI\fR Sets an upper limit of the bitrate in bps. .TP \fBMaxFrameRate\fR = \fI\fR Sets the maximum frame rate that the encoder will process per second. .SH "CONNECTION TYPES" \fB[x264]\fR and \fB[OpenH264]\fR section are tables (also known as dictionaries) that have subtables with connection types in their keys. For example, \fB[x264.lan]\fR, \fB[OpenH264.wan]\fR. You can configure different parameters such as bitrate for the encoder per connection type. Define the default parameter set first, this will be inherited to all connection types unless explicitly overridden in each connection type. List of available connection types are: .B lan, wan, broadband_high, satellite, broadband_low, modem, and default Currently, xrdp does not support connection type autodetection. If autodetect is selected on the client side, it will be treated as if LAN is selected. .SH "EXAMPLES" This is an example \fBgfx.toml\fR: .nf [codec] order = [ "H.264", "RFX" ] h264_encoder = "x264" [x264.default] preset = "ultrafast" tune = "zerolatency" profile = "main" # profile is forced to baseline if preset == ultrafast vbv_max_bitrate = 0 vbv_buffer_size = 0 fps_num = 60 fps_den = 1 [x264.lan] # inherits default, everything is same with the default [x264.wan] # parameters that are not explicitly overridden inherit the default values preset = "veryfast" vbv_max_bitrate = 15_000 vbv_buffer_size = 1_500 .fi There are multiple ways to represent the data structure in TOML format. The following two representations are semantically equivalent but the latter is discouraged due to concerns about complexity and readability. .nf [x264.default] preset = "ultrafast" tune = "zerolatency" .fi .nf x264 = { default = { preset = "ultrafast", tune="zerolatency" } } .fi .SH "SEE ALSO" For more information on \fBgfx.toml\fR configuration, see the wiki page. .UR https://github.com/neutrinolabs/xrdp/wiki/H.264-encoding .UE The syntax for TOML files can be found at the following page. .UR https://toml.io/en/v1.0.0 .UE ================================================ FILE: docs/man/sesman.ini.5.in ================================================ .\" .TH "sesman.ini" "5" "@PACKAGE_VERSION@" "xrdp team" "" .SH "NAME" \fBsesman.ini\fR \- Configuration file for \fBxrdp-sesman\fR(8) .SH "DESCRIPTION" \fBsesman.ini\fR consists of several sections. Each section starts with the section name in square brackets, followed by a list of \fIparameter\fR=\fIvalue\fR lines. Following sections are recognized: .TP \fB[Globals]\fR Global configuration .TP \fB[Logging]\fR Logging subsystem .TP \fB[Sessions]\fR Session management .TP \fB[Security]\fR Access control .TP \fB[Chansrv]\fR Settings for xrdp-chansrv(8) .TP \fB[ChansrvLogging]\fR Logging settings for xrdp-chansrv(8) .TP \fB[SessionVariables]\fR Environment variables for the session .LP All parameters and values (except for file names and paths) are case insensitive, and are described in detail below. If any parameter is specified more than once, the last entry will be used. Options specified outside their proper section will be \fIignored\fR. .SH "GLOBALS" Following parameters can be used in the \fB[Globals]\fR section. .TP \fBListenPort\fR=\fIpath-to-socket\fR UNIX domain socket for xrdp-sesman(8) to listen on. .PP .RS The default value of this setting is 'sesman.socket'. .PP An absolute path can be specified by starting this parameter with a '/'. In this instance, the system administrator is responsible for ensuring the socket can only be created by a suitably privileged process. .PP If the parameter does not start with a '/', a name within @socketdir@/\fI\fR is used. .RE .TP \fBEnableUserWindowManager\fR=\fI[true|false]\fR If set to \fB1\fR, \fBtrue\fR or \fByes\fR, this option enables user specific startup script. That is, xrdp-sesman will execute the script specified by \fBUserWindowManager\fR if it exists. .TP \fBUserWindowManager\fR=\fIfilename\fR Path of the startup script relative to the user's home directory. If present and enabled by \fBEnableUserWindowManager\fR, that script is executed instead of \fBDefaultWindowManager\fR. .TP \fBDefaultWindowManager\fR=\fIfilename\fR Full path or relative path of the default startup script used by xrdp-sesman to start a session. If the path is not a full path, it will be resolved as relative path to \fI@xrdpconfdir@\fR. If not specified, defaults to \fI@xrdpconfdir@/startwm.sh\fR. .TP \fBReconnectScript\fR=\fIfilename\fR Full path or relative path if the script which executed when users reconnects to the existing session. If the path is not a full path, it will be resolved as relative path to \fI@xrdpconfdir@\fR. If not specified, defaults to \fI@xrdpconfdir@/reconnectwm.sh\fR. .TP \fBAlwaysRunReconnect\fR=\fI[yes|no]\fR If set to \fB1\fR, \fBtrue\fR or \fByes\fR, the \fBReconnectScript\fR will be run for the initial connection to a session, as well as all reconnects. .SH "LOGGING" Following parameters can be used in the \fB[Logging]\fR and \fB[ChansrvLogging]\fR sections. .TP \fBLogFile\fR=\fIfilename\fR Log file path. It can be either absolute or relative. If not specified, defaults to \fI./sesman.log\fR. If set to \fB\fR, log will go to stdout. Use for debugging only\fR It is ignored in the [ChansrvLogging] section since the channel server creates one log file per display and instead uses the following log file naming convention \fIxrdp-chansrv.${DISPLAY}.log\fR. For details of the chansrv log file location, see \fBLogFilePath\fR. .TP \fBLogFilePath\fR=\fIstring\fR Directory for storing the chansrv log file. This setting only applies to chansrv. The sesman log file is always created in \fI@localstatedir@/log\fR. Created if it doesn't exist. If first character is not a '/', this is relative to $HOME, where chansrv is normally started. .RS The following substitutions are made in this string:- %U - Username %u - Numeric UID %% - Percent character This is most useful if you are using NFS-mounted home directories, and wish to move the chansrv log file to the local disk. If this parameter isn't specified, the log file is stored in one of the following locations :- - $CHANSRV_LOG_PATH - $XDG_DATA_HOME/xrdp - $HOME/.local/share/xrdp .RE .TP \fBLogLevel\fR=\fIlevel\fR This option can have one of the following values: \fBCORE\fR or \fB0\fR \- Log only core messages. Those messages are logged \fIregardless\fR of the selected logging level. \fBERROR\fR or \fB1\fR \- Log only error messages. \fBWARNING\fR, \fBWARN\fR or \fB2\fR \- Logs warnings and error messages. \fBINFO\fR or \fB3\fR \- Log errors, warnings and informational messages. \fBDEBUG\fR or \fB4\fR \- Log everything. If xrdp-sesman is compiled in debug mode, this options will output many more low\-level messages. .TP \fBEnableSyslog\fR=\fI[true|false]\fR If set to \fB1\fR, \fBtrue\fR or \fByes\fR, this option enables logging to syslog. .TP \fBSyslogLevel\fR=\fIlevel\fR Logging level for syslog. It can have the same values as \fBLogLevel\fR. Defaults to \fBDEBUG\fR. .TP \fBEnableConsole\fR=\fI[true|false]\fR If set to \fB1\fR, \fBtrue\fR or \fByes\fR, this option enables logging to the console (ie. stdout). .TP \fBConsoleLevel\fR=\fIlevel\fR Logging level for the console. It can have the same values as \fBLogLevel\fR. Defaults to \fBDEBUG\fR. .TP \fBEnableProcessId\fR=\fI[true|false]\fR If set to \fB1\fR, \fBtrue\fR or \fByes\fR, this option enables logging the process id in all log messages. Defaults to \fBfalse\fR. .SH "SESSIONS" Following parameters can be used in the \fB[Sessions]\fR section. .TP \fBX11DisplayOffset\fR=\fInumber\fR The first X display number available for xrdp-sesman. This prevents xrdp-sesman from interfering with real X11 servers. If not specified, defaults to \fI10\fR. .TP \fBMaxSessions\fR=\fInumber\fR Sets the maximum number of simultaneous sessions. If not set or set to \fI0\fR, unlimited session are allowed. .TP \fBMaxDisplayNumber\fR=\fInumber\fR Sets the maximum number which can be assigned to an X11 $DISPLAY. The default is compatible with IANA TCP port allocations. If you are not allowing TCP connections to your X servers you may safely increase this number. .TP \fBKillDisconnected\fR=\fI[true|false]\fR If set to \fB1\fR, \fBtrue\fR or \fByes\fR, every session will be killed within \fBDisconnectedTimeLimit\fR seconds after the user disconnects. This setting currently only works with xorgxrdp sessions. .TP \fBDisconnectedTimeLimit\fR=\fInumber\fR Sets the time limit for \fBKillDisconnected\fR to a value greater than 60. Values less than 60 are to be overridden with 60. This setting currently only works with xorgxrdp sessions. .TP \fBIdleTimeLimit\fR=\fInumber\fR Sets the time limit (in seconds) before an idle session is disconnected. Idle means no keyboard inputs and no mouse moves/clicks here. If set to \fI0\fR, idle sessions will never be disconnected by timeout. This works only with xorgxrdp sessions. Moreover, xorgxrdp must be v0.2.9 or later. .TP \fBPolicy\fR=\fI[Default|Separate|{UBDI}]\fR Session allocation policy. Used to decide when to allocate a new session. Set to one of the following values: .br .RS .HP 12 \fBDefault\fR - Currently the same as "UB" for all session types .HP 12 \fBSeparate\fR - All sessions are separate. Sessions can never be rejoined, and will need to be cleaned up manually, or automatically by setting other sesman options. .P Alternatively combine one-or-more of the following options .HP 4 \fBU\fR - Sessions are separated per user .HP 4 \fBB\fR - Sessions are separated by bits-per-pixel .HP 4 \fBD\fR - Sessions are separated by initial display size .HP 4 \fBI\fR - Sessions are separated by IP address .HP 4 \fBN\fR - Sessions are separated by an instance name specified on startup .RE .IP Note that the \fBU\fR and \fBB\fR criteria cannot be turned off. \fBDisplaySize\fR refers to the initial geometry of a connection, as actual display sizes can change dynamically. .TP \fBStartupWaitTime\fR=\fInumber\fR Milliseconds to wait to ensure the session has started. The default is 1500 milli-seconds. .IP Making this larger does not increase the session startup time, but will increase the time for the first connection to a session. The value can be set to zero. If this is done, sessions which fail early will not be reported to the user. .SH "SECURITY" Following parameters can be used in the \fB[Security]\fR section. .TP \fBAllowRootLogin\fR=\fI[true|false]\fR If set to \fB1\fR, \fBtrue\fR or \fByes\fR, enables root login on the terminal server. .TP \fBMaxLoginRetry\fR=\fInumber\fR The number of login attempts that are allowed on terminal server. If set to \fI0\fR, unlimited attempts are allowed. If not specified, defaults to \fI3\fR. .TP \fBXAuthorityInSystemDir\fR=\fI[no|yes]\fR If set to \fBno\fR (the default), \fBXAUTHORITY\fR will not be set for sessions, and the X11 authfile will be $HOME/.Xauthority. .br If set to \fByes\fR, xrdp will point \fBXAUTHORITY\fR to a file in a system directory private to the logged-in user (currently @socketdir@/\fI\fR/Xauthority). .br You may wish to use this if $HOME is NFS-mounted, or you are experiencing other applications overwriting the default file. .TP \fBTerminalServerUsers\fR=\fIgroup\fR Only the users belonging to the specified group are allowed to login on terminal server. If unset or set to an invalid or non\-existent group, login for all users is enabled. .TP \fBTerminalServerAdmins\fR=\fIgroup\fR Members of this group can use the \fBxrdp-sesadmin\fR command to administer sessions started by other users. The root user is always considered to be in this group. .TP \fBRestrictOutboundClipboard\fR=\fI[all|none|text|file|image]\fR If set to \fBall\fR, will restrict the clipboard outbound from the server, to prevent data copied inside the xrdp session to be pasted in the client. Default value is \fBnone\fR. In addition, you can control text/file/image transfer restrictions respectively. It also accepts comma separated list such as text,file,image. .br .br \fBnone\fR - No restriction about copying inbound clipboard data. .br \fBall\fR - Restrict to copy inbound clipboard data. .br \fBtext\fR - Restrict to copy only inbound text clipboard data. .br \fBfile\fR - Restrict to copy only inbound file clipboard data. .br \fBimage\fR - Restrict to copy only inbound image clipboard data. .br To keep compatibility, the following aliases are also available. .br \fBtrue\fR - an alias of \fBall\fR. .br \fBfalse\fR - an alias of \fBnone\fR. .br \fByes\fR - an alias of \fBall\fR. .TP \fBRestrictInboundClipboard\fR=\fI[none|all|text|file|image]\fR If set to \fBall\fR, will restrict the clipboard inbound from the client, to prevent data copied inside the client to be pasted in the xrdp session. Default value is \fBnone\fR. In addition, you can control text/file/image transfer restrictions respectively. It also accepts comma separated list such as text,file,image. .br .br \fBnone\fR - No restriction about copying inbound clipboard data. .br \fBall\fR - Restrict to copy inbound clipboard data. .br \fBtext\fR - Restrict to copy only inbound text clipboard data. .br \fBfile\fR - Restrict to copy only inbound file clipboard data. .br \fBimage\fR - Restrict to copy only inbound image clipboard data. .br To keep compatibility, the following aliases are also available. .br \fBtrue\fR - an alias of \fBall\fR. .br \fBfalse\fR - an alias of \fBnone\fR. .br \fByes\fR - an alias of \fBall\fR. .TP \fBAlwaysGroupCheck\fR=\fI[true|false]\fR If set to \fB1\fR, \fBtrue\fR or \fByes\fR:- .RS .HP 3 - For normal logins, require group membership even if the group specified in \fBTerminalServerUsers\fR doesn't exist. .HP 3 - An error message may be generated when any user authenticates if the group specified in \fBTerminalServerAdmins\fR doesn't exist. This is because the system is unable to check whether the user is an administrator. .RE .TP \fBAllowAlternateShell\fR=\fI[true|false]\fR If set to \fB0\fR, \fBfalse\fR or \fBno\fR, prevent usage of alternate shells by users. .TP \fBPassShellAsEnv\fR=\fI\fR If this is set, alternate shells are not actioned directly, but passed in to the default window manager in the specified environment variable. This allows the system manager more control over exactly what alternate shells are permitted. This will override any setting of the same environment variable in the \fB[SessionVariables]\fR section. .TP \fBXorgNoNewPrivileges\fR=\fI[true|false]\fR Only applicable on Linux. If set to \fB0\fR, \fBfalse\fR or \fBno\fR, do not use the kernel's \fIno_new_privs\fR restriction when invoking the Xorg X11 server. The use of \fIno_new_privs\fR is intended to prevent issues due to a setuid Xorg executable. However, if a kernel security module (such as AppArmor) is used to confine xrdp, \fIno_new_privs\fR may interfere with transitions between confinement domains. .TP \fBSessionSockdirGroup\fR=\fIgroup\fR Sets the group owner of the directories containing session sockets. For normal operation with sesman, set this to 'root' for maximum security. If you are using xrdp to connect to VNC sessions with X server sockets or chansrv sockets in the local sockets dir, set this to the runtime_group in xrdp.ini. If you do not do this, xrdp will not be able to connect to your sessions. .SH "X11 SERVER" Following parameters can be used in the \fB[Xvnc]\fR and \fB[Xorg]\fR sections. .TP \fBparam\fR=\fIstring\fR Multiple \fIparam\fR lines are supported. This first line specifies the path to the X11 server executable. Following lines specify command line arguments passed to the X11 server. .SH "CHANSRV" Following parameters can be used in the \fB[Chansrv]\fR section. .TP \fBFuseMountName\fR=\fIstring\fR Directory for drive redirection. Created if it doesn't exist. If not specified, defaults to \fIxrdp_client\fR. If first character is not a '/', this is relative to $HOME. .P .RS The following substitutions are made in this string:- %U - Username %u - Numeric UID %d - Display identifier (e.g. "X11-10" for X11, or "wayland-1" for Wayland) %% - Percent character .HP 3 1) The directory path permissions MUST be configured correctly by the system administrator or the system itself - xrdp-chansrv will not do this for you (although it will create the final directories owned by the user). .HP 3 2) The desktop may not automatically display a link for the redirected drive. To fix this, consult the docs for your chosen desktop. .RE .TP \fBFuseMountNameColonCharReplacement\fR=\fIstring\fR Character to replace colon in redirected drive mount point names. If not specified no colon will not be replaced. If empty then colon will be replaced by null character. If longer than one character, only first character used. Only last colon replaced. .RE .TP \fBFuseDirectIO\fR=\fI[false|true]\fR Defaults to \fIfalse\fR. Set to \fItrue\fR to disable page caching in FUSE when opening files on a redirected drive. Direct I/O can impact the performance of file operations. .TP \fBFileUmask\fR=\fImode\fR Additional umask to apply to files in the \fBFuseMountName\fR directory. The default value of 077 prevents other users on the system from reading files on your redirected drives. This may not be appropriate for all environments, and so you can change this value to allow other users to access your remote files if required. .TP \fBEnableFuseMount\fR=\fI[true|false]\fR Defaults to \fItrue\fR. Set to \fIfalse\fR to disable xrdp-chansrv's use of the FUSE system feature, even if it has been built with this feature enabled. .P .RS Setting this value to \fIfalse\fR will disable the following application features:- .P - drive redirection .P - copying-and-pasting of files .RE .TP \fBUseNautilus3FlistFormat\fR=\fI[false|true]\fR Defaults to \fIfalse\fR. Set to \fItrue\fR to make file copy-paste compatible with Nautilus from GNOME 3 versions later than 3.29.92. Do not use this for any other reason. This setting will be removed in a later version of xrdp, when GNOME 3 is no longer supported. .TP \fBFuseRootReportMaxFree\fR=\fI[false|true]\fR The existing FUSE implementation reports free space on remote drives in a way which can confuse some file managers if they check for free space at the FUSE mountpoint before copying files. KDE Dolphin is affected by this, and will report 'no space available' when trying to copy to remote drives. Setting this option will cause the FUSE fileystem to report a very large amount of free space for the root of the FUSE mountpoint. This will allow Dolphin to copy files to remote drives, but introduces a risk that the remote filesystem will run out of space during the copy. This setting will be removed in a later version of xrdp, when remote drives receive unique mountpoints. .TP \fBSoundNumSilentFramesAAC\fR=\fInumber\fR Sets the \fInumber\fR of silent frames which are sent to client before close message is sent, when AAC is selected. If set to 0, no silent frame is sent. If not specified, defaults to \fI4\fR. .TP \fBSoundNumSilentFramesMP3\fR=\fInumber\fR Sets the \fInumber\fR of silent frames which are sent to client before close message is sent, when MP3 is selected. If set to 0, no silent frame is sent. If not specified, defaults to \fI2\fR. .TP \fBSoundMsecDoNotSend\fR=\fInumber\fR Sets the duration(msec). Sound data is not send to client during \fInumber\fR millisecond(s) after close message is sent, when AAC/MP3 is selected. If set to 0, all the data is sent. If not specified, defaults to \fI1000\fR. .SH "SESSIONS VARIABLES" All entries in the \fB[SessionVariables]\fR section are set as environment variables in the user's session. .SH "FILES" @sysconfdir@/@sysconfsubdir@/sesman.ini .SH "SEE ALSO" .BR xrdp-sesman (8), .BR xrdp-sesrun (8), .BR xrdp (8), .BR xrdp.ini (5) For more info on \fBxrdp\fR see .UR @xrdphomeurl@ .UE ================================================ FILE: docs/man/xrdp-chansrv.8.in ================================================ .TH "xrdp\-chansrv" "8" "@PACKAGE_VERSION@" "xrdp team" "" .SH "NAME" \fBxrdp\-chansrv\fR \- \fBxrdp\fR channel server .SH "SYNTAX" .B xrdp\-chansrv .SH "DESCRIPTION" \fBxrdp\-chansrv\fR is the \fBxrdp\fR(8) channel server, which manages the Remote Desktop Protocol (RDP) sub-channels. .PP This program is only forked internally by \fBxrdp\-sesman\fP(8). .PP Currently \fBxrdp\-chansrv\fP knows about the following channels: .RS 8 .TP .B cliprdr Clipboard Redirection .TP .B rdpsnd Remote Desktop Protocol Sound .TP .B rdpdr Remote Desktop Protocol Device Redirection .TP .B rail Remote Applications Integrated Locally .TP .B drdynvc Dynamic Virtual Channel .RE .SH ENVIRONMENT .TP .I CHANSRV_LOG_PATH Path to the location where the log file is stored. If not specified, $\fBXDG_DATA_HOME/xrdp\fP or \fB$HOME/.local/share/xrdp\fP is used instead. .TP .I DISPLAY X11 display number. Must be specified. .SH FILES .TP .I @sysconfdir@/@sysconfsubdir@/sesman.ini Contains some settings for this program. .TP .I @socketdir@/xrdp_chansrv_socket_* UNIX socket used by external programs to implement channels. .TP .I @socketdir@/xrdp_api_* UNIX socket used by \fBxrdp\-chansrv\fP to communicate with \fBxrdp\-sesman\fP. .TP .I xrdp-chansrv.%s.log Log file used by \fBxrdp\-chansrv\fP(8). \fB%s\fP is display number. See the description of \fBCHANSRV_LOG_PATH\fP above for the file's location. .SH "SEE ALSO" .BR xrdp\-sesman (8), .BR sesman.ini (5). For more info on \fBxrdp\fR see .UR @xrdphomeurl@ .UE ================================================ FILE: docs/man/xrdp-dis.1.in ================================================ .TH "xrdp-dis" "1" "@PACKAGE_VERSION@" "xrdp team" .SH NAME xrdp\-dis \- xrdp disconnect utility .SH SYNOPSIS .B xrdp\-dis .SH DESCRIPTION .PP \fBxrdp\-dis\fP is run with no parameters to disconnect your xrdp session. .SH ENVIRONMENT .TP .B DISPLAY to get the default host and display number. .SH FILES .TP .I @socketdir@/xrdp_disconnect_display_* UNIX socket used to communicate the disconnect request to xorgxrdp. .SH KNOWN ISSUES .TP This utility doesn't support disconnecting Xvnc sessions so far. .SH SEE ALSO .BR xrdp (8). ================================================ FILE: docs/man/xrdp-dumpfv1.8.in ================================================ .TH "xrdp-dumpfv1" "8" "@PACKAGE_VERSION@" "xrdp team" .SH NAME xrdp\-dumpfv1 \- Display content of .fv1 font files .SH SYNOPSIS \fBxrdp-dumpfv1\fR [ options ] fv1_file .SH DESCRIPTION \fBxrdp\-dumpfv1\fP can be used to display the contents of an fv1 file. .SH OPTIONS A summary of options is included below. One of \fB\-i\fR, \fB\-t\fR, or \fB\-c\fR must be specified. .TP \fB\-i\fR Displays general information about the fv1 file. .TP \fB\-t\fR Displays a CSV table of all the glyphs in the font. This table can be imported into a spreadsheet program for further manipulation. .TP \fB\-c\fR Displays detailed information about a particular glyph in the font, including a representation of the bitmap for the glyph. Specify the character using one of the following strings: \fBU+\fR - Unicode character, e.g. \fBU+25\fR for a percentage symbol (%). \fB@\fR - Unicode character, e.g. \fB@%\fR for a percentage symbol. \fBnumber\fR - Unicode value as an integer, e.g. \fB37\fR for a percentage symbol Note that the row numbers shown in the font data are relative to the natural font baseline. If comparing two fonts, be aware that when the glyph is drawn, the row number may be affected by the global descender value for the font (displayed with \fB\-i\fR). .SH "EXAMPLES" .TP \fBxrdp\-dumpfv1 -i @xrdpdatadir@/sans-10.fv1\fR Displays global information about the sans 10 font file distributed with xrdp. .TP \fBxrdp\-dumpfv1 -c @'*' @xrdpdatadir@/sans-10.fv1\fR Displays information about the asterisk symbol in the sans 10 font file distributed with xrdp. .SH SEE ALSO .BR xrdp\-mkfv1(8). More info on \fBxrdp\fR can be found on the .UR @xrdphomeurl@ xrdp homepage .UE ================================================ FILE: docs/man/xrdp-genkeymap.8.in ================================================ .TH "xrdp\-genkeymap" "8" "@PACKAGE_VERSION@" "xrdp team" "" .de URL . \\$2 \(laURL: \\$1 \(ra\\$3 .. .if \n[.g] .mso www.tmac .SH "NAME" \fBxrdp\-genkeymap\fR \- key map generator for XRDP .SH "SYNTAX" .B xrdp\-genkeymap .I [ options ] file .SH "DESCRIPTION" \fBxrdp\-genkeymap\fR extracts the current key map from the X server X session to generate a mapping from Remote Desktop Protocol (RDP) scan codes to X keysyms and Unicode code points. Before running this utility, make sure the keymap is correct, by issuing the correct \fIsetxkbmap\fP command(s). .SH OPTIONS .TP .B -k 'keycode_set' Inform \fBxrdp\-genkeymap\fR of the keycode set in operation (evdev or base), so that the correct scan code to keycode mapping table is selected to generate the keymap. If you omit this option, the XKB extension is asked to provide the name of the keycode set. .TP .B -c 'comment' Adds a comment to the top of the generated file. This option may be repeated more than once to add multiple comments to the top of the file. .TP .B outfile The key map information is stored in the file named \fIoutfile\fP. .SH "FILES" .TP .I @sysconfdir@/@sysconfsubdir@/km-XXXXXXXX.toml Files containing the keyboard mapping for country and language \fIXXXXXXXX\fP. \fIXXXXXXXX\fP is a 8 digit hexadecimal number, representing the \fIinput locale identifier\fP. The input locale identifier is passed from the RDP client when it connects. .RE .SH "AUTHORS" Jay Sorg .br Simone Fedele .SH "SEE ALSO" .BR xrdp (8), .BR xrdp-km.toml (5), .BR setxkbmap (1), .BR unicode (7) .PP Input locale identifiers on the .UR https://go.microsoft.com/fwlink/?LinkId=202824 Microsoft website .UE .PP Description of Keyboard Input mapping on the .UR https://github.com/FreeRDP/FreeRDP/wiki/Keyboard FreeRDP wiki .UE .PP For more info on \fBxrdp\fR see .UR @xrdphomeurl@ .UE ================================================ FILE: docs/man/xrdp-keygen.8.in ================================================ .\" Hey, EMACS: -*- nroff -*- .\"- .\" Copyright © 2007, 2008 Vincent Bernat .\" License: GPL-2+ .\"- .TH xrdp\-keygen 8 "@PACKAGE_VERSION@" "xrdp team" .SH NAME xrdp\-keygen \- xrdp RSA key generation utility .SH SYNOPSIS .B xrdp\-keygen xrdp < \fIoutfile\fP | \fBauto\fP > .br .B xrdp\-keygen test .SH DESCRIPTION \fBxrdp\-keygen\fP generates the file .I @sysconfdir@/@sysconfsubdir@/rsakeys.ini which contains the RSA key pair used to perform authentication to remote clients. The public key is self-signed. .SH OPTIONS This program takes one of the following options: .TP \fBxrdp\fP \fIoutfile\fP Generate a new key pair. The key data is stored in the file named \fIoutfile\fP. .br If \fBauto\fP is used as \fIoutfile\fP, the default file \fI@sysconfdir@/@sysconfsubdir@/rsakeys.ini\fP gets created if it does not yet exists. .TP .B test Generate a test key pair and print information to standard output. .SH NOTES On machines with FIPS enabled, this program will generate an empty file, and a warning. On these machines, xrdp cannot use Classic RDP encryption. .SH FILES .TP .I @sysconfdir@/@sysconfsubdir@/rsakeys.ini RSA public and private key pair used to identify this XRDP server. .SH SEE ALSO .BR xrdp (8), .BR xrdp\-sesman (8). .SH AUTHOR This manual page was originally written by Vincent Bernat . ================================================ FILE: docs/man/xrdp-km.toml.5.in ================================================ .\" .TH "xrdp-km.toml" "5" "@PACKAGE_VERSION@" "xrdp team" "" .SH "NAME" \fBxrdp-km.toml\fR \- \fBxrdp\fP key mapping file .SH "DESCRIPTION" Key mapping files are located at \fB@sysconfdir@/@sysconfsubdir@/km-XXXXXXXX.toml\fP where \fBXXXXXXXX\fP is the input locale identifier sent by the RDP client. The key mapping files are used to translate RDP scan codes into one of the following forms:- .TP .B X11 KeySyms These are used when \fBxrdp\fP connects to a VNC server. .TP .B Unicode characters These are used on the \fBxrdp\fP login screen. .RE .PP Each keymap file consists of several sections. Each section starts with the section name in square brackets, followed by a list of \fIparameter\fR=\fIvalue\fR lines. .SH "SECTIONS" The following sections are recognized: .TP \fB[Globals]\fR Global configuration .TP \fB[noshift]\fR Key mappings if no modifier keys (i.e. shift, alt gr, caps lock) are down. .TP \fB[shift]\fR Key mappings if the shift key is down. .TP \fB[altgr]\fR Key mappings if the alt gr key is down. .TP \fB[shiftaltgr]\fR Key mappings if the shift and alt gr keys are down. .TP \fB[capslock]\fR Key mappings if the caps lock key is down. .TP \fB[shiftcapslock]\fR Key mappings if the caps lock and shift keys are down. .TP \fB[shiftcapslockaltgr]\fR Key mappings if the shift, caps lock and alt gr keys are down. .TP \fB[numlock]\fR Key mappings if the numlock key is down. .LP All parameters and values are case insensitive, and are described in detail below. If any parameter is specified more than once, the last entry will be used. Options specified outside their proper section will be \fIignored\fR. .SH "GLOBALS Section" Following parameters can be used in the \fB[Globals]\fR section. .TP \fBVersion\fR=\fInumber\fR Version of the file format in use. Can be used to check for file format mis-matches when a file is loaded. .RE .SH "Keymap Sections" All other sections contain lines formatted in one of the following ways:- .TP = .TP =: .RE Each line may also be followed by a comment (preceded by '#') which contains more information about the key, for example a KeySym string. .TP .B scancode A \fBscancode\fP is an RDP scancode received from the client. These correspond to Windows "Scan Code Set 1" scan codes, and can be displayed in Windows by using an appropriate utility. The \fBscancode\fP is in one of these two forms:- .RS 8 .TP .B Standard scancodes. For example, '1C' refers to the enter key. These are 'key down' scancodes, and so are always between 00 and 7F. .TP .B E0_ Extended scancodes. For example, 'E0_1C' refers to the enter key on the numeric keypad. .RE .TP .B KeySymNum A decimal number representing an X11 KeySym .TP .B unicode-char A string of the format \fBU+XXXX\fP \fBU+XXXXX\fP,, \fBU+XXXXX\fP, where \fBX\fP is a hexadecimal digit. .RE .SH "Limitations" This file format has the following limitations. .IP \(bu Not all combinations of shift keys are stored in the file. For example, at present there is no section for shift and numlock combined. .IP \(bu Modifier keys, other than the ones supported above, are not supported. .SH "SEE ALSO" .BR xrdp-genkeymap (8) .PP Scancode mappings for most keyboards at .UR https://kbdlayout.info .UE For more info on \fBxrdp\fR see .UR @xrdphomeurl@ .UE ================================================ FILE: docs/man/xrdp-mkfv1.8.in ================================================ .TH "xrdp-mkfv1" "8" "@PACKAGE_VERSION@" "xrdp team" .SH NAME xrdp\-mkfv1 \- Create .fv1 font files from other font files .SH SYNOPSIS \fBxrdp-mkfv1\fR [ options ] font_file fv1_file .SH DESCRIPTION \fBxrdp\-mkfv1\fP can be used to convert a font file such as a TrueType font to a fv1 file. .SH OPTIONS A summary of options is included below. .TP \fB\-n\fR Give the font a name, which is stored in the font header. The default is to use the font family name from the source font. .TP \fB\-p\fR Set the point size of the font. A fixed DPI value of 96 is used for converting this value into a pixel size. The default value for this option is '10'. .TP \fB\-m\fR Set the limit on the glyphs stored in the font file. The argument is the last glyph stored in the font file. Specify the glyph using one of the following strings: \fBU+\fR - Unicode character, e.g. \fBU+25\fR for a percentage symbol (%). \fB@\fR - Unicode character, e.g. \fB@%\fR for a percentage symbol. \fBnumber\fR - Unicode value as an integer, e.g. \fB37\fR for a percentage symbol The default value for this option is 'U+4DFF'. .TP \fB\-C\fR When used with the "DejaVu Sans" font at a point-size of 10, a small number of glyphs are assigned a different x-offset than they have when the original Windows font generation program is used. This switch can be used to preserve the original x-offsets for glyphs in the range U+0020 - U+00FF when a 10 point DajaVu Sans font is generated. Use one of the following arguments to this option:- \fBauto\fR - Automatic mode. Offsets are preserved if a "DajaVu Sans" 10-point font is converted. \fBon / true / yes\fR - Preserve offsets if automatic font detection does not work. \fBoff / false / no\fR - Do not tamper with the offsets generated by the program. The default value of this switch is \fRauto\fR. To see the effects of this switch, set the \fBMKFV1_LOG_LEVEL\fR environment variable to \fBinfo\fR before running the program. .SH "EXAMPLES" .TP \fBxrdp-mkfv1 -p18 /path/to/DejaVuSans.ttf ./sans-18.fv1\fR Generate an 18-point Deja Sans font. .TP \fBxrdp-mkfv1 -C off -p10 /path/to/DejaVuSans.ttf ./sans-10.fv1\fR Generate a 10-point DajaVu Sans font using natural offsets. .SH SEE ALSO .BR xrdp\-dumpfv1(8). More info on \fBxrdp\fR can be found on the .UR @xrdphomeurl@ xrdp homepage .UE ================================================ FILE: docs/man/xrdp-sesadmin.8.in ================================================ .TH "xrdp-sesadmin" "8" "@PACKAGE_VERSION@" "xrdp team" .SH NAME xrdp\-sesadmin \- console XRDP sessions administration tool .SH SYNOPSIS .B xrdp\-sesadmin .RI [ options ] .BI -c= command .SH DESCRIPTION This manual page documents briefly the .B xrdp\-sesadmin command. .PP \fBxrdp\-sesadmin\fP is a console program to administer running XRDP sessions. .SH OPTIONS A summary of options is included below. .TP .BI \-u= username Retained for compatibility, but ignored. .TP .BI \-p= password Retained for compatibility, but ignored. .TP .BI \-i= port The sesman \fIUNIX domain socket\fP to connect to. Defaults to \fBsesman.socket\fP. If no path is specified for the socket, a default of @socketdir@ is used. .TP .BI \-c= command Specifies the \fIcommand\fP to execute on the server. Valid commands are: .RS 4 .TP .B list List active sessions for the current user. Members of the \fBTerminalServerAdmins\fR group can view active sessions for all users. .TP .BI kill: sid Kills the session specified the given \fIsession id\fP. (not yet implemented). .RE .SH FILES xrdp\-sesadmin.log .SH SEE ALSO .BR xrdp (8). More info on \fBxrdp\fR can be found on the .UR @xrdphomeurl@ xrdp homepage .UE ================================================ FILE: docs/man/xrdp-sesman.8.in ================================================ .TH "xrdp\-sesman" "8" "@PACKAGE_VERSION@" "xrdp team" "" .SH "NAME" xrdp\-sesman \- \fBxrdp\fR(8) session manager .SH "SYNTAX" .B xrdp\-sesman \-\-kill .br .B xrdp\-sesman \-\-reload .br .B xrdp\-sesman \-\-help .br .B xrdp\-sesman \-\-version .br .B xrdp\-sesman [\-\-nodaemon] [\-\-dump\-config] [\-\-config /path/to/sesman.ini] .SH "DESCRIPTION" \fBxrdp\-sesman\fR is \fBxrdp\fR(8) session manager. .br It manages user sessions by authenticating the user and starting the appropriate Xserver. .SH "OPTIONS" .TP \fB\-k\fR, \fB\-\-kill\fR Kills running \fBxrdp\-sesman\fR daemon. .TP \fB\-r\fR, \fB\-\-reload\fR Reloads running \fBxrdp\-sesman\fR daemon. .TP \fB\-h\fR, \fB\-\-help\fR Output help information and exit. .TP \fB\-v\fR, \fB\-\-version\fR Output version information and exit. .TP \fB\-n\fR, \fB\-\-nodaemon\fR Starts \fBxrdp\-sesman\fR in foreground instead of starting it as a daemon. .TP \fB\-\-dump\-config\fR Print the configuration on stdout before starting the daemon. The default is not to do this. .TP \fB\-c\fR, \fB\-\-config\fR Specify a path to a different \fIsesman.ini\fR file. This option is intended to be used primarily for testing or for unusual configurations. .P .RS If you use this option, be aware that you will have to have a \fB@sysconfdir@/@sysconfsubdir@/sesman.ini\fR in place too, as a few elements of the system (notably \fBxrdp(8)\fR and \fBxrdp\-chansrv(8)\fR) will want to read it. .RE .SH "SIGNALS" .TP \fBSIGHUP\fR Causes \fBxrdp\-sesman\fR to reload its configuration. Needed if you're not running \fBxrdp\-sesman\fR as a daemon. .SH "FILES" @sbindir@/xrdp\-sesman .br @bindir@/xrdp\-sesrun .br @sysconfdir@/sysconfsubdir@/sesman.ini .br @localstatedir@/log/xrdp\-sesman.log .br @localstatedir@/run/xrdp\-sesman.pid .br @socketdir@/sesman.socket .SH "AUTHORS" Jay Sorg .br Simone Fedele .SH "SEE ALSO" .BR sesman.ini (5), .BR xrdp\-sesrun (8), .BR xrdp (8), .BR xrdp.ini (5) for more info on \fBxrdp\fR see .UR @xrdphomeurl@ .UE ================================================ FILE: docs/man/xrdp-sesrun.8.in ================================================ .TH "xrdp\-sesrun" "8" "@PACKAGE_VERSION@" "xrdp team" "" .SH "NAME" \fBxrdp\-sesrun\fR \- \fBxrdp\-sesman\fR(8) session launcher .SH "SYNTAX" .B xrdp\-sesrun .I --help .br .B xrdp\-sesrun .I [ options ] [ username ] .SH "DESCRIPTION" \fBxrdp\-sesrun\fR starts a session using \fBxrdp\-sesman\fR(8). .br This is a tool useful for testing. It simply behaves like xrdp when some user logs in a new session and authenticates, thus starting a new session. Default values for the options are set at compile-time. Run the utility with the '--help' option to see what the defaults are for your installation. If no username is used, the current username is used, and no password needs to be provided. In this instance, it is important that any necessary authentication tokens for a GUI session (e.g. a Kerberos ticket) have already been acquired. If a username is provided, a password must also be provided. In this instance the utility prompts for a password if neither \fB-p\fR or \fB-F\fR is used. .SH "OPTIONS" .TP .B -g x Set session geometry. .br Note that most configurations will resize the session on connection, so this option may not do what you expect. .TP .B -b Set session bits-per-pixel (colour depth). Some session types (i.e. Xorg) will ignore this setting. .TP .B -t Session type - one of Xorg or Xvnc. Alternatively, for testing only, use the numeric session code. .TP .B -D Directory to run the new session in. Defaults to $HOME for the specified user. .TP .B -S Specify an alternate shell to run, instead of the default window manager. .TP .B -p Password for user. USE FOR TESTING ONLY - the password will be visible in the output of the \fBps\fR command. .TP .B -F Specify a file descriptor (normally 0) to read the password in from. This is a secure way to pass the password in to the utility. .TP .B -c Specify a different sesman.ini file. This file is used to find out how to connect to \fBxrdp\-sesman\fR. .SH "ENVIRONMENT" .TP .I SESRUN_LOG_LEVEL Override the default logging level. One of "error", "warn", "info", "debug", "trace" or a number 1-5. .SH "EXAMPLES" .TP .B xrdp-sesrun Create a default session for the current user. .TP .B xrdp-sesrun -F 0 user1 .br Simone Fedele .SH "SEE ALSO" .BR xrdp\-sesman (8), .BR sesman.ini (5), .BR xrdp (8), .BR xrdp.ini (5) For more info on \fBxrdp\fR see .UR @xrdphomeurl@ .UE ================================================ FILE: docs/man/xrdp.8.in ================================================ .TH "xrdp" "8" "@PACKAGE_VERSION@" "xrdp team" "" .SH "NAME" \fBxrdp\fR \- a Remote Desktop Protocol (RDP) server .SH "SYNTAX" .B xrdp \-\-kill .br .B xrdp \-\-help .br .B xrdp \-\-version .br .B xrdp [\-\-nodaemon] [\-\-port port] [\-\-fork] [\-\-dump\-config] [\-\-config /path/to/xrdp.ini] .SH "DESCRIPTION" \fBxrdp\fR is a Remote Desktop Protocol (RDP) Server. .br Unlike Windows NT/2000/2003 server, \fBxrdp\fR will not display a Windows desktop but an X window desktop to the user. It can also be used as a VNC\->RDP bridge. .SH "OPTIONS" .TP \fB\-k\fR, \fB\-\-kill\fR Kill running \fBxrdp\fR daemon. .TP \fB\-h\fR, \fB\-\-help\fR Output help information and exit. .TP \fB\-v\fR, \fB\-\-version\fR Output version information and exit. .TP \fB\-n\fR, \fB\-\-nodaemon\fR Start \fBxrdp\fR in foreground instead of starting it as a daemon. .TP \fB\-p\fR, \fB\-\-port\fR Specify TCP port to listen to. This overrides \fIport\fR setting in \fIxrdp.ini\fR file. .TP \fB\-f\fR, \fB\-\-fork\fR Fork a new process on a new connection. If not enabled, use a new thread for every connection. This overrides \fIfork\fR setting in \fIxrdp.ini\fR file. .TP \fB\-\-dump\-config\fR Print the configuration on stdout before starting the daemon. The default is not to do this. .TP \fB\-c\fR, \fB\-\-config\fR Specify a path to a different \fIxrdp.ini\fR file. This option is intended to be used primarily for testing or for unusual configurations. .SH "FILES" @sbindir@/xrdp .br @sysconfdir@/@sysconfsubdir@/xrdp.ini .br @localstatedir@/log/xrdp.log .br @localstatedir@/run/xrdp.pid .SH "AUTHORS" Jay Sorg .br Simone Fedele .SH "SEE ALSO" .BR xrdp.ini (5), .BR xrdp\-sesman (8), .BR sesman.ini (5), .BR xrdp\-sesrun (8) for more info on \fBxrdp\fR see .UR @xrdphomeurl@ .UE ================================================ FILE: docs/man/xrdp.ini.5.in ================================================ .TH "xrdp.ini" "5" "@PACKAGE_VERSION@" "xrdp team" "" .SH "NAME" \fBxrdp.ini\fR \- Configuration file for \fBxrdp\fR(8) .SH "DESCRIPTION" This is the man page for \fBxrdp.ini\fR, \fBxrdp\fR(8) configuration file. It is composed by a number of sections, each one composed by a section name, enclosed by square brackets, followed by a list of \fI\fR=\fI\fR lines. \fBxrdp.ini\fR supports the following sections: .TP \fB[Globals]\fP \- sets some global configuration settings for \fBxrdp\fR(8). .TP \fB[Logging]\fP \- logging subsystem parameters .TP \fB[Channels]\fP \- channel subsystem parameters .LP All options and values (except for file names and paths) are case insensitive, and are described in detail below. .SH "GLOBALS" The options to be specified in the \fB[Globals]\fR section are the following: .TP \fBport\fR=\fIport_specification [ port_specification ... ]\fR Specify the port(s) that xrdp should listen on. More instructions and examples can be found within xrdp.ini itself. .TP \fBinstance_name\fR=\fI\fR Specify an arbitrary name for the xrdp instance that can be used to identify sessions that this xrdp instance started, or which were spun up with the same name using \fBxrdp-sesrun\fR. When using the \fBN\fR policy in \fBsesman.ini\fR these sessions are kept distinct and can be reconnected to by connecting to the respective \fBxrdp\fR instance. .TP \fBvmconnect\fR=\fI[true|false]\fR (Hyper-V VMs only). Enables a wider support of security protocols when a virtual machine running xrdp is hosted on Hyper-V, and the user connects to it via the vmms service on TCP port 2179. In this configuration, RDP security is handled by the vmms service, and security features which are not yet added to xrdp itself can be supported. This parameter is required in environments which do not support 'classic' RDP encryption. The parameter is ignored for connections which are not made to the virtual machine over the vsock transport. .TP \fBautorun\fP=\fIsession_name\fP Section name for automatic login. If set and the client supplies valid username and password, the user will be logged in automatically using the connection specified by \fIsession_name\fP. If \fIsession_name\fP is empty, the \fBLOGIN DOMAIN\fR from the client with be used to select the section. If no domain name is supplied, the first suitable section will be used for automatic login. .TP \fBbitmap_cache\fR=\fI[true|false]\fR If set to \fB1\fR, \fBtrue\fR or \fByes\fR this option enables bitmap caching in \fBxrdp\fR(8). .TP \fBbitmap_compression\fR=\fI[true|false]\fR If set to \fB1\fR, \fBtrue\fR or \fByes\fR this option enables bitmap compression in \fBxrdp\fR(8). .TP \fBbulk_compression\fP=\fI[true|false]\fP If set to \fB1\fR, \fBtrue\fR or \fByes\fR this option enables compression of bulk data in \fBxrdp\fR(8). .TP \fBcertificate\fP=\fI/path/to/certificate\fP .TP \fBkey_file\fP=\fI/path/to/private_key\fP Set location of TLS certificate and private key. They must be written in PEM format. If not specified, defaults to \fB@sysconfdir@/@sysconfsubdir@/cert.pem\fP, \fB@sysconfdir@/@sysconfsubdir@/key.pem\fP. This parameter is effective only if \fBsecurity_layer\fP is set to \fBtls\fP or \fBnegotiate\fP. .TP \fBtls_pms_log_file\fR=\fI\fR Logs TLS pre-master secrets to the specified file. This allows packet capture tools (e.g. Wireshark) to decrypt captured PDUs. The file must be writeable by xrdp and readable by the packet capture tool. A good way to achive this is to create a temporary directory with permissions 2750 owned by the user running xrdp, and in the group used by the packet sniffer. SETTING THIS OPTION IS A SECURITY RISK. ONLY SET THIS OPTION FOR DEBUGGING COMMUNICATIONS BETWEEN XRDP AND A CLIENT. .TP \fBchannel_code\fP=\fI[true|false]\fP If set to \fB0\fR, \fBfalse\fR or \fBno\fR this option disables all channels \fBxrdp\fR(8). See section \fBCHANNELS\fP below for more fine grained options. .TP \fBcrypt_level\fP=\fI[low|medium|high|fips]\fP .\" Regulate encryption level of Classic RDP Security. This parameter is effective only if \fBsecurity_layer\fP is set to \fBrdp\fP or \fBnegotiate\fP. Encryption in Classic RDP Security is controlled by two settings: \fIEncryption Level\fP and \fIEncryption Method\fP. The only supported \fIEncryption Method\fP are \fB40BIT_ENCRYPTION\fP and \fB128BIT_ENCRYPTION\fP. \fB56BIT_ENCRYPTION\fP is not supported. This option controls the \fIEncryption Level\fP: .RS 8 .TP .B low All data sent from the client to the server is protected by encryption based on the maximum key strength supported by the client. .I This is the only level that the traffic sent by the server to client is not encrypted. .TP .B medium All data sent between the client and the server is protected by encryption based on the maximum key strength supported by the client (client compatible). .TP .B high All data sent between the client and the server is protected by encryption based on the server's maximum key strength (sever compatible). .TP .B fips All data sent between the client and server is protected using Federal Information Processing Standard 140-1 validated encryption methods. Note that FIPS 140-1 is no longer considered secure. .I This level is required for Windows clients (mstsc.exe) if the client's group policy .I enforces FIPS-compliance mode. .RE .TP \fBfork\fP=\fI[true|false]\fP If set to \fB1\fR, \fBtrue\fR or \fByes\fR for each incoming connection \fBxrdp\fR(8) forks a sub-process instead of using threads. .TP \fBhidelogwindow\fP=\fI[true|false]\fP If set to \fB1\fP, \fBtrue\fP or \fByes\fP, \fBxrdp\fP will not show a window for log messages. If not specified, defaults to \fBfalse\fP. .TP \fBmax_bpp\fP=\fI[8|15|16|24|32]\fP Limit the color depth by specifying the maximum number of bits per pixel. If not specified or set to \fB0\fP, unlimited. .TP \fBpamerrortxt\fP=\fIerror_text\fP Specify additional text displayed to user if authentication fails. The maximum length is \fB256\fP. The use of 'pam' in the name of this option is historic .TP \fBport\fP=\fIport\fP Specify TCP port and interface to listen on for incoming connections. Specifying only the port means that xrdp will listen on all interfaces. The default port for RDP is \fB3389\fP. Multiple address:port instances must be separated by spaces or commas. Check the .ini file for examples. Specifying interfaces requires said interfaces to be UP before xrdp starts. .TP \fBruntime_user\fP=\fIusername\fP .TP \fBruntime_group\fP=\fIgroupname\fP User name and group to run the xrdp daemon under. After xrdp starts, it sets its UID and GID to values derived from these settings, so that it's running without system privilege. The \fBruntime_group\fP MUST be set to the same value as \fBSessionSockdirGroup\fP in \fBsesman.ini\fP if you want to run sessions. A suitable user and group can be added with a command like this (Linux):- useradd xrdp -d / -c 'xrdp daemon' -s /usr/sbin/nologin In order to establish secure connections, the xrdp daemon needs permission to access sensitive cryptographic files. After changing either or both of these values, check that xrdp has access to required files by running this script:- @xrdpdatadir@/xrdp-chkpriv .TP \fBenable_token_login\fP=\fI[true|false]\fP If set to \fB1\fP, \fBtrue\fP or \fByes\fP, \fBxrdp\fP will scan the user name provided by the client for the ASCII field separator character (0x1F). It will then copy over what is after the separator as the password supplied by the user and treats it as autologon. If not specified, defaults to \fBfalse\fP. .TP \fBdomain_user_separator\fP=\fBseparator\fP If specified the domain name supplied by the client is appended to the username separated by \fBseparator\fP. .TP \fBrequire_credentials\fP=\fI[true|false]\fP If set to \fB1\fP, \fBtrue\fP or \fByes\fP, \fBxrdp\fP requires clients to include username and password initial connection phase. In other words, xrdp doesn't allow clients to show login screen if set to true. It follows that an incorrect password will cause the login to immediately fail without displaying the login screen. If not specified, defaults to \fBfalse\fP. .TP \fBsecurity_layer\fP=\fI[tls|rdp|negotiate]\fP Regulate security methods. If not specified, defaults to \fBnegotiate\fP. .RS 8 .TP .B tls Enhanced RDP Security is used. All security operations (encryption, decryption, data integrity verification, and server authentication) are implemented by TLS. .TP .B rdp Classic RDP Security is used. The encryption level of Classic RDP Security is controlled by \fBcrypt_level\fP. Use this setting for testing only. .TP .B negotiate Negotiate these security methods with clients. .RE .TP \fBssl_protocols\fP=\fI[SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3]\fP Enables the specified SSL/TLS protocols. Each value should be separated by comma. SSLv2 is always disabled. At least one protocol should be given to accept TLS connections. This parameter is effective only if \fBsecurity_layer\fP is set to \fBtls\fP or \fBnegotiate\fP. .TP \fBtcp_keepalive\fP=\fI[true|false]\fP Regulate if the listening socket uses socket option \fBSO_KEEPALIVE\fP. If set to \fB1\fP, \fBtrue\fP or \fByes\fP and the network connection disappears without closing messages, the connection will be closed. .TP \fBtcp_nodelay\fP=\fI[true|false]\fP Regulate if the listening socket uses socket option \fBTCP_NODELAY\fP. If set to \fB1\fP, \fBtrue\fP or \fByes\fP, no buffering will be performed in the TCP stack. .TP \fBtcp_send_buffer_bytes\fP=\fIbuffer_size\fP .TP \fBtcp_recv_buffer_bytes\fP=\fIbuffer_size\fP Specify send/recv buffer sizes in bytes. The default value depends on the operating system. It is recommended not to set these on systems with dynamic TCP buffer sizing .TP \fBtls_ciphers\fP=\fIcipher_suite\fP Specifies TLS cipher suite. The format of this parameter is equivalent to which \fBopenssl\fP(1) ciphers subcommand accepts. (ex. $ openssl ciphers 'HIGH:!ADH:!SHA1') This parameter is effective only if \fBsecurity_layer\fP is set to \fBtls\fP or \fBnegotiate\fP. .TP \fBuse_fastpath\fP=\fI[input|output|both|none]\fP If not specified, defaults to \fBnone\fP. .TP \fBblack\fP=\fI000000\fP .TP \fBgrey\fP=\fIc0c0c0\fP .TP \fBdark_grey\fP=\fI808080\fP .TP \fBblue\fP=\fI0000ff\fP .TP \fBdark_blue\fP=\fI00007f\fP .TP \fBwhite\fP=\fIffffff\fP .TP \fBred\fP=\fIff0000\fP .TP \fBgreen\fP=\fI00ff00\fP .TP \fBbackground\fP=\fI000000\fP These options override the colors used internally by \fBxrdp\fP(8) to draw the login and log windows. Colors are defined using a hexadecimal (hex) notation for the combination of Red, Green, and Blue color values (RGB). The lowest value that can be given to one of the light sources is 0 (hex 00). The highest value is 255 (hex FF). .TP \fBfv1_select\fP=\fI130:sans-18.fv1,0:sans-10.fv1\fP Selects a default fv1 font. This parameter is a comma-separated list of DPI:name pairs. The list is scanned from left-to-right. The font used is the first font whose DPI value is less-than-or-equal to the vertical DPI of the monitor used for the login screen. .TP \fBdefault_dpi\fP=\fI96\fP Default DPI used for a monitor if the client does not send physical size information. .SH "LOGGING" The following parameters can be used in the \fB[Logging]\fR section: .TP \fBLogFile\fR=\fI@localstatedir@/log/xrdp.log\fR This options contains the path to logfile. It can be either absolute or relative. If set to \fB\fR, log will go to stdout. Use for debugging only\fR .TP \fBLogLevel\fR=\fIlevel\fR This option can have one of the following values: \fBCORE\fR or \fB0\fR \- Log only core messages. these messages are _always_ logged, regardless the logging level selected. \fBERROR\fR or \fB1\fR \- Log only error messages \fBWARNING\fR, \fBWARN\fR or \fB2\fR \- Logs warnings and error messages \fBINFO\fR or \fB3\fR \- Logs errors, warnings and informational messages \fBDEBUG\fR or \fB4\fR \- Log everything. If \fBxrdp-sesman\fR is compiled in debug mode, this options will output many more low\-level message, useful for developers .TP \fBEnableSyslog\fR=\fI[true|false]\fR If set to \fB1\fR, \fBtrue\fR or \fByes\fR this option enables logging to syslog. Otherwise syslog is disabled. .TP \fBSyslogLevel\fR=\fIlevel\fR This option sets the logging level for syslog. It can have the same values of \fBLogLevel\fR. If \fBSyslogLevel\fR is greater than \fBLogLevel\fR, its value is lowered to that of \fBLogLevel\fR. .TP \fBEnableConsole\fR=\fI[true|false]\fR If set to \fB1\fR, \fBtrue\fR or \fByes\fR, this option enables logging to the console (ie. stdout). .TP \fBConsoleLevel\fR=\fIlevel\fR Logging level for the console. It can have the same values as \fBLogLevel\fR. Defaults to \fBDEBUG\fR. .TP \fBEnableProcessId\fR=\fI[true|false]\fR If set to \fB1\fR, \fBtrue\fR or \fByes\fR, this option enables logging the process id in all log messages. Defaults to \fBfalse\fR. .SH "CHANNELS" The Remote Desktop Protocol supports several channels, which are used to transfer additional data like sound, clipboard data and others. Channel names not listed here will be blocked by \fBxrdp\fP. Not all channels are supported in all cases, so setting a value to \fItrue\fP is a prerequisite, but does not force its use. .br Channels can also be enabled or disabled on a per connection basis by prefixing each setting with \fBchannel.\fP in the channel section. .TP \fBrdpdr\fP=\fI[true|false]\fP If set to \fB1\fR, \fBtrue\fR or \fByes\fR using the RDP channel for device redirection is allowed. .TP \fBrdpsnd\fP=\fI[true|false]\fP If set to \fB1\fR, \fBtrue\fR or \fByes\fR using the RDP channel for sound is allowed. .TP \fBdrdynvc\fP=\fI[true|false]\fP If set to \fB1\fR, \fBtrue\fR or \fByes\fR using the RDP channel to initiate additional dynamic virtual channels is allowed. .TP \fBcliprdr\fP=\fI[true|false]\fP If set to \fB1\fR, \fBtrue\fR or \fByes\fR using the RDP channel for clipboard redirection is allowed. .TP \fBrail\fP=\fI[true|false]\fP If set to \fB1\fR, \fBtrue\fR or \fByes\fR using the RDP channel for remote applications integrated locally (RAIL) is allowed. .TP \fBxrdpvr\fP=\fI[true|false]\fP If set to \fB1\fR, \fBtrue\fR or \fByes\fR using the RDP channel for XRDP Video streaming is allowed. .SH "CONNECTIONS" A connection section is made of a section name, enclosed in square brackets, and the following entries: .TP \fBname\fR=\fI\fR The name displayed in \fBxrdp\fR(8) login window's combo box. .TP \fBlib\fR=\fI../vnc/libvnc.so\fR Sets the library to be used with this connection. .TP \fBusername\fR=\fI\fR|\fI{base64}\fR|\fIask\fR Specifies the username used for authenticating in the connection. If set to \fIask\fR, user name should be provided in the login window. If the username includes comment out symbols such as '#', or ';', the username can be provided in base64 form prefixing "{base64}". .TP \fBpassword\fR=\fI\fR|\fI{base64}\fR|\fIask\fR Specifies the password used for authenticating in the connection. If set to \fIask\fR, password should be provided in the login window. This parameter can be provided in base64 form as well as username. See also examples below. .TP \fBip\fR=\fI127.0.0.1\fR Specifies the ip address of the host to connect to. .TP \fBport\fR=\fI\fR|\fI\-1\fR Specifies the port number to connect to. If set to \fI\-1\fR, the default port for the specified library is used. .TP \fBxserverbpp\fR=\fI\fR Specifies color depth of the backend X server. The default is the color depth of the client. Only Xvnc uses that setting. Xorg runs at \fI24\fR bpp. .TP \fBdisabled_encodings_mask\fR=\fI\fR Set this bitmask to a non-zero value to prevent \fBxrdp\fR(8) requesting some features from the Xvnc server. You should only need to set this to a non-zero value to work around bugs in your Xvnc server. The bit values supported for a particular release of \fBxrdp\fR(8) are documented in \fBxrdp.ini\fR. .TP \fBcode\fR=\fI\fR|\fI0\fR Specifies the session type. \fI0\fR is Xvnc over TCP, \fI1\fR is Xvnc over a UNIX domain socket, and \fI20\fR is Xorg with xorgxrdp modules. The default is \fI0\fR on non-FIPS systems, and \fI1\fR on FIPS systems. .TP \fBchansrvport\fR=\fBDISPLAY(\fR\fIn\fR\fB)\fR|\fBDISPLAY(\fR\fIn,u\fR\fB)\fR||\fI/path/to/domain-socket\fR Asks xrdp to connect to a manually started \fBxrdp-chansrv\fR instance. This can be useful if you wish to use to use xrdp to connect to a VNC session which has been started other than by \fBxrdp-sesman\fR, as you can then make use of \fBxrdp\-chansrv\fR facilities in the VNC session. Either the first or second form of this setting is recommended. Replace \fIn\fR with the X11 display number of the session, and (if applicable) \fIu\fR with the numeric ID of the session. The second form is only required if \fBxrdp\fR is unable to determine the session uid from the other values in the connection block. If you use this setting, you must also set SessionSockdirGroup in \fBsesman.ini\fR to be the same as runtime_group in this file. This is necessary to give \fBxrdp\fR the privilege to connect to \fBxrdp\-chansrv\fR. .TP \fBkeycode_set\fR=\fI\fR [Xorg only] Asks for the specified keycode set to be used by the X server. Normally "evdev" or "base". The default should be correct for your system. .TP \fBh264_frame_interval\fR=\fI\fR [Xorg only] Specify frame capture interval for H.264 captures in milliseconds. .TP \fBrfx_frame_interval\fR=\fI\fR [Xorg only] Specify frame capture interval for RemoteFX captures in milliseconds. .TP \fBnormal_frame_interval\fR=\fI\fR [Xorg only] Specify frame capture interval for normal captures in milliseconds. .SH "EXAMPLES" This is an example \fBxrdp.ini\fR: .nf [Globals] bitmap_cache=true bitmap_compression=true [Xorg] name=Xorg lib=libxup.so username=ask password=ask ip=127.0.0.1 port=-1 code=20 h264_frame_interval=16 rfx_frame_interval=32 normal_frame_interval=40 [vnc-any] name=vnc-any lib=libvnc.so ip=ask port=ask5900 username=na password={base64}cGFzc3dvcmQhCg== .fi .SH "FILES" @sysconfdir@/@sysconfsubdir@/xrdp.ini .SH "SEE ALSO" .BR xrdp (8), .BR xrdp\-chansrv (8), .BR xrdp\-sesman (8), .BR xrdp\-sesrun (8), .BR sesman.ini (5) For more info on \fBxrdp\fR see .UR @xrdphomeurl@ .UE ================================================ FILE: fontutils/Makefile.am ================================================ EXTRA_DIST = windows # Some programs need freetype2 to build if USE_FREETYPE2 MKFV1 = xrdp-mkfv1 else MKFV1 = endif AM_CPPFLAGS = \ -I$(top_builddir) \ -I$(top_srcdir)/common \ $(FREETYPE2_CFLAGS) bin_PROGRAMS = \ $(MKFV1) \ xrdp-dumpfv1 xrdp_mkfv1_SOURCES = \ mkfv1.c \ fv1.c \ fv1.h xrdp_mkfv1_LDADD = \ $(top_builddir)/common/libcommon.la \ $(FREETYPE2_LIBS) xrdp_dumpfv1_SOURCES = \ dumpfv1.c \ fv1.c \ fv1.h xrdp_dumpfv1_LDADD = \ $(top_builddir)/common/libcommon.la ================================================ FILE: fontutils/README_fv1.txt ================================================ The fv1 font format has the following characteristics:- 1) Bitmap fonts (i.e. pixels are on or off) 2) 96 DPI is assumed 3) Glyphs from U+0020 up to a pre-defined limit are stored in the file. At the time of writing this limit is U+4DFF. To change the limit requires a change to xrdp/xrdp_types.h and (potentially) fontutils/mkfv1.c 4) Font format is header, plus a variable data area for each glyph. The intention (over time) is to build support for the freetype2 library directly into xrdp. This will allow for modern font features like anti-aliasing and kerning to be supported. General Info ------------ All numeric values are 2 octets, and stored in twos-complement little-endian format. Dimensions are all measured in pixels. Font header ----------- signature 4 octets File signature - "FNT1" font~name 32 octets Null-terminated if less that 32 octets long point_size 2 octets Assumes 96 DPI. style 2 octets Unused. Set to 1. body_height 2 octets Line spacing for font. min_descender 2 octets The common lowest descender value in the font glyphs (A few glyphs may be lower than this). Used to calculate where the font baseline is in relation to the text box for the font. 4 octets Set to zero. Older fonts, generated for xrdp v.0.9x and earlier, have zero values for the body_height and min_descender. For these fonts, the body height is calculated as (-baseline + 1) for the first glyph, and the glyphs are all offset so that a min_descender of 0 works OK. Glyph data ---------- The header is followed by a number of glyphs representing U+0020 upwards. The glyphs have a variable size. The format of each glyph is as follows:- width 2 octets Width of character data height 2 octets Height of character data baseline 2 octets Offset from font baseline to 1st row of glyph data offset 2 octets Space before glyph is drawn (can be -ve) inc_by 2 octets Total width of glyph + spacing. The width of a string is obtained by adding up all the inc_by fields for all the glyphs data Bitmap data. Bitmap data is laid out in rows from top to bottom. Within each row the most significant bit of each octet is on the left. Row data is padded to the nearest octet (e.g. a 14 bit width would be padded by 2 bits to 16 bits (2 octets). The total data is padded out with between 0 and 3 octets to end on a 4-octet boundary. Example glyph:- Glyph : U+0067 Width : 12 Height : 18 Baseline : -13 Offset : 1 Inc By : 15 Data : -13: ...XXXXX..XX 1F 30 -12: ..XXXXXXXXXX 3F F0 -11: .XXX....XXXX 70 F0 -10: XXX......XXX E0 70 -9: XX........XX C0 30 -8: XX........XX C0 30 -7: XX........XX C0 30 -6: XX........XX C0 30 -5: XX........XX C0 30 -4: XXX......XXX E0 70 -3: .XXX....XXXX 70 F0 -2: ..XXXXXXXXXX 3F F0 -1: ...XXXXX..XX 1F 30 +0: ..........XX 00 30 +1: .........XXX 00 70 +2: ..X.....XXX. 20 E0 +3: ..XXXXXXXX.. 3F C0 +4: ...XXXXXX... 1F 80 ================================================ FILE: fontutils/dumpfv1.c ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2022 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * fonts */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include "list.h" #include "os_calls.h" #include "parse.h" #include "string_calls.h" #include "fv1.h" /** * What the program is doing */ enum program_mode { PM_UNSPECIFIED = 0, PM_INFO, PM_GLYPH_INFO_TABLE, PM_SHOW_CHAR }; /** * Parsed program arguments */ struct program_args { const char *font_file; enum program_mode mode; int ucode; /* Unicode character to display in 'c' mode */ }; /**************************************************************************//** * Parses the program args * * @param argc Passed to main * @param argv Passed to main * @param pa program_pargs structure for resulting values * @return !=0 for success */ static int parse_program_args(int argc, char *argv[], struct program_args *pa) { int params_ok = 1; int opt; pa->font_file = NULL; pa->mode = PM_UNSPECIFIED; pa->ucode = 0; while ((opt = getopt(argc, argv, "c:it")) != -1) { switch (opt) { case 'i': if (pa->mode == PM_UNSPECIFIED) { pa->mode = PM_INFO; } else { LOG(LOG_LEVEL_ERROR, "Can't have two modes set"); params_ok = 0; } break; case 't': if (pa->mode == PM_UNSPECIFIED) { pa->mode = PM_GLYPH_INFO_TABLE; } else { LOG(LOG_LEVEL_ERROR, "Can't have two modes set"); params_ok = 0; } break; case 'c': if (pa->mode == PM_UNSPECIFIED) { pa->mode = PM_SHOW_CHAR; if (toupper(optarg[0]) == 'U' && optarg[1] == '+') { char *hex = g_strdup(optarg); hex[0] = '0'; hex[1] = 'x'; pa->ucode = g_atoix(hex); g_free(hex); } else if (optarg[0] == '@') { pa->ucode = optarg[1]; } else { pa->ucode = g_atoix(optarg); } } else { LOG(LOG_LEVEL_ERROR, "Can't have two modes set"); params_ok = 0; } break; default: LOG(LOG_LEVEL_ERROR, "Unrecognised switch '%c'", (char)opt); params_ok = 0; } } if (argc <= optind) { LOG(LOG_LEVEL_ERROR, "No font file specified"); params_ok = 0; } else if ((argc - optind) > 1) { LOG(LOG_LEVEL_ERROR, "Unexpected arguments after font file"); params_ok = 0; } else { pa->font_file = argv[optind]; } return params_ok; } /**************************************************************************//** * Displays information about a font file * * @param fv1 loaded font file */ static void display_font_file_info(const struct fv1_file *fv1) { g_printf("Font name : %s\n", fv1->font_name); g_printf("Point size (%d DPI) : %d\n", FV1_DEVICE_DPI, fv1->point_size); g_printf("Style : %d\n", fv1->style); if (fv1->body_height == 0 && fv1->glyphs->count > 0) { const struct fv1_glyph *g = (const struct fv1_glyph *)fv1->glyphs->items[0]; g_printf("Body height : %d (from 1st glyph)\n", -g->baseline + 1); } else { g_printf("Body height : %d\n", fv1->body_height); } g_printf("Descender : %d\n", fv1->min_descender); if (fv1->glyphs->count == 0) { g_printf("\nFile contains no glyphs\n"); } else { g_printf("Min glyph index : U+%04X\n", FV1_MIN_CHAR); g_printf("Max glyph index : U+%04X\n", FV1_GLYPH_END(fv1) - 1); /* Work out the statistics */ unsigned short max_width = 0; int max_width_ucode = 0; unsigned short max_height = 0; int max_height_ucode = 0; short min_baseline = 0; int min_baseline_ucode = 0; short min_offset = 0; int min_offset_ucode = 0; short max_offset = 0; int max_offset_ucode = 0; unsigned short max_inc_by = 0; int max_inc_by_ucode = 0; /* Derived quantities */ short min_y_descender = SHRT_MAX; int min_y_descender_ucode = 0; int max_datasize = -1; int max_datasize_ucode = 0; /* Loop and output macros */ #define SET_MIN(ucode,field,val) \ if ((field) < (val)) \ { \ val = (field); \ val##_ucode = (ucode); \ } #define SET_MAX(ucode,field,val) \ if ((field) > (val)) \ { \ val = (field); \ val##_ucode = (ucode); \ } #define OUTPUT_INFO(string, val) \ if (val##_ucode > 0) \ { \ g_printf(string, val, val##_ucode); \ } int u; for (u = FV1_MIN_CHAR ; u < FV1_GLYPH_END(fv1); ++u) { const struct fv1_glyph *g = FV1_GET_GLYPH(fv1, u); if (g != NULL) { short y_descender = - (g->baseline + g->height); int datasize = FONT_DATASIZE(g); SET_MAX(u, g->width, max_width); SET_MAX(u, g->height, max_height); SET_MIN(u, g->baseline, min_baseline); SET_MIN(u, g->offset, min_offset); SET_MAX(u, g->offset, max_offset); SET_MAX(u, g->inc_by, max_inc_by); SET_MIN(u, y_descender, min_y_descender); SET_MAX(u, datasize, max_datasize); } } OUTPUT_INFO("Max glyph width : %d (U+%04X)\n", max_width); OUTPUT_INFO("Max glyph height : %d (U+%04X)\n", max_height); OUTPUT_INFO("Min glyph y-baseline : %d (U+%04X)\n", min_baseline); OUTPUT_INFO("Min glyph y-descender : %d (U+%04X)\n", min_y_descender); OUTPUT_INFO("Min glyph x-offset : %d (U+%04X)\n", min_offset); OUTPUT_INFO("Max glyph x-offset : %d (U+%04X)\n", max_offset); OUTPUT_INFO("Max glyph x-inc_by : %d (U+%04X)\n", max_inc_by); OUTPUT_INFO("Max glyph datasize : %d (U+%04X)\n", max_datasize); #undef SET_MIN #undef SET_MAX #undef OUTPUT_INFO } } /**************************************************************************//** * Display info in a table about all the glyphs * @param fv1 font file */ static void display_glyph_info_table(const struct fv1_file *fv1) { int u; g_printf("character,width,height,baseline,offset,inc_by,datasize\n"); for (u = FV1_MIN_CHAR; u < FV1_GLYPH_END(fv1); ++u) { const struct fv1_glyph *g = FV1_GET_GLYPH(fv1, u); if (g != NULL) { int datasize = FONT_DATASIZE(g); g_printf("%d,%hu,%hu,%hd,%hd,%hu,%d\n", u, g->width, g->height, g->baseline, g->offset, g->inc_by, datasize); } } } /**************************************************************************//** * Converts a font data row to a printable string * * @param rowdata Pointer to the first byte of the row data * @param width Number of pixels in the row * @param out Output buffer. Must be sized by the caller to be at * least width+1 bytes */ static void row_to_str(const unsigned char *rowdata, int width, char *out) { int x; int mask = 1 << 7; for (x = 0 ; x < width ; ++x) { out[x] = ((*rowdata & mask) != 0) ? 'X' : '.'; mask >>= 1; if (mask == 0) { mask = 1 << 7; ++rowdata; } } out[width] = '\0'; } /**************************************************************************//** * Display info about a specific glyph * @param ucode Unicode character value * @param g Glyph */ static void display_glyph_info(int ucode, const struct fv1_glyph *g) { char *row_buffer = (char *)g_malloc(g->width + 1, 0); if (row_buffer == NULL) { g_printf("\n"); } else { g_printf("Glyph : U+%04X\n", ucode); g_printf(" Width : %d\n", g->width); g_printf(" Height : %d\n", g->height); g_printf(" Baseline : %d\n", g->baseline); g_printf(" Offset : %d\n", g->offset); g_printf(" Inc By : %d\n", g->inc_by); g_printf(" Data :\n"); int y; const unsigned char *dataptr = g->data; for (y = 0 ; y < g->height; ++y) { row_to_str(dataptr, g->width, row_buffer); g_printf(" %+3d: %s\n", y + g->baseline, row_buffer); dataptr += (g->width + 7) / 8; } g_free(row_buffer); } } /**************************************************************************//** * Main * * @param argc Argument count * @param argv Arguments */ int main(int argc, char *argv[]) { struct fv1_file *fv1 = NULL; struct log_config *logging; struct program_args pa; int rv = 1; logging = log_config_init_for_console(LOG_LEVEL_WARNING, g_getenv("DUMPFV1_LOG_LEVEL")); log_start_from_param(logging); log_config_free(logging); if (parse_program_args(argc, argv, &pa) && (fv1 = fv1_file_load(pa.font_file)) != NULL) { switch (pa.mode) { case PM_INFO: display_font_file_info(fv1); rv = 0; break; case PM_GLYPH_INFO_TABLE: display_glyph_info_table(fv1); rv = 0; break; case PM_SHOW_CHAR: if (pa.ucode < FV1_MIN_CHAR) { LOG(LOG_LEVEL_ERROR, "Value for -c must be at least U+%04X", FV1_MIN_CHAR); } else if (pa.ucode >= FV1_GLYPH_END(fv1)) { LOG(LOG_LEVEL_ERROR, "Value for -c must be less than U+%04X", FV1_GLYPH_END(fv1)); } else { const struct fv1_glyph *g = (const struct fv1_glyph *) list_get_item(fv1->glyphs, pa.ucode - FV1_MIN_CHAR); display_glyph_info(pa.ucode, g); rv = 0; } break; default: LOG(LOG_LEVEL_ERROR, "Specify one of '-i' or '-c'"); break; } } fv1_file_free(fv1); log_end(); return rv; } ================================================ FILE: fontutils/fv1.c ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2022 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @file fontutils/fv1.c * @brief Definitions relating to fv1 font files */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include "list.h" #include "os_calls.h" #include "parse.h" #include "string_calls.h" #include "fv1.h" static const char FV1_SIGNATURE[] = {'F', 'N', 'T', '1'}; /*****************************************************************************/ struct fv1_glyph * fv1_alloc_glyph(int ucode, unsigned short width, unsigned short height) { int datasize = FONT_DATASIZE_FROM_GEOMETRY(width, height); struct fv1_glyph *glyph = NULL; char ucode_str[16] = {'\0'}; if (ucode < 0) { g_snprintf(ucode_str, sizeof(ucode_str), "Glyph"); } else { g_snprintf(ucode_str, sizeof(ucode_str), "Glyph:U+%04X", ucode); } if (datasize < 0 || datasize > FV1_MAX_GLYPH_DATASIZE) { /* shouldn't happen */ LOG(LOG_LEVEL_ERROR, "%s - datasize %d out of bounds", ucode_str, datasize); } else { glyph = (struct fv1_glyph *) g_malloc( offsetof(struct fv1_glyph, data) + datasize, 1); if (glyph == NULL) { LOG(LOG_LEVEL_ERROR, "%s - out of memory", ucode_str); } else { glyph->width = width; glyph->height = height; } } return glyph; } /*****************************************************************************/ struct fv1_file * fv1_file_create(void) { struct fv1_file *fv1 = (struct fv1_file *)g_new0(struct fv1_file, 1); if (fv1 == NULL) { LOG(LOG_LEVEL_ERROR, "fv1_file_create - out of memory"); } else { fv1->style = 1; /* Unused at present - compatibility value */ fv1->glyphs = list_create(); fv1->glyphs->auto_free = 1; } return fv1; } /*****************************************************************************/ static void add_glyphs_from_stream(struct fv1_file *fv1, struct stream *s) { unsigned short width; unsigned short height; int datasize; struct fv1_glyph *glyph; while (s_check_rem(s, 4)) { in_sint16_le(s, width); in_sint16_le(s, height); datasize = FONT_DATASIZE_FROM_GEOMETRY(width, height); if (datasize < 0 || datasize > FV1_MAX_GLYPH_DATASIZE) { LOG(LOG_LEVEL_ERROR, "Font:%s Glyph:%d - datasize %d out of bounds", fv1->font_name, FV1_GLYPH_END(fv1), datasize); break; } if (!s_check_rem(s, 6 + 6 + datasize)) { LOG(LOG_LEVEL_ERROR, "Font:%s Glyph:%d - not enough data for glyph", fv1->font_name, FV1_GLYPH_END(fv1)); break; } if ((glyph = fv1_alloc_glyph(FV1_GLYPH_END(fv1), width, height)) == NULL) { break; } in_sint16_le(s, glyph->baseline); in_sint16_le(s, glyph->offset); in_sint16_le(s, glyph->inc_by); in_uint8s(s, 6); in_uint8a(s, glyph->data, datasize); list_add_item(fv1->glyphs, (tintptr)glyph); } } /*****************************************************************************/ struct fv1_file * fv1_file_load(const char *filename) { struct fv1_file *fv1 = NULL; if (!g_file_exist(filename)) { LOG(LOG_LEVEL_ERROR, "Can't find font file %s", filename); } else { int file_size = g_file_get_size(filename); if (file_size < FV1_MIN_FILE_SIZE || file_size > FV1_MAX_FILE_SIZE) { LOG(LOG_LEVEL_ERROR, "Font file %s has bad size %d", filename, file_size); } else { struct stream *s; int fd; make_stream(s); init_stream(s, file_size + 1024); fd = g_file_open_ro(filename); if (fd < 0) { LOG(LOG_LEVEL_ERROR, "Can't open font file %s", filename); } else { int b = g_file_read(fd, s->data, file_size + 1024); g_file_close(fd); if (b < FV1_MIN_FILE_SIZE) { LOG(LOG_LEVEL_ERROR, "Font file %s is too small", filename); } else { char sig[sizeof(FV1_SIGNATURE)]; s->end = s->data + b; in_uint8a(s, sig, sizeof(FV1_SIGNATURE)); if (g_memcmp(sig, FV1_SIGNATURE, sizeof(sig)) != 0) { LOG(LOG_LEVEL_ERROR, "Font file %s has wrong signature", filename); } else if ((fv1 = fv1_file_create()) != NULL) { in_uint8a(s, fv1->font_name, FV1_MAX_FONT_NAME_SIZE); fv1->font_name[FV1_MAX_FONT_NAME_SIZE] = '\0'; in_uint16_le(s, fv1->point_size); in_uint16_le(s, fv1->style); in_uint16_le(s, fv1->body_height); in_uint16_le(s, fv1->min_descender); in_uint8s(s, 4); add_glyphs_from_stream(fv1, s); } } } free_stream(s); } } return fv1; } /*****************************************************************************/ void fv1_file_free(struct fv1_file *fv1) { if (fv1 != NULL) { list_delete(fv1->glyphs); g_free(fv1); } } /*****************************************************************************/ static int write_stream(int fd, struct stream *s) { const char *p = s->data; int rv = 1; while (p < s->end) { int len = g_file_write(fd, p, s->end - p); if (len <= 0) { rv = 0; break; } p += len; } return rv; } /*****************************************************************************/ int fv1_file_save(const struct fv1_file *fv1, const char *filename) { int fd; struct fv1_glyph *blank_glyph; /* Needed for bad characters */ fd = g_file_open_ex(filename, 0, 1, 1, 1); int rv = 1; if (fd < 0) { LOG(LOG_LEVEL_ERROR, "Unable to open %s for writing [%s]", filename, g_get_strerror()); } else { struct stream *s; make_stream(s); init_stream(s, 1024); /* Write the header */ out_uint8a(s, FV1_SIGNATURE, sizeof(FV1_SIGNATURE)); int len = g_strlen(fv1->font_name); if (len > FV1_MAX_FONT_NAME_SIZE) { len = FV1_MAX_FONT_NAME_SIZE; } out_uint8a(s, fv1->font_name, len); while (len++ < FV1_MAX_FONT_NAME_SIZE) { out_uint8(s, '\0'); } out_uint16_le(s, fv1->point_size); out_uint16_le(s, fv1->style); out_uint16_le(s, fv1->body_height); out_uint16_le(s, fv1->min_descender); out_uint8a(s, "\0\0\0\0", 4); s_mark_end(s); if (!write_stream(fd, s)) { LOG(LOG_LEVEL_ERROR, "Unable to write file header [%s]", g_get_strerror()); } else if ((blank_glyph = fv1_alloc_glyph(-1, 0, 0)) == NULL) { LOG(LOG_LEVEL_ERROR, "Unable to allocate blank glyph"); } else { int u; for (u = FV1_MIN_CHAR; u < FV1_GLYPH_END(fv1); ++u) { const struct fv1_glyph *g = FV1_GET_GLYPH(fv1, u); int datasize; if (g == NULL) { LOG(LOG_LEVEL_WARNING, "Glyph %d is not set", u); g = blank_glyph; } else { datasize = FONT_DATASIZE(g); if (datasize > FV1_MAX_GLYPH_DATASIZE) { LOG(LOG_LEVEL_WARNING, "glyph %d datasize %d exceeds max of %d" " - glyph will be blank", u, datasize, FV1_MAX_GLYPH_DATASIZE); g = blank_glyph; } } init_stream(s, 16 + FONT_DATASIZE(g)); out_uint16_le(s, g->width); out_uint16_le(s, g->height); out_uint16_le(s, g->baseline); out_uint16_le(s, g->offset); out_uint16_le(s, g->inc_by); out_uint8a(s, "\0\0\0\0\0\0", 6); out_uint8a(s, g->data, FONT_DATASIZE(g)); s_mark_end(s); if (!write_stream(fd, s)) { LOG(LOG_LEVEL_ERROR, "Unable to write glyph %d [%s]", u, g_get_strerror()); break; } } g_free(blank_glyph); rv = (u == FV1_GLYPH_END(fv1)) ? 0 : 1; } free_stream(s); g_file_close(fd); } return rv; } ================================================ FILE: fontutils/fv1.h ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2022 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @file fontutils/fv1.h * @brief Definitions relating to fv1 font files */ #if !defined(FV1_H) #define FV1_H struct list; #define FV1_DEVICE_DPI 96 #define FV1_MIN_CHAR 0x20 /* First character value in file */ #define FV1_MIN_FILE_SIZE 48 #define FV1_MAX_FILE_SIZE (10 * 1024 * 1024) #define FV1_MAX_FONT_NAME_SIZE 32 #define FV1_MAX_GLYPH_DATASIZE 512 struct fv1_glyph { unsigned short width; /* Width of glyph */ unsigned short height; /* Height of glyph */ short baseline; /* Offset from cursor pos to 1st row of glyph */ short offset; /* Space before glyph (can be -ve) */ unsigned short inc_by; /* Total width of glyph + spacing */ /* Standard C++ does not yet support C99 flexible array members */ #ifdef __cplusplus unsigned char data[1]; #else unsigned char data[]; #endif }; struct fv1_file { char font_name[FV1_MAX_FONT_NAME_SIZE + 1]; short point_size; /* Input point size (for reference) */ short style; short body_height; /* Body height (pixels) */ short min_descender; /* Min descender of the glyphs in the font */ struct list *glyphs; /* Glyphs are struct fv1_glyph * */ }; /** * Get a glyph pointer for a unicode character */ #define FV1_GET_GLYPH(fv1,ucode) \ (((ucode) < FV1_MIN_CHAR) \ ? NULL \ : (struct fv1_glyph *)list_get_item(fv1->glyphs, (ucode) - FV1_MIN_CHAR)) /** * First glyph not in file */ #define FV1_GLYPH_END(fv1) (fv1->glyphs->count + FV1_MIN_CHAR) struct fv1_file * fv1_file_load(const char *filename); void fv1_file_free(struct fv1_file *); struct fv1_file * fv1_file_create(void); struct fv1_glyph * fv1_alloc_glyph(int ucode, /* Unicode character for error reporting if known */ unsigned short width, unsigned short height); enum fv1_realloc_mode { FV1_AT_TOP, FV1_AT_BOTTOM }; int fv1_file_save(const struct fv1_file *fv1, const char *filename); #endif ================================================ FILE: fontutils/mkfv1.c ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2012 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include FT_FREETYPE_H /* See the FT2 documentation - this builds an error table */ #undef FTERRORS_H_ #define FT_ERRORDEF( e, v, s ) { e, s }, #define FT_ERROR_START_LIST { #define FT_ERROR_END_LIST { 0, NULL } }; static const struct { int err_code; const char *err_msg; } ft_errors[] = #include #ifdef __cppcheck__ // avoid syntaxError by providing the array contents {}; #endif #include "arch.h" #include "defines.h" #include "log.h" #include "os_calls.h" #include "string_calls.h" #include "fv1.h" #define DEFAULT_POINT_SIZE 10 #define DEFAULT_MAX_CHAR 0x4dff /** * sans10 compatibility choices */ enum sans10_compat { S10_OFF = 0, S10_ON, S10_AUTO }; /** * Parsed program arguments */ struct program_args { const char *input_file; const char *output_file; char font_name[FV1_MAX_FONT_NAME_SIZE + 1]; unsigned short point_size; /** Last character value in file */ unsigned int max_ucode; /** Are we generating san10 in compatibility mode? */ enum sans10_compat sans10_compatibility; }; struct x_dimensions { unsigned short width; short offset; unsigned short inc_by; }; /** * Table of some character settings in the original sans-10.fv1 font */ static const struct x_dimensions original_sans10_data[] = { /* 0x20 - 0x3f */ {1, 0, 4}, {1, 2, 5}, {3, 1, 5}, {9, 1, 11}, {7, 1, 8}, {11, 0, 12}, {9, 1, 11}, {1, 1, 3}, {3, 1, 5}, {3, 1, 5}, {7, 0, 7}, {9, 1, 11}, {2, 1, 4}, {3, 1, 5}, {1, 2, 4}, {4, 0, 4}, {6, 1, 8}, {5, 2, 8}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {1, 2, 4}, {2, 1, 4}, {8, 1, 11}, {8, 1, 11}, {8, 1, 11}, {5, 1, 7}, /* 0x40 - 0x5f */ {11, 1, 13}, {9, 0, 9}, {7, 1, 9}, {7, 1, 9}, {8, 1, 10}, {6, 1, 8}, {5, 1, 7}, {8, 1, 10}, {8, 1, 10}, {1, 1, 3}, {3, -1, 3}, {7, 1, 8}, {6, 1, 7}, {9, 1, 11}, {8, 1, 10}, {8, 1, 10}, {6, 1, 8}, {8, 1, 10}, {7, 1, 8}, {7, 1, 9}, {7, 0, 7}, {8, 1, 10}, {9, 0, 9}, {11, 0, 11}, {8, 0, 8}, {7, 0, 7}, {8, 1, 10}, {3, 1, 5}, {4, 0, 4}, {3, 1, 5}, {8, 1, 11}, {7, 0, 7}, /* 0x60 - 0x7f */ {3, 1, 7}, {6, 1, 8}, {6, 1, 8}, {5, 1, 7}, {6, 1, 8}, {6, 1, 8}, {4, 0, 4}, {6, 1, 8}, {6, 1, 8}, {1, 1, 3}, {2, 0, 3}, {6, 1, 7}, {1, 1, 3}, {11, 1, 13}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {4, 1, 5}, {5, 1, 7}, {4, 0, 5}, {6, 1, 8}, {7, 0, 7}, {9, 0, 9}, {7, 0, 7}, {7, 0, 7}, {5, 1, 7}, {5, 2, 8}, {1, 2, 4}, {5, 2, 8}, {8, 1, 11}, {7, 1, 8}, /* 0x80 - 0x9f */ {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, /* 0xa0 - 0xbf */ {1, 0, 4}, {1, 2, 5}, {6, 1, 8}, {7, 0, 8}, {7, 0, 8}, {7, 1, 8}, {1, 2, 4}, {5, 1, 7}, {3, 2, 7}, {9, 2, 13}, {5, 1, 6}, {6, 1, 8}, {8, 1, 11}, {3, 1, 5}, {9, 2, 13}, {4, 1, 7}, {4, 1, 7}, {9, 1, 11}, {4, 1, 5}, {4, 1, 5}, {3, 2, 7}, {7, 1, 8}, {6, 1, 8}, {1, 1, 4}, {3, 2, 7}, {3, 1, 5}, {5, 1, 6}, {6, 1, 8}, {12, 1, 13}, {11, 1, 13}, {12, 1, 13}, {5, 1, 7}, /* 0xc0 - 0xdf */ {9, 0, 9}, {9, 0, 9}, {9, 0, 9}, {9, 0, 9}, {9, 0, 9}, {9, 0, 9}, {12, 0, 13}, {7, 1, 9}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {2, 0, 3}, {2, 1, 3}, {5, -1, 3}, {3, 0, 3}, {9, 0, 10}, {8, 1, 10}, {8, 1, 10}, {8, 1, 10}, {8, 1, 10}, {8, 1, 10}, {8, 1, 10}, {7, 2, 11}, {8, 1, 10}, {8, 1, 10}, {8, 1, 10}, {8, 1, 10}, {8, 1, 10}, {7, 0, 7}, {6, 1, 8}, {6, 1, 8}, /* 0xe0 - 0xff */ {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {11, 1, 13}, {5, 1, 7}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {3, 0, 3}, {3, 1, 3}, {5, -1, 3}, {3, 0, 3}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {8, 1, 11}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {7, 0, 7}, {6, 1, 8}, {7, 0, 7} }; /**************************************************************************//** * Parses a unicode character value * * @param str String containing value * @return Resulting character value */ static unsigned int parse_ucode_name(const char *str) { unsigned int rv; if (toupper(str[0]) == 'U' && str[1] == '+') { char *hex = g_strdup(str); hex[0] = '0'; hex[1] = 'x'; rv = g_atoix(hex); g_free(hex); } else if (str[0] == '@') { rv = str[1]; } else { rv = g_atoix(str); } return rv; } /**************************************************************************//** * Parses the program args * * @param argc Passed to main * @param @argv Passed to main * @param pa program_pargs structure for resulting values * @return !=0 for success */ static int parse_program_args(int argc, char *argv[], struct program_args *pa) { int params_ok = 1; int opt; pa->input_file = NULL; pa->output_file = NULL; pa->font_name[0] = '\0'; pa->point_size = DEFAULT_POINT_SIZE; pa->max_ucode = DEFAULT_MAX_CHAR; pa->sans10_compatibility = S10_AUTO; while ((opt = getopt(argc, argv, "n:p:m:C:")) != -1) { switch (opt) { case 'n': g_snprintf(pa->font_name, FV1_MAX_FONT_NAME_SIZE + 1, "%s", optarg); break; case 'p': pa->point_size = g_atoi(optarg); break; case 'm': pa->max_ucode = parse_ucode_name(optarg); break; case 'C': if (toupper(optarg[0]) == 'A') { pa->sans10_compatibility = S10_AUTO; } else if (g_text2bool(optarg)) { pa->sans10_compatibility = S10_ON; } else { pa->sans10_compatibility = S10_OFF; } break; default: LOG(LOG_LEVEL_ERROR, "Unrecognised switch '%c'", (char)opt); params_ok = 0; } } if (pa->max_ucode < FV1_MIN_CHAR) { LOG(LOG_LEVEL_ERROR, "-m argument must be at least %d", FV1_MIN_CHAR); params_ok = 0; } switch (argc - optind) { case 0: LOG(LOG_LEVEL_ERROR, "No input file specified"); params_ok = 0; break; case 1: LOG(LOG_LEVEL_ERROR, "No output file specified"); params_ok = 0; break; case 2: pa->input_file = argv[optind]; pa->output_file = argv[optind + 1]; break; default: LOG(LOG_LEVEL_ERROR, "Unexpected arguments after output file"); params_ok = 0; } return params_ok; } /**************************************************************************//** * Checks whether the specified glyph row is blank * @param g Glyph * @param row Row number between 0 and g->height - 1 * @result Boolean */ static int is_blank_glyph_row(const struct fv1_glyph *g, unsigned int row) { if (g->width == 0 || row >= g->height) { return 1; } const unsigned int glyph_row_size = ((g->width + 7) / 8); const unsigned char *dataptr = g->data + (row * glyph_row_size); const unsigned int masks[] = { 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff }; /* Check for set pixels in all the leading bytes */ unsigned int x; for (x = g->width ; x > 8 ; x -= 8) { if (*dataptr++ != 0) { return 0; } } /* Use a single test to check the pixels in the last byte */ return ((*dataptr & masks[x - 1]) == 0); } /**************************************************************************//** * Returns a string for a freetype2 error * @param error Freetype2 error code * @param buff Pointer to buffer for error string * @param bufflen Length of above */ static void get_ft_error(FT_Error error, char *buff, unsigned int bufflen) { const char *errstr = NULL; unsigned int i; for (i = 0 ; i < (sizeof(ft_errors) / sizeof(ft_errors[0])); ++i) { if (ft_errors[i].err_code == error) { errstr = ft_errors[i].err_msg; break; } } if (errstr != NULL) { g_snprintf(buff, bufflen, "[%s]", errstr); } else { g_snprintf(buff, bufflen, "[errorcode %d (no description)]", (int)error); } } /**************************************************************************//** * Implement sans10 compatibility for a glyph * * The original Windows font generator made a few different choices for the * character x offset than freetype2 does. These are particularly noticeable * with a small font. * * This routine checks the glyph, and implements the original offset size * for popular English characters, which are all that the user will probably * be displaying with xrdp v0.9.x * * @param g Glyph to check */ static void implement_sans10_compatibility(struct fv1_glyph *g, unsigned int ucode) { const unsigned int max_index = sizeof(original_sans10_data) / sizeof(original_sans10_data[0]); if (ucode < FV1_MIN_CHAR || ucode >= max_index + FV1_MIN_CHAR) { return; } const struct x_dimensions *d = &original_sans10_data[ucode - FV1_MIN_CHAR]; if (g->offset != d->offset) { if (g->width != d->width) { LOG(LOG_LEVEL_WARNING, "Can't set compatibility offset for U+%04X: width %d != %d", ucode, g->width, d->width); } else if (g->inc_by != d->inc_by) { LOG(LOG_LEVEL_WARNING, "Can't set compatibility offset for U+%04X: inc_by %d != %d", ucode, g->inc_by, d->inc_by); } else { LOG(LOG_LEVEL_INFO, "Changing compatibility offset for U+%04X: from %d to %d", ucode, g->offset, d->offset); } g->offset = d->offset; } } /**************************************************************************//** * Converts a freetype 2 bitmap to a fv1 glyph * @param ft_glyph Freetype2 glyph. Must be a monochrome bitmap * @param ucode Unicode character for error reporting * @param pa Program args * @return fv1 glyph, or NULL for error */ static struct fv1_glyph * convert_mono_glyph(FT_GlyphSlot ft_glyph, unsigned int ucode, const struct program_args *pa) { short width = ft_glyph->bitmap.width; short height = ft_glyph->bitmap.rows; struct fv1_glyph *g; /* Number of bytes in a glyph row */ const unsigned int glyph_row_size = ((width + 7) / 8); if ((g = fv1_alloc_glyph(ucode, width, height)) != NULL) { g->baseline = -(ft_glyph->metrics.horiBearingY / 64); g->offset = ft_glyph->metrics.horiBearingX / 64; g->inc_by = ft_glyph->metrics.horiAdvance / 64; if (FONT_DATASIZE(g) > 0) { const unsigned char *srcptr = ft_glyph->bitmap.buffer; unsigned char *dstptr = g->data; unsigned int y; for (y = 0; y < g->height; ++y) { g_memcpy(dstptr, srcptr, glyph_row_size); dstptr += glyph_row_size; srcptr += ft_glyph->bitmap.pitch; } /* Optimise the glyph by removing any blank lines at the bottom * and top */ if (g->width > 0) { while (g->height > 0 && is_blank_glyph_row(g, g->height - 1)) { --g->height; } y = 0; while (y < g->height && is_blank_glyph_row(g, y)) { ++y; } if (y > 0) { g->baseline += y; g->height -= y; g_memmove(g->data, g->data + (y * glyph_row_size), g->height * glyph_row_size); } } } if (pa->sans10_compatibility != S10_OFF) { implement_sans10_compatibility(g, ucode); } } return g; } /**************************************************************************//** * Main * * @param argc Argument count * @param argv Arguments */ int main(int argc, char *argv[]) { FT_Library library = NULL; /* handle to library */ FT_Face face = NULL; /* handle to face object */ FT_Error error; struct fv1_glyph *g; struct program_args pa; struct log_config *logging; int rv = 1; logging = log_config_init_for_console(LOG_LEVEL_WARNING, g_getenv("MKFV1_LOG_LEVEL")); log_start_from_param(logging); log_config_free(logging); struct fv1_file *fv1 = fv1_file_create(); if (fv1 == NULL) { LOG(LOG_LEVEL_ERROR, "Memory allocation failure"); } else if (parse_program_args(argc, argv, &pa)) { char errstr[128]; if ((error = FT_Init_FreeType(&library)) != 0) { get_ft_error(error, errstr, sizeof(errstr)); LOG(LOG_LEVEL_ERROR, "Error initializing freetype library %s", errstr); } else if ((error = FT_New_Face(library, pa.input_file, 0, &face)) != 0) { get_ft_error(error, errstr, sizeof(errstr)); LOG(LOG_LEVEL_ERROR, "Error loading font file %s %s", pa.input_file, errstr); } else if ((error = FT_Set_Char_Size(face, 0, pa.point_size * 64, FV1_DEVICE_DPI, 0)) != 0) { get_ft_error(error, errstr, sizeof(errstr)); LOG(LOG_LEVEL_ERROR, "Error setting point size to %u %s", pa.point_size, errstr); } else { const char *fname = (pa.font_name[0] != '\0') ? pa.font_name : (face->family_name != NULL) ? face->family_name : /* Default */ ""; g_snprintf(fv1->font_name, FV1_MAX_FONT_NAME_SIZE + 1, "%s", fname); fv1->point_size = pa.point_size; fv1->body_height = face->size->metrics.height / 64; fv1->min_descender = face->size->metrics.descender / 64; if (pa.sans10_compatibility == S10_AUTO) { if (g_strcmp(fv1->font_name, "DejaVu Sans") == 0 && fv1->point_size == 10) { pa.sans10_compatibility = S10_ON; } else { pa.sans10_compatibility = S10_OFF; } } unsigned int u; for (u = FV1_MIN_CHAR; u <= pa.max_ucode; ++u) { /* retrieve glyph index from character code */ FT_UInt glyph_index = FT_Get_Char_Index(face, u); /* load glyph image into the slot (erase previous one) */ error = FT_Load_Glyph(face, glyph_index, FT_LOAD_RENDER | FT_LOAD_TARGET_MONO); if (error) { get_ft_error(error, errstr, sizeof(errstr)); LOG(LOG_LEVEL_WARNING, "Unable to get bitmap for U+%04X %s", u, errstr); g = NULL; } else if (face->glyph->format != FT_GLYPH_FORMAT_BITMAP || face->glyph->bitmap.pixel_mode != FT_PIXEL_MODE_MONO) { LOG(LOG_LEVEL_WARNING, "Internal error; U+%04X was not loaded as a bitmap", u); g = NULL; } else { g = convert_mono_glyph(face->glyph, u, &pa); } list_add_item(fv1->glyphs, (tintptr)g); } rv = fv1_file_save(fv1, pa.output_file); } } FT_Done_FreeType(library); fv1_file_free(fv1); log_end(); return rv; } ================================================ FILE: fontutils/windows/.gitignore ================================================ !Makefile ================================================ FILE: fontutils/windows/Makefile ================================================ OBJS = fontdump.obj os_calls.obj #CFLAGS = -O2 -I../common CFLAGS = -O2 -I../common -DUNICODE -D_UNICODE LDFLAGS = -W -efontdump.exe all: fontdump1 fontdump1: $(OBJS) $(CC) $(LDFLAGS) $(OBJS) clean: del $(OBJS) fontdump.exe *.tds os_calls.obj: ../common/os_calls.c $(CC) $(CFLAGS) -c ../common/os_calls.c ================================================ FILE: fontutils/windows/fontdump.c ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2012 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include "os_calls.h" #include "arch.h" static HINSTANCE g_instance = 0; static HWND g_wnd = 0; static HWND g_lb = 0; static HWND g_exit_button = 0; static HWND g_go_button = 0; static HWND g_font_list = 0; static char g_font_name[512] = ""; static int g_font_size = 10; static HFONT g_font = 0; static int g_running = 0; #define FONT_DATASIZE(_w, _h) (((_h * ((_w + 7) / 8)) + 3) & ~3) /*****************************************************************************/ int check_messages(void) { MSG msg; while (PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE)) { GetMessage(&msg, NULL, 0, 0); TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } /*****************************************************************************/ static int msg(char *msg1, ...) { va_list ap; char text1[512]; va_start(ap, msg1); vsnprintf(text1, 511, msg1, ap); SendMessageA(g_lb, LB_ADDSTRING, 0, (LPARAM)text1); va_end(ap); return 0; } /*****************************************************************************/ static int show_last_error(void) { LPVOID lpMsgBuf = NULL; DWORD len; len = FormatMessageA( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&lpMsgBuf, 0, NULL); if (len > 0) { msg("GetLastError - %s", lpMsgBuf); LocalFree(lpMsgBuf); } return 0; } /*****************************************************************************/ static int font_dump(void) { HDC dc; HDC dc1; RECT rect; HBRUSH brush; HGDIOBJ saved; HBITMAP bitmap; BITMAPINFO bi; char *bits; ABC abc; SIZE sz; char filename[256]; TCHAR text[256]; char zero1; char *bmtext; int bmtextindex; int fd; int x1; int strlen1; int index1; int index2; int len; int pixel; int red; int green; int blue; int width; int height; int roller; int outlen; tui8 b1; short x2; if (g_running) { return 0; } g_running = 1; msg("starting"); g_font_name[0] = 0; SendMessageA(g_font_list, WM_GETTEXT, 255, (LPARAM)g_font_name); if (g_strlen(g_font_name) == 0) { msg("error font not set"); g_running = 0; return 1; } dc = GetDC(g_wnd); height = -MulDiv(g_font_size, GetDeviceCaps(dc, LOGPIXELSY), 72); g_font = CreateFontA(height, 0, 0, 0, FW_DONTCARE, 0, 0, 0, 0, 0, 0, 0, 0, g_font_name); ReleaseDC(g_wnd, dc); if (g_font == 0) { msg("error - Font creation failed"); } zero1 = 0; g_snprintf(filename, 255, "%s-%d.fv1", g_font_name, g_font_size); msg("creating file %s", filename); g_file_delete(filename); fd = g_file_open_rw(filename); g_file_write(fd, "FNT1", 4); strlen1 = g_strlen(g_font_name); g_file_write(fd, g_font_name, strlen1); x1 = strlen1; while (x1 < 32) { g_file_write(fd, &zero1, 1); x1++; } x2 = g_font_size; /* font size */ g_file_write(fd, (char *)&x2, 2); x2 = 1; /* style */ g_file_write(fd, (char *)&x2, 2); /* pad */ index1 = 0; while (index1 < 8) { g_file_write(fd, &zero1, 1); index1++; } for (x1 = 32; x1 < 0x4e00; x1++) { check_messages(); dc = GetWindowDC(g_wnd); saved = SelectObject(dc, g_font); if (!GetCharABCWidths(dc, x1, x1, &abc)) { show_last_error(); } text[0] = (TCHAR)x1; text[1] = 0; if (!GetTextExtentPoint32(dc, text, 1, &sz)) { show_last_error(); } SelectObject(dc, saved); ReleaseDC(g_wnd, dc); if ((sz.cx > 0) && (sz.cy > 0)) { dc = GetWindowDC(g_wnd); saved = SelectObject(dc, g_font); SetBkColor(dc, RGB(255, 255, 255)); if (!ExtTextOut(dc, 50, 50, ETO_OPAQUE, 0, text, 1, 0)) { show_last_error(); } SelectObject(dc, saved); ReleaseDC(g_wnd, dc); Sleep(10); /* width */ x2 = abc.abcB; g_file_write(fd, (char *)&x2, 2); /* height */ x2 = sz.cy; g_file_write(fd, (char *)&x2, 2); /* baseline */ x2 = -sz.cy; g_file_write(fd, (char *)&x2, 2); /* offset */ x2 = abc.abcA; g_file_write(fd, (char *)&x2, 2); /* incby */ x2 = sz.cx; g_file_write(fd, (char *)&x2, 2); /* pad */ index1 = 0; while (index1 < 6) { g_file_write(fd, &zero1, 1); index1++; } dc = GetWindowDC(g_wnd); rect.left = 50 + abc.abcA; rect.top = 50; rect.right = rect.left + abc.abcB; rect.bottom = rect.top + sz.cy; memset(&bi, 0, sizeof(bi)); width = (abc.abcB + 7) & (~7); height = sz.cy; bi.bmiHeader.biSize = sizeof(bi.bmiHeader); bi.bmiHeader.biWidth = width; bi.bmiHeader.biHeight = height; bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biBitCount = 32; bitmap = CreateDIBSection(dc, &bi, DIB_RGB_COLORS, (void *)&bits, 0, 0); if (bitmap == 0) { msg("error - CreateDIBSection failed"); } else { memset(bits, 0, width * height * 4); dc1 = CreateCompatibleDC(dc); SelectObject(dc1, bitmap); if (!BitBlt(dc1, 0, 0, width, height, dc, rect.left, rect.top, SRCCOPY)) { show_last_error(); } bmtext = (char *)g_malloc(width * height + 16, 1); bmtextindex = 0; for (index1 = (height - 1); index1 >= 0; index1--) { for (index2 = 0; index2 < width; index2++) { pixel = ((int *)bits)[index1 * width + index2]; red = (pixel >> 16) & 0xff; green = (pixel >> 8) & 0xff; blue = (pixel >> 0) & 0xff; if (red == 0 && green == 0 && blue == 0) { bmtext[bmtextindex] = '1'; bmtextindex++; } else { bmtext[bmtextindex] = '0'; bmtextindex++; } } } outlen = 0; b1 = 0; roller = 0; len = g_strlen(bmtext); for (index2 = 0; index2 < len; index2++) { if (bmtext[index2] == '1') { switch (roller) { case 0: b1 = b1 | 0x80; break; case 1: b1 = b1 | 0x40; break; case 2: b1 = b1 | 0x20; break; case 3: b1 = b1 | 0x10; break; case 4: b1 = b1 | 0x08; break; case 5: b1 = b1 | 0x04; break; case 6: b1 = b1 | 0x02; break; case 7: b1 = b1 | 0x01; break; } } roller++; if (roller == 8) { roller = 0; g_file_write(fd, &b1, 1); outlen++; b1 = 0; } } while ((outlen % 4) != 0) { g_file_write(fd, &zero1, 1); outlen++; } free(bmtext); DeleteDC(dc1); DeleteObject(bitmap); } if (sz.cx != (long)(abc.abcA + abc.abcB + abc.abcC)) { msg("error - width not right 1"); } brush = CreateSolidBrush(RGB(255, 255, 255)); FillRect(dc, &rect, brush); DeleteObject(brush); ReleaseDC(g_wnd, dc); } else { /* write out a blank glyph here */ /* width */ x2 = 1; g_file_write(fd, (char *)&x2, 2); /* height */ x2 = 1; g_file_write(fd, (char *)&x2, 2); /* baseline */ x2 = 0; g_file_write(fd, (char *)&x2, 2); /* offset */ x2 = 0; g_file_write(fd, (char *)&x2, 2); /* incby */ x2 = 1; g_file_write(fd, (char *)&x2, 2); /* pad */ index1 = 0; while (index1 < 6) { g_file_write(fd, &zero1, 1); index1++; } /* blank bitmap */ index1 = 0; while (index1 < 4) { g_file_write(fd, &zero1, 1); index1++; } } } g_file_close(fd); msg("done"); g_running = 0; return 0; } /*****************************************************************************/ static LRESULT CALLBACK wnd_proc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HBRUSH brush; RECT rect; switch (message) { case WM_PAINT: BeginPaint(hWnd, &ps); brush = CreateSolidBrush(RGB(255, 255, 255)); rect = ps.rcPaint; FillRect(ps.hdc, &rect, brush); DeleteObject(brush); EndPaint(hWnd, &ps); break; case WM_CLOSE: DestroyWindow(g_wnd); g_wnd = 0; break; case WM_DESTROY: PostQuitMessage(0); break; case WM_TIMER: KillTimer(g_wnd, 1); font_dump(); break; case WM_COMMAND: if ((HWND)lParam == g_exit_button) { PostMessage(g_wnd, WM_CLOSE, 0, 0); } else if ((HWND)lParam == g_go_button) { while (SendMessage(g_lb, LB_GETCOUNT, 0, 0) > 0) { SendMessage(g_lb, LB_DELETESTRING, 0, 0); } SetTimer(g_wnd, 1, 1000, 0); } break; } return DefWindowProc(hWnd, message, wParam, lParam); } /*****************************************************************************/ static int create_window(void) { WNDCLASS wc; DWORD style; int left; int top; ZeroMemory(&wc, sizeof(wc)); wc.lpfnWndProc = wnd_proc; /* points to window procedure */ /* name of window class */ wc.lpszClassName = _T("fontdump"); wc.hCursor = LoadCursor(0, IDC_ARROW); /* Register the window class. */ if (!RegisterClass(&wc)) { return 0; /* Failed to register window class */ } style = WS_OVERLAPPED | WS_CAPTION | WS_POPUP | WS_MINIMIZEBOX | WS_SYSMENU | WS_SIZEBOX | WS_MAXIMIZEBOX; left = GetSystemMetrics(SM_CXSCREEN) / 2 - 640 / 2; top = GetSystemMetrics(SM_CYSCREEN) / 2 - 480 / 2; g_wnd = CreateWindow(wc.lpszClassName, _T("fontdump"), style, left, top, 640, 480, (HWND) NULL, (HMENU) NULL, g_instance, (LPVOID) NULL); style = WS_CHILD | WS_VISIBLE | WS_BORDER; g_lb = CreateWindow(_T("LISTBOX"), _T("LISTBOX1"), style, 200, 10, 400, 400, g_wnd, 0, g_instance, 0); style = WS_CHILD | WS_VISIBLE; g_exit_button = CreateWindow(_T("BUTTON"), _T("Exit"), style, 540, 410, 75, 25, g_wnd, 0, g_instance, 0); g_go_button = CreateWindow(_T("BUTTON"), _T("Go"), style, 440, 410, 75, 25, g_wnd, 0, g_instance, 0); style = WS_CHILD | WS_VISIBLE | CBS_DROPDOWN; g_font_list = CreateWindow(_T("COMBOBOX"), _T("COMBOBOX1"), style, 50, 250, 125, 125, g_wnd, 0, g_instance, 0); ShowWindow(g_wnd, SW_SHOWNORMAL); PostMessage(g_wnd, WM_SETFONT, (WPARAM)g_font, 0); SendMessageA(g_font_list, CB_ADDSTRING, 0, (LPARAM)"Tahoma"); SendMessageA(g_font_list, CB_ADDSTRING, 0, (LPARAM)"DejaVu Serif"); SendMessageA(g_font_list, CB_ADDSTRING, 0, (LPARAM)"DejaVu Sans"); SendMessageA(g_font_list, CB_ADDSTRING, 0, (LPARAM)"Arial"); SendMessageA(g_font_list, CB_ADDSTRING, 0, (LPARAM)"Comic Sans MS"); return 0; } /*****************************************************************************/ static int main_loop(void) { MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)(msg.wParam); } /*****************************************************************************/ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { g_instance = hInstance; create_window(); return main_loop(); } ================================================ FILE: genkeymap/Makefile.am ================================================ EXTRA_DIST = \ dump-keymaps.sh \ readme.txt AM_CPPFLAGS = \ -DXRDP_CFG_PATH=\"${sysconfdir}/${sysconfsubdir}\" \ -I$(top_srcdir)/common AM_CFLAGS = $(X_CFLAGS) bin_PROGRAMS = \ xrdp-genkeymap xrdp_genkeymap_SOURCES = genkeymap.c xrdp_genkeymap_LDFLAGS = \ $(X_LIBS) xrdp_genkeymap_LDADD = \ $(top_builddir)/common/libcommon.la \ $(X_PRE_LIBS) -lxkbfile -lX11 $(X_EXTRA_LIBS) ================================================ FILE: genkeymap/dump-keymaps.sh ================================================ #!/bin/sh # Use evdev rules to obtain the mappings XKB_RULES=evdev # ----------------------------------------------------------------------------- # K B G E N # # Generates a keyboard mapping # $1 - LCID (See [MS-LCID]) # $2 - Language tag (See [MS-LCID]) # $3 - Current operating system # $4.. Arguments to setxkbmap to select the required keyboard # ----------------------------------------------------------------------------- kbgen() { file=$(printf "../instfiles/km-%08s.toml" "$1" | tr ' ' '0') desc="$2" os="$3" shift 3 if ! setxkbmap "$@"; then echo "Failed to run setxkbmap $*" >&2 return 1 fi ./xrdp-genkeymap \ -c "Description: $desc" \ -c "Operating system: $os" \ "$file" } # ----------------------------------------------------------------------------- # M A I N # ----------------------------------------------------------------------------- # Run the keymap extraction in a clean X session if [ "$1" != _IN_XVFB_SESSION_ ]; then # All commands available? ok=1 for cmd in setxkbmap xvfb-run xauth; do if ! command -v $cmd >/dev/null then echo "Error. $cmd not found" >&2 ok= fi done if [ -z "$ok" ]; then exit 1 fi xvfb-run --auto-servernum --server-args="-noreset" "$0" _IN_XVFB_SESSION_ exit $? fi OLD_SETTINGS=$(setxkbmap -query -verbose 4 | sed "s/^\([a-z]\+\):\s*\(.*\)$/-\1 \2/;s/^-options/-option \"\" -option/;s/,/ -option /g" | xargs -d \\n) setxkbmap -rules "$XKB_RULES" # Assign NumLock to mod2 xmodmap -e "clear mod2" -e "add mod2 = Num_Lock" # Find the operating system if command -v hostnamectl >/dev/null; then os=$(hostnamectl status | sed -ne 's/^i *Operating[^:]*: *//p') fi if [ -z "$os" ] && command -v lsb_release -v >/dev/null; then os=$(lsb_release --description --short) fi if [ -z "$os" ]; then os="Unknown" fi kbgen 0405 "cs-CZ" "$os" -model pc105 -layout cz kbgen 0406 "da-DK" "$os" -model pc105 -layout dk kbgen 0407 "de-DE" "$os" -model pc104 -layout de kbgen 0409 "en-US" "$os" -model pc104 -layout us kbgen 10409 "en-US" "$os" -model pc104 -layout us -variant dvorak kbgen 60409 "en-US" "$os" -model pc104 -layout us -variant colemak kbgen 040a "es-ES_tradnl" "$os" -model pc105 -layout es kbgen 040b "fi-FI" "$os" -model pc105 -layout 'fi' kbgen 040c "fr-FR" "$os" -model pc105 -layout fr kbgen 040e "hu-HU" "$os" -model pc105 -layout hu kbgen 0410 "it-IT" "$os" -model pc104 -layout it kbgen 0411 "ja-JP" "$os" -model pc105 -layout jp -variant OADG109A kbgen 0412 "ko-KR" "$os" -model pc105 -layout kr kbgen 0414 "nb-NO" "$os" -model pc105 -layout no kbgen 0415 "pl-PL" "$os" -model pc104 -layout pl kbgen 0416 "pt-BR" "$os" -model pc105 -layout br kbgen 0419 "ru-RU" "$os" -model pc104 -layout ru kbgen 041d "sv-SE" "$os" -model pc104 -layout se kbgen 0424 "sl-SI" "$os" -model pc104 -layout si kbgen 0426 "lv-LV" "$os" -model pc104 -layout lv -variant ergonomic kbgen 10426 "lv-LV" "$os" -model pc104 -layout lv # 20426 Latvian(Standard) is symlinked to 10426 Latvian(QWERTY) elsewhere kbgen 0807 "de-CH" "$os" -model pc105 -layout ch kbgen 0809 "en-GB" "$os" -model pc105 -layout gb kbgen 080a "es-MX" "$os" -model pc105 -layout latam kbgen 080c "fr-BE" "$os" -model pc105 -layout be -variant oss kbgen 0813 "nl-BE" "$os" -model pc105 -layout be kbgen 0816 "pt-PT" "$os" -model pc104 -layout pt kbgen 100c "fr-CH" "$os" -model pc105 -layout ch -variant fr # Put keyboards which change options below the ones that don't to # prevent unexpected things happening to keypads, etc kbgen 19360409 "en-US" "$os" -model pc105 -layout us -variant dvp \ -option "" -option compose:102 -option caps:shift -option numpad:sg \ -option numpad:shift3 -option keypad:hex -option keypad:atm \ -option kpdl:semi -option lv3:ralt_alt # set back to entry settings # shellcheck disable=SC2086 setxkbmap ${OLD_SETTINGS} ================================================ FILE: genkeymap/genkeymap.c ================================================ /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * genkeymap.c * Copyright (C) Ádám Wallner 2008 * * You may redistribute it and/or modify it under the terms of the * GNU General Public License, as published by the Free Software * Foundation; either version 2 of the License, or (at your option) * any later version. * * main.cc is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with main.cc. If not, write to: * The Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301, USA Updated Jay Sorg 2009 cs Czech 0x405 de German 0x407 en-us US English 0x409 fr French 0x40c it Italian 0x410 br Portuguese (Brazil) 0x416 ru Russian 0x419 se Swedish 0x41d en-uk UK English 0x809 */ #if defined(HAVE_CONFIG_H) #include #endif #include #include #include #include #include #include #include #include #include #include "scancode.h" #include "xrdp_constants.h" // cppcheck doesn't always set this macro to something in double-quotes #if defined(__cppcheck__) #undef PACKAGE_VERSION #endif #if !defined(PACKAGE_VERSION) #define PACKAGE_VERSION "???" #endif #define NUM_STATES 9 #define KEYMAP_FILE_FORMAT_VERSION "2" // Scancodes affected by numlock #define IS_KEYPAD_SCANCODE(s) \ ((s) >= SCANCODE_MIN_NUMLOCK && (s) <= SCANCODE_MAX_NUMLOCK) #define MAX_COMMENTS 10 /** * Contains info about the current keyboard setting */ struct kbd_info { char *keycode_set; ///< See 'setxkbmap -v' char *rules; ///< See 'setxkbmap -query' char *model; ///< See 'setxkbmap -query' char *layout; ///< See 'setxkbmap -query' char *variant; ///< See 'setxkbmap -query' char *options; ///< See 'setxkbmap -query' (comma separated) }; /*****************************************************************************/ /** * Print brief info about program usage and exit * @param programname Unqualified name of program * @param status Exit status */ static void usage(const char *programname, int status) { fprintf(stderr, "Usage: %s [ -k keycode_set] [-c comment] [-c comment...]" " out_filename\n", programname); fprintf(stderr, "Example: %s -r evdev -c \"en-US pc104 keyboard\" ", programname); fprintf(stderr, XRDP_CFG_PATH "/km-00000409.toml\n"); exit(status); } /*****************************************************************************/ /** * Free a kbd_info struct * @param kbd_info struct to free. May be incomplete or NULL */ static void free_kbd_info(struct kbd_info *kbd_info) { if (kbd_info != NULL) { free(kbd_info->keycode_set); free(kbd_info->rules); free(kbd_info->model); free(kbd_info->layout); free(kbd_info->variant); free(kbd_info->options); free(kbd_info); } } /*****************************************************************************/ /** * Queries the X server to get information about the current keyboard * @param dpy X11 Display * @param programname Unqualified name of program * @return kbd_info struct, or NULL * * The structure may be incomplete if some data could not be obtained */ static struct kbd_info * get_kbd_info(Display *dpy, const char *programname) { struct kbd_info *kbd_info; char *rules; XkbRF_VarDefsRec vd; XkbDescPtr kbdesc = NULL; if ((kbd_info = (struct kbd_info *)malloc( sizeof(*kbd_info))) == NULL) { fprintf(stderr, "%s: Out of memory\n", programname); } else if ((kbdesc = XkbAllocKeyboard()) == NULL) { fprintf(stderr, "%s: unable to allocate keyboard desc\n", programname); free_kbd_info(kbd_info); kbd_info = NULL; } else if (XkbGetNames(dpy, XkbKeycodesNameMask, kbdesc) != Success) { fprintf(stderr, "%s: unable to obtain keycode name for keyboard\n", programname); free_kbd_info(kbd_info); kbd_info = NULL; } else { char *symatom = XGetAtomName(dpy, kbdesc->names->keycodes); kbd_info->keycode_set = strdup(symatom); XFree(symatom); if (XkbRF_GetNamesProp(dpy, &rules, &vd) == 0 || rules == NULL) { fprintf(stderr, "%s: Couldn't interpret %s property\n", programname, _XKB_RF_NAMES_PROP_ATOM); kbd_info->rules = NULL; kbd_info->model = NULL; kbd_info->layout = NULL; kbd_info->variant = NULL; kbd_info->options = NULL; } else { kbd_info->rules = rules; kbd_info->model = vd.model; kbd_info->layout = vd.layout; kbd_info->variant = vd.variant; kbd_info->options = vd.options; } } if (kbdesc != NULL) { XkbFreeKeyboard(kbdesc, 0, True); } return kbd_info; } /*****************************************************************************/ /** * Outputs a comment containing the last setxkbmap command * * @param outf Output file * @param kbd_info Keyboard info struct * */ static void output_setxkbmap_comment(FILE *outf, const struct kbd_info *kbd_info) { if (kbd_info->model != NULL || kbd_info->layout != NULL || kbd_info->variant != NULL || kbd_info->options != NULL) { fprintf(outf, "# setxkbmap -rules %s", kbd_info->rules); if (kbd_info->model != NULL) { fprintf(outf, " -model %s", kbd_info->model); } if (kbd_info->layout != NULL) { fprintf(outf, " -layout %s", kbd_info->layout); } if (kbd_info->variant != NULL) { fprintf(outf, " -variant %s", kbd_info->variant); } if (kbd_info->options != NULL) { // Options is comma-separated, but to achieve the same effect // with the command we need to use multiple '-option' args char *optionstr = strdup(kbd_info->options); if (optionstr != NULL) { char *p = strtok(optionstr, ","); fprintf(outf, " -option \"\""); while (p != NULL) { fprintf(outf, " -option %s", p); p = strtok(NULL, ","); } free(optionstr); } } putc('\n', outf); } } /*****************************************************************************/ /** * Output a section of the keymap file * @param outf Output file * @param dpy X display * @param section_name name Section name (e.g. 'shift') * @param event_state Modifier state needed for XKeyPressedEvent */ static void output_file_section(FILE *outf, Display *dpy, const char *section_name, unsigned int event_state) { XKeyPressedEvent e = { .type = KeyPress, .serial = 16, .send_event = True, .display = dpy, .state = event_state, .same_screen = True }; int char_count; int nbytes = 0; int unicode; KeySym ks; const char *ksstr; unsigned short scancode; unsigned int iter = 0; char text[256]; wchar_t wtext[256]; int is_numlock_section = (strcmp(section_name, "numlock") == 0); fprintf(outf, "\n[%s]\n", section_name); while ((scancode = scancode_get_next(&iter)) != 0) { // Numlock state table can be very small if (is_numlock_section && !IS_KEYPAD_SCANCODE(scancode)) { continue; } e.keycode = scancode_to_x11_keycode(scancode); nbytes = XLookupString(&e, text, 255, &ks, NULL); if (ks == NoSymbol) { continue; } ksstr = XKeysymToString(ks); if (ksstr == NULL) { continue; } text[nbytes] = 0; char_count = mbstowcs(wtext, text, 255); unicode = 0; if (char_count == 1) { unicode = wtext[0]; } if (scancode > 0x1ff) { fputs("E1_", outf); } else if (scancode > 0xff) { fputs("E0_", outf); } fprintf(outf, "%02X=\"%d", (scancode & 0xff), (int)ks); if (unicode != 0) { fprintf(outf, ":U+%04X", unicode); } fprintf(outf, "\" # %s\n", ksstr); } } /*****************************************************************************/ /** * Determine is caps-lock is supported. Some layouts (e.g. Colemak) do not * support this key. * * @param dpy X display * @return boolean */ static int is_caps_lock_supported(Display *dpy) { char dummy[4]; KeySym ks; XKeyPressedEvent e = { .type = KeyPress, .serial = 16, .send_event = True, .display = dpy, .state = 0, .keycode = scancode_to_x11_keycode(SCANCODE_CAPS_KEY), .same_screen = True }; (void)XLookupString(&e, dummy, sizeof(dummy), &ks, NULL); return (ks == XK_Caps_Lock || ks == XK_Eisu_toggle); } /*****************************************************************************/ /** * Main * @param argc Argument count * @param argv Pointers to arguments * @return 0 for success */ int main(int argc, char **argv) { const char *programname; int opt; char *displayname = NULL; char *outfname; const char *sections[NUM_STATES] = { "noshift", "shift", "altgr", "shiftaltgr", "capslock", "capslockaltgr", "shiftcapslock", "shiftcapslockaltgr", "numlock" }; const int states[NUM_STATES] = {0, 1, 0x80, 0x81, 2, 0x82, 3, 0x83, 0x10}; int idx; Display *dpy = NULL; FILE *outf = NULL; const char *comment[MAX_COMMENTS] = {0}; int comment_count = 0; const char *keycode_set = NULL; struct kbd_info *kbd_info = NULL; int status = 1; int caps_lock_supported; setlocale(LC_CTYPE, ""); if (strrchr(argv[0], '/') != NULL) { programname = strrchr(argv[0], '/') + 1; } else { programname = argv[0]; } while ((opt = getopt(argc, argv, "c:k:")) != -1) { switch (opt) { case 'c': if (comment_count < MAX_COMMENTS) { comment[comment_count++] = optarg; } break; case 'k': keycode_set = optarg; break; default: /* '?' */ usage(programname, 1); } } if ((optind + 1) != argc) { usage(programname, 1); } outfname = argv[optind]; dpy = XOpenDisplay(displayname); if (!dpy) { fprintf(stderr, "%s: unable to open display '%s'\n", programname, XDisplayName(displayname)); goto finish; } if ((kbd_info = get_kbd_info(dpy, programname)) == 0) { // An error has already been logged goto finish; } // If the keycode set isn't specified, use the one returned // by the XKB extension if (keycode_set == NULL) { keycode_set = kbd_info->keycode_set; } if (scancode_set_keycode_set(keycode_set) != 0) { fprintf(stderr, "%s: keycode set '%s' is not recognised\n", programname, keycode_set); goto finish; } if ((outf = fopen(outfname, "w")) == NULL) { fprintf(stderr, "%s: unable to create file '%s'\n", programname, outfname); goto finish; } caps_lock_supported = is_caps_lock_supported(dpy); fprintf(outf, "# Created by %s V" PACKAGE_VERSION "\n# Key code set: %s\n", programname, keycode_set); output_setxkbmap_comment(outf, kbd_info); for (idx = 0; idx < comment_count; ++idx) { fprintf(outf, "# %s\n", comment[idx]); } fprintf(outf, "\n[General]\nversion=" KEYMAP_FILE_FORMAT_VERSION "\n"); fprintf(outf, "caps_lock_supported=%s\n", (caps_lock_supported) ? "true" : "false"); for (idx = 0; idx < NUM_STATES; idx++) /* Sections and states */ { int mod_state = states[idx]; if (!caps_lock_supported && ((mod_state & 2) != 0)) { // Skip this section as it's for caps lock continue; } output_file_section(outf, dpy, sections[idx], mod_state); } status = 0; // Successful run finish: free_kbd_info(kbd_info); if (dpy != NULL) { XCloseDisplay(dpy); } if (outf != NULL) { fclose(outf); } return status; } ================================================ FILE: genkeymap/readme.txt ================================================ Keymap file description ----------------------- The keymap files are used by the xrdp login screen, and also when sending keyboard input to a VNC server. The names of the files are of the format; km-xxxxxxxx.toml where the xxxxxxxx is replaced by the hex number of the layout of interest. The contents of the files are documented in xrdp-km.toml(5) See also xrdp-genkeymap(8) which describes the utility used to generate these files. Creating a new file ------------------- To create a new file:- 1) Start an X server 2) Use the 'setxkbmap' command to get the keyboard configured for the X server. 3) Run the 'xrdp-genkeymap' command to extract the keyboard mappings Example: ./xrdp-genkeymap ./km-00000409.toml 4) Copy the generated file to /etc/xrdp/ Using the X server of your current session may not be a good idea, as session and window managers can interfere with key bindings. A good option is to use an 'Xvfb' dummy X server to do this. Getting a file added to xrdp ---------------------------- The file dump-keymaps.sh in this directory is used to auto-generate all keymap files. It runs on Linux currently, but will generate keymap files suitable for any xrdp platform. 1) Add a line towards the end of this file which causes your mapping to be generated. Use the other lines in this file as a guide. 2) Run the dump-keymaps.sh script to generate a new file in instfiles/ 3) Add your mapping to the list in instfiless/Makefile.am 4) Submit a pull request to the project containing the above three changes. ================================================ FILE: instfiles/Makefile.am ================================================ EXTRA_DIST = \ keymap-names.txt \ xrdp-sesman.service.in \ xrdp.service.in # # substitute directories in service file # CLEANFILES= \ xrdp-sesman.service \ xrdp.service SUBST_VARS = sed \ -e 's|@sbindir[@]|$(sbindir)|g' \ -e 's|@sysconfdir[@]|$(sysconfdir)|g' \ -e 's|@sysconfsubdir[@]|$(sysconfsubdir)|g' \ -e 's|@localstatedir[@]|$(localstatedir)|g' subst_verbose = $(subst_verbose_@AM_V@) subst_verbose_ = $(subst_verbose_@AM_DEFAULT_V@) subst_verbose_0 = @echo " SUBST $@"; SUFFIXES = .in .in: $(subst_verbose)$(SUBST_VARS) $< > $@ # # files for all platforms # startscriptdir=$(sysconfdir)/$(sysconfsubdir) dist_startscript_DATA = \ km-00000405.toml \ km-00000406.toml \ km-00000407.toml \ km-00000409.toml \ km-0000040a.toml \ km-0000040b.toml \ km-0000040c.toml \ km-0000040e.toml \ km-00000410.toml \ km-00000411.toml \ km-00000412.toml \ km-00000414.toml \ km-00000415.toml \ km-00000416.toml \ km-00000419.toml \ km-0000041d.toml \ km-00000424.toml \ km-00000426.toml \ km-00010426.toml \ km-00000807.toml \ km-00000809.toml \ km-0000080a.toml \ km-0000080c.toml \ km-00000813.toml \ km-00000816.toml \ km-0000100c.toml \ km-00010409.toml \ km-00060409.toml \ km-19360409.toml # # platform specific files # SUBDIRS = if LINUX SUBDIRS += \ pam.d \ pulse if HAVE_SYSTEMD systemdsystemunit_DATA = \ xrdp-sesman.service \ xrdp.service else SUBDIRS += \ default \ init.d endif # HAVE_SYSTEMD endif # LINUX if FREEBSD SUBDIRS += \ pam.d \ rc.d \ pulse endif if MACOS SUBDIRS += pam.d endif # # install-data-hook # TODO: subst these directories as well as service files # # must be tabs below # Note the section to soft-link keyboard files which share a definition install-data-hook: if LINUX if [ -f $(DESTDIR)$(sysconfdir)/init.d/xrdp ]; then \ sed -i 's|__BASE__|$(prefix)|' $(DESTDIR)$(sysconfdir)/init.d/xrdp; \ fi endif if FREEBSD sed -e 's|%%PREFIX%%|$(prefix)|g' \ -e 's|%%LOCALSTATEDIR%%|$(localstatedir)|g' \ -i '' \ $(DESTDIR)$(sysconfdir)/rc.d/xrdp \ $(DESTDIR)$(sysconfdir)/rc.d/xrdp-sesman endif (cd $(DESTDIR)${startscriptdir} && \ $(LN_S) km-00010426.toml km-00020426.toml) ================================================ FILE: instfiles/default/Makefile.am ================================================ startscriptdir = $(sysconfdir)/default dist_startscript_DATA = xrdp ================================================ FILE: instfiles/default/xrdp ================================================ # Do we need to start sesman ? SESMAN_START=yes # Do we restart xrdp on upgrade ? If not set to no, any xrdp session will # be shutdown on upgrade. # RESTART_ON_UPGRADE=no ================================================ FILE: instfiles/init.d/Makefile.am ================================================ startscriptdir = $(sysconfdir)/init.d dist_startscript_SCRIPTS = xrdp ================================================ FILE: instfiles/init.d/xrdp ================================================ #!/bin/sh -e # # start/stop xrdp and sesman daemons # ### BEGIN INIT INFO # Provides: xrdp # Required-Start: $network $remote_fs # Required-Stop: $network $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start xrdp and sesman daemons # Description: XRDP uses the Remote Desktop Protocol to present a # graphical login to a remote client allowing connection # to a VNC server or another RDP server. ### END INIT INFO PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin BASE=__BASE__ DAEMON=${BASE}/sbin/xrdp SDAEMON=${BASE}/sbin/xrdp-sesman PIDDIR=/var/run/ SESMAN_START=yes #USERID=xrdp # the X11rdp backend only works as root at the moment - GH 20/03/2013 USERID=root NAME=xrdp DESC="Remote Desktop Protocol server" test -x $DAEMON || exit 0 . /lib/lsb/init-functions check_root() { if [ "$(id -u)" != "0" ]; then log_failure_msg "You must be root to start, stop or restart $NAME." exit 4 fi } force_stop() { DELAY=1 PROCLIST="xrdp-sesman xrdp-sessvc xrdp-chansrv X11rdp Xvnc" for p in $PROCLIST; do pgrep -x $p >/dev/null && pkill -x $p sleep $DELAY pgrep -x $p >/dev/null && pkill -9 -x $p done # let's not kill ourselves - the init script is called xrdp as well pgrep -fx $DAEMON >/dev/null && pkill -fx $DAEMON sleep $DELAY pgrep -fx $DAEMON >/dev/null && pkill -9 -fx $DAEMON rm -f $PIDDIR/xrdp*.pid } if [ -r /etc/default/$NAME ]; then . /etc/default/$NAME fi # Tasks that can only be run as root if [ "$(id -u)" = "0" ]; then # Check for pid dir if [ ! -d $PIDDIR ] ; then mkdir $PIDDIR fi chown $USERID:$USERID $PIDDIR fi case "$1" in start) check_root exitval=0 log_daemon_msg "Starting $DESC " if pidofproc -p $PIDDIR/$NAME.pid $DAEMON > /dev/null; then log_progress_msg "$NAME apparently already running" log_end_msg 0 exit 0 fi log_progress_msg $NAME start-stop-daemon --start --quiet --oknodo --pidfile $PIDDIR/$NAME.pid \ --chuid $USERID:$USERID --exec $DAEMON >/dev/null exitval=$? if [ "$SESMAN_START" = "yes" ] ; then log_progress_msg "sesman" start-stop-daemon --start --quiet --oknodo --pidfile $PIDDIR/xrdp-sesman.pid \ --exec $SDAEMON >/dev/null value=$? [ $value -gt 0 ] && exitval=$value fi # Make pidfile readable for all users (for status to work) [ -e $PIDDIR/xrdp-sesman.pid ] && chmod 0644 $PIDDIR/xrdp-sesman.pid [ -e $PIDDIR/$NAME.pid ] && chmod 0644 $PIDDIR/$NAME.pid # Note: Unfortunately, xrdp currently takes too long to create # the pidfile unless properly patched log_end_msg $exitval ;; stop) check_root [ -n "$XRDP_UPGRADE" -a "$RESTART_ON_UPGRADE" = "no" ] && { echo "Upgrade in progress, no restart of xrdp." exit 0 } exitval=0 log_daemon_msg "Stopping RDP Session manager " log_progress_msg "sesman" if pidofproc -p $PIDDIR/xrdp-sesman.pid $SDAEMON > /dev/null; then start-stop-daemon --stop --quiet --oknodo --pidfile $PIDDIR/xrdp-sesman.pid \ --chuid $USERID:$USERID --exec $SDAEMON exitval=$? else log_progress_msg "apparently not running" fi log_progress_msg $NAME if pidofproc -p $PIDDIR/$NAME.pid $DAEMON > /dev/null; then start-stop-daemon --stop --quiet --oknodo --pidfile $PIDDIR/$NAME.pid \ --remove-pidfile --exec $DAEMON value=$? [ $value -gt 0 ] && exitval=$value else log_progress_msg "apparently not running" fi log_end_msg $exitval ;; force-stop) $0 stop # because it doesn't always die the right way force_stop ;; restart|force-reload) check_root $0 stop # Wait for things to settle down sleep 1 $0 start ;; reload) log_warning_msg "Reloading $NAME daemon: not implemented, as the daemon" log_warning_msg "cannot re-read the config file (use restart)." ;; status) exitval=0 log_daemon_msg "Checking status of $DESC" "$NAME" if pidofproc -p $PIDDIR/$NAME.pid $DAEMON > /dev/null; then log_progress_msg "running" log_end_msg 0 else log_progress_msg "apparently not running" log_end_msg 1 || true exitval=1 fi if [ "$SESMAN_START" = "yes" ] ; then log_daemon_msg "Checking status of RDP Session Manager" "sesman" if pidofproc -p $PIDDIR/xrdp-sesman.pid $SDAEMON > /dev/null; then log_progress_msg "running" log_end_msg 0 else log_progress_msg "apparently not running" log_end_msg 1 || true exitval=1 fi fi exit $exitval ;; *) N=/etc/init.d/$NAME echo "Usage: $N {start|stop|force-stop|restart|force-reload|status}" >&2 exit 1 ;; esac exit 0 ================================================ FILE: instfiles/keymap-names.txt ================================================ 0x00000436 af Afrikaans 0x0000041C sq Albanian 0x00000001 ar Arabic 0x00000401 ar-sa Arabic (Saudi Arabia) 0x00000801 ar-iq Arabic (Iraq) 0x00000C01 ar-eg Arabic (Egypt) 0x00001001 ar-ly Arabic (Libya) 0x00001401 ar-dz Arabic (Algeria) 0x00001801 ar-ma Arabic (Morocco) 0x00001C01 ar-tn Arabic (Tunisia) 0x00002001 ar-om Arabic (Oman) 0x00002401 ar-ye Arabic (Yemen) 0x00002801 ar-sy Arabic (Syria) 0x00002C01 ar-jo Arabic (Jordan) 0x00003001 ar-lb Arabic (Lebanon) 0x00003401 ar-kw Arabic (Kuwait) 0x00003801 ar-ae Arabic (U.A.E.) 0x00003C01 ar-bh Arabic (Bahrain) 0x00004001 ar-qa Arabic (Qatar) 0x0000042D eu Basque 0x00000402 bg Bulgarian 0x00000423 be Belarusian 0x00000403 ca Catalan 0x00000004 zh Chinese 0x00000404 zh-tw Chinese (Taiwan) 0x00000804 zh-cn Chinese (China) 0x00000C04 zh-hk Chinese (Hong Kong SAR) 0x00001004 zh-sg Chinese (Singapore) 0x0000041A hr Croatian 0x00000405 cs Czech 0x00000406 da Danish 0x00000413 nl Dutch (Netherlands) 0x00000813 nl-be Dutch (Belgium) 0x00000009 en English 0x00000409 en-us English (United States) 0x00000809 en-gb English (United Kingdom) 0x00000C09 en-au English (Australia) 0x00001009 en-ca English (Canada) 0x00001409 en-nz English (New Zealand) 0x00001809 en-ie English (Ireland) 0x00001C09 en-za English (South Africa) 0x00002009 en-jm English (Jamaica) 0x00002809 en-bz English (Belize) 0x00002C09 en-tt English (Trinidad) 0x00000425 et Estonian 0x00000438 fo Faeroese 0x00000429 fa Farsi 0x0000040B fi Finnish 0x0000040C fr French (France) 0x0000080C fr-be French (Belgium) 0x00000C0C fr-ca French (Canada) 0x0000100C fr-ch French (Switzerland) 0x0000140C fr-lu French (Luxembourg) 0x0000043C gd Gaelic 0x00000407 de German (Germany) 0x00000807 de-ch German (Switzerland) 0x00000C07 de-at German (Austria) 0x00001007 de-lu German (Luxembourg) 0x00001407 de-li German (Liechtenstein) 0x00000408 el Greek 0x0000040D he Hebrew 0x00000439 hi Hindi 0x0000040E hu Hungarian 0x0000040F is Icelandic 0x00000421 in Indonesian 0x00000410 it Italian (Italy) 0x00000810 it-ch Italian (Switzerland) 0x00000411 ja Japanese 0x00000412 ko Korean 0x00000426 lv Latvian 0x00000427 lt Lithuanian 0x0000042F mk FYRO Macedonian 0x0000043E ms Malay (Malaysia) 0x0000043A mt Maltese 0x00000414 no Norwegian (Bokmal) 0x00000814 no Norwegian (Nynorsk) 0x00000415 pl Polish 0x00000416 pt-br Portuguese (Brazil) 0x00000816 pt Portuguese (Portugal) 0x00000417 rm Rhaeto-Romanic 0x00000418 ro Romanian 0x00000818 ro-mo Romanian (Moldova) 0x00000419 ru Russian 0x00000819 ru-mo Russian (Moldova) 0x00000C1A sr Serbian (Cyrillic) 0x0000081A sr Serbian (Latin) 0x0000041B sk Slovak 0x00000424 sl Slovenian 0x0000042E sb Sorbian 0x0000040A es Spanish (Traditional Sort) 0x0000080A es-mx Spanish (Mexico) 0x00000C0A es Spanish (International Sort) 0x0000100A es-gt Spanish (Guatemala) 0x0000140A es-cr Spanish (Costa Rica) 0x0000180A es-pa Spanish (Panama) 0x00001C0A es-do Spanish (Dominican Republic) 0x0000200A es-ve Spanish (Venezuela) 0x0000240A es-co Spanish (Colombia) 0x0000280A es-pe Spanish (Peru) 0x00002C0A es-ar Spanish (Argentina) 0x0000300A es-ec Spanish (Ecuador) 0x0000340A es-cl Spanish (Chile) 0x0000380A es-uy Spanish (Uruguay) 0x00003C0A es-py Spanish (Paraguay) 0x0000400A es-bo Spanish (Bolivia) 0x0000440A es-sv Spanish (El Salvador) 0x0000480A es-hn Spanish (Honduras) 0x00004C0A es-ni Spanish (Nicaragua) 0x0000500A es-pr Spanish (Puerto Rico) 0x00000430 sx Sutu 0x0000041D sv Swedish 0x0000081D sv-fi Swedish (Finland) 0x0000041E th Thai 0x00000431 ts Tsonga 0x00000432 tn Tswana 0x0000041F tr Turkish 0x00000422 uk Ukrainian 0x00000420 ur Urdu 0x0000042A vi Vietnamese 0x00000434 xh Xhosa 0x0000043D ji Yiddish 0x00000435 zu Zulu ================================================ FILE: instfiles/km-00000405.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwertz) # setxkbmap -rules evdev -model pc105 -layout cz # Description: cs-CZ # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="43:U+002B" # plus 03="492:U+011B" # ecaron 04="441:U+0161" # scaron 05="488:U+010D" # ccaron 06="504:U+0159" # rcaron 07="446:U+017E" # zcaron 08="253:U+00FD" # yacute 09="225:U+00E1" # aacute 0A="237:U+00ED" # iacute 0B="233:U+00E9" # eacute 0C="61:U+003D" # equal 0D="65105:U+00B4" # dead_acute 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="122:U+007A" # z 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="250:U+00FA" # uacute 1B="41:U+0029" # parenright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="505:U+016F" # uring 28="167:U+00A7" # section 29="59:U+003B" # semicolon 2A="65505" # Shift_L 2B="65111:U+00A8" # dead_diaeresis 2C="121:U+0079" # y 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="92:U+005C" # backslash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="37:U+0025" # percent 0D="65114:U+02C7" # dead_caron 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="90:U+005A" # Z 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="47:U+002F" # slash 1B="40:U+0028" # parenleft 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="34:U+0022" # quotedbl 28="33:U+0021" # exclam 29="65112:U+00B0" # dead_abovering 2A="65505" # Shift_L 2B="39:U+0027" # apostrophe 2C="89:U+0059" # Y 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="63:U+003F" # question 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="94:U+005E" # asciicircum 08="38:U+0026" # ampersand 09="42:U+002A" # asterisk 0A="123:U+007B" # braceleft 0B="125:U+007D" # braceright 0C="92:U+005C" # backslash 0D="65108:U+00AF" # dead_macron 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="92:U+005C" # backslash 11="124:U+007C" # bar 12="8364:U+20AC" # EuroSign 13="182:U+00B6" # paragraph 14="956:U+0167" # tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="248:U+00F8" # oslash 19="254:U+00FE" # thorn 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="126:U+007E" # asciitilde 1F="496:U+0111" # dstroke 20="464:U+0110" # Dstroke 21="91:U+005B" # bracketleft 22="93:U+005D" # bracketright 23="96:U+0060" # grave 24="39:U+0027" # apostrophe 25="435:U+0142" # lstroke 26="419:U+0141" # Lstroke 27="36:U+0024" # dollar 28="39:U+0027" # apostrophe 29="96:U+0060" # grave 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="176:U+00B0" # degree 2D="35:U+0023" # numbersign 2E="38:U+0026" # ampersand 2F="64:U+0040" # at 30="123:U+007B" # braceleft 31="125:U+007D" # braceright 32="94:U+005E" # asciicircum 33="60:U+003C" # less 34="62:U+003E" # greater 35="42:U+002A" # asterisk 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="47:U+002F" # slash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="65107:U+007E" # dead_tilde 03="65114:U+02C7" # dead_caron 04="65106:U+005E" # dead_circumflex 05="65109:U+02D8" # dead_breve 06="65112:U+00B0" # dead_abovering 07="65116:U+02DB" # dead_ogonek 08="65104:U+0060" # dead_grave 09="65110:U+02D9" # dead_abovedot 0A="65105:U+00B4" # dead_acute 0B="65113:U+02DD" # dead_doubleacute 0C="65111:U+00A8" # dead_diaeresis 0D="65115:U+00B8" # dead_cedilla 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="419:U+0141" # Lstroke 12="69:U+0045" # E 13="174:U+00AE" # registered 14="940:U+0166" # Tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="216:U+00D8" # Oslash 19="222:U+00DE" # THORN 1A="247:U+00F7" # division 1B="215:U+00D7" # multiply 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="198:U+00C6" # AE 1F="167:U+00A7" # section 20="208:U+00D0" # ETH 21="170:U+00AA" # ordfeminine 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="419:U+0141" # Lstroke 27="65113:U+02DD" # dead_doubleacute 28="223:U+00DF" # ssharp 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="124:U+007C" # bar 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="78:U+004E" # N 32="186:U+00BA" # masculine 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="43:U+002B" # plus 03="460:U+011A" # Ecaron 04="425:U+0160" # Scaron 05="456:U+010C" # Ccaron 06="472:U+0158" # Rcaron 07="430:U+017D" # Zcaron 08="221:U+00DD" # Yacute 09="193:U+00C1" # Aacute 0A="205:U+00CD" # Iacute 0B="201:U+00C9" # Eacute 0C="61:U+003D" # equal 0D="65105:U+00B4" # dead_acute 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="90:U+005A" # Z 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="218:U+00DA" # Uacute 1B="41:U+0029" # parenright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="473:U+016E" # Uring 28="167:U+00A7" # section 29="59:U+003B" # semicolon 2A="65505" # Shift_L 2B="65111:U+00A8" # dead_diaeresis 2C="89:U+0059" # Y 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="92:U+005C" # backslash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="94:U+005E" # asciicircum 08="38:U+0026" # ampersand 09="42:U+002A" # asterisk 0A="123:U+007B" # braceleft 0B="125:U+007D" # braceright 0C="92:U+005C" # backslash 0D="65108:U+00AF" # dead_macron 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="92:U+005C" # backslash 11="124:U+007C" # bar 12="8364:U+20AC" # EuroSign 13="182:U+00B6" # paragraph 14="940:U+0166" # Tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="216:U+00D8" # Oslash 19="222:U+00DE" # THORN 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="126:U+007E" # asciitilde 1F="464:U+0110" # Dstroke 20="464:U+0110" # Dstroke 21="91:U+005B" # bracketleft 22="93:U+005D" # bracketright 23="96:U+0060" # grave 24="39:U+0027" # apostrophe 25="419:U+0141" # Lstroke 26="419:U+0141" # Lstroke 27="36:U+0024" # dollar 28="39:U+0027" # apostrophe 29="96:U+0060" # grave 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="176:U+00B0" # degree 2D="35:U+0023" # numbersign 2E="38:U+0026" # ampersand 2F="64:U+0040" # at 30="123:U+007B" # braceleft 31="125:U+007D" # braceright 32="94:U+005E" # asciicircum 33="60:U+003C" # less 34="62:U+003E" # greater 35="42:U+002A" # asterisk 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="47:U+002F" # slash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="37:U+0025" # percent 0D="65114:U+02C7" # dead_caron 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="122:U+007A" # z 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="47:U+002F" # slash 1B="40:U+0028" # parenleft 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="34:U+0022" # quotedbl 28="33:U+0021" # exclam 29="65112:U+00B0" # dead_abovering 2A="65505" # Shift_L 2B="39:U+0027" # apostrophe 2C="121:U+0079" # y 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="63:U+003F" # question 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="65107:U+007E" # dead_tilde 03="65114:U+02C7" # dead_caron 04="65106:U+005E" # dead_circumflex 05="65109:U+02D8" # dead_breve 06="65112:U+00B0" # dead_abovering 07="65116:U+02DB" # dead_ogonek 08="65104:U+0060" # dead_grave 09="65110:U+02D9" # dead_abovedot 0A="65105:U+00B4" # dead_acute 0B="65113:U+02DD" # dead_doubleacute 0C="65111:U+00A8" # dead_diaeresis 0D="65115:U+00B8" # dead_cedilla 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="419:U+0141" # Lstroke 12="69:U+0045" # E 13="174:U+00AE" # registered 14="956:U+0167" # tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="248:U+00F8" # oslash 19="254:U+00FE" # thorn 1A="247:U+00F7" # division 1B="215:U+00D7" # multiply 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="198:U+00C6" # AE 1F="167:U+00A7" # section 20="208:U+00D0" # ETH 21="170:U+00AA" # ordfeminine 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="419:U+0141" # Lstroke 27="65113:U+02DD" # dead_doubleacute 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="124:U+007C" # bar 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="78:U+004E" # N 32="186:U+00BA" # masculine 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65454:U+002E" # KP_Decimal ================================================ FILE: instfiles/km-00000406.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwerty) # setxkbmap -rules evdev -model pc105 -layout dk # Description: da-DK # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="43:U+002B" # plus 0D="65105:U+00B4" # dead_acute 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="229:U+00E5" # aring 1B="65111:U+00A8" # dead_diaeresis 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="230:U+00E6" # ae 28="248:U+00F8" # oslash 29="189:U+00BD" # onehalf 2A="65505" # Shift_L 2B="39:U+0027" # apostrophe 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="35:U+0023" # numbersign 05="164:U+00A4" # currency 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="47:U+002F" # slash 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="61:U+003D" # equal 0C="63:U+003F" # question 0D="65104:U+0060" # dead_grave 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="197:U+00C5" # Aring 1B="65106:U+005E" # dead_circumflex 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="198:U+00C6" # AE 28="216:U+00D8" # Oslash 29="167:U+00A7" # section 2A="65505" # Shift_L 2B="42:U+002A" # asterisk 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="64:U+0040" # at 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="189:U+00BD" # onehalf 07="165:U+00A5" # yen 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="177:U+00B1" # plusminus 0D="124:U+007C" # bar 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="64:U+0040" # at 11="435:U+0142" # lstroke 12="8364:U+20AC" # EuroSign 13="174:U+00AE" # registered 14="254:U+00FE" # thorn 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="5053:U+0153" # oe 19="254:U+00FE" # thorn 1A="65111:U+00A8" # dead_diaeresis 1B="65107:U+007E" # dead_tilde 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="170:U+00AA" # ordfeminine 1F="223:U+00DF" # ssharp 20="240:U+00F0" # eth 21="496:U+0111" # dstroke 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="435:U+0142" # lstroke 27="65105:U+00B4" # dead_acute 28="65106:U+005E" # dead_circumflex 29="190:U+00BE" # threequarters 2A="65505" # Shift_L 2B="65113:U+02DD" # dead_doubleacute 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="169:U+00A9" # copyright 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="110:U+006E" # n 32="181:U+00B5" # mu 33="65115:U+00B8" # dead_cedilla 34="183:U+00B7" # periodcentered 35="65120" # dead_belowdot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="92:U+005C" # backslash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="185:U+00B9" # onesuperior 03="178:U+00B2" # twosuperior 04="179:U+00B3" # threesuperior 05="188:U+00BC" # onequarter 06="162:U+00A2" # cent 07="2757:U+215D" # fiveeighths 08="247:U+00F7" # division 09="171:U+00AB" # guillemotleft 0A="187:U+00BB" # guillemotright 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="166:U+00A6" # brokenbar 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="419:U+0141" # Lstroke 12="162:U+00A2" # cent 13="174:U+00AE" # registered 14="222:U+00DE" # THORN 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="5052:U+0152" # OE 19="222:U+00DE" # THORN 1A="65112:U+00B0" # dead_abovering 1B="65114:U+02C7" # dead_caron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="186:U+00BA" # masculine 1F="167:U+00A7" # section 20="208:U+00D0" # ETH 21="170:U+00AA" # ordfeminine 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="419:U+0141" # Lstroke 27="65113:U+02DD" # dead_doubleacute 28="65114:U+02C7" # dead_caron 29="182:U+00B6" # paragraph 2A="65505" # Shift_L 2B="215:U+00D7" # multiply 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="78:U+004E" # N 32="186:U+00BA" # masculine 33="65116:U+02DB" # dead_ogonek 34="65110:U+02D9" # dead_abovedot 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="172:U+00AC" # notsign 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="43:U+002B" # plus 0D="65105:U+00B4" # dead_acute 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="197:U+00C5" # Aring 1B="65111:U+00A8" # dead_diaeresis 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="198:U+00C6" # AE 28="216:U+00D8" # Oslash 29="189:U+00BD" # onehalf 2A="65505" # Shift_L 2B="39:U+0027" # apostrophe 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="64:U+0040" # at 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="189:U+00BD" # onehalf 07="165:U+00A5" # yen 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="177:U+00B1" # plusminus 0D="124:U+007C" # bar 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="64:U+0040" # at 11="419:U+0141" # Lstroke 12="8364:U+20AC" # EuroSign 13="174:U+00AE" # registered 14="222:U+00DE" # THORN 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="5052:U+0152" # OE 19="222:U+00DE" # THORN 1A="65111:U+00A8" # dead_diaeresis 1B="65107:U+007E" # dead_tilde 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="170:U+00AA" # ordfeminine 20="208:U+00D0" # ETH 21="464:U+0110" # Dstroke 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="419:U+0141" # Lstroke 27="65105:U+00B4" # dead_acute 28="65106:U+005E" # dead_circumflex 29="190:U+00BE" # threequarters 2A="65505" # Shift_L 2B="65113:U+02DD" # dead_doubleacute 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="169:U+00A9" # copyright 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="78:U+004E" # N 33="65115:U+00B8" # dead_cedilla 34="183:U+00B7" # periodcentered 35="65120" # dead_belowdot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="92:U+005C" # backslash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="35:U+0023" # numbersign 05="164:U+00A4" # currency 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="47:U+002F" # slash 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="61:U+003D" # equal 0C="63:U+003F" # question 0D="65104:U+0060" # dead_grave 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="229:U+00E5" # aring 1B="65106:U+005E" # dead_circumflex 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="230:U+00E6" # ae 28="248:U+00F8" # oslash 29="167:U+00A7" # section 2A="65505" # Shift_L 2B="42:U+002A" # asterisk 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="185:U+00B9" # onesuperior 03="178:U+00B2" # twosuperior 04="179:U+00B3" # threesuperior 05="188:U+00BC" # onequarter 06="162:U+00A2" # cent 07="2757:U+215D" # fiveeighths 08="247:U+00F7" # division 09="171:U+00AB" # guillemotleft 0A="187:U+00BB" # guillemotright 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="166:U+00A6" # brokenbar 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="435:U+0142" # lstroke 12="162:U+00A2" # cent 13="174:U+00AE" # registered 14="254:U+00FE" # thorn 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="5053:U+0153" # oe 19="254:U+00FE" # thorn 1A="65112:U+00B0" # dead_abovering 1B="65114:U+02C7" # dead_caron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="186:U+00BA" # masculine 1F="167:U+00A7" # section 20="240:U+00F0" # eth 21="170:U+00AA" # ordfeminine 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="435:U+0142" # lstroke 27="65113:U+02DD" # dead_doubleacute 28="65114:U+02C7" # dead_caron 29="182:U+00B6" # paragraph 2A="65505" # Shift_L 2B="215:U+00D7" # multiply 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="110:U+006E" # n 32="186:U+00BA" # masculine 33="65116:U+02DB" # dead_ogonek 34="65110:U+02D9" # dead_abovedot 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="172:U+00AC" # notsign 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65452:U+002C" # KP_Separator ================================================ FILE: instfiles/km-00000407.ini ================================================ [noshift] Key8=65406:0 Key9=65307:27 Key10=49:49 Key11=50:50 Key12=51:51 Key13=52:52 Key14=53:53 Key15=54:54 Key16=55:55 Key17=56:56 Key18=57:57 Key19=48:48 Key20=223:223 Key21=65105:180 Key22=65288:8 Key23=65289:9 Key24=113:113 Key25=119:119 Key26=101:101 Key27=114:114 Key28=116:116 Key29=122:122 Key30=117:117 Key31=105:105 Key32=111:111 Key33=112:112 Key34=252:252 Key35=43:43 Key36=65293:13 Key37=65507:0 Key38=97:97 Key39=115:115 Key40=100:100 Key41=102:102 Key42=103:103 Key43=104:104 Key44=106:106 Key45=107:107 Key46=108:108 Key47=246:246 Key48=228:228 Key49=65106:94 Key50=65505:0 Key51=35:35 Key52=121:121 Key53=120:120 Key54=99:99 Key55=118:118 Key56=98:98 Key57=110:110 Key58=109:109 Key59=44:44 Key60=46:46 Key61=45:45 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shift] Key8=65406:0 Key9=65307:27 Key10=33:33 Key11=34:34 Key12=167:167 Key13=36:36 Key14=37:37 Key15=38:38 Key16=47:47 Key17=40:40 Key18=41:41 Key19=61:61 Key20=63:63 Key21=65104:96 Key22=65288:8 Key23=65056:0 Key24=81:81 Key25=87:87 Key26=69:69 Key27=82:82 Key28=84:84 Key29=90:90 Key30=85:85 Key31=73:73 Key32=79:79 Key33=80:80 Key34=220:220 Key35=42:42 Key36=65293:13 Key37=65507:0 Key38=65:65 Key39=83:83 Key40=68:68 Key41=70:70 Key42=71:71 Key43=72:72 Key44=74:74 Key45=75:75 Key46=76:76 Key47=214:214 Key48=196:196 Key49=176:176 Key50=65505:0 Key51=39:39 Key52=89:89 Key53=88:88 Key54=67:67 Key55=86:86 Key56=66:66 Key57=78:78 Key58=77:77 Key59=59:59 Key60=58:58 Key61=95:95 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [altgr] Key8=65406:0 Key9=65307:27 Key10=185:185 Key11=178:178 Key12=179:179 Key13=188:188 Key14=189:189 Key15=172:172 Key16=123:123 Key17=91:91 Key18=93:93 Key19=125:125 Key20=92:92 Key21=65115:184 Key22=65288:8 Key23=65289:9 Key24=64:64 Key25=435:322 Key26=8364:8364 Key27=182:182 Key28=956:359 Key29=2299:8592 Key30=2302:8595 Key31=2301:8594 Key32=248:248 Key33=254:254 Key34=65111:168 Key35=126:126 Key36=65293:13 Key37=65507:0 Key38=230:230 Key39=16777599:383 Key40=240:240 Key41=496:273 Key42=959:331 Key43=689:295 Key44=65120:0 Key45=930:312 Key46=435:322 Key47=65113:733 Key48=65106:94 Key49=16785458:8242 Key50=65505:0 Key51=2769:8217 Key52=187:187 Key53=171:171 Key54=162:162 Key55=2814:8222 Key56=2770:8220 Key57=2771:8221 Key58=181:181 Key59=183:183 Key60=16785446:8230 Key61=2730:8211 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftaltgr] Key8=65406:0 Key9=65307:27 Key10=161:161 Key11=2755:8539 Key12=163:163 Key13=164:164 Key14=2756:8540 Key15=2757:8541 Key16=2758:8542 Key17=2761:8482 Key18=177:177 Key19=176:176 Key20=191:191 Key21=65116:731 Key22=65288:8 Key23=65056:0 Key24=2009:937 Key25=419:321 Key26=8364:8364 Key27=174:174 Key28=940:358 Key29=165:165 Key30=2300:8593 Key31=697:305 Key32=216:216 Key33=222:222 Key34=65112:176 Key35=175:175 Key36=65293:13 Key37=65507:0 Key38=198:198 Key39=16785054:7838 Key40=208:208 Key41=170:170 Key42=957:330 Key43=673:294 Key44=65110:729 Key45=38:38 Key46=419:321 Key47=65120:0 Key48=65114:711 Key49=16785459:8243 Key50=65505:0 Key51=65109:728 Key52=16785466:8250 Key53=16785465:8249 Key54=169:169 Key55=2813:8218 Key56=2768:8216 Key57=2769:8217 Key58=186:186 Key59=215:215 Key60=247:247 Key61=2729:8212 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [capslock] Key8=65406:0 Key9=65307:27 Key10=49:49 Key11=50:50 Key12=51:51 Key13=52:52 Key14=53:53 Key15=54:54 Key16=55:55 Key17=56:56 Key18=57:57 Key19=48:48 Key20=16785054:7838 Key21=65105:180 Key22=65288:8 Key23=65289:9 Key24=81:81 Key25=87:87 Key26=69:69 Key27=82:82 Key28=84:84 Key29=90:90 Key30=85:85 Key31=73:73 Key32=79:79 Key33=80:80 Key34=220:220 Key35=43:43 Key36=65293:13 Key37=65507:0 Key38=65:65 Key39=83:83 Key40=68:68 Key41=70:70 Key42=71:71 Key43=72:72 Key44=74:74 Key45=75:75 Key46=76:76 Key47=214:214 Key48=196:196 Key49=65106:94 Key50=65505:0 Key51=35:35 Key52=89:89 Key53=88:88 Key54=67:67 Key55=86:86 Key56=66:66 Key57=78:78 Key58=77:77 Key59=44:44 Key60=46:46 Key61=45:45 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [capslockaltgr] Key8=65406:0 Key9=65307:27 Key10=185:185 Key11=178:178 Key12=179:179 Key13=188:188 Key14=189:189 Key15=172:172 Key16=123:123 Key17=91:91 Key18=93:93 Key19=125:125 Key20=92:92 Key21=65115:184 Key22=65288:8 Key23=65289:9 Key24=64:64 Key25=419:321 Key26=8364:8364 Key27=182:182 Key28=940:358 Key29=2299:8592 Key30=2302:8595 Key31=2301:8594 Key32=216:216 Key33=222:222 Key34=65111:168 Key35=126:126 Key36=65293:13 Key37=65507:0 Key38=198:198 Key39=16777299:83 Key40=208:208 Key41=464:272 Key42=957:330 Key43=673:294 Key44=65120:0 Key45=930:312 Key46=419:321 Key47=65113:733 Key48=65106:94 Key49=16785458:8242 Key50=65505:0 Key51=2769:8217 Key52=187:187 Key53=171:171 Key54=162:162 Key55=2814:8222 Key56=2770:8220 Key57=2771:8221 Key58=924:0 Key59=183:183 Key60=16785446:8230 Key61=2730:8211 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftcapslock] Key8=65406:0 Key9=65307:27 Key10=33:33 Key11=34:34 Key12=167:167 Key13=36:36 Key14=37:37 Key15=38:38 Key16=47:47 Key17=40:40 Key18=41:41 Key19=61:61 Key20=63:63 Key21=65104:96 Key22=65288:8 Key23=65056:0 Key24=113:113 Key25=119:119 Key26=101:101 Key27=114:114 Key28=116:116 Key29=122:122 Key30=117:117 Key31=105:105 Key32=111:111 Key33=112:112 Key34=252:252 Key35=42:42 Key36=65293:13 Key37=65507:0 Key38=97:97 Key39=115:115 Key40=100:100 Key41=102:102 Key42=103:103 Key43=104:104 Key44=106:106 Key45=107:107 Key46=108:108 Key47=246:246 Key48=228:228 Key49=176:176 Key50=65505:0 Key51=39:39 Key52=121:121 Key53=120:120 Key54=99:99 Key55=118:118 Key56=98:98 Key57=110:110 Key58=109:109 Key59=59:59 Key60=58:58 Key61=95:95 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftcapslockaltgr] Key8=65406:0 Key9=65307:27 Key10=161:161 Key11=2755:8539 Key12=163:163 Key13=164:164 Key14=2756:8540 Key15=2757:8541 Key16=2758:8542 Key17=2761:8482 Key18=177:177 Key19=176:176 Key20=191:191 Key21=65116:731 Key22=65288:8 Key23=65056:0 Key24=2009:937 Key25=435:322 Key26=8364:8364 Key27=174:174 Key28=956:359 Key29=165:165 Key30=2300:8593 Key31=697:305 Key32=248:248 Key33=254:254 Key34=65112:176 Key35=175:175 Key36=65293:13 Key37=65507:0 Key38=230:230 Key39=16785054:7838 Key40=240:240 Key41=170:170 Key42=959:331 Key43=689:295 Key44=65110:729 Key45=38:38 Key46=435:322 Key47=65120:0 Key48=65114:711 Key49=16785459:8243 Key50=65505:0 Key51=65109:728 Key52=16785466:8250 Key53=16785465:8249 Key54=169:169 Key55=2813:8218 Key56=2768:8216 Key57=2769:8217 Key58=186:186 Key59=215:215 Key60=247:247 Key61=2729:8212 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 ================================================ FILE: instfiles/km-00000407.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwertz) # setxkbmap -rules evdev -model pc104 -layout de # Description: de-DE # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="223:U+00DF" # ssharp 0D="65105:U+00B4" # dead_acute 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="122:U+007A" # z 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="252:U+00FC" # udiaeresis 1B="43:U+002B" # plus 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="246:U+00F6" # odiaeresis 28="228:U+00E4" # adiaeresis 29="65106:U+005E" # dead_circumflex 2A="65505" # Shift_L 2B="35:U+0023" # numbersign 2C="121:U+0079" # y 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="167:U+00A7" # section 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="47:U+002F" # slash 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="61:U+003D" # equal 0C="63:U+003F" # question 0D="65104:U+0060" # dead_grave 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="90:U+005A" # Z 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="220:U+00DC" # Udiaeresis 1B="42:U+002A" # asterisk 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="214:U+00D6" # Odiaeresis 28="196:U+00C4" # Adiaeresis 29="176:U+00B0" # degree 2A="65505" # Shift_L 2B="39:U+0027" # apostrophe 2C="89:U+0059" # Y 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="185:U+00B9" # onesuperior 03="178:U+00B2" # twosuperior 04="179:U+00B3" # threesuperior 05="188:U+00BC" # onequarter 06="189:U+00BD" # onehalf 07="172:U+00AC" # notsign 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="92:U+005C" # backslash 0D="65115:U+00B8" # dead_cedilla 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="64:U+0040" # at 11="435:U+0142" # lstroke 12="8364:U+20AC" # EuroSign 13="182:U+00B6" # paragraph 14="956:U+0167" # tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="248:U+00F8" # oslash 19="254:U+00FE" # thorn 1A="65111:U+00A8" # dead_diaeresis 1B="126:U+007E" # asciitilde 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="230:U+00E6" # ae 1F="16777599:U+017F" # U017F 20="240:U+00F0" # eth 21="496:U+0111" # dstroke 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65120" # dead_belowdot 25="930:U+0138" # kra 26="435:U+0142" # lstroke 27="65113:U+02DD" # dead_doubleacute 28="65106:U+005E" # dead_circumflex 29="16785458:U+2032" # U2032 2A="65505" # Shift_L 2B="2769:U+2019" # rightsinglequotemark 2C="187:U+00BB" # guillemotright 2D="171:U+00AB" # guillemotleft 2E="162:U+00A2" # cent 2F="2814:U+201E" # doublelowquotemark 30="2770:U+201C" # leftdoublequotemark 31="2771:U+201D" # rightdoublequotemark 32="181:U+00B5" # mu 33="183:U+00B7" # periodcentered 34="16785446:U+2026" # U2026 35="2730:U+2013" # endash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="2755:U+215B" # oneeighth 04="163:U+00A3" # sterling 05="164:U+00A4" # currency 06="2756:U+215C" # threeeighths 07="2757:U+215D" # fiveeighths 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="65116:U+02DB" # dead_ogonek 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="419:U+0141" # Lstroke 12="8364:U+20AC" # EuroSign 13="174:U+00AE" # registered 14="940:U+0166" # Tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="216:U+00D8" # Oslash 19="222:U+00DE" # THORN 1A="65112:U+00B0" # dead_abovering 1B="175:U+00AF" # macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="198:U+00C6" # AE 1F="16785054:U+1E9E" # U1E9E 20="208:U+00D0" # ETH 21="170:U+00AA" # ordfeminine 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65110:U+02D9" # dead_abovedot 25="38:U+0026" # ampersand 26="419:U+0141" # Lstroke 27="65120" # dead_belowdot 28="65114:U+02C7" # dead_caron 29="16785459:U+2033" # U2033 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="16785466:U+203A" # U203A 2D="16785465:U+2039" # U2039 2E="169:U+00A9" # copyright 2F="2813:U+201A" # singlelowquotemark 30="2768:U+2018" # leftsinglequotemark 31="2769:U+2019" # rightsinglequotemark 32="186:U+00BA" # masculine 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="2729:U+2014" # emdash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="65128" # dead_belowmacron 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="16785054:U+1E9E" # U1E9E 0D="65105:U+00B4" # dead_acute 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="90:U+005A" # Z 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="220:U+00DC" # Udiaeresis 1B="43:U+002B" # plus 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="214:U+00D6" # Odiaeresis 28="196:U+00C4" # Adiaeresis 29="65106:U+005E" # dead_circumflex 2A="65505" # Shift_L 2B="35:U+0023" # numbersign 2C="89:U+0059" # Y 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="185:U+00B9" # onesuperior 03="178:U+00B2" # twosuperior 04="179:U+00B3" # threesuperior 05="188:U+00BC" # onequarter 06="189:U+00BD" # onehalf 07="172:U+00AC" # notsign 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="92:U+005C" # backslash 0D="65115:U+00B8" # dead_cedilla 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="64:U+0040" # at 11="419:U+0141" # Lstroke 12="8364:U+20AC" # EuroSign 13="182:U+00B6" # paragraph 14="940:U+0166" # Tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="216:U+00D8" # Oslash 19="222:U+00DE" # THORN 1A="65111:U+00A8" # dead_diaeresis 1B="126:U+007E" # asciitilde 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="198:U+00C6" # AE 1F="16785054:U+1E9E" # U1E9E 20="208:U+00D0" # ETH 21="464:U+0110" # Dstroke 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65120" # dead_belowdot 25="930:U+0138" # kra 26="419:U+0141" # Lstroke 27="65113:U+02DD" # dead_doubleacute 28="65106:U+005E" # dead_circumflex 29="16785458:U+2032" # U2032 2A="65505" # Shift_L 2B="2769:U+2019" # rightsinglequotemark 2C="187:U+00BB" # guillemotright 2D="171:U+00AB" # guillemotleft 2E="162:U+00A2" # cent 2F="2814:U+201E" # doublelowquotemark 30="2770:U+201C" # leftdoublequotemark 31="2771:U+201D" # rightdoublequotemark 33="183:U+00B7" # periodcentered 34="16785446:U+2026" # U2026 35="2730:U+2013" # endash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="167:U+00A7" # section 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="47:U+002F" # slash 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="61:U+003D" # equal 0C="63:U+003F" # question 0D="65104:U+0060" # dead_grave 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="122:U+007A" # z 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="252:U+00FC" # udiaeresis 1B="42:U+002A" # asterisk 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="246:U+00F6" # odiaeresis 28="228:U+00E4" # adiaeresis 29="176:U+00B0" # degree 2A="65505" # Shift_L 2B="39:U+0027" # apostrophe 2C="121:U+0079" # y 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="2755:U+215B" # oneeighth 04="163:U+00A3" # sterling 05="164:U+00A4" # currency 06="2756:U+215C" # threeeighths 07="2757:U+215D" # fiveeighths 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="65116:U+02DB" # dead_ogonek 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="435:U+0142" # lstroke 12="8364:U+20AC" # EuroSign 13="174:U+00AE" # registered 14="956:U+0167" # tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="248:U+00F8" # oslash 19="254:U+00FE" # thorn 1A="65112:U+00B0" # dead_abovering 1B="175:U+00AF" # macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="230:U+00E6" # ae 1F="16777599:U+017F" # U017F 20="240:U+00F0" # eth 21="170:U+00AA" # ordfeminine 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65110:U+02D9" # dead_abovedot 25="38:U+0026" # ampersand 26="435:U+0142" # lstroke 27="65120" # dead_belowdot 28="65114:U+02C7" # dead_caron 29="16785459:U+2033" # U2033 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="16785466:U+203A" # U203A 2D="16785465:U+2039" # U2039 2E="169:U+00A9" # copyright 2F="2813:U+201A" # singlelowquotemark 30="2768:U+2018" # leftsinglequotemark 31="2769:U+2019" # rightsinglequotemark 32="186:U+00BA" # masculine 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="2729:U+2014" # emdash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="65128" # dead_belowmacron 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65452:U+002C" # KP_Separator ================================================ FILE: instfiles/km-00000409.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwerty) # setxkbmap -rules evdev -model pc104 -layout us # Description: en-US # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="61:U+003D" # equal 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="59:U+003B" # semicolon 28="39:U+0027" # apostrophe 29="96:U+0060" # grave 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="44:U+002C" # comma 34="46:U+002E" # period 35="47:U+002F" # slash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65514" # Alt_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="94:U+005E" # asciicircum 08="38:U+0026" # ampersand 09="42:U+002A" # asterisk 0A="40:U+0028" # parenleft 0B="41:U+0029" # parenright 0C="95:U+005F" # underscore 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="123:U+007B" # braceleft 1B="125:U+007D" # braceright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="58:U+003A" # colon 28="34:U+0022" # quotedbl 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="124:U+007C" # bar 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="60:U+003C" # less 34="62:U+003E" # greater 35="63:U+003F" # question 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65512" # Meta_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="61:U+003D" # equal 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="59:U+003B" # semicolon 28="39:U+0027" # apostrophe 29="96:U+0060" # grave 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="44:U+002C" # comma 34="46:U+002E" # period 35="47:U+002F" # slash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65514" # Alt_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="94:U+005E" # asciicircum 08="38:U+0026" # ampersand 09="42:U+002A" # asterisk 0A="40:U+0028" # parenleft 0B="41:U+0029" # parenright 0C="95:U+005F" # underscore 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="123:U+007B" # braceleft 1B="125:U+007D" # braceright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="58:U+003A" # colon 28="34:U+0022" # quotedbl 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="124:U+007C" # bar 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="60:U+003C" # less 34="62:U+003E" # greater 35="63:U+003F" # question 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65512" # Meta_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="61:U+003D" # equal 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="59:U+003B" # semicolon 28="39:U+0027" # apostrophe 29="96:U+0060" # grave 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="44:U+002C" # comma 34="46:U+002E" # period 35="47:U+002F" # slash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65514" # Alt_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="61:U+003D" # equal 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="59:U+003B" # semicolon 28="39:U+0027" # apostrophe 29="96:U+0060" # grave 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="44:U+002C" # comma 34="46:U+002E" # period 35="47:U+002F" # slash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65514" # Alt_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="94:U+005E" # asciicircum 08="38:U+0026" # ampersand 09="42:U+002A" # asterisk 0A="40:U+0028" # parenleft 0B="41:U+0029" # parenright 0C="95:U+005F" # underscore 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="123:U+007B" # braceleft 1B="125:U+007D" # braceright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="58:U+003A" # colon 28="34:U+0022" # quotedbl 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="124:U+007C" # bar 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="60:U+003C" # less 34="62:U+003E" # greater 35="63:U+003F" # question 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65512" # Meta_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="94:U+005E" # asciicircum 08="38:U+0026" # ampersand 09="42:U+002A" # asterisk 0A="40:U+0028" # parenleft 0B="41:U+0029" # parenright 0C="95:U+005F" # underscore 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="123:U+007B" # braceleft 1B="125:U+007D" # braceright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="58:U+003A" # colon 28="34:U+0022" # quotedbl 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="124:U+007C" # bar 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="60:U+003C" # less 34="62:U+003E" # greater 35="63:U+003F" # question 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65512" # Meta_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65454:U+002E" # KP_Decimal ================================================ FILE: instfiles/km-0000040a.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwerty) # setxkbmap -rules evdev -model pc105 -layout es # Description: es-ES_tradnl # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="39:U+0027" # apostrophe 0D="161:U+00A1" # exclamdown 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="65104:U+0060" # dead_grave 1B="43:U+002B" # plus 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="241:U+00F1" # ntilde 28="65105:U+00B4" # dead_acute 29="186:U+00BA" # masculine 2A="65505" # Shift_L 2B="231:U+00E7" # ccedilla 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="183:U+00B7" # periodcentered 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="47:U+002F" # slash 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="61:U+003D" # equal 0C="63:U+003F" # question 0D="191:U+00BF" # questiondown 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="65106:U+005E" # dead_circumflex 1B="42:U+002A" # asterisk 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="209:U+00D1" # Ntilde 28="65111:U+00A8" # dead_diaeresis 29="170:U+00AA" # ordfeminine 2A="65505" # Shift_L 2B="199:U+00C7" # Ccedilla 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="124:U+007C" # bar 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="126:U+007E" # asciitilde 06="189:U+00BD" # onehalf 07="172:U+00AC" # notsign 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="92:U+005C" # backslash 0D="65107:U+007E" # dead_tilde 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="64:U+0040" # at 11="435:U+0142" # lstroke 12="8364:U+20AC" # EuroSign 13="182:U+00B6" # paragraph 14="956:U+0167" # tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="248:U+00F8" # oslash 19="254:U+00FE" # thorn 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="230:U+00E6" # ae 1F="223:U+00DF" # ssharp 20="240:U+00F0" # eth 21="496:U+0111" # dstroke 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="435:U+0142" # lstroke 27="126:U+007E" # asciitilde 28="123:U+007B" # braceleft 29="92:U+005C" # backslash 2A="65505" # Shift_L 2B="125:U+007D" # braceright 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="162:U+00A2" # cent 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="110:U+006E" # n 32="181:U+00B5" # mu 33="2211" # horizconnector 34="183:U+00B7" # periodcentered 35="65120" # dead_belowdot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="2755:U+215B" # oneeighth 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="2756:U+215C" # threeeighths 07="2757:U+215D" # fiveeighths 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="126:U+007E" # asciitilde 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="419:U+0141" # Lstroke 12="162:U+00A2" # cent 13="174:U+00AE" # registered 14="940:U+0166" # Tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="216:U+00D8" # Oslash 19="222:U+00DE" # THORN 1A="65112:U+00B0" # dead_abovering 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="198:U+00C6" # AE 1F="167:U+00A7" # section 20="208:U+00D0" # ETH 21="170:U+00AA" # ordfeminine 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="419:U+0141" # Lstroke 27="65113:U+02DD" # dead_doubleacute 28="123:U+007B" # braceleft 29="92:U+005C" # backslash 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="78:U+004E" # N 32="186:U+00BA" # masculine 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="39:U+0027" # apostrophe 0D="161:U+00A1" # exclamdown 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="65104:U+0060" # dead_grave 1B="43:U+002B" # plus 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="209:U+00D1" # Ntilde 28="65105:U+00B4" # dead_acute 29="186:U+00BA" # masculine 2A="65505" # Shift_L 2B="199:U+00C7" # Ccedilla 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="124:U+007C" # bar 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="126:U+007E" # asciitilde 06="189:U+00BD" # onehalf 07="172:U+00AC" # notsign 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="92:U+005C" # backslash 0D="65107:U+007E" # dead_tilde 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="64:U+0040" # at 11="419:U+0141" # Lstroke 12="8364:U+20AC" # EuroSign 13="182:U+00B6" # paragraph 14="940:U+0166" # Tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="216:U+00D8" # Oslash 19="222:U+00DE" # THORN 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="198:U+00C6" # AE 20="208:U+00D0" # ETH 21="464:U+0110" # Dstroke 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="419:U+0141" # Lstroke 27="126:U+007E" # asciitilde 28="123:U+007B" # braceleft 29="92:U+005C" # backslash 2A="65505" # Shift_L 2B="125:U+007D" # braceright 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="162:U+00A2" # cent 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="78:U+004E" # N 33="2211" # horizconnector 34="183:U+00B7" # periodcentered 35="65120" # dead_belowdot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="183:U+00B7" # periodcentered 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="47:U+002F" # slash 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="61:U+003D" # equal 0C="63:U+003F" # question 0D="191:U+00BF" # questiondown 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="65106:U+005E" # dead_circumflex 1B="42:U+002A" # asterisk 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="241:U+00F1" # ntilde 28="65111:U+00A8" # dead_diaeresis 29="170:U+00AA" # ordfeminine 2A="65505" # Shift_L 2B="231:U+00E7" # ccedilla 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="2755:U+215B" # oneeighth 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="2756:U+215C" # threeeighths 07="2757:U+215D" # fiveeighths 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="126:U+007E" # asciitilde 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="435:U+0142" # lstroke 12="162:U+00A2" # cent 13="174:U+00AE" # registered 14="956:U+0167" # tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="248:U+00F8" # oslash 19="254:U+00FE" # thorn 1A="65112:U+00B0" # dead_abovering 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="230:U+00E6" # ae 1F="167:U+00A7" # section 20="240:U+00F0" # eth 21="170:U+00AA" # ordfeminine 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="435:U+0142" # lstroke 27="65113:U+02DD" # dead_doubleacute 28="123:U+007B" # braceleft 29="92:U+005C" # backslash 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="110:U+006E" # n 32="186:U+00BA" # masculine 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65454:U+002E" # KP_Decimal ================================================ FILE: instfiles/km-0000040b.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwerty) # setxkbmap -rules evdev -model pc105 -layout fi # Description: fi-FI # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="43:U+002B" # plus 0D="65105:U+00B4" # dead_acute 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="229:U+00E5" # aring 1B="65111:U+00A8" # dead_diaeresis 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="246:U+00F6" # odiaeresis 28="228:U+00E4" # adiaeresis 29="167:U+00A7" # section 2A="65505" # Shift_L 2B="39:U+0027" # apostrophe 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="35:U+0023" # numbersign 05="164:U+00A4" # currency 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="47:U+002F" # slash 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="61:U+003D" # equal 0C="63:U+003F" # question 0D="65104:U+0060" # dead_grave 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="197:U+00C5" # Aring 1B="65106:U+005E" # dead_circumflex 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="214:U+00D6" # Odiaeresis 28="196:U+00C4" # Adiaeresis 29="189:U+00BD" # onehalf 2A="65505" # Shift_L 2B="42:U+002A" # asterisk 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 03="64:U+0040" # at 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="2773:U+2030" # permille 07="2813:U+201A" # singlelowquotemark 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="92:U+005C" # backslash 0D="65115:U+00B8" # dead_cedilla 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="8364:U+20AC" # EuroSign 13="114:U+0072" # r 14="254:U+00FE" # thorn 15="121:U+0079" # y 16="117:U+0075" # u 17="697:U+0131" # idotless 18="5053:U+0153" # oe 19="65122" # dead_horn 1A="65113:U+02DD" # dead_doubleacute 1B="65107:U+007E" # dead_tilde 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="16777817:U+0259" # schwa 1F="223:U+00DF" # ssharp 20="240:U+00F0" # eth 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="930:U+0138" # kra 26="65123" # dead_stroke 27="248:U+00F8" # oslash 28="230:U+00E6" # ae 29="65123" # dead_stroke 2A="65505" # Shift_L 2B="65114:U+02C7" # dead_caron 2C="16777874:U+0292" # ezh 2D="215:U+00D7" # multiply 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="959:U+014B" # eng 32="181:U+00B5" # mu 33="2769:U+2019" # rightsinglequotemark 34="65120" # dead_belowdot 35="2730:U+2013" # endash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="2771:U+201D" # rightdoublequotemark 04="187:U+00BB" # guillemotright 05="171:U+00AB" # guillemotleft 06="2770:U+201C" # leftdoublequotemark 07="2814:U+201E" # doublelowquotemark 09="60:U+003C" # less 0A="62:U+003E" # greater 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="65116:U+02DB" # dead_ogonek 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 13="82:U+0052" # R 14="222:U+00DE" # THORN 15="89:U+0059" # Y 16="85:U+0055" # U 17="124:U+007C" # bar 18="5052:U+0152" # OE 19="65121" # dead_hook 1A="65112:U+00B0" # dead_abovering 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="16777615:U+018F" # SCHWA 1F="16785054:U+1E9E" # U1E9E 20="208:U+00D0" # ETH 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="65164" # dead_greek 26="65135" # dead_currency 27="216:U+00D8" # Oslash 28="198:U+00C6" # AE 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="16777655:U+01B7" # EZH 2D="183:U+00B7" # periodcentered 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="957:U+014A" # ENG 32="2729:U+2014" # emdash 33="2768:U+2018" # leftsinglequotemark 34="65110:U+02D9" # dead_abovedot 35="65134" # dead_belowcomma 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="16785455:U+202F" # U202F 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="43:U+002B" # plus 0D="65105:U+00B4" # dead_acute 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="197:U+00C5" # Aring 1B="65111:U+00A8" # dead_diaeresis 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="214:U+00D6" # Odiaeresis 28="196:U+00C4" # Adiaeresis 29="167:U+00A7" # section 2A="65505" # Shift_L 2B="39:U+0027" # apostrophe 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 03="64:U+0040" # at 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="2773:U+2030" # permille 07="2813:U+201A" # singlelowquotemark 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="92:U+005C" # backslash 0D="65115:U+00B8" # dead_cedilla 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="8364:U+20AC" # EuroSign 13="82:U+0052" # R 14="222:U+00DE" # THORN 15="89:U+0059" # Y 16="85:U+0055" # U 17="697:U+0131" # idotless 18="5052:U+0152" # OE 19="65122" # dead_horn 1A="65113:U+02DD" # dead_doubleacute 1B="65107:U+007E" # dead_tilde 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="16777615:U+018F" # SCHWA 1F="16785054:U+1E9E" # U1E9E 20="208:U+00D0" # ETH 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="930:U+0138" # kra 26="65123" # dead_stroke 27="216:U+00D8" # Oslash 28="198:U+00C6" # AE 29="65123" # dead_stroke 2A="65505" # Shift_L 2B="65114:U+02C7" # dead_caron 2C="16777655:U+01B7" # EZH 2D="215:U+00D7" # multiply 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="957:U+014A" # ENG 33="2769:U+2019" # rightsinglequotemark 34="65120" # dead_belowdot 35="2730:U+2013" # endash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="35:U+0023" # numbersign 05="164:U+00A4" # currency 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="47:U+002F" # slash 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="61:U+003D" # equal 0C="63:U+003F" # question 0D="65104:U+0060" # dead_grave 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="229:U+00E5" # aring 1B="65106:U+005E" # dead_circumflex 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="246:U+00F6" # odiaeresis 28="228:U+00E4" # adiaeresis 29="189:U+00BD" # onehalf 2A="65505" # Shift_L 2B="42:U+002A" # asterisk 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="2771:U+201D" # rightdoublequotemark 04="187:U+00BB" # guillemotright 05="171:U+00AB" # guillemotleft 06="2770:U+201C" # leftdoublequotemark 07="2814:U+201E" # doublelowquotemark 09="60:U+003C" # less 0A="62:U+003E" # greater 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="65116:U+02DB" # dead_ogonek 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 13="114:U+0072" # r 14="254:U+00FE" # thorn 15="121:U+0079" # y 16="117:U+0075" # u 17="124:U+007C" # bar 18="5053:U+0153" # oe 19="65121" # dead_hook 1A="65112:U+00B0" # dead_abovering 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="16777817:U+0259" # schwa 1F="223:U+00DF" # ssharp 20="240:U+00F0" # eth 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="65164" # dead_greek 26="65135" # dead_currency 27="248:U+00F8" # oslash 28="230:U+00E6" # ae 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="16777874:U+0292" # ezh 2D="183:U+00B7" # periodcentered 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="959:U+014B" # eng 32="2729:U+2014" # emdash 33="2768:U+2018" # leftsinglequotemark 34="65110:U+02D9" # dead_abovedot 35="65134" # dead_belowcomma 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="16785455:U+202F" # U202F 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65452:U+002C" # KP_Separator ================================================ FILE: instfiles/km-0000040c.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(azerty) # setxkbmap -rules evdev -model pc105 -layout fr # Description: fr-FR # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="38:U+0026" # ampersand 03="233:U+00E9" # eacute 04="34:U+0022" # quotedbl 05="39:U+0027" # apostrophe 06="40:U+0028" # parenleft 07="45:U+002D" # minus 08="232:U+00E8" # egrave 09="95:U+005F" # underscore 0A="231:U+00E7" # ccedilla 0B="224:U+00E0" # agrave 0C="41:U+0029" # parenright 0D="61:U+003D" # equal 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="97:U+0061" # a 11="122:U+007A" # z 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="65106:U+005E" # dead_circumflex 1B="36:U+0024" # dollar 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="113:U+0071" # q 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="109:U+006D" # m 28="249:U+00F9" # ugrave 29="178:U+00B2" # twosuperior 2A="65505" # Shift_L 2B="42:U+002A" # asterisk 2C="119:U+0077" # w 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="44:U+002C" # comma 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="33:U+0021" # exclam 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="176:U+00B0" # degree 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="65:U+0041" # A 11="90:U+005A" # Z 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="65111:U+00A8" # dead_diaeresis 1B="163:U+00A3" # sterling 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="81:U+0051" # Q 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="77:U+004D" # M 28="37:U+0025" # percent 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="181:U+00B5" # mu 2C="87:U+0057" # W 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="63:U+003F" # question 33="46:U+002E" # period 34="47:U+002F" # slash 35="167:U+00A7" # section 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="185:U+00B9" # onesuperior 03="126:U+007E" # asciitilde 04="35:U+0023" # numbersign 05="123:U+007B" # braceleft 06="91:U+005B" # bracketleft 07="124:U+007C" # bar 08="96:U+0060" # grave 09="92:U+005C" # backslash 0A="94:U+005E" # asciicircum 0B="64:U+0040" # at 0C="93:U+005D" # bracketright 0D="125:U+007D" # braceright 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="230:U+00E6" # ae 11="171:U+00AB" # guillemotleft 12="8364:U+20AC" # EuroSign 13="182:U+00B6" # paragraph 14="956:U+0167" # tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="248:U+00F8" # oslash 19="254:U+00FE" # thorn 1A="65111:U+00A8" # dead_diaeresis 1B="164:U+00A4" # currency 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="64:U+0040" # at 1F="223:U+00DF" # ssharp 20="240:U+00F0" # eth 21="496:U+0111" # dstroke 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="435:U+0142" # lstroke 27="181:U+00B5" # mu 28="65106:U+005E" # dead_circumflex 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="65104:U+0060" # dead_grave 2C="435:U+0142" # lstroke 2D="187:U+00BB" # guillemotright 2E="162:U+00A2" # cent 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="110:U+006E" # n 32="65105:U+00B4" # dead_acute 33="2211" # horizconnector 34="183:U+00B7" # periodcentered 35="65120" # dead_belowdot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="2755:U+215B" # oneeighth 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="2756:U+215C" # threeeighths 07="2757:U+215D" # fiveeighths 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="65116:U+02DB" # dead_ogonek 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="198:U+00C6" # AE 11="60:U+003C" # less 12="162:U+00A2" # cent 13="174:U+00AE" # registered 14="940:U+0166" # Tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="216:U+00D8" # Oslash 19="222:U+00DE" # THORN 1A="65112:U+00B0" # dead_abovering 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="2009:U+03A9" # Greek_OMEGA 1F="167:U+00A7" # section 20="208:U+00D0" # ETH 21="170:U+00AA" # ordfeminine 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="419:U+0141" # Lstroke 27="186:U+00BA" # masculine 28="65114:U+02C7" # dead_caron 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="419:U+0141" # Lstroke 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="78:U+004E" # N 32="65113:U+02DD" # dead_doubleacute 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="38:U+0026" # ampersand 03="201:U+00C9" # Eacute 04="34:U+0022" # quotedbl 05="39:U+0027" # apostrophe 06="40:U+0028" # parenleft 07="45:U+002D" # minus 08="200:U+00C8" # Egrave 09="95:U+005F" # underscore 0A="199:U+00C7" # Ccedilla 0B="192:U+00C0" # Agrave 0C="41:U+0029" # parenright 0D="61:U+003D" # equal 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="65:U+0041" # A 11="90:U+005A" # Z 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="65106:U+005E" # dead_circumflex 1B="36:U+0024" # dollar 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="81:U+0051" # Q 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="77:U+004D" # M 28="217:U+00D9" # Ugrave 29="178:U+00B2" # twosuperior 2A="65505" # Shift_L 2B="42:U+002A" # asterisk 2C="87:U+0057" # W 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="44:U+002C" # comma 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="33:U+0021" # exclam 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="185:U+00B9" # onesuperior 03="126:U+007E" # asciitilde 04="35:U+0023" # numbersign 05="123:U+007B" # braceleft 06="91:U+005B" # bracketleft 07="124:U+007C" # bar 08="96:U+0060" # grave 09="92:U+005C" # backslash 0A="94:U+005E" # asciicircum 0B="64:U+0040" # at 0C="93:U+005D" # bracketright 0D="125:U+007D" # braceright 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="198:U+00C6" # AE 11="171:U+00AB" # guillemotleft 12="8364:U+20AC" # EuroSign 13="182:U+00B6" # paragraph 14="940:U+0166" # Tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="216:U+00D8" # Oslash 19="222:U+00DE" # THORN 1A="65111:U+00A8" # dead_diaeresis 1B="164:U+00A4" # currency 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="64:U+0040" # at 20="208:U+00D0" # ETH 21="464:U+0110" # Dstroke 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="419:U+0141" # Lstroke 28="65106:U+005E" # dead_circumflex 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="65104:U+0060" # dead_grave 2C="419:U+0141" # Lstroke 2D="187:U+00BB" # guillemotright 2E="162:U+00A2" # cent 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="78:U+004E" # N 32="65105:U+00B4" # dead_acute 33="2211" # horizconnector 34="183:U+00B7" # periodcentered 35="65120" # dead_belowdot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="176:U+00B0" # degree 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="97:U+0061" # a 11="122:U+007A" # z 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="65111:U+00A8" # dead_diaeresis 1B="163:U+00A3" # sterling 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="113:U+0071" # q 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="109:U+006D" # m 28="37:U+0025" # percent 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2C="119:U+0077" # w 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="63:U+003F" # question 33="46:U+002E" # period 34="47:U+002F" # slash 35="167:U+00A7" # section 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="2755:U+215B" # oneeighth 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="2756:U+215C" # threeeighths 07="2757:U+215D" # fiveeighths 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="65116:U+02DB" # dead_ogonek 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="230:U+00E6" # ae 11="60:U+003C" # less 12="162:U+00A2" # cent 13="174:U+00AE" # registered 14="956:U+0167" # tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="248:U+00F8" # oslash 19="254:U+00FE" # thorn 1A="65112:U+00B0" # dead_abovering 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="2009:U+03A9" # Greek_OMEGA 1F="167:U+00A7" # section 20="240:U+00F0" # eth 21="170:U+00AA" # ordfeminine 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="435:U+0142" # lstroke 27="186:U+00BA" # masculine 28="65114:U+02C7" # dead_caron 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="435:U+0142" # lstroke 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="110:U+006E" # n 32="65113:U+02DD" # dead_doubleacute 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65454:U+002E" # KP_Decimal ================================================ FILE: instfiles/km-0000040e.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwertz) # setxkbmap -rules evdev -model pc105 -layout hu # Description: hu-HU # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="246:U+00F6" # odiaeresis 0C="252:U+00FC" # udiaeresis 0D="243:U+00F3" # oacute 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="122:U+007A" # z 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="501:U+0151" # odoubleacute 1B="250:U+00FA" # uacute 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="233:U+00E9" # eacute 28="225:U+00E1" # aacute 29="48:U+0030" # 0 2A="65505" # Shift_L 2B="507:U+0171" # udoubleacute 2C="121:U+0079" # y 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="237:U+00ED" # iacute 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="39:U+0027" # apostrophe 03="34:U+0022" # quotedbl 04="43:U+002B" # plus 05="33:U+0021" # exclam 06="37:U+0025" # percent 07="47:U+002F" # slash 08="61:U+003D" # equal 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="214:U+00D6" # Odiaeresis 0C="220:U+00DC" # Udiaeresis 0D="211:U+00D3" # Oacute 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="90:U+005A" # Z 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="469:U+0150" # Odoubleacute 1B="218:U+00DA" # Uacute 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="201:U+00C9" # Eacute 28="193:U+00C1" # Aacute 29="167:U+00A7" # section 2A="65505" # Shift_L 2B="475:U+0170" # Udoubleacute 2C="89:U+0059" # Y 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="63:U+003F" # question 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="205:U+00CD" # Iacute 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="126:U+007E" # asciitilde 03="65114:U+02C7" # dead_caron 04="94:U+005E" # asciicircum 05="65109:U+02D8" # dead_breve 06="65112:U+00B0" # dead_abovering 07="65116:U+02DB" # dead_ogonek 08="96:U+0060" # grave 09="65110:U+02D9" # dead_abovedot 0A="65105:U+00B4" # dead_acute 0B="65113:U+02DD" # dead_doubleacute 0C="65111:U+00A8" # dead_diaeresis 0D="65115:U+00B8" # dead_cedilla 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="92:U+005C" # backslash 11="124:U+007C" # bar 12="196:U+00C4" # Adiaeresis 13="182:U+00B6" # paragraph 14="956:U+0167" # tslash 15="2730:U+2013" # endash 16="8364:U+20AC" # EuroSign 17="205:U+00CD" # Iacute 18="2814:U+201E" # doublelowquotemark 19="2771:U+201D" # rightdoublequotemark 1A="247:U+00F7" # division 1B="215:U+00D7" # multiply 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="228:U+00E4" # adiaeresis 1F="496:U+0111" # dstroke 20="464:U+0110" # Dstroke 21="91:U+005B" # bracketleft 22="93:U+005D" # bracketright 23="689:U+0127" # hstroke 24="237:U+00ED" # iacute 25="435:U+0142" # lstroke 26="419:U+0141" # Lstroke 27="36:U+0024" # dollar 28="223:U+00DF" # ssharp 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="164:U+00A4" # currency 2C="62:U+003E" # greater 2D="35:U+0023" # numbersign 2E="38:U+0026" # ampersand 2F="64:U+0040" # at 30="123:U+007B" # braceleft 31="125:U+007D" # braceright 32="60:U+003C" # less 33="59:U+003B" # semicolon 34="62:U+003E" # greater 35="42:U+002A" # asterisk 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="65107:U+007E" # dead_tilde 03="439:U+02C7" # caron 04="65106:U+005E" # dead_circumflex 05="418:U+02D8" # breve 06="176:U+00B0" # degree 07="434:U+02DB" # ogonek 08="65104:U+0060" # dead_grave 09="511:U+02D9" # abovedot 0A="180:U+00B4" # acute 0B="445:U+02DD" # doubleacute 0C="168:U+00A8" # diaeresis 0D="184:U+00B8" # cedilla 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="419:U+0141" # Lstroke 12="69:U+0045" # E 13="174:U+00AE" # registered 14="940:U+0166" # Tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="237:U+00ED" # iacute 18="216:U+00D8" # Oslash 19="222:U+00DE" # THORN 1A="65112:U+00B0" # dead_abovering 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="196:U+00C4" # Adiaeresis 1F="167:U+00A7" # section 20="208:U+00D0" # ETH 21="170:U+00AA" # ordfeminine 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="205:U+00CD" # Iacute 25="38:U+0026" # ampersand 26="419:U+0141" # Lstroke 27="162:U+00A2" # cent 28="16785054:U+1E9E" # U1E9E 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="78:U+004E" # N 32="186:U+00BA" # masculine 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="214:U+00D6" # Odiaeresis 0C="220:U+00DC" # Udiaeresis 0D="211:U+00D3" # Oacute 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="90:U+005A" # Z 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="469:U+0150" # Odoubleacute 1B="218:U+00DA" # Uacute 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="201:U+00C9" # Eacute 28="193:U+00C1" # Aacute 29="48:U+0030" # 0 2A="65505" # Shift_L 2B="475:U+0170" # Udoubleacute 2C="89:U+0059" # Y 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="205:U+00CD" # Iacute 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="126:U+007E" # asciitilde 03="65114:U+02C7" # dead_caron 04="94:U+005E" # asciicircum 05="65109:U+02D8" # dead_breve 06="65112:U+00B0" # dead_abovering 07="65116:U+02DB" # dead_ogonek 08="96:U+0060" # grave 09="65110:U+02D9" # dead_abovedot 0A="65105:U+00B4" # dead_acute 0B="65113:U+02DD" # dead_doubleacute 0C="65111:U+00A8" # dead_diaeresis 0D="65115:U+00B8" # dead_cedilla 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="92:U+005C" # backslash 11="124:U+007C" # bar 12="196:U+00C4" # Adiaeresis 13="182:U+00B6" # paragraph 14="940:U+0166" # Tslash 15="2730:U+2013" # endash 16="8364:U+20AC" # EuroSign 17="205:U+00CD" # Iacute 18="2814:U+201E" # doublelowquotemark 19="2771:U+201D" # rightdoublequotemark 1A="247:U+00F7" # division 1B="215:U+00D7" # multiply 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="196:U+00C4" # Adiaeresis 1F="464:U+0110" # Dstroke 20="464:U+0110" # Dstroke 21="91:U+005B" # bracketleft 22="93:U+005D" # bracketright 23="673:U+0126" # Hstroke 24="205:U+00CD" # Iacute 25="419:U+0141" # Lstroke 26="419:U+0141" # Lstroke 27="36:U+0024" # dollar 28="16785054:U+1E9E" # U1E9E 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="164:U+00A4" # currency 2C="62:U+003E" # greater 2D="35:U+0023" # numbersign 2E="38:U+0026" # ampersand 2F="64:U+0040" # at 30="123:U+007B" # braceleft 31="125:U+007D" # braceright 32="60:U+003C" # less 33="59:U+003B" # semicolon 34="62:U+003E" # greater 35="42:U+002A" # asterisk 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="39:U+0027" # apostrophe 03="34:U+0022" # quotedbl 04="43:U+002B" # plus 05="33:U+0021" # exclam 06="37:U+0025" # percent 07="47:U+002F" # slash 08="61:U+003D" # equal 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="246:U+00F6" # odiaeresis 0C="252:U+00FC" # udiaeresis 0D="243:U+00F3" # oacute 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="122:U+007A" # z 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="501:U+0151" # odoubleacute 1B="250:U+00FA" # uacute 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="233:U+00E9" # eacute 28="225:U+00E1" # aacute 29="167:U+00A7" # section 2A="65505" # Shift_L 2B="507:U+0171" # udoubleacute 2C="121:U+0079" # y 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="63:U+003F" # question 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="237:U+00ED" # iacute 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="65107:U+007E" # dead_tilde 03="439:U+02C7" # caron 04="65106:U+005E" # dead_circumflex 05="418:U+02D8" # breve 06="176:U+00B0" # degree 07="434:U+02DB" # ogonek 08="65104:U+0060" # dead_grave 09="511:U+02D9" # abovedot 0A="180:U+00B4" # acute 0B="445:U+02DD" # doubleacute 0C="168:U+00A8" # diaeresis 0D="184:U+00B8" # cedilla 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="419:U+0141" # Lstroke 12="69:U+0045" # E 13="174:U+00AE" # registered 14="956:U+0167" # tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="205:U+00CD" # Iacute 18="216:U+00D8" # Oslash 19="222:U+00DE" # THORN 1A="65112:U+00B0" # dead_abovering 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="228:U+00E4" # adiaeresis 1F="167:U+00A7" # section 20="208:U+00D0" # ETH 21="170:U+00AA" # ordfeminine 22="957:U+014A" # ENG 23="689:U+0127" # hstroke 24="237:U+00ED" # iacute 25="38:U+0026" # ampersand 26="419:U+0141" # Lstroke 27="162:U+00A2" # cent 28="223:U+00DF" # ssharp 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="78:U+004E" # N 32="186:U+00BA" # masculine 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65452:U+002C" # KP_Separator ================================================ FILE: instfiles/km-00000410.ini ================================================ [noshift] Key8=65406:0 Key9=65307:27 Key10=49:49 Key11=50:50 Key12=51:51 Key13=52:52 Key14=53:53 Key15=54:54 Key16=55:55 Key17=56:56 Key18=57:57 Key19=48:48 Key20=39:39 Key21=236:236 Key22=65288:8 Key23=65289:9 Key24=113:113 Key25=119:119 Key26=101:101 Key27=114:114 Key28=116:116 Key29=121:121 Key30=117:117 Key31=105:105 Key32=111:111 Key33=112:112 Key34=232:232 Key35=43:43 Key36=65293:13 Key37=65507:0 Key38=97:97 Key39=115:115 Key40=100:100 Key41=102:102 Key42=103:103 Key43=104:104 Key44=106:106 Key45=107:107 Key46=108:108 Key47=242:242 Key48=224:224 Key49=92:92 Key50=65505:0 Key51=249:249 Key52=122:122 Key53=120:120 Key54=99:99 Key55=118:118 Key56=98:98 Key57=110:110 Key58=109:109 Key59=44:44 Key60=46:46 Key61=45:45 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shift] Key8=65406:0 Key9=65307:27 Key10=33:33 Key11=34:34 Key12=163:163 Key13=36:36 Key14=37:37 Key15=38:38 Key16=47:47 Key17=40:40 Key18=41:41 Key19=61:61 Key20=63:63 Key21=94:94 Key22=65288:8 Key23=65056:0 Key24=81:81 Key25=87:87 Key26=69:69 Key27=82:82 Key28=84:84 Key29=89:89 Key30=85:85 Key31=73:73 Key32=79:79 Key33=80:80 Key34=233:233 Key35=42:42 Key36=65293:13 Key37=65507:0 Key38=65:65 Key39=83:83 Key40=68:68 Key41=70:70 Key42=71:71 Key43=72:72 Key44=74:74 Key45=75:75 Key46=76:76 Key47=231:231 Key48=176:176 Key49=124:124 Key50=65505:0 Key51=167:167 Key52=90:90 Key53=88:88 Key54=67:67 Key55=86:86 Key56=66:66 Key57=78:78 Key58=77:77 Key59=59:59 Key60=58:58 Key61=95:95 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [altgr] Key8=65406:0 Key9=65307:27 Key10=185:185 Key11=178:178 Key12=179:179 Key13=188:188 Key14=189:189 Key15=172:172 Key16=123:123 Key17=91:91 Key18=93:93 Key19=125:125 Key20=96:96 Key21=126:126 Key22=65288:8 Key23=65289:9 Key24=64:64 Key25=435:322 Key26=8364:8364 Key27=182:182 Key28=956:359 Key29=2299:8592 Key30=2302:8595 Key31=2301:8594 Key32=248:248 Key33=254:254 Key34=91:91 Key35=93:93 Key36=65293:13 Key37=65507:0 Key38=230:230 Key39=223:223 Key40=240:240 Key41=496:273 Key42=959:331 Key43=689:295 Key44=65121:0 Key45=930:312 Key46=435:322 Key47=64:64 Key48=35:35 Key49=172:172 Key50=65505:0 Key51=65104:96 Key52=171:171 Key53=187:187 Key54=162:162 Key55=2770:8220 Key56=2771:8221 Key57=241:241 Key58=181:181 Key59=65105:180 Key60=183:183 Key61=65108:175 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftaltgr] Key8=65406:0 Key9=65307:27 Key10=161:161 Key11=65113:733 Key12=65107:126 Key13=2755:8539 Key14=2756:8540 Key15=2757:8541 Key16=2758:8542 Key17=2761:8482 Key18=177:177 Key19=65116:731 Key20=191:191 Key21=65106:94 Key22=65288:8 Key23=65056:0 Key24=2009:937 Key25=419:321 Key26=162:162 Key27=174:174 Key28=940:358 Key29=165:165 Key30=2300:8593 Key31=697:305 Key32=216:216 Key33=222:222 Key34=123:123 Key35=125:125 Key36=65293:13 Key37=65507:0 Key38=198:198 Key39=167:167 Key40=208:208 Key41=170:170 Key42=957:330 Key43=673:294 Key44=65122:0 Key45=38:38 Key46=419:321 Key47=65115:184 Key48=65112:176 Key49=166:166 Key50=65505:0 Key51=65109:728 Key52=60:60 Key53=62:62 Key54=169:169 Key55=2768:8216 Key56=2769:8217 Key57=209:209 Key58=186:186 Key59=215:215 Key60=65111:168 Key61=247:247 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [capslock] Key8=65406:0 Key9=65307:27 Key10=49:49 Key11=50:50 Key12=51:51 Key13=52:52 Key14=53:53 Key15=54:54 Key16=55:55 Key17=56:56 Key18=57:57 Key19=48:48 Key20=39:39 Key21=204:204 Key22=65288:8 Key23=65289:9 Key24=81:81 Key25=87:87 Key26=69:69 Key27=82:82 Key28=84:84 Key29=89:89 Key30=85:85 Key31=73:73 Key32=79:79 Key33=80:80 Key34=200:200 Key35=43:43 Key36=65293:13 Key37=65507:0 Key38=65:65 Key39=83:83 Key40=68:68 Key41=70:70 Key42=71:71 Key43=72:72 Key44=74:74 Key45=75:75 Key46=76:76 Key47=210:210 Key48=192:192 Key49=92:92 Key50=65505:0 Key51=217:217 Key52=90:90 Key53=88:88 Key54=67:67 Key55=86:86 Key56=66:66 Key57=78:78 Key58=77:77 Key59=44:44 Key60=46:46 Key61=45:45 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [capslockaltgr] Key8=65406:0 Key9=65307:27 Key10=185:185 Key11=178:178 Key12=179:179 Key13=188:188 Key14=189:189 Key15=172:172 Key16=123:123 Key17=91:91 Key18=93:93 Key19=125:125 Key20=96:96 Key21=126:126 Key22=65288:8 Key23=65289:9 Key24=64:64 Key25=419:321 Key26=8364:8364 Key27=182:182 Key28=940:358 Key29=2299:8592 Key30=2302:8595 Key31=2301:8594 Key32=216:216 Key33=222:222 Key34=91:91 Key35=93:93 Key36=65293:13 Key37=65507:0 Key38=198:198 Key39=223:223 Key40=208:208 Key41=464:272 Key42=957:330 Key43=673:294 Key44=65121:0 Key45=930:312 Key46=419:321 Key47=64:64 Key48=35:35 Key49=172:172 Key50=65505:0 Key51=65104:96 Key52=171:171 Key53=187:187 Key54=162:162 Key55=2770:8220 Key56=2771:8221 Key57=209:209 Key58=924:0 Key59=65105:180 Key60=183:183 Key61=65108:175 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftcapslock] Key8=65406:0 Key9=65307:27 Key10=33:33 Key11=34:34 Key12=163:163 Key13=36:36 Key14=37:37 Key15=38:38 Key16=47:47 Key17=40:40 Key18=41:41 Key19=61:61 Key20=63:63 Key21=94:94 Key22=65288:8 Key23=65056:0 Key24=113:113 Key25=119:119 Key26=101:101 Key27=114:114 Key28=116:116 Key29=121:121 Key30=117:117 Key31=105:105 Key32=111:111 Key33=112:112 Key34=201:201 Key35=42:42 Key36=65293:13 Key37=65507:0 Key38=97:97 Key39=115:115 Key40=100:100 Key41=102:102 Key42=103:103 Key43=104:104 Key44=106:106 Key45=107:107 Key46=108:108 Key47=199:199 Key48=176:176 Key49=124:124 Key50=65505:0 Key51=167:167 Key52=122:122 Key53=120:120 Key54=99:99 Key55=118:118 Key56=98:98 Key57=110:110 Key58=109:109 Key59=59:59 Key60=58:58 Key61=95:95 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftcapslockaltgr] Key8=65406:0 Key9=65307:27 Key10=161:161 Key11=65113:733 Key12=65107:126 Key13=2755:8539 Key14=2756:8540 Key15=2757:8541 Key16=2758:8542 Key17=2761:8482 Key18=177:177 Key19=65116:731 Key20=191:191 Key21=65106:94 Key22=65288:8 Key23=65056:0 Key24=2009:937 Key25=435:322 Key26=162:162 Key27=174:174 Key28=956:359 Key29=165:165 Key30=2300:8593 Key31=697:305 Key32=248:248 Key33=254:254 Key34=123:123 Key35=125:125 Key36=65293:13 Key37=65507:0 Key38=230:230 Key39=167:167 Key40=240:240 Key41=170:170 Key42=959:331 Key43=689:295 Key44=65122:0 Key45=38:38 Key46=435:322 Key47=65115:184 Key48=65112:176 Key49=166:166 Key50=65505:0 Key51=65109:728 Key52=60:60 Key53=62:62 Key54=169:169 Key55=2768:8216 Key56=2769:8217 Key57=241:241 Key58=186:186 Key59=215:215 Key60=65111:168 Key61=247:247 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 ================================================ FILE: instfiles/km-00000410.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwerty) # setxkbmap -rules evdev -model pc104 -layout it # Description: it-IT # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="39:U+0027" # apostrophe 0D="236:U+00EC" # igrave 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="232:U+00E8" # egrave 1B="43:U+002B" # plus 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="242:U+00F2" # ograve 28="224:U+00E0" # agrave 29="92:U+005C" # backslash 2A="65505" # Shift_L 2B="249:U+00F9" # ugrave 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="47:U+002F" # slash 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="61:U+003D" # equal 0C="63:U+003F" # question 0D="94:U+005E" # asciicircum 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="233:U+00E9" # eacute 1B="42:U+002A" # asterisk 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="231:U+00E7" # ccedilla 28="176:U+00B0" # degree 29="124:U+007C" # bar 2A="65505" # Shift_L 2B="167:U+00A7" # section 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="185:U+00B9" # onesuperior 03="178:U+00B2" # twosuperior 04="179:U+00B3" # threesuperior 05="188:U+00BC" # onequarter 06="189:U+00BD" # onehalf 07="172:U+00AC" # notsign 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="96:U+0060" # grave 0D="126:U+007E" # asciitilde 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="64:U+0040" # at 11="435:U+0142" # lstroke 12="8364:U+20AC" # EuroSign 13="182:U+00B6" # paragraph 14="956:U+0167" # tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="248:U+00F8" # oslash 19="254:U+00FE" # thorn 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="230:U+00E6" # ae 1F="223:U+00DF" # ssharp 20="240:U+00F0" # eth 21="496:U+0111" # dstroke 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="435:U+0142" # lstroke 27="64:U+0040" # at 28="35:U+0023" # numbersign 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="65104:U+0060" # dead_grave 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="162:U+00A2" # cent 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="241:U+00F1" # ntilde 32="181:U+00B5" # mu 33="65105:U+00B4" # dead_acute 34="183:U+00B7" # periodcentered 35="65108:U+00AF" # dead_macron 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="171:U+00AB" # guillemotleft 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="65113:U+02DD" # dead_doubleacute 04="65107:U+007E" # dead_tilde 05="2755:U+215B" # oneeighth 06="2756:U+215C" # threeeighths 07="2757:U+215D" # fiveeighths 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="65116:U+02DB" # dead_ogonek 0C="191:U+00BF" # questiondown 0D="65106:U+005E" # dead_circumflex 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="419:U+0141" # Lstroke 12="162:U+00A2" # cent 13="174:U+00AE" # registered 14="940:U+0166" # Tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="216:U+00D8" # Oslash 19="222:U+00DE" # THORN 1A="123:U+007B" # braceleft 1B="125:U+007D" # braceright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="198:U+00C6" # AE 1F="167:U+00A7" # section 20="208:U+00D0" # ETH 21="170:U+00AA" # ordfeminine 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="419:U+0141" # Lstroke 27="65115:U+00B8" # dead_cedilla 28="65112:U+00B0" # dead_abovering 29="166:U+00A6" # brokenbar 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="209:U+00D1" # Ntilde 32="186:U+00BA" # masculine 33="215:U+00D7" # multiply 34="65111:U+00A8" # dead_diaeresis 35="247:U+00F7" # division 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="187:U+00BB" # guillemotright 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="39:U+0027" # apostrophe 0D="204:U+00CC" # Igrave 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="200:U+00C8" # Egrave 1B="43:U+002B" # plus 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="210:U+00D2" # Ograve 28="192:U+00C0" # Agrave 29="92:U+005C" # backslash 2A="65505" # Shift_L 2B="217:U+00D9" # Ugrave 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="185:U+00B9" # onesuperior 03="178:U+00B2" # twosuperior 04="179:U+00B3" # threesuperior 05="188:U+00BC" # onequarter 06="189:U+00BD" # onehalf 07="172:U+00AC" # notsign 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="96:U+0060" # grave 0D="126:U+007E" # asciitilde 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="64:U+0040" # at 11="419:U+0141" # Lstroke 12="8364:U+20AC" # EuroSign 13="182:U+00B6" # paragraph 14="940:U+0166" # Tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="216:U+00D8" # Oslash 19="222:U+00DE" # THORN 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="198:U+00C6" # AE 20="208:U+00D0" # ETH 21="464:U+0110" # Dstroke 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="419:U+0141" # Lstroke 27="64:U+0040" # at 28="35:U+0023" # numbersign 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="65104:U+0060" # dead_grave 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="162:U+00A2" # cent 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="209:U+00D1" # Ntilde 33="65105:U+00B4" # dead_acute 34="183:U+00B7" # periodcentered 35="65108:U+00AF" # dead_macron 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="171:U+00AB" # guillemotleft 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="47:U+002F" # slash 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="61:U+003D" # equal 0C="63:U+003F" # question 0D="94:U+005E" # asciicircum 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="201:U+00C9" # Eacute 1B="42:U+002A" # asterisk 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="199:U+00C7" # Ccedilla 28="176:U+00B0" # degree 29="124:U+007C" # bar 2A="65505" # Shift_L 2B="167:U+00A7" # section 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="65113:U+02DD" # dead_doubleacute 04="65107:U+007E" # dead_tilde 05="2755:U+215B" # oneeighth 06="2756:U+215C" # threeeighths 07="2757:U+215D" # fiveeighths 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="65116:U+02DB" # dead_ogonek 0C="191:U+00BF" # questiondown 0D="65106:U+005E" # dead_circumflex 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="435:U+0142" # lstroke 12="162:U+00A2" # cent 13="174:U+00AE" # registered 14="956:U+0167" # tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="248:U+00F8" # oslash 19="254:U+00FE" # thorn 1A="123:U+007B" # braceleft 1B="125:U+007D" # braceright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="230:U+00E6" # ae 1F="167:U+00A7" # section 20="240:U+00F0" # eth 21="170:U+00AA" # ordfeminine 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="435:U+0142" # lstroke 27="65115:U+00B8" # dead_cedilla 28="65112:U+00B0" # dead_abovering 29="166:U+00A6" # brokenbar 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="241:U+00F1" # ntilde 32="186:U+00BA" # masculine 33="215:U+00D7" # multiply 34="65111:U+00A8" # dead_diaeresis 35="247:U+00F7" # division 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="187:U+00BB" # guillemotright 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65454:U+002E" # KP_Decimal ================================================ FILE: instfiles/km-00000411.ini ================================================ [noshift] Key8=65406:0 Key9=65307:27 Key10=49:49 Key11=50:50 Key12=51:51 Key13=52:52 Key14=53:53 Key15=54:54 Key16=55:55 Key17=56:56 Key18=57:57 Key19=48:48 Key20=45:45 Key21=94:94 Key22=65288:8 Key23=65289:9 Key24=113:113 Key25=119:119 Key26=101:101 Key27=114:114 Key28=116:116 Key29=121:121 Key30=117:117 Key31=105:105 Key32=111:111 Key33=112:112 Key34=64:64 Key35=91:91 Key36=65293:13 Key37=65507:0 Key38=97:97 Key39=115:115 Key40=100:100 Key41=102:102 Key42=103:103 Key43=104:104 Key44=106:106 Key45=107:107 Key46=108:108 Key47=59:59 Key48=58:58 Key49=65322:0 Key50=65505:0 Key51=93:93 Key52=122:122 Key53=120:120 Key54=99:99 Key55=118:118 Key56=98:98 Key57=110:110 Key58=109:109 Key59=44:44 Key60=46:46 Key61=47:47 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65328:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key133=165:165 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shift] Key8=65406:0 Key9=65307:27 Key10=33:33 Key11=34:34 Key12=35:35 Key13=36:36 Key14=37:37 Key15=38:38 Key16=39:39 Key17=40:40 Key18=41:41 Key19=48:48 Key20=61:61 Key21=126:126 Key22=65288:8 Key23=65056:0 Key24=81:81 Key25=87:87 Key26=69:69 Key27=82:82 Key28=84:84 Key29=89:89 Key30=85:85 Key31=73:73 Key32=79:79 Key33=80:80 Key34=96:96 Key35=123:123 Key36=65293:13 Key37=65507:0 Key38=65:65 Key39=83:83 Key40=68:68 Key41=70:70 Key42=71:71 Key43=72:72 Key44=74:74 Key45=75:75 Key46=76:76 Key47=43:43 Key48=42:42 Key49=65322:0 Key50=65505:0 Key51=125:125 Key52=90:90 Key53=88:88 Key54=67:67 Key55=86:86 Key56=66:66 Key57=78:78 Key58=77:77 Key59=60:60 Key60=62:62 Key61=63:63 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key133=124:124 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [altgr] Key8=65406:0 Key9=65307:27 Key10=49:49 Key11=50:50 Key12=51:51 Key13=52:52 Key14=53:53 Key15=54:54 Key16=55:55 Key17=56:56 Key18=57:57 Key19=48:48 Key20=45:45 Key21=94:94 Key22=65288:8 Key23=65289:9 Key24=113:113 Key25=119:119 Key26=101:101 Key27=114:114 Key28=116:116 Key29=121:121 Key30=117:117 Key31=105:105 Key32=111:111 Key33=112:112 Key34=64:64 Key35=91:91 Key36=65293:13 Key37=65507:0 Key38=97:97 Key39=115:115 Key40=100:100 Key41=102:102 Key42=103:103 Key43=104:104 Key44=106:106 Key45=107:107 Key46=108:108 Key47=59:59 Key48=58:58 Key49=65322:0 Key50=65505:0 Key51=93:93 Key52=122:122 Key53=120:120 Key54=99:99 Key55=118:118 Key56=98:98 Key57=110:110 Key58=109:109 Key59=44:44 Key60=46:46 Key61=47:47 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65328:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key133=165:165 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftaltgr] Key8=65406:0 Key9=65307:27 Key10=33:33 Key11=34:34 Key12=35:35 Key13=36:36 Key14=37:37 Key15=38:38 Key16=39:39 Key17=40:40 Key18=41:41 Key19=48:48 Key20=61:61 Key21=126:126 Key22=65288:8 Key23=65056:0 Key24=81:81 Key25=87:87 Key26=69:69 Key27=82:82 Key28=84:84 Key29=89:89 Key30=85:85 Key31=73:73 Key32=79:79 Key33=80:80 Key34=96:96 Key35=123:123 Key36=65293:13 Key37=65507:0 Key38=65:65 Key39=83:83 Key40=68:68 Key41=70:70 Key42=71:71 Key43=72:72 Key44=74:74 Key45=75:75 Key46=76:76 Key47=43:43 Key48=42:42 Key49=65322:0 Key50=65505:0 Key51=125:125 Key52=90:90 Key53=88:88 Key54=67:67 Key55=86:86 Key56=66:66 Key57=78:78 Key58=77:77 Key59=60:60 Key60=62:62 Key61=63:63 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key133=124:124 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [capslock] Key8=65406:0 Key9=65307:27 Key10=49:49 Key11=50:50 Key12=51:51 Key13=52:52 Key14=53:53 Key15=54:54 Key16=55:55 Key17=56:56 Key18=57:57 Key19=48:48 Key20=45:45 Key21=94:94 Key22=65288:8 Key23=65289:9 Key24=81:81 Key25=87:87 Key26=69:69 Key27=82:82 Key28=84:84 Key29=89:89 Key30=85:85 Key31=73:73 Key32=79:79 Key33=80:80 Key34=64:64 Key35=91:91 Key36=65293:13 Key37=65507:0 Key38=65:65 Key39=83:83 Key40=68:68 Key41=70:70 Key42=71:71 Key43=72:72 Key44=74:74 Key45=75:75 Key46=76:76 Key47=59:59 Key48=58:58 Key49=65322:0 Key50=65505:0 Key51=93:93 Key52=90:90 Key53=88:88 Key54=67:67 Key55=86:86 Key56=66:66 Key57=78:78 Key58=77:77 Key59=44:44 Key60=46:46 Key61=47:47 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65328:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key133=165:165 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [capslockaltgr] Key8=65406:0 Key9=65307:27 Key10=49:49 Key11=50:50 Key12=51:51 Key13=52:52 Key14=53:53 Key15=54:54 Key16=55:55 Key17=56:56 Key18=57:57 Key19=48:48 Key20=45:45 Key21=94:94 Key22=65288:8 Key23=65289:9 Key24=81:81 Key25=87:87 Key26=69:69 Key27=82:82 Key28=84:84 Key29=89:89 Key30=85:85 Key31=73:73 Key32=79:79 Key33=80:80 Key34=64:64 Key35=91:91 Key36=65293:13 Key37=65507:0 Key38=65:65 Key39=83:83 Key40=68:68 Key41=70:70 Key42=71:71 Key43=72:72 Key44=74:74 Key45=75:75 Key46=76:76 Key47=59:59 Key48=58:58 Key49=65322:0 Key50=65505:0 Key51=93:93 Key52=90:90 Key53=88:88 Key54=67:67 Key55=86:86 Key56=66:66 Key57=78:78 Key58=77:77 Key59=44:44 Key60=46:46 Key61=47:47 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65328:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key133=165:165 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftcapslock] Key8=65406:0 Key9=65307:27 Key10=33:33 Key11=34:34 Key12=35:35 Key13=36:36 Key14=37:37 Key15=38:38 Key16=39:39 Key17=40:40 Key18=41:41 Key19=48:48 Key20=61:61 Key21=126:126 Key22=65288:8 Key23=65056:0 Key24=113:113 Key25=119:119 Key26=101:101 Key27=114:114 Key28=116:116 Key29=121:121 Key30=117:117 Key31=105:105 Key32=111:111 Key33=112:112 Key34=96:96 Key35=123:123 Key36=65293:13 Key37=65507:0 Key38=97:97 Key39=115:115 Key40=100:100 Key41=102:102 Key42=103:103 Key43=104:104 Key44=106:106 Key45=107:107 Key46=108:108 Key47=43:43 Key48=42:42 Key49=65322:0 Key50=65505:0 Key51=125:125 Key52=122:122 Key53=120:120 Key54=99:99 Key55=118:118 Key56=98:98 Key57=110:110 Key58=109:109 Key59=60:60 Key60=62:62 Key61=63:63 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key133=124:124 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftcapslockaltgr] Key8=65406:0 Key9=65307:27 Key10=33:33 Key11=34:34 Key12=35:35 Key13=36:36 Key14=37:37 Key15=38:38 Key16=39:39 Key17=40:40 Key18=41:41 Key19=48:48 Key20=61:61 Key21=126:126 Key22=65288:8 Key23=65056:0 Key24=113:113 Key25=119:119 Key26=101:101 Key27=114:114 Key28=116:116 Key29=121:121 Key30=117:117 Key31=105:105 Key32=111:111 Key33=112:112 Key34=96:96 Key35=123:123 Key36=65293:13 Key37=65507:0 Key38=97:97 Key39=115:115 Key40=100:100 Key41=102:102 Key42=103:103 Key43=104:104 Key44=106:106 Key45=107:107 Key46=108:108 Key47=43:43 Key48=42:42 Key49=65322:0 Key50=65505:0 Key51=125:125 Key52=122:122 Key53=120:120 Key54=99:99 Key55=118:118 Key56=98:98 Key57=110:110 Key58=109:109 Key59=60:60 Key60=62:62 Key61=63:63 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key133=124:124 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 ================================================ FILE: instfiles/km-00000411.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwerty) # setxkbmap -rules evdev -model pc105 -layout jp -variant OADG109A # Description: ja-JP # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="94:U+005E" # asciicircum 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="64:U+0040" # at 1B="91:U+005B" # bracketleft 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="59:U+003B" # semicolon 28="58:U+003A" # colon 29="65322" # Zenkaku_Hankaku 2A="65505" # Shift_L 2B="93:U+005D" # bracketright 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="44:U+002C" # comma 34="46:U+002E" # period 35="47:U+002F" # slash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65328" # Eisu_toggle 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 73="92:U+005C" # backslash 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7D="165:U+00A5" # yen 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65514" # Alt_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="39:U+0027" # apostrophe 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="48:U+0030" # 0 0C="61:U+003D" # equal 0D="126:U+007E" # asciitilde 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="96:U+0060" # grave 1B="123:U+007B" # braceleft 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="43:U+002B" # plus 28="42:U+002A" # asterisk 29="65322" # Zenkaku_Hankaku 2A="65505" # Shift_L 2B="125:U+007D" # braceright 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="60:U+003C" # less 34="62:U+003E" # greater 35="63:U+003F" # question 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 73="95:U+005F" # underscore 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7D="124:U+007C" # bar 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65512" # Meta_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="94:U+005E" # asciicircum 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="64:U+0040" # at 1B="91:U+005B" # bracketleft 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="59:U+003B" # semicolon 28="58:U+003A" # colon 29="65322" # Zenkaku_Hankaku 2A="65505" # Shift_L 2B="93:U+005D" # bracketright 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="44:U+002C" # comma 34="46:U+002E" # period 35="47:U+002F" # slash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65328" # Eisu_toggle 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 73="92:U+005C" # backslash 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7D="165:U+00A5" # yen 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65514" # Alt_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="39:U+0027" # apostrophe 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="48:U+0030" # 0 0C="61:U+003D" # equal 0D="126:U+007E" # asciitilde 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="96:U+0060" # grave 1B="123:U+007B" # braceleft 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="43:U+002B" # plus 28="42:U+002A" # asterisk 29="65322" # Zenkaku_Hankaku 2A="65505" # Shift_L 2B="125:U+007D" # braceright 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="60:U+003C" # less 34="62:U+003E" # greater 35="63:U+003F" # question 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 73="95:U+005F" # underscore 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7D="124:U+007C" # bar 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65512" # Meta_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="94:U+005E" # asciicircum 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="64:U+0040" # at 1B="91:U+005B" # bracketleft 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="59:U+003B" # semicolon 28="58:U+003A" # colon 29="65322" # Zenkaku_Hankaku 2A="65505" # Shift_L 2B="93:U+005D" # bracketright 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="44:U+002C" # comma 34="46:U+002E" # period 35="47:U+002F" # slash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65328" # Eisu_toggle 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 73="92:U+005C" # backslash 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7D="165:U+00A5" # yen 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65514" # Alt_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="94:U+005E" # asciicircum 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="64:U+0040" # at 1B="91:U+005B" # bracketleft 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="59:U+003B" # semicolon 28="58:U+003A" # colon 29="65322" # Zenkaku_Hankaku 2A="65505" # Shift_L 2B="93:U+005D" # bracketright 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="44:U+002C" # comma 34="46:U+002E" # period 35="47:U+002F" # slash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65328" # Eisu_toggle 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 73="92:U+005C" # backslash 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7D="165:U+00A5" # yen 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65514" # Alt_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="39:U+0027" # apostrophe 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="48:U+0030" # 0 0C="61:U+003D" # equal 0D="126:U+007E" # asciitilde 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="96:U+0060" # grave 1B="123:U+007B" # braceleft 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="43:U+002B" # plus 28="42:U+002A" # asterisk 29="65322" # Zenkaku_Hankaku 2A="65505" # Shift_L 2B="125:U+007D" # braceright 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="60:U+003C" # less 34="62:U+003E" # greater 35="63:U+003F" # question 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 73="95:U+005F" # underscore 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7D="124:U+007C" # bar 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65512" # Meta_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="39:U+0027" # apostrophe 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="48:U+0030" # 0 0C="61:U+003D" # equal 0D="126:U+007E" # asciitilde 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="96:U+0060" # grave 1B="123:U+007B" # braceleft 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="43:U+002B" # plus 28="42:U+002A" # asterisk 29="65322" # Zenkaku_Hankaku 2A="65505" # Shift_L 2B="125:U+007D" # braceright 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="60:U+003C" # less 34="62:U+003E" # greater 35="63:U+003F" # question 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 73="95:U+005F" # underscore 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7D="124:U+007C" # bar 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65512" # Meta_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65454:U+002E" # KP_Decimal ================================================ FILE: instfiles/km-00000412.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwerty) # setxkbmap -rules evdev -model pc105 -layout kr # Description: ko-KR # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="61:U+003D" # equal 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="59:U+003B" # semicolon 28="39:U+0027" # apostrophe 29="96:U+0060" # grave 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="44:U+002C" # comma 34="46:U+002E" # period 35="47:U+002F" # slash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65514" # Alt_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="94:U+005E" # asciicircum 08="38:U+0026" # ampersand 09="42:U+002A" # asterisk 0A="40:U+0028" # parenleft 0B="41:U+0029" # parenright 0C="95:U+005F" # underscore 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="123:U+007B" # braceleft 1B="125:U+007D" # braceright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="58:U+003A" # colon 28="34:U+0022" # quotedbl 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="124:U+007C" # bar 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="60:U+003C" # less 34="62:U+003E" # greater 35="63:U+003F" # question 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65512" # Meta_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="61:U+003D" # equal 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="59:U+003B" # semicolon 28="39:U+0027" # apostrophe 29="96:U+0060" # grave 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="44:U+002C" # comma 34="46:U+002E" # period 35="47:U+002F" # slash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65514" # Alt_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="94:U+005E" # asciicircum 08="38:U+0026" # ampersand 09="42:U+002A" # asterisk 0A="40:U+0028" # parenleft 0B="41:U+0029" # parenright 0C="95:U+005F" # underscore 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="123:U+007B" # braceleft 1B="125:U+007D" # braceright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="58:U+003A" # colon 28="34:U+0022" # quotedbl 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="124:U+007C" # bar 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="60:U+003C" # less 34="62:U+003E" # greater 35="63:U+003F" # question 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65512" # Meta_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="61:U+003D" # equal 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="59:U+003B" # semicolon 28="39:U+0027" # apostrophe 29="96:U+0060" # grave 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="44:U+002C" # comma 34="46:U+002E" # period 35="47:U+002F" # slash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65514" # Alt_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="61:U+003D" # equal 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="59:U+003B" # semicolon 28="39:U+0027" # apostrophe 29="96:U+0060" # grave 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="44:U+002C" # comma 34="46:U+002E" # period 35="47:U+002F" # slash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65514" # Alt_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="94:U+005E" # asciicircum 08="38:U+0026" # ampersand 09="42:U+002A" # asterisk 0A="40:U+0028" # parenleft 0B="41:U+0029" # parenright 0C="95:U+005F" # underscore 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="123:U+007B" # braceleft 1B="125:U+007D" # braceright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="58:U+003A" # colon 28="34:U+0022" # quotedbl 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="124:U+007C" # bar 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="60:U+003C" # less 34="62:U+003E" # greater 35="63:U+003F" # question 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65512" # Meta_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="94:U+005E" # asciicircum 08="38:U+0026" # ampersand 09="42:U+002A" # asterisk 0A="40:U+0028" # parenleft 0B="41:U+0029" # parenright 0C="95:U+005F" # underscore 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="123:U+007B" # braceleft 1B="125:U+007D" # braceright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="58:U+003A" # colon 28="34:U+0022" # quotedbl 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="124:U+007C" # bar 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="60:U+003C" # less 34="62:U+003E" # greater 35="63:U+003F" # question 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65512" # Meta_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65454:U+002E" # KP_Decimal ================================================ FILE: instfiles/km-00000414.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwerty) # setxkbmap -rules evdev -model pc105 -layout no # Description: nb-NO # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="43:U+002B" # plus 0D="92:U+005C" # backslash 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="229:U+00E5" # aring 1B="65111:U+00A8" # dead_diaeresis 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="248:U+00F8" # oslash 28="230:U+00E6" # ae 29="124:U+007C" # bar 2A="65505" # Shift_L 2B="39:U+0027" # apostrophe 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="35:U+0023" # numbersign 05="164:U+00A4" # currency 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="47:U+002F" # slash 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="61:U+003D" # equal 0C="63:U+003F" # question 0D="65104:U+0060" # dead_grave 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="197:U+00C5" # Aring 1B="65106:U+005E" # dead_circumflex 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="216:U+00D8" # Oslash 28="198:U+00C6" # AE 29="167:U+00A7" # section 2A="65505" # Shift_L 2B="42:U+002A" # asterisk 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="16786117:U+22C5" # U22C5 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="16785938:U+2212" # U2212 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="16785941:U+2215" # U2215 E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="64:U+0040" # at 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="189:U+00BD" # onehalf 07="165:U+00A5" # yen 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="177:U+00B1" # plusminus 0D="65105:U+00B4" # dead_acute 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="64:U+0040" # at 11="435:U+0142" # lstroke 12="8364:U+20AC" # EuroSign 13="174:U+00AE" # registered 14="254:U+00FE" # thorn 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="5053:U+0153" # oe 19="2032:U+03C0" # Greek_pi 1A="65111:U+00A8" # dead_diaeresis 1B="65107:U+007E" # dead_tilde 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="170:U+00AA" # ordfeminine 1F="223:U+00DF" # ssharp 20="240:U+00F0" # eth 21="496:U+0111" # dstroke 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="435:U+0142" # lstroke 27="65105:U+00B4" # dead_acute 28="65106:U+005E" # dead_circumflex 29="166:U+00A6" # brokenbar 2A="65505" # Shift_L 2B="65113:U+02DD" # dead_doubleacute 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="169:U+00A9" # copyright 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="110:U+006E" # n 32="181:U+00B5" # mu 33="65115:U+00B8" # dead_cedilla 34="2734:U+2026" # ellipsis 35="2730:U+2013" # endash 36="65506" # Shift_R 38="65513" # Alt_L 39="160:U+00A0" # nobreakspace 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="16785938:U+2212" # U2212 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="189:U+00BD" # onehalf 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="185:U+00B9" # onesuperior 03="178:U+00B2" # twosuperior 04="179:U+00B3" # threesuperior 05="188:U+00BC" # onequarter 06="16785456:U+2030" # U2030 07="2757:U+215D" # fiveeighths 08="247:U+00F7" # division 09="171:U+00AB" # guillemotleft 0A="187:U+00BB" # guillemotright 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="172:U+00AC" # notsign 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="419:U+0141" # Lstroke 12="162:U+00A2" # cent 13="2761:U+2122" # trademark 14="222:U+00DE" # THORN 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="5052:U+0152" # OE 19="2000:U+03A0" # Greek_PI 1A="65112:U+00B0" # dead_abovering 1B="65114:U+02C7" # dead_caron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="186:U+00BA" # masculine 1F="167:U+00A7" # section 20="208:U+00D0" # ETH 21="170:U+00AA" # ordfeminine 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="419:U+0141" # Lstroke 27="65113:U+02DD" # dead_doubleacute 28="65114:U+02C7" # dead_caron 29="182:U+00B6" # paragraph 2A="65505" # Shift_L 2B="215:U+00D7" # multiply 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="78:U+004E" # N 32="186:U+00BA" # masculine 33="65116:U+02DB" # dead_ogonek 34="183:U+00B7" # periodcentered 35="2729:U+2014" # emdash 36="65506" # Shift_R 37="16777215" # VoidSymbol 38="65511" # Meta_L 39="16785455:U+202F" # U202F 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="16777215" # VoidSymbol 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="16777215" # VoidSymbol 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="190:U+00BE" # threequarters 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="16777215" # VoidSymbol E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="43:U+002B" # plus 0D="92:U+005C" # backslash 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="197:U+00C5" # Aring 1B="65111:U+00A8" # dead_diaeresis 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="216:U+00D8" # Oslash 28="198:U+00C6" # AE 29="124:U+007C" # bar 2A="65505" # Shift_L 2B="39:U+0027" # apostrophe 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="64:U+0040" # at 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="189:U+00BD" # onehalf 07="165:U+00A5" # yen 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="177:U+00B1" # plusminus 0D="65105:U+00B4" # dead_acute 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="64:U+0040" # at 11="419:U+0141" # Lstroke 12="8364:U+20AC" # EuroSign 13="174:U+00AE" # registered 14="222:U+00DE" # THORN 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="5052:U+0152" # OE 19="2000:U+03A0" # Greek_PI 1A="65111:U+00A8" # dead_diaeresis 1B="65107:U+007E" # dead_tilde 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="170:U+00AA" # ordfeminine 20="208:U+00D0" # ETH 21="464:U+0110" # Dstroke 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="419:U+0141" # Lstroke 27="65105:U+00B4" # dead_acute 28="65106:U+005E" # dead_circumflex 29="166:U+00A6" # brokenbar 2A="65505" # Shift_L 2B="65113:U+02DD" # dead_doubleacute 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="169:U+00A9" # copyright 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="78:U+004E" # N 33="65115:U+00B8" # dead_cedilla 34="2734:U+2026" # ellipsis 35="2730:U+2013" # endash 36="65506" # Shift_R 38="65513" # Alt_L 39="160:U+00A0" # nobreakspace 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="16785938:U+2212" # U2212 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="189:U+00BD" # onehalf 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="35:U+0023" # numbersign 05="164:U+00A4" # currency 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="47:U+002F" # slash 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="61:U+003D" # equal 0C="63:U+003F" # question 0D="65104:U+0060" # dead_grave 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="229:U+00E5" # aring 1B="65106:U+005E" # dead_circumflex 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="248:U+00F8" # oslash 28="230:U+00E6" # ae 29="167:U+00A7" # section 2A="65505" # Shift_L 2B="42:U+002A" # asterisk 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="16786117:U+22C5" # U22C5 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="16785938:U+2212" # U2212 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="16785941:U+2215" # U2215 E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="185:U+00B9" # onesuperior 03="178:U+00B2" # twosuperior 04="179:U+00B3" # threesuperior 05="188:U+00BC" # onequarter 06="16785456:U+2030" # U2030 07="2757:U+215D" # fiveeighths 08="247:U+00F7" # division 09="171:U+00AB" # guillemotleft 0A="187:U+00BB" # guillemotright 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="172:U+00AC" # notsign 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="435:U+0142" # lstroke 12="162:U+00A2" # cent 13="2761:U+2122" # trademark 14="254:U+00FE" # thorn 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="5053:U+0153" # oe 19="2032:U+03C0" # Greek_pi 1A="65112:U+00B0" # dead_abovering 1B="65114:U+02C7" # dead_caron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="186:U+00BA" # masculine 1F="167:U+00A7" # section 20="240:U+00F0" # eth 21="170:U+00AA" # ordfeminine 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="435:U+0142" # lstroke 27="65113:U+02DD" # dead_doubleacute 28="65114:U+02C7" # dead_caron 29="182:U+00B6" # paragraph 2A="65505" # Shift_L 2B="215:U+00D7" # multiply 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="110:U+006E" # n 32="186:U+00BA" # masculine 33="65116:U+02DB" # dead_ogonek 34="183:U+00B7" # periodcentered 35="2729:U+2014" # emdash 36="65506" # Shift_R 37="16777215" # VoidSymbol 38="65511" # Meta_L 39="16785455:U+202F" # U202F 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="16777215" # VoidSymbol 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="16777215" # VoidSymbol 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="190:U+00BE" # threequarters 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="16777215" # VoidSymbol E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65452:U+002C" # KP_Separator ================================================ FILE: instfiles/km-00000415.ini ================================================ [noshift] Key8=65406:0 Key9=65307:27 Key10=49:49 Key11=50:50 Key12=51:51 Key13=52:52 Key14=53:53 Key15=54:54 Key16=55:55 Key17=56:56 Key18=57:57 Key19=48:48 Key20=45:45 Key21=61:61 Key22=65288:8 Key23=65289:9 Key24=113:113 Key25=119:119 Key26=101:101 Key27=114:114 Key28=116:116 Key29=121:121 Key30=117:117 Key31=105:105 Key32=111:111 Key33=112:112 Key34=91:91 Key35=93:93 Key36=65293:13 Key37=65507:0 Key38=97:97 Key39=115:115 Key40=100:100 Key41=102:102 Key42=103:103 Key43=104:104 Key44=106:106 Key45=107:107 Key46=108:108 Key47=59:59 Key48=39:39 Key49=96:96 Key50=65505:0 Key51=92:92 Key52=122:122 Key53=120:120 Key54=99:99 Key55=118:118 Key56=98:98 Key57=110:110 Key58=109:109 Key59=44:44 Key60=46:46 Key61=47:47 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shift] Key8=65406:0 Key9=65307:27 Key10=33:33 Key11=64:64 Key12=35:35 Key13=36:36 Key14=37:37 Key15=94:94 Key16=38:38 Key17=42:42 Key18=40:40 Key19=41:41 Key20=95:95 Key21=43:43 Key22=65288:8 Key23=65056:0 Key24=81:81 Key25=87:87 Key26=69:69 Key27=82:82 Key28=84:84 Key29=89:89 Key30=85:85 Key31=73:73 Key32=79:79 Key33=80:80 Key34=123:123 Key35=125:125 Key36=65293:13 Key37=65507:0 Key38=65:65 Key39=83:83 Key40=68:68 Key41=70:70 Key42=71:71 Key43=72:72 Key44=74:74 Key45=75:75 Key46=76:76 Key47=58:58 Key48=34:34 Key49=126:126 Key50=65505:0 Key51=124:124 Key52=90:90 Key53=88:88 Key54=67:67 Key55=86:86 Key56=66:66 Key57=78:78 Key58=77:77 Key59=60:60 Key60=62:62 Key61=63:63 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [altgr] Key8=65406:0 Key9=65307:27 Key10=2237:8800 Key11=178:178 Key12=179:179 Key13=162:162 Key14=8364:8364 Key15=189:189 Key16=167:167 Key17=183:183 Key18=171:171 Key19=187:187 Key20=2730:8211 Key21=65115:184 Key22=65288:8 Key23=65289:9 Key24=2032:960 Key25=5053:339 Key26=490:281 Key27=169:169 Key28=223:223 Key29=2299:8592 Key30=2302:8595 Key31=2301:8594 Key32=243:243 Key33=254:254 Key34=65111:168 Key35=65107:126 Key36=65293:13 Key37=65507:0 Key38=433:261 Key39=438:347 Key40=240:240 Key41=230:230 Key42=959:331 Key43=2769:8217 Key44=16777817:601 Key45=2734:8230 Key46=435:322 Key47=65105:180 Key48=65106:94 Key49=172:172 Key50=65505:0 Key51=65104:96 Key52=447:380 Key53=444:378 Key54=486:263 Key55=2814:8222 Key56=2771:8221 Key57=497:324 Key58=181:181 Key59=2236:8804 Key60=2238:8805 Key61=65120:0 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=160:160 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftaltgr] Key8=65406:0 Key9=65307:27 Key10=161:161 Key11=191:191 Key12=163:163 Key13=188:188 Key14=16785456:8240 Key15=2270:8743 Key16=16785992:8776 Key17=190:190 Key18=177:177 Key19=176:176 Key20=2729:8212 Key21=65116:731 Key22=65288:8 Key23=65056:0 Key24=2009:937 Key25=5052:338 Key26=458:280 Key27=174:174 Key28=2761:8482 Key29=165:165 Key30=2300:8593 Key31=16785812:8596 Key32=211:211 Key33=222:222 Key34=65112:176 Key35=65108:175 Key36=65293:13 Key37=65507:0 Key38=417:260 Key39=422:346 Key40=208:208 Key41=198:198 Key42=957:330 Key43=16785442:8226 Key44=16777615:399 Key45=65123:0 Key46=419:321 Key47=65113:733 Key48=65114:711 Key49=2271:8744 Key50=65505:0 Key51=65109:728 Key52=431:379 Key53=428:377 Key54=454:262 Key55=2768:8216 Key56=2770:8220 Key57=465:323 Key58=2242:8734 Key59=215:215 Key60=247:247 Key61=65110:729 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=160:160 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [capslock] Key8=65406:0 Key9=65307:27 Key10=49:49 Key11=50:50 Key12=51:51 Key13=52:52 Key14=53:53 Key15=54:54 Key16=55:55 Key17=56:56 Key18=57:57 Key19=48:48 Key20=45:45 Key21=61:61 Key22=65288:8 Key23=65289:9 Key24=81:81 Key25=87:87 Key26=69:69 Key27=82:82 Key28=84:84 Key29=89:89 Key30=85:85 Key31=73:73 Key32=79:79 Key33=80:80 Key34=91:91 Key35=93:93 Key36=65293:13 Key37=65507:0 Key38=65:65 Key39=83:83 Key40=68:68 Key41=70:70 Key42=71:71 Key43=72:72 Key44=74:74 Key45=75:75 Key46=76:76 Key47=59:59 Key48=39:39 Key49=96:96 Key50=65505:0 Key51=92:92 Key52=90:90 Key53=88:88 Key54=67:67 Key55=86:86 Key56=66:66 Key57=78:78 Key58=77:77 Key59=44:44 Key60=46:46 Key61=47:47 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [capslockaltgr] Key8=65406:0 Key9=65307:27 Key10=2237:8800 Key11=178:178 Key12=179:179 Key13=162:162 Key14=8364:8364 Key15=189:189 Key16=167:167 Key17=183:183 Key18=171:171 Key19=187:187 Key20=2730:8211 Key21=65115:184 Key22=65288:8 Key23=65289:9 Key24=2009:937 Key25=5052:338 Key26=458:280 Key27=169:169 Key28=223:223 Key29=2299:8592 Key30=2302:8595 Key31=2301:8594 Key32=211:211 Key33=222:222 Key34=65111:168 Key35=65107:126 Key36=65293:13 Key37=65507:0 Key38=417:260 Key39=422:346 Key40=208:208 Key41=198:198 Key42=957:330 Key43=2769:8217 Key44=16777615:399 Key45=2734:8230 Key46=419:321 Key47=65105:180 Key48=65106:94 Key49=172:172 Key50=65505:0 Key51=65104:96 Key52=431:379 Key53=428:377 Key54=454:262 Key55=2814:8222 Key56=2771:8221 Key57=465:323 Key58=924:0 Key59=2236:8804 Key60=2238:8805 Key61=65120:0 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=160:160 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftcapslock] Key8=65406:0 Key9=65307:27 Key10=33:33 Key11=64:64 Key12=35:35 Key13=36:36 Key14=37:37 Key15=94:94 Key16=38:38 Key17=42:42 Key18=40:40 Key19=41:41 Key20=95:95 Key21=43:43 Key22=65288:8 Key23=65056:0 Key24=113:113 Key25=119:119 Key26=101:101 Key27=114:114 Key28=116:116 Key29=121:121 Key30=117:117 Key31=105:105 Key32=111:111 Key33=112:112 Key34=123:123 Key35=125:125 Key36=65293:13 Key37=65507:0 Key38=97:97 Key39=115:115 Key40=100:100 Key41=102:102 Key42=103:103 Key43=104:104 Key44=106:106 Key45=107:107 Key46=108:108 Key47=58:58 Key48=34:34 Key49=126:126 Key50=65505:0 Key51=124:124 Key52=122:122 Key53=120:120 Key54=99:99 Key55=118:118 Key56=98:98 Key57=110:110 Key58=109:109 Key59=60:60 Key60=62:62 Key61=63:63 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftcapslockaltgr] Key8=65406:0 Key9=65307:27 Key10=161:161 Key11=191:191 Key12=163:163 Key13=188:188 Key14=16785456:8240 Key15=2270:8743 Key16=16785992:8776 Key17=190:190 Key18=177:177 Key19=176:176 Key20=2729:8212 Key21=65116:731 Key22=65288:8 Key23=65056:0 Key24=2032:960 Key25=5053:339 Key26=490:281 Key27=174:174 Key28=2761:8482 Key29=165:165 Key30=2300:8593 Key31=16785812:8596 Key32=243:243 Key33=254:254 Key34=65112:176 Key35=65108:175 Key36=65293:13 Key37=65507:0 Key38=433:261 Key39=438:347 Key40=240:240 Key41=230:230 Key42=959:331 Key43=16785442:8226 Key44=16777817:601 Key45=65123:0 Key46=435:322 Key47=65113:733 Key48=65114:711 Key49=2271:8744 Key50=65505:0 Key51=65109:728 Key52=447:380 Key53=444:378 Key54=486:263 Key55=2768:8216 Key56=2770:8220 Key57=497:324 Key58=2242:8734 Key59=215:215 Key60=247:247 Key61=65110:729 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=160:160 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 ================================================ FILE: instfiles/km-00000415.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwerty) # setxkbmap -rules evdev -model pc104 -layout pl # Description: pl-PL # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="61:U+003D" # equal 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="59:U+003B" # semicolon 28="39:U+0027" # apostrophe 29="96:U+0060" # grave 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="44:U+002C" # comma 34="46:U+002E" # period 35="47:U+002F" # slash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="94:U+005E" # asciicircum 08="38:U+0026" # ampersand 09="42:U+002A" # asterisk 0A="40:U+0028" # parenleft 0B="41:U+0029" # parenright 0C="95:U+005F" # underscore 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="123:U+007B" # braceleft 1B="125:U+007D" # braceright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="58:U+003A" # colon 28="34:U+0022" # quotedbl 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="124:U+007C" # bar 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="60:U+003C" # less 34="62:U+003E" # greater 35="63:U+003F" # question 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="2237:U+2260" # notequal 03="178:U+00B2" # twosuperior 04="179:U+00B3" # threesuperior 05="162:U+00A2" # cent 06="8364:U+20AC" # EuroSign 07="189:U+00BD" # onehalf 08="167:U+00A7" # section 09="183:U+00B7" # periodcentered 0A="171:U+00AB" # guillemotleft 0B="187:U+00BB" # guillemotright 0C="2730:U+2013" # endash 0D="65115:U+00B8" # dead_cedilla 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="2032:U+03C0" # Greek_pi 11="5053:U+0153" # oe 12="490:U+0119" # eogonek 13="169:U+00A9" # copyright 14="223:U+00DF" # ssharp 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="243:U+00F3" # oacute 19="254:U+00FE" # thorn 1A="65111:U+00A8" # dead_diaeresis 1B="65107:U+007E" # dead_tilde 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="433:U+0105" # aogonek 1F="438:U+015B" # sacute 20="240:U+00F0" # eth 21="230:U+00E6" # ae 22="959:U+014B" # eng 23="2769:U+2019" # rightsinglequotemark 24="16777817:U+0259" # schwa 25="2734:U+2026" # ellipsis 26="435:U+0142" # lstroke 27="65105:U+00B4" # dead_acute 28="65106:U+005E" # dead_circumflex 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="65104:U+0060" # dead_grave 2C="447:U+017C" # zabovedot 2D="444:U+017A" # zacute 2E="486:U+0107" # cacute 2F="2814:U+201E" # doublelowquotemark 30="2771:U+201D" # rightdoublequotemark 31="497:U+0144" # nacute 32="181:U+00B5" # mu 33="2236:U+2264" # lessthanequal 34="2238:U+2265" # greaterthanequal 35="65120" # dead_belowdot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="160:U+00A0" # nobreakspace 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="191:U+00BF" # questiondown 04="163:U+00A3" # sterling 05="188:U+00BC" # onequarter 06="16785456:U+2030" # U2030 07="2270:U+2227" # logicaland 08="16785992:U+2248" # approxeq 09="190:U+00BE" # threequarters 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="2729:U+2014" # emdash 0D="65116:U+02DB" # dead_ogonek 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="5052:U+0152" # OE 12="458:U+0118" # Eogonek 13="174:U+00AE" # registered 14="2761:U+2122" # trademark 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="16785812:U+2194" # U2194 18="211:U+00D3" # Oacute 19="222:U+00DE" # THORN 1A="65112:U+00B0" # dead_abovering 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="417:U+0104" # Aogonek 1F="422:U+015A" # Sacute 20="208:U+00D0" # ETH 21="198:U+00C6" # AE 22="957:U+014A" # ENG 23="16785442:U+2022" # U2022 24="16777615:U+018F" # SCHWA 25="65123" # dead_stroke 26="419:U+0141" # Lstroke 27="65113:U+02DD" # dead_doubleacute 28="65114:U+02C7" # dead_caron 29="2271:U+2228" # logicalor 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="431:U+017B" # Zabovedot 2D="428:U+0179" # Zacute 2E="454:U+0106" # Cacute 2F="2768:U+2018" # leftsinglequotemark 30="2770:U+201C" # leftdoublequotemark 31="465:U+0143" # Nacute 32="2242:U+221E" # infinity 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="160:U+00A0" # nobreakspace 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="61:U+003D" # equal 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="59:U+003B" # semicolon 28="39:U+0027" # apostrophe 29="96:U+0060" # grave 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="44:U+002C" # comma 34="46:U+002E" # period 35="47:U+002F" # slash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="2237:U+2260" # notequal 03="178:U+00B2" # twosuperior 04="179:U+00B3" # threesuperior 05="162:U+00A2" # cent 06="8364:U+20AC" # EuroSign 07="189:U+00BD" # onehalf 08="167:U+00A7" # section 09="183:U+00B7" # periodcentered 0A="171:U+00AB" # guillemotleft 0B="187:U+00BB" # guillemotright 0C="2730:U+2013" # endash 0D="65115:U+00B8" # dead_cedilla 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="2009:U+03A9" # Greek_OMEGA 11="5052:U+0152" # OE 12="458:U+0118" # Eogonek 13="169:U+00A9" # copyright 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="211:U+00D3" # Oacute 19="222:U+00DE" # THORN 1A="65111:U+00A8" # dead_diaeresis 1B="65107:U+007E" # dead_tilde 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="417:U+0104" # Aogonek 1F="422:U+015A" # Sacute 20="208:U+00D0" # ETH 21="198:U+00C6" # AE 22="957:U+014A" # ENG 23="2769:U+2019" # rightsinglequotemark 24="16777615:U+018F" # SCHWA 25="2734:U+2026" # ellipsis 26="419:U+0141" # Lstroke 27="65105:U+00B4" # dead_acute 28="65106:U+005E" # dead_circumflex 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="65104:U+0060" # dead_grave 2C="431:U+017B" # Zabovedot 2D="428:U+0179" # Zacute 2E="454:U+0106" # Cacute 2F="2814:U+201E" # doublelowquotemark 30="2771:U+201D" # rightdoublequotemark 31="465:U+0143" # Nacute 33="2236:U+2264" # lessthanequal 34="2238:U+2265" # greaterthanequal 35="65120" # dead_belowdot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="160:U+00A0" # nobreakspace 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="94:U+005E" # asciicircum 08="38:U+0026" # ampersand 09="42:U+002A" # asterisk 0A="40:U+0028" # parenleft 0B="41:U+0029" # parenright 0C="95:U+005F" # underscore 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="123:U+007B" # braceleft 1B="125:U+007D" # braceright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="58:U+003A" # colon 28="34:U+0022" # quotedbl 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="124:U+007C" # bar 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="60:U+003C" # less 34="62:U+003E" # greater 35="63:U+003F" # question 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="191:U+00BF" # questiondown 04="163:U+00A3" # sterling 05="188:U+00BC" # onequarter 06="16785456:U+2030" # U2030 07="2270:U+2227" # logicaland 08="16785992:U+2248" # approxeq 09="190:U+00BE" # threequarters 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="2729:U+2014" # emdash 0D="65116:U+02DB" # dead_ogonek 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2032:U+03C0" # Greek_pi 11="5053:U+0153" # oe 12="490:U+0119" # eogonek 13="174:U+00AE" # registered 14="2761:U+2122" # trademark 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="16785812:U+2194" # U2194 18="243:U+00F3" # oacute 19="254:U+00FE" # thorn 1A="65112:U+00B0" # dead_abovering 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="433:U+0105" # aogonek 1F="438:U+015B" # sacute 20="240:U+00F0" # eth 21="230:U+00E6" # ae 22="959:U+014B" # eng 23="16785442:U+2022" # U2022 24="16777817:U+0259" # schwa 25="65123" # dead_stroke 26="435:U+0142" # lstroke 27="65113:U+02DD" # dead_doubleacute 28="65114:U+02C7" # dead_caron 29="2271:U+2228" # logicalor 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="447:U+017C" # zabovedot 2D="444:U+017A" # zacute 2E="486:U+0107" # cacute 2F="2768:U+2018" # leftsinglequotemark 30="2770:U+201C" # leftdoublequotemark 31="497:U+0144" # nacute 32="2242:U+221E" # infinity 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="160:U+00A0" # nobreakspace 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65452:U+002C" # KP_Separator ================================================ FILE: instfiles/km-00000416.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwerty) # setxkbmap -rules evdev -model pc105 -layout br # Description: pt-BR # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="61:U+003D" # equal 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="65105:U+00B4" # dead_acute 1B="91:U+005B" # bracketleft 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="231:U+00E7" # ccedilla 28="65107:U+007E" # dead_tilde 29="39:U+0027" # apostrophe 2A="65505" # Shift_L 2B="93:U+005D" # bracketright 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="44:U+002C" # comma 34="46:U+002E" # period 35="59:U+003B" # semicolon 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="92:U+005C" # backslash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 73="47:U+002F" # slash 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="65111:U+00A8" # dead_diaeresis 08="38:U+0026" # ampersand 09="42:U+002A" # asterisk 0A="40:U+0028" # parenleft 0B="41:U+0029" # parenright 0C="95:U+005F" # underscore 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="65104:U+0060" # dead_grave 1B="123:U+007B" # braceleft 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="199:U+00C7" # Ccedilla 28="65106:U+005E" # dead_circumflex 29="34:U+0022" # quotedbl 2A="65505" # Shift_L 2B="125:U+007D" # braceright 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="60:U+003C" # less 34="62:U+003E" # greater 35="58:U+003A" # colon 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 73="63:U+003F" # question 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="185:U+00B9" # onesuperior 03="178:U+00B2" # twosuperior 04="179:U+00B3" # threesuperior 05="163:U+00A3" # sterling 06="162:U+00A2" # cent 07="172:U+00AC" # notsign 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="92:U+005C" # backslash 0D="167:U+00A7" # section 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="47:U+002F" # slash 11="63:U+003F" # question 12="176:U+00B0" # degree 13="174:U+00AE" # registered 14="956:U+0167" # tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="248:U+00F8" # oslash 19="254:U+00FE" # thorn 1A="180:U+00B4" # acute 1B="170:U+00AA" # ordfeminine 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="230:U+00E6" # ae 1F="223:U+00DF" # ssharp 20="240:U+00F0" # eth 21="496:U+0111" # dstroke 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="435:U+0142" # lstroke 27="65105:U+00B4" # dead_acute 28="126:U+007E" # asciitilde 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="186:U+00BA" # masculine 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="169:U+00A9" # copyright 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="110:U+006E" # n 32="181:U+00B5" # mu 33="2211" # horizconnector 34="183:U+00B7" # periodcentered 35="65120" # dead_belowdot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="65114:U+02C7" # dead_caron 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 73="176:U+00B0" # degree 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="189:U+00BD" # onehalf 04="190:U+00BE" # threequarters 05="188:U+00BC" # onequarter 06="2756:U+215C" # threeeighths 07="168:U+00A8" # diaeresis 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="65116:U+02DB" # dead_ogonek 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="47:U+002F" # slash 11="63:U+003F" # question 12="176:U+00B0" # degree 13="174:U+00AE" # registered 14="940:U+0166" # Tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="216:U+00D8" # Oslash 19="222:U+00DE" # THORN 1A="96:U+0060" # grave 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="198:U+00C6" # AE 1F="167:U+00A7" # section 20="208:U+00D0" # ETH 21="170:U+00AA" # ordfeminine 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="419:U+0141" # Lstroke 27="65113:U+02DD" # dead_doubleacute 28="94:U+005E" # asciicircum 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="186:U+00BA" # masculine 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="78:U+004E" # N 32="181:U+00B5" # mu 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="65109:U+02D8" # dead_breve 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 73="191:U+00BF" # questiondown 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="61:U+003D" # equal 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="65105:U+00B4" # dead_acute 1B="91:U+005B" # bracketleft 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="199:U+00C7" # Ccedilla 28="65107:U+007E" # dead_tilde 29="39:U+0027" # apostrophe 2A="65505" # Shift_L 2B="93:U+005D" # bracketright 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="44:U+002C" # comma 34="46:U+002E" # period 35="59:U+003B" # semicolon 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="92:U+005C" # backslash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 73="47:U+002F" # slash 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="185:U+00B9" # onesuperior 03="178:U+00B2" # twosuperior 04="179:U+00B3" # threesuperior 05="163:U+00A3" # sterling 06="162:U+00A2" # cent 07="172:U+00AC" # notsign 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="92:U+005C" # backslash 0D="167:U+00A7" # section 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="47:U+002F" # slash 11="63:U+003F" # question 12="176:U+00B0" # degree 13="174:U+00AE" # registered 14="940:U+0166" # Tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="216:U+00D8" # Oslash 19="222:U+00DE" # THORN 1A="180:U+00B4" # acute 1B="170:U+00AA" # ordfeminine 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="198:U+00C6" # AE 20="208:U+00D0" # ETH 21="464:U+0110" # Dstroke 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="419:U+0141" # Lstroke 27="65105:U+00B4" # dead_acute 28="126:U+007E" # asciitilde 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="186:U+00BA" # masculine 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="169:U+00A9" # copyright 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="78:U+004E" # N 33="2211" # horizconnector 34="183:U+00B7" # periodcentered 35="65120" # dead_belowdot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="65114:U+02C7" # dead_caron 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 73="176:U+00B0" # degree 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="65111:U+00A8" # dead_diaeresis 08="38:U+0026" # ampersand 09="42:U+002A" # asterisk 0A="40:U+0028" # parenleft 0B="41:U+0029" # parenright 0C="95:U+005F" # underscore 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="65104:U+0060" # dead_grave 1B="123:U+007B" # braceleft 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="231:U+00E7" # ccedilla 28="65106:U+005E" # dead_circumflex 29="34:U+0022" # quotedbl 2A="65505" # Shift_L 2B="125:U+007D" # braceright 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="60:U+003C" # less 34="62:U+003E" # greater 35="58:U+003A" # colon 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 73="63:U+003F" # question 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="189:U+00BD" # onehalf 04="190:U+00BE" # threequarters 05="188:U+00BC" # onequarter 06="2756:U+215C" # threeeighths 07="168:U+00A8" # diaeresis 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="65116:U+02DB" # dead_ogonek 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="47:U+002F" # slash 11="63:U+003F" # question 12="176:U+00B0" # degree 13="174:U+00AE" # registered 14="956:U+0167" # tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="248:U+00F8" # oslash 19="254:U+00FE" # thorn 1A="96:U+0060" # grave 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="230:U+00E6" # ae 1F="167:U+00A7" # section 20="240:U+00F0" # eth 21="170:U+00AA" # ordfeminine 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="435:U+0142" # lstroke 27="65113:U+02DD" # dead_doubleacute 28="94:U+005E" # asciicircum 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="186:U+00BA" # masculine 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="110:U+006E" # n 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="65109:U+02D8" # dead_breve 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 73="191:U+00BF" # questiondown 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65452:U+002C" # KP_Separator ================================================ FILE: instfiles/km-00000419.ini ================================================ [noshift] Key8=65406:0 Key9=65307:27 Key10=49:49 Key11=50:50 Key12=51:51 Key13=52:52 Key14=53:53 Key15=54:54 Key16=55:55 Key17=56:56 Key18=57:57 Key19=48:48 Key20=45:45 Key21=61:61 Key22=65288:8 Key23=65289:9 Key24=1738:1081 Key25=1731:1094 Key26=1749:1091 Key27=1739:1082 Key28=1733:1077 Key29=1742:1085 Key30=1735:1075 Key31=1755:1096 Key32=1757:1097 Key33=1754:1079 Key34=1736:1093 Key35=1759:1098 Key36=65293:13 Key37=65507:0 Key38=1734:1092 Key39=1753:1099 Key40=1751:1074 Key41=1729:1072 Key42=1744:1087 Key43=1746:1088 Key44=1743:1086 Key45=1740:1083 Key46=1732:1076 Key47=1750:1078 Key48=1756:1101 Key49=1699:1105 Key50=65505:0 Key51=92:92 Key52=1745:1103 Key53=1758:1095 Key54=1747:1089 Key55=1741:1084 Key56=1737:1080 Key57=1748:1090 Key58=1752:1100 Key59=1730:1073 Key60=1728:1102 Key61=46:46 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shift] Key8=65406:0 Key9=65307:27 Key10=33:33 Key11=34:34 Key12=1712:8470 Key13=59:59 Key14=37:37 Key15=58:58 Key16=63:63 Key17=42:42 Key18=40:40 Key19=41:41 Key20=95:95 Key21=43:43 Key22=65288:8 Key23=65056:0 Key24=1770:1049 Key25=1763:1062 Key26=1781:1059 Key27=1771:1050 Key28=1765:1045 Key29=1774:1053 Key30=1767:1043 Key31=1787:1064 Key32=1789:1065 Key33=1786:1047 Key34=1768:1061 Key35=1791:1066 Key36=65293:13 Key37=65507:0 Key38=1766:1060 Key39=1785:1067 Key40=1783:1042 Key41=1761:1040 Key42=1776:1055 Key43=1778:1056 Key44=1775:1054 Key45=1772:1051 Key46=1764:1044 Key47=1782:1046 Key48=1788:1069 Key49=1715:1025 Key50=65505:0 Key51=47:47 Key52=1777:1071 Key53=1790:1063 Key54=1779:1057 Key55=1773:1052 Key56=1769:1048 Key57=1780:1058 Key58=1784:1068 Key59=1762:1041 Key60=1760:1070 Key61=44:44 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [altgr] Key8=65406:0 Key9=65307:27 Key10=49:49 Key11=50:50 Key12=51:51 Key13=52:52 Key14=53:53 Key15=54:54 Key16=55:55 Key17=16785597:8381 Key18=57:57 Key19=48:48 Key20=45:45 Key21=61:61 Key22=65288:8 Key23=65289:9 Key24=1738:1081 Key25=1731:1094 Key26=1749:1091 Key27=1739:1082 Key28=1733:1077 Key29=1742:1085 Key30=1735:1075 Key31=1755:1096 Key32=1757:1097 Key33=1754:1079 Key34=1736:1093 Key35=1759:1098 Key36=65293:13 Key37=65507:0 Key38=1734:1092 Key39=1753:1099 Key40=1751:1074 Key41=1729:1072 Key42=1744:1087 Key43=1746:1088 Key44=1743:1086 Key45=1740:1083 Key46=1732:1076 Key47=1750:1078 Key48=1756:1101 Key49=1699:1105 Key50=65505:0 Key51=92:92 Key52=1745:1103 Key53=1758:1095 Key54=1747:1089 Key55=1741:1084 Key56=1737:1080 Key57=1748:1090 Key58=1752:1100 Key59=1730:1073 Key60=1728:1102 Key61=46:46 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftaltgr] Key8=65406:0 Key9=65307:27 Key10=33:33 Key11=34:34 Key12=1712:8470 Key13=59:59 Key14=37:37 Key15=58:58 Key16=63:63 Key18=40:40 Key19=41:41 Key20=95:95 Key21=43:43 Key22=65288:8 Key23=65056:0 Key24=1770:1049 Key25=1763:1062 Key26=1781:1059 Key27=1771:1050 Key28=1765:1045 Key29=1774:1053 Key30=1767:1043 Key31=1787:1064 Key32=1789:1065 Key33=1786:1047 Key34=1768:1061 Key35=1791:1066 Key36=65293:13 Key37=65507:0 Key38=1766:1060 Key39=1785:1067 Key40=1783:1042 Key41=1761:1040 Key42=1776:1055 Key43=1778:1056 Key44=1775:1054 Key45=1772:1051 Key46=1764:1044 Key47=1782:1046 Key48=1788:1069 Key49=1715:1025 Key50=65505:0 Key51=47:47 Key52=1777:1071 Key53=1790:1063 Key54=1779:1057 Key55=1773:1052 Key56=1769:1048 Key57=1780:1058 Key58=1784:1068 Key59=1762:1041 Key60=1760:1070 Key61=44:44 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [capslock] Key8=65406:0 Key9=65307:27 Key10=49:49 Key11=50:50 Key12=51:51 Key13=52:52 Key14=53:53 Key15=54:54 Key16=55:55 Key17=56:56 Key18=57:57 Key19=48:48 Key20=45:45 Key21=61:61 Key22=65288:8 Key23=65289:9 Key24=1770:1049 Key25=1763:1062 Key26=1781:1059 Key27=1771:1050 Key28=1765:1045 Key29=1774:1053 Key30=1767:1043 Key31=1787:1064 Key32=1789:1065 Key33=1786:1047 Key34=1768:1061 Key35=1791:1066 Key36=65293:13 Key37=65507:0 Key38=1766:1060 Key39=1785:1067 Key40=1783:1042 Key41=1761:1040 Key42=1776:1055 Key43=1778:1056 Key44=1775:1054 Key45=1772:1051 Key46=1764:1044 Key47=1782:1046 Key48=1788:1069 Key49=1715:1025 Key50=65505:0 Key51=92:92 Key52=1777:1071 Key53=1790:1063 Key54=1779:1057 Key55=1773:1052 Key56=1769:1048 Key57=1780:1058 Key58=1784:1068 Key59=1762:1041 Key60=1760:1070 Key61=46:46 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [capslockaltgr] Key8=65406:0 Key9=65307:27 Key10=49:49 Key11=50:50 Key12=51:51 Key13=52:52 Key14=53:53 Key15=54:54 Key16=55:55 Key17=16785597:8381 Key18=57:57 Key19=48:48 Key20=45:45 Key21=61:61 Key22=65288:8 Key23=65289:9 Key24=1770:1049 Key25=1763:1062 Key26=1781:1059 Key27=1771:1050 Key28=1765:1045 Key29=1774:1053 Key30=1767:1043 Key31=1787:1064 Key32=1789:1065 Key33=1786:1047 Key34=1768:1061 Key35=1791:1066 Key36=65293:13 Key37=65507:0 Key38=1766:1060 Key39=1785:1067 Key40=1783:1042 Key41=1761:1040 Key42=1776:1055 Key43=1778:1056 Key44=1775:1054 Key45=1772:1051 Key46=1764:1044 Key47=1782:1046 Key48=1788:1069 Key49=1715:1025 Key50=65505:0 Key51=92:92 Key52=1777:1071 Key53=1790:1063 Key54=1779:1057 Key55=1773:1052 Key56=1769:1048 Key57=1780:1058 Key58=1784:1068 Key59=1762:1041 Key60=1760:1070 Key61=46:46 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftcapslock] Key8=65406:0 Key9=65307:27 Key10=33:33 Key11=34:34 Key12=1712:8470 Key13=59:59 Key14=37:37 Key15=58:58 Key16=63:63 Key17=42:42 Key18=40:40 Key19=41:41 Key20=95:95 Key21=43:43 Key22=65288:8 Key23=65056:0 Key24=1738:1081 Key25=1731:1094 Key26=1749:1091 Key27=1739:1082 Key28=1733:1077 Key29=1742:1085 Key30=1735:1075 Key31=1755:1096 Key32=1757:1097 Key33=1754:1079 Key34=1736:1093 Key35=1759:1098 Key36=65293:13 Key37=65507:0 Key38=1734:1092 Key39=1753:1099 Key40=1751:1074 Key41=1729:1072 Key42=1744:1087 Key43=1746:1088 Key44=1743:1086 Key45=1740:1083 Key46=1732:1076 Key47=1750:1078 Key48=1756:1101 Key49=1699:1105 Key50=65505:0 Key51=47:47 Key52=1745:1103 Key53=1758:1095 Key54=1747:1089 Key55=1741:1084 Key56=1737:1080 Key57=1748:1090 Key58=1752:1100 Key59=1730:1073 Key60=1728:1102 Key61=44:44 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftcapslockaltgr] Key8=65406:0 Key9=65307:27 Key10=33:33 Key11=34:34 Key12=1712:8470 Key13=59:59 Key14=37:37 Key15=58:58 Key16=63:63 Key18=40:40 Key19=41:41 Key20=95:95 Key21=43:43 Key22=65288:8 Key23=65056:0 Key24=1738:1081 Key25=1731:1094 Key26=1749:1091 Key27=1739:1082 Key28=1733:1077 Key29=1742:1085 Key30=1735:1075 Key31=1755:1096 Key32=1757:1097 Key33=1754:1079 Key34=1736:1093 Key35=1759:1098 Key36=65293:13 Key37=65507:0 Key38=1734:1092 Key39=1753:1099 Key40=1751:1074 Key41=1729:1072 Key42=1744:1087 Key43=1746:1088 Key44=1743:1086 Key45=1740:1083 Key46=1732:1076 Key47=1750:1078 Key48=1756:1101 Key49=1699:1105 Key50=65505:0 Key51=47:47 Key52=1745:1103 Key53=1758:1095 Key54=1747:1089 Key55=1741:1084 Key56=1737:1080 Key57=1748:1090 Key58=1752:1100 Key59=1730:1073 Key60=1728:1102 Key61=44:44 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 ================================================ FILE: instfiles/km-00000419.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwerty) # setxkbmap -rules evdev -model pc104 -layout ru # Description: ru-RU # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="61:U+003D" # equal 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="1738:U+0439" # Cyrillic_shorti 11="1731:U+0446" # Cyrillic_tse 12="1749:U+0443" # Cyrillic_u 13="1739:U+043A" # Cyrillic_ka 14="1733:U+0435" # Cyrillic_ie 15="1742:U+043D" # Cyrillic_en 16="1735:U+0433" # Cyrillic_ghe 17="1755:U+0448" # Cyrillic_sha 18="1757:U+0449" # Cyrillic_shcha 19="1754:U+0437" # Cyrillic_ze 1A="1736:U+0445" # Cyrillic_ha 1B="1759:U+044A" # Cyrillic_hardsign 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="1734:U+0444" # Cyrillic_ef 1F="1753:U+044B" # Cyrillic_yeru 20="1751:U+0432" # Cyrillic_ve 21="1729:U+0430" # Cyrillic_a 22="1744:U+043F" # Cyrillic_pe 23="1746:U+0440" # Cyrillic_er 24="1743:U+043E" # Cyrillic_o 25="1740:U+043B" # Cyrillic_el 26="1732:U+0434" # Cyrillic_de 27="1750:U+0436" # Cyrillic_zhe 28="1756:U+044D" # Cyrillic_e 29="1699:U+0451" # Cyrillic_io 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="1745:U+044F" # Cyrillic_ya 2D="1758:U+0447" # Cyrillic_che 2E="1747:U+0441" # Cyrillic_es 2F="1741:U+043C" # Cyrillic_em 30="1737:U+0438" # Cyrillic_i 31="1748:U+0442" # Cyrillic_te 32="1752:U+044C" # Cyrillic_softsign 33="1730:U+0431" # Cyrillic_be 34="1728:U+044E" # Cyrillic_yu 35="46:U+002E" # period 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="47:U+002F" # slash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65514" # Alt_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="1712:U+2116" # numerosign 05="59:U+003B" # semicolon 06="37:U+0025" # percent 07="58:U+003A" # colon 08="63:U+003F" # question 09="42:U+002A" # asterisk 0A="40:U+0028" # parenleft 0B="41:U+0029" # parenright 0C="95:U+005F" # underscore 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="1770:U+0419" # Cyrillic_SHORTI 11="1763:U+0426" # Cyrillic_TSE 12="1781:U+0423" # Cyrillic_U 13="1771:U+041A" # Cyrillic_KA 14="1765:U+0415" # Cyrillic_IE 15="1774:U+041D" # Cyrillic_EN 16="1767:U+0413" # Cyrillic_GHE 17="1787:U+0428" # Cyrillic_SHA 18="1789:U+0429" # Cyrillic_SHCHA 19="1786:U+0417" # Cyrillic_ZE 1A="1768:U+0425" # Cyrillic_HA 1B="1791:U+042A" # Cyrillic_HARDSIGN 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="1766:U+0424" # Cyrillic_EF 1F="1785:U+042B" # Cyrillic_YERU 20="1783:U+0412" # Cyrillic_VE 21="1761:U+0410" # Cyrillic_A 22="1776:U+041F" # Cyrillic_PE 23="1778:U+0420" # Cyrillic_ER 24="1775:U+041E" # Cyrillic_O 25="1772:U+041B" # Cyrillic_EL 26="1764:U+0414" # Cyrillic_DE 27="1782:U+0416" # Cyrillic_ZHE 28="1788:U+042D" # Cyrillic_E 29="1715:U+0401" # Cyrillic_IO 2A="65505" # Shift_L 2B="47:U+002F" # slash 2C="1777:U+042F" # Cyrillic_YA 2D="1790:U+0427" # Cyrillic_CHE 2E="1779:U+0421" # Cyrillic_ES 2F="1773:U+041C" # Cyrillic_EM 30="1769:U+0418" # Cyrillic_I 31="1780:U+0422" # Cyrillic_TE 32="1784:U+042C" # Cyrillic_SOFTSIGN 33="1762:U+0411" # Cyrillic_BE 34="1760:U+042E" # Cyrillic_YU 35="44:U+002C" # comma 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65512" # Meta_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="16785597:U+20BD" # U20BD 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="61:U+003D" # equal 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="1738:U+0439" # Cyrillic_shorti 11="1731:U+0446" # Cyrillic_tse 12="1749:U+0443" # Cyrillic_u 13="1739:U+043A" # Cyrillic_ka 14="1733:U+0435" # Cyrillic_ie 15="1742:U+043D" # Cyrillic_en 16="1735:U+0433" # Cyrillic_ghe 17="1755:U+0448" # Cyrillic_sha 18="1757:U+0449" # Cyrillic_shcha 19="1754:U+0437" # Cyrillic_ze 1A="1736:U+0445" # Cyrillic_ha 1B="1759:U+044A" # Cyrillic_hardsign 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="1734:U+0444" # Cyrillic_ef 1F="1753:U+044B" # Cyrillic_yeru 20="1751:U+0432" # Cyrillic_ve 21="1729:U+0430" # Cyrillic_a 22="1744:U+043F" # Cyrillic_pe 23="1746:U+0440" # Cyrillic_er 24="1743:U+043E" # Cyrillic_o 25="1740:U+043B" # Cyrillic_el 26="1732:U+0434" # Cyrillic_de 27="1750:U+0436" # Cyrillic_zhe 28="1756:U+044D" # Cyrillic_e 29="1699:U+0451" # Cyrillic_io 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="1745:U+044F" # Cyrillic_ya 2D="1758:U+0447" # Cyrillic_che 2E="1747:U+0441" # Cyrillic_es 2F="1741:U+043C" # Cyrillic_em 30="1737:U+0438" # Cyrillic_i 31="1748:U+0442" # Cyrillic_te 32="1752:U+044C" # Cyrillic_softsign 33="1730:U+0431" # Cyrillic_be 34="1728:U+044E" # Cyrillic_yu 35="46:U+002E" # period 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65514" # Alt_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="1712:U+2116" # numerosign 05="59:U+003B" # semicolon 06="37:U+0025" # percent 07="58:U+003A" # colon 08="63:U+003F" # question 0A="40:U+0028" # parenleft 0B="41:U+0029" # parenright 0C="95:U+005F" # underscore 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="1770:U+0419" # Cyrillic_SHORTI 11="1763:U+0426" # Cyrillic_TSE 12="1781:U+0423" # Cyrillic_U 13="1771:U+041A" # Cyrillic_KA 14="1765:U+0415" # Cyrillic_IE 15="1774:U+041D" # Cyrillic_EN 16="1767:U+0413" # Cyrillic_GHE 17="1787:U+0428" # Cyrillic_SHA 18="1789:U+0429" # Cyrillic_SHCHA 19="1786:U+0417" # Cyrillic_ZE 1A="1768:U+0425" # Cyrillic_HA 1B="1791:U+042A" # Cyrillic_HARDSIGN 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="1766:U+0424" # Cyrillic_EF 1F="1785:U+042B" # Cyrillic_YERU 20="1783:U+0412" # Cyrillic_VE 21="1761:U+0410" # Cyrillic_A 22="1776:U+041F" # Cyrillic_PE 23="1778:U+0420" # Cyrillic_ER 24="1775:U+041E" # Cyrillic_O 25="1772:U+041B" # Cyrillic_EL 26="1764:U+0414" # Cyrillic_DE 27="1782:U+0416" # Cyrillic_ZHE 28="1788:U+042D" # Cyrillic_E 29="1715:U+0401" # Cyrillic_IO 2A="65505" # Shift_L 2B="47:U+002F" # slash 2C="1777:U+042F" # Cyrillic_YA 2D="1790:U+0427" # Cyrillic_CHE 2E="1779:U+0421" # Cyrillic_ES 2F="1773:U+041C" # Cyrillic_EM 30="1769:U+0418" # Cyrillic_I 31="1780:U+0422" # Cyrillic_TE 32="1784:U+042C" # Cyrillic_SOFTSIGN 33="1762:U+0411" # Cyrillic_BE 34="1760:U+042E" # Cyrillic_YU 35="44:U+002C" # comma 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65512" # Meta_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="61:U+003D" # equal 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="1770:U+0419" # Cyrillic_SHORTI 11="1763:U+0426" # Cyrillic_TSE 12="1781:U+0423" # Cyrillic_U 13="1771:U+041A" # Cyrillic_KA 14="1765:U+0415" # Cyrillic_IE 15="1774:U+041D" # Cyrillic_EN 16="1767:U+0413" # Cyrillic_GHE 17="1787:U+0428" # Cyrillic_SHA 18="1789:U+0429" # Cyrillic_SHCHA 19="1786:U+0417" # Cyrillic_ZE 1A="1768:U+0425" # Cyrillic_HA 1B="1791:U+042A" # Cyrillic_HARDSIGN 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="1766:U+0424" # Cyrillic_EF 1F="1785:U+042B" # Cyrillic_YERU 20="1783:U+0412" # Cyrillic_VE 21="1761:U+0410" # Cyrillic_A 22="1776:U+041F" # Cyrillic_PE 23="1778:U+0420" # Cyrillic_ER 24="1775:U+041E" # Cyrillic_O 25="1772:U+041B" # Cyrillic_EL 26="1764:U+0414" # Cyrillic_DE 27="1782:U+0416" # Cyrillic_ZHE 28="1788:U+042D" # Cyrillic_E 29="1715:U+0401" # Cyrillic_IO 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="1777:U+042F" # Cyrillic_YA 2D="1790:U+0427" # Cyrillic_CHE 2E="1779:U+0421" # Cyrillic_ES 2F="1773:U+041C" # Cyrillic_EM 30="1769:U+0418" # Cyrillic_I 31="1780:U+0422" # Cyrillic_TE 32="1784:U+042C" # Cyrillic_SOFTSIGN 33="1762:U+0411" # Cyrillic_BE 34="1760:U+042E" # Cyrillic_YU 35="46:U+002E" # period 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="47:U+002F" # slash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65514" # Alt_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="16785597:U+20BD" # U20BD 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="61:U+003D" # equal 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="1770:U+0419" # Cyrillic_SHORTI 11="1763:U+0426" # Cyrillic_TSE 12="1781:U+0423" # Cyrillic_U 13="1771:U+041A" # Cyrillic_KA 14="1765:U+0415" # Cyrillic_IE 15="1774:U+041D" # Cyrillic_EN 16="1767:U+0413" # Cyrillic_GHE 17="1787:U+0428" # Cyrillic_SHA 18="1789:U+0429" # Cyrillic_SHCHA 19="1786:U+0417" # Cyrillic_ZE 1A="1768:U+0425" # Cyrillic_HA 1B="1791:U+042A" # Cyrillic_HARDSIGN 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="1766:U+0424" # Cyrillic_EF 1F="1785:U+042B" # Cyrillic_YERU 20="1783:U+0412" # Cyrillic_VE 21="1761:U+0410" # Cyrillic_A 22="1776:U+041F" # Cyrillic_PE 23="1778:U+0420" # Cyrillic_ER 24="1775:U+041E" # Cyrillic_O 25="1772:U+041B" # Cyrillic_EL 26="1764:U+0414" # Cyrillic_DE 27="1782:U+0416" # Cyrillic_ZHE 28="1788:U+042D" # Cyrillic_E 29="1715:U+0401" # Cyrillic_IO 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="1777:U+042F" # Cyrillic_YA 2D="1790:U+0427" # Cyrillic_CHE 2E="1779:U+0421" # Cyrillic_ES 2F="1773:U+041C" # Cyrillic_EM 30="1769:U+0418" # Cyrillic_I 31="1780:U+0422" # Cyrillic_TE 32="1784:U+042C" # Cyrillic_SOFTSIGN 33="1762:U+0411" # Cyrillic_BE 34="1760:U+042E" # Cyrillic_YU 35="46:U+002E" # period 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65514" # Alt_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="1712:U+2116" # numerosign 05="59:U+003B" # semicolon 06="37:U+0025" # percent 07="58:U+003A" # colon 08="63:U+003F" # question 09="42:U+002A" # asterisk 0A="40:U+0028" # parenleft 0B="41:U+0029" # parenright 0C="95:U+005F" # underscore 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="1738:U+0439" # Cyrillic_shorti 11="1731:U+0446" # Cyrillic_tse 12="1749:U+0443" # Cyrillic_u 13="1739:U+043A" # Cyrillic_ka 14="1733:U+0435" # Cyrillic_ie 15="1742:U+043D" # Cyrillic_en 16="1735:U+0433" # Cyrillic_ghe 17="1755:U+0448" # Cyrillic_sha 18="1757:U+0449" # Cyrillic_shcha 19="1754:U+0437" # Cyrillic_ze 1A="1736:U+0445" # Cyrillic_ha 1B="1759:U+044A" # Cyrillic_hardsign 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="1734:U+0444" # Cyrillic_ef 1F="1753:U+044B" # Cyrillic_yeru 20="1751:U+0432" # Cyrillic_ve 21="1729:U+0430" # Cyrillic_a 22="1744:U+043F" # Cyrillic_pe 23="1746:U+0440" # Cyrillic_er 24="1743:U+043E" # Cyrillic_o 25="1740:U+043B" # Cyrillic_el 26="1732:U+0434" # Cyrillic_de 27="1750:U+0436" # Cyrillic_zhe 28="1756:U+044D" # Cyrillic_e 29="1699:U+0451" # Cyrillic_io 2A="65505" # Shift_L 2B="47:U+002F" # slash 2C="1745:U+044F" # Cyrillic_ya 2D="1758:U+0447" # Cyrillic_che 2E="1747:U+0441" # Cyrillic_es 2F="1741:U+043C" # Cyrillic_em 30="1737:U+0438" # Cyrillic_i 31="1748:U+0442" # Cyrillic_te 32="1752:U+044C" # Cyrillic_softsign 33="1730:U+0431" # Cyrillic_be 34="1728:U+044E" # Cyrillic_yu 35="44:U+002C" # comma 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65512" # Meta_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="1712:U+2116" # numerosign 05="59:U+003B" # semicolon 06="37:U+0025" # percent 07="58:U+003A" # colon 08="63:U+003F" # question 0A="40:U+0028" # parenleft 0B="41:U+0029" # parenright 0C="95:U+005F" # underscore 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="1738:U+0439" # Cyrillic_shorti 11="1731:U+0446" # Cyrillic_tse 12="1749:U+0443" # Cyrillic_u 13="1739:U+043A" # Cyrillic_ka 14="1733:U+0435" # Cyrillic_ie 15="1742:U+043D" # Cyrillic_en 16="1735:U+0433" # Cyrillic_ghe 17="1755:U+0448" # Cyrillic_sha 18="1757:U+0449" # Cyrillic_shcha 19="1754:U+0437" # Cyrillic_ze 1A="1736:U+0445" # Cyrillic_ha 1B="1759:U+044A" # Cyrillic_hardsign 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="1734:U+0444" # Cyrillic_ef 1F="1753:U+044B" # Cyrillic_yeru 20="1751:U+0432" # Cyrillic_ve 21="1729:U+0430" # Cyrillic_a 22="1744:U+043F" # Cyrillic_pe 23="1746:U+0440" # Cyrillic_er 24="1743:U+043E" # Cyrillic_o 25="1740:U+043B" # Cyrillic_el 26="1732:U+0434" # Cyrillic_de 27="1750:U+0436" # Cyrillic_zhe 28="1756:U+044D" # Cyrillic_e 29="1699:U+0451" # Cyrillic_io 2A="65505" # Shift_L 2B="47:U+002F" # slash 2C="1745:U+044F" # Cyrillic_ya 2D="1758:U+0447" # Cyrillic_che 2E="1747:U+0441" # Cyrillic_es 2F="1741:U+043C" # Cyrillic_em 30="1737:U+0438" # Cyrillic_i 31="1748:U+0442" # Cyrillic_te 32="1752:U+044C" # Cyrillic_softsign 33="1730:U+0431" # Cyrillic_be 34="1728:U+044E" # Cyrillic_yu 35="44:U+002C" # comma 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65512" # Meta_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65452:U+002C" # KP_Separator ================================================ FILE: instfiles/km-0000041d.ini ================================================ [noshift] Key8=65406:0 Key9=65307:27 Key10=49:49 Key11=50:50 Key12=51:51 Key13=52:52 Key14=53:53 Key15=54:54 Key16=55:55 Key17=56:56 Key18=57:57 Key19=48:48 Key20=43:43 Key21=65105:180 Key22=65288:8 Key23=65289:9 Key24=113:113 Key25=119:119 Key26=101:101 Key27=114:114 Key28=116:116 Key29=121:121 Key30=117:117 Key31=105:105 Key32=111:111 Key33=112:112 Key34=229:229 Key35=65111:168 Key36=65293:13 Key37=65507:0 Key38=97:97 Key39=115:115 Key40=100:100 Key41=102:102 Key42=103:103 Key43=104:104 Key44=106:106 Key45=107:107 Key46=108:108 Key47=246:246 Key48=228:228 Key49=167:167 Key50=65505:0 Key51=39:39 Key52=122:122 Key53=120:120 Key54=99:99 Key55=118:118 Key56=98:98 Key57=110:110 Key58=109:109 Key59=44:44 Key60=46:46 Key61=45:45 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shift] Key8=65406:0 Key9=65307:27 Key10=33:33 Key11=34:34 Key12=35:35 Key13=164:164 Key14=37:37 Key15=38:38 Key16=47:47 Key17=40:40 Key18=41:41 Key19=61:61 Key20=63:63 Key21=65104:96 Key22=65288:8 Key23=65056:0 Key24=81:81 Key25=87:87 Key26=69:69 Key27=82:82 Key28=84:84 Key29=89:89 Key30=85:85 Key31=73:73 Key32=79:79 Key33=80:80 Key34=197:197 Key35=65106:94 Key36=65293:13 Key37=65507:0 Key38=65:65 Key39=83:83 Key40=68:68 Key41=70:70 Key42=71:71 Key43=72:72 Key44=74:74 Key45=75:75 Key46=76:76 Key47=214:214 Key48=196:196 Key49=189:189 Key50=65505:0 Key51=42:42 Key52=90:90 Key53=88:88 Key54=67:67 Key55=86:86 Key56=66:66 Key57=78:78 Key58=77:77 Key59=59:59 Key60=58:58 Key61=95:95 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [altgr] Key8=65406:0 Key9=65307:27 Key10=161:161 Key11=64:64 Key12=163:163 Key13=36:36 Key14=8364:8364 Key15=165:165 Key16=123:123 Key17=91:91 Key18=93:93 Key19=125:125 Key20=92:92 Key21=177:177 Key22=65288:8 Key23=65289:9 Key24=64:64 Key25=435:322 Key26=8364:8364 Key27=174:174 Key28=254:254 Key29=2299:8592 Key30=2302:8595 Key31=2301:8594 Key32=5053:339 Key33=254:254 Key34=65111:168 Key35=65107:126 Key36=65293:13 Key37=65507:0 Key38=170:170 Key39=223:223 Key40=240:240 Key41=496:273 Key42=959:331 Key43=689:295 Key44=65121:0 Key45=930:312 Key46=435:322 Key47=248:248 Key48=230:230 Key49=182:182 Key50=65505:0 Key51=180:180 Key52=171:171 Key53=187:187 Key54=169:169 Key55=2770:8220 Key56=2771:8221 Key57=110:110 Key58=181:181 Key59=65115:184 Key60=183:183 Key61=65120:0 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftaltgr] Key8=65406:0 Key9=65307:27 Key10=185:185 Key11=178:178 Key12=179:179 Key13=188:188 Key14=162:162 Key15=2757:8541 Key16=247:247 Key17=171:171 Key18=187:187 Key19=176:176 Key20=191:191 Key21=172:172 Key22=65288:8 Key23=65056:0 Key24=2009:937 Key25=419:321 Key26=162:162 Key27=174:174 Key28=222:222 Key29=165:165 Key30=2300:8593 Key31=697:305 Key32=5052:338 Key33=222:222 Key34=65112:176 Key35=65114:711 Key36=65293:13 Key37=65507:0 Key38=186:186 Key39=167:167 Key40=208:208 Key41=170:170 Key42=957:330 Key43=673:294 Key44=65122:0 Key45=38:38 Key46=419:321 Key47=216:216 Key48=198:198 Key49=190:190 Key50=65505:0 Key51=215:215 Key52=60:60 Key53=62:62 Key54=169:169 Key55=2768:8216 Key56=2769:8217 Key57=78:78 Key58=186:186 Key59=65116:731 Key60=65110:729 Key61=65110:729 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=160:160 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [capslock] Key8=65406:0 Key9=65307:27 Key10=49:49 Key11=50:50 Key12=51:51 Key13=52:52 Key14=53:53 Key15=54:54 Key16=55:55 Key17=56:56 Key18=57:57 Key19=48:48 Key20=43:43 Key21=65105:180 Key22=65288:8 Key23=65289:9 Key24=81:81 Key25=87:87 Key26=69:69 Key27=82:82 Key28=84:84 Key29=89:89 Key30=85:85 Key31=73:73 Key32=79:79 Key33=80:80 Key34=197:197 Key35=65111:168 Key36=65293:13 Key37=65507:0 Key38=65:65 Key39=83:83 Key40=68:68 Key41=70:70 Key42=71:71 Key43=72:72 Key44=74:74 Key45=75:75 Key46=76:76 Key47=214:214 Key48=196:196 Key49=167:167 Key50=65505:0 Key51=39:39 Key52=90:90 Key53=88:88 Key54=67:67 Key55=86:86 Key56=66:66 Key57=78:78 Key58=77:77 Key59=44:44 Key60=46:46 Key61=45:45 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [capslockaltgr] Key8=65406:0 Key9=65307:27 Key10=161:161 Key11=64:64 Key12=163:163 Key13=36:36 Key14=8364:8364 Key15=165:165 Key16=123:123 Key17=91:91 Key18=93:93 Key19=125:125 Key20=92:92 Key21=177:177 Key22=65288:8 Key23=65289:9 Key24=64:64 Key25=419:321 Key26=8364:8364 Key27=174:174 Key28=222:222 Key29=2299:8592 Key30=2302:8595 Key31=2301:8594 Key32=5052:338 Key33=222:222 Key34=65111:168 Key35=65107:126 Key36=65293:13 Key37=65507:0 Key38=170:170 Key39=223:223 Key40=208:208 Key41=464:272 Key42=957:330 Key43=673:294 Key44=65121:0 Key45=930:312 Key46=419:321 Key47=216:216 Key48=198:198 Key49=182:182 Key50=65505:0 Key51=180:180 Key52=171:171 Key53=187:187 Key54=169:169 Key55=2770:8220 Key56=2771:8221 Key57=78:78 Key58=924:0 Key59=65115:184 Key60=183:183 Key61=65120:0 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftcapslock] Key8=65406:0 Key9=65307:27 Key10=33:33 Key11=34:34 Key12=35:35 Key13=164:164 Key14=37:37 Key15=38:38 Key16=47:47 Key17=40:40 Key18=41:41 Key19=61:61 Key20=63:63 Key21=65104:96 Key22=65288:8 Key23=65056:0 Key24=113:113 Key25=119:119 Key26=101:101 Key27=114:114 Key28=116:116 Key29=121:121 Key30=117:117 Key31=105:105 Key32=111:111 Key33=112:112 Key34=229:229 Key35=65106:94 Key36=65293:13 Key37=65507:0 Key38=97:97 Key39=115:115 Key40=100:100 Key41=102:102 Key42=103:103 Key43=104:104 Key44=106:106 Key45=107:107 Key46=108:108 Key47=246:246 Key48=228:228 Key49=189:189 Key50=65505:0 Key51=42:42 Key52=122:122 Key53=120:120 Key54=99:99 Key55=118:118 Key56=98:98 Key57=110:110 Key58=109:109 Key59=59:59 Key60=58:58 Key61=95:95 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftcapslockaltgr] Key8=65406:0 Key9=65307:27 Key10=185:185 Key11=178:178 Key12=179:179 Key13=188:188 Key14=162:162 Key15=2757:8541 Key16=247:247 Key17=171:171 Key18=187:187 Key19=176:176 Key20=191:191 Key21=172:172 Key22=65288:8 Key23=65056:0 Key24=2009:937 Key25=435:322 Key26=162:162 Key27=174:174 Key28=254:254 Key29=165:165 Key30=2300:8593 Key31=697:305 Key32=5053:339 Key33=254:254 Key34=65112:176 Key35=65114:711 Key36=65293:13 Key37=65507:0 Key38=186:186 Key39=167:167 Key40=240:240 Key41=170:170 Key42=959:331 Key43=689:295 Key44=65122:0 Key45=38:38 Key46=435:322 Key47=248:248 Key48=230:230 Key49=190:190 Key50=65505:0 Key51=215:215 Key52=60:60 Key53=62:62 Key54=169:169 Key55=2768:8216 Key56=2769:8217 Key57=110:110 Key58=186:186 Key59=65116:731 Key60=65110:729 Key61=65110:729 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=160:160 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 ================================================ FILE: instfiles/km-0000041d.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwerty) # setxkbmap -rules evdev -model pc104 -layout se # Description: sv-SE # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="43:U+002B" # plus 0D="65105:U+00B4" # dead_acute 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="229:U+00E5" # aring 1B="65111:U+00A8" # dead_diaeresis 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="246:U+00F6" # odiaeresis 28="228:U+00E4" # adiaeresis 29="167:U+00A7" # section 2A="65505" # Shift_L 2B="39:U+0027" # apostrophe 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="35:U+0023" # numbersign 05="164:U+00A4" # currency 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="47:U+002F" # slash 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="61:U+003D" # equal 0C="63:U+003F" # question 0D="65104:U+0060" # dead_grave 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="197:U+00C5" # Aring 1B="65106:U+005E" # dead_circumflex 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="214:U+00D6" # Odiaeresis 28="196:U+00C4" # Adiaeresis 29="189:U+00BD" # onehalf 2A="65505" # Shift_L 2B="42:U+002A" # asterisk 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="64:U+0040" # at 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="8364:U+20AC" # EuroSign 07="165:U+00A5" # yen 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="92:U+005C" # backslash 0D="177:U+00B1" # plusminus 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="64:U+0040" # at 11="435:U+0142" # lstroke 12="8364:U+20AC" # EuroSign 13="174:U+00AE" # registered 14="254:U+00FE" # thorn 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="5053:U+0153" # oe 19="254:U+00FE" # thorn 1A="65111:U+00A8" # dead_diaeresis 1B="65107:U+007E" # dead_tilde 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="170:U+00AA" # ordfeminine 1F="223:U+00DF" # ssharp 20="240:U+00F0" # eth 21="496:U+0111" # dstroke 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="435:U+0142" # lstroke 27="248:U+00F8" # oslash 28="230:U+00E6" # ae 29="182:U+00B6" # paragraph 2A="65505" # Shift_L 2B="180:U+00B4" # acute 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="169:U+00A9" # copyright 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="110:U+006E" # n 32="181:U+00B5" # mu 33="65115:U+00B8" # dead_cedilla 34="183:U+00B7" # periodcentered 35="65120" # dead_belowdot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="185:U+00B9" # onesuperior 03="178:U+00B2" # twosuperior 04="179:U+00B3" # threesuperior 05="188:U+00BC" # onequarter 06="162:U+00A2" # cent 07="2757:U+215D" # fiveeighths 08="247:U+00F7" # division 09="171:U+00AB" # guillemotleft 0A="187:U+00BB" # guillemotright 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="172:U+00AC" # notsign 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="419:U+0141" # Lstroke 12="162:U+00A2" # cent 13="174:U+00AE" # registered 14="222:U+00DE" # THORN 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="5052:U+0152" # OE 19="222:U+00DE" # THORN 1A="65112:U+00B0" # dead_abovering 1B="65114:U+02C7" # dead_caron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="186:U+00BA" # masculine 1F="167:U+00A7" # section 20="208:U+00D0" # ETH 21="170:U+00AA" # ordfeminine 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="419:U+0141" # Lstroke 27="216:U+00D8" # Oslash 28="198:U+00C6" # AE 29="190:U+00BE" # threequarters 2A="65505" # Shift_L 2B="215:U+00D7" # multiply 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="78:U+004E" # N 32="186:U+00BA" # masculine 33="65116:U+02DB" # dead_ogonek 34="65110:U+02D9" # dead_abovedot 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="160:U+00A0" # nobreakspace 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="43:U+002B" # plus 0D="65105:U+00B4" # dead_acute 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="197:U+00C5" # Aring 1B="65111:U+00A8" # dead_diaeresis 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="214:U+00D6" # Odiaeresis 28="196:U+00C4" # Adiaeresis 29="167:U+00A7" # section 2A="65505" # Shift_L 2B="39:U+0027" # apostrophe 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="64:U+0040" # at 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="8364:U+20AC" # EuroSign 07="165:U+00A5" # yen 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="92:U+005C" # backslash 0D="177:U+00B1" # plusminus 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="64:U+0040" # at 11="419:U+0141" # Lstroke 12="8364:U+20AC" # EuroSign 13="174:U+00AE" # registered 14="222:U+00DE" # THORN 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="5052:U+0152" # OE 19="222:U+00DE" # THORN 1A="65111:U+00A8" # dead_diaeresis 1B="65107:U+007E" # dead_tilde 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="170:U+00AA" # ordfeminine 20="208:U+00D0" # ETH 21="464:U+0110" # Dstroke 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="419:U+0141" # Lstroke 27="216:U+00D8" # Oslash 28="198:U+00C6" # AE 29="182:U+00B6" # paragraph 2A="65505" # Shift_L 2B="180:U+00B4" # acute 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="169:U+00A9" # copyright 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="78:U+004E" # N 33="65115:U+00B8" # dead_cedilla 34="183:U+00B7" # periodcentered 35="65120" # dead_belowdot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="35:U+0023" # numbersign 05="164:U+00A4" # currency 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="47:U+002F" # slash 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="61:U+003D" # equal 0C="63:U+003F" # question 0D="65104:U+0060" # dead_grave 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="229:U+00E5" # aring 1B="65106:U+005E" # dead_circumflex 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="246:U+00F6" # odiaeresis 28="228:U+00E4" # adiaeresis 29="189:U+00BD" # onehalf 2A="65505" # Shift_L 2B="42:U+002A" # asterisk 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="185:U+00B9" # onesuperior 03="178:U+00B2" # twosuperior 04="179:U+00B3" # threesuperior 05="188:U+00BC" # onequarter 06="162:U+00A2" # cent 07="2757:U+215D" # fiveeighths 08="247:U+00F7" # division 09="171:U+00AB" # guillemotleft 0A="187:U+00BB" # guillemotright 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="172:U+00AC" # notsign 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="435:U+0142" # lstroke 12="162:U+00A2" # cent 13="174:U+00AE" # registered 14="254:U+00FE" # thorn 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="5053:U+0153" # oe 19="254:U+00FE" # thorn 1A="65112:U+00B0" # dead_abovering 1B="65114:U+02C7" # dead_caron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="186:U+00BA" # masculine 1F="167:U+00A7" # section 20="240:U+00F0" # eth 21="170:U+00AA" # ordfeminine 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="435:U+0142" # lstroke 27="248:U+00F8" # oslash 28="230:U+00E6" # ae 29="190:U+00BE" # threequarters 2A="65505" # Shift_L 2B="215:U+00D7" # multiply 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="110:U+006E" # n 32="186:U+00BA" # masculine 33="65116:U+02DB" # dead_ogonek 34="65110:U+02D9" # dead_abovedot 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="160:U+00A0" # nobreakspace 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65452:U+002C" # KP_Separator ================================================ FILE: instfiles/km-00000424.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwertz) # setxkbmap -rules evdev -model pc104 -layout si # Description: sl-SI # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="39:U+0027" # apostrophe 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="122:U+007A" # z 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="441:U+0161" # scaron 1B="496:U+0111" # dstroke 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="488:U+010D" # ccaron 28="486:U+0107" # cacute 29="184:U+00B8" # cedilla 2A="65505" # Shift_L 2B="446:U+017E" # zcaron 2C="121:U+0079" # y 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="47:U+002F" # slash 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="61:U+003D" # equal 0C="63:U+003F" # question 0D="42:U+002A" # asterisk 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="90:U+005A" # Z 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="425:U+0160" # Scaron 1B="464:U+0110" # Dstroke 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="456:U+010C" # Ccaron 28="454:U+0106" # Cacute 29="168:U+00A8" # diaeresis 2A="65505" # Shift_L 2B="430:U+017D" # Zcaron 2C="89:U+0059" # Y 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="65107:U+007E" # dead_tilde 03="65114:U+02C7" # dead_caron 04="65106:U+005E" # dead_circumflex 05="65109:U+02D8" # dead_breve 06="65112:U+00B0" # dead_abovering 07="65116:U+02DB" # dead_ogonek 08="65104:U+0060" # dead_grave 09="65110:U+02D9" # dead_abovedot 0A="65105:U+00B4" # dead_acute 0B="65113:U+02DD" # dead_doubleacute 0C="65111:U+00A8" # dead_diaeresis 0D="65115:U+00B8" # dead_cedilla 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="92:U+005C" # backslash 11="124:U+007C" # bar 12="8364:U+20AC" # EuroSign 13="182:U+00B6" # paragraph 14="956:U+0167" # tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="248:U+00F8" # oslash 19="254:U+00FE" # thorn 1A="247:U+00F7" # division 1B="215:U+00D7" # multiply 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="230:U+00E6" # ae 1F="2814:U+201E" # doublelowquotemark 20="2770:U+201C" # leftdoublequotemark 21="91:U+005B" # bracketleft 22="93:U+005D" # bracketright 23="689:U+0127" # hstroke 24="65121" # dead_hook 25="435:U+0142" # lstroke 26="435:U+0142" # lstroke 27="65105:U+00B4" # dead_acute 28="223:U+00DF" # ssharp 29="184:U+00B8" # cedilla 2A="65505" # Shift_L 2B="164:U+00A4" # currency 2C="2768:U+2018" # leftsinglequotemark 2D="2769:U+2019" # rightsinglequotemark 2E="162:U+00A2" # cent 2F="64:U+0040" # at 30="123:U+007B" # braceleft 31="125:U+007D" # braceright 32="167:U+00A7" # section 33="60:U+003C" # less 34="62:U+003E" # greater 35="2729:U+2014" # emdash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="126:U+007E" # asciitilde 03="439:U+02C7" # caron 04="94:U+005E" # asciicircum 05="418:U+02D8" # breve 06="176:U+00B0" # degree 07="434:U+02DB" # ogonek 08="96:U+0060" # grave 09="511:U+02D9" # abovedot 0A="39:U+0027" # apostrophe 0B="445:U+02DD" # doubleacute 0C="168:U+00A8" # diaeresis 0D="184:U+00B8" # cedilla 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="419:U+0141" # Lstroke 12="8364:U+20AC" # EuroSign 13="174:U+00AE" # registered 14="940:U+0166" # Tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="216:U+00D8" # Oslash 19="222:U+00DE" # THORN 1A="65112:U+00B0" # dead_abovering 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="198:U+00C6" # AE 1F="187:U+00BB" # guillemotright 20="171:U+00AB" # guillemotleft 21="170:U+00AA" # ordfeminine 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="419:U+0141" # Lstroke 27="65113:U+02DD" # dead_doubleacute 28="65114:U+02C7" # dead_caron 29="168:U+00A8" # diaeresis 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="187:U+00BB" # guillemotright 2D="171:U+00AB" # guillemotleft 2E="169:U+00A9" # copyright 2F="96:U+0060" # grave 30="39:U+0027" # apostrophe 31="125:U+007D" # braceright 32="186:U+00BA" # masculine 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="2730:U+2013" # endash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="39:U+0027" # apostrophe 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="90:U+005A" # Z 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="425:U+0160" # Scaron 1B="464:U+0110" # Dstroke 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="456:U+010C" # Ccaron 28="454:U+0106" # Cacute 29="184:U+00B8" # cedilla 2A="65505" # Shift_L 2B="430:U+017D" # Zcaron 2C="89:U+0059" # Y 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="65107:U+007E" # dead_tilde 03="65114:U+02C7" # dead_caron 04="65106:U+005E" # dead_circumflex 05="65109:U+02D8" # dead_breve 06="65112:U+00B0" # dead_abovering 07="65116:U+02DB" # dead_ogonek 08="65104:U+0060" # dead_grave 09="65110:U+02D9" # dead_abovedot 0A="65105:U+00B4" # dead_acute 0B="65113:U+02DD" # dead_doubleacute 0C="65111:U+00A8" # dead_diaeresis 0D="65115:U+00B8" # dead_cedilla 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="92:U+005C" # backslash 11="124:U+007C" # bar 12="8364:U+20AC" # EuroSign 13="182:U+00B6" # paragraph 14="940:U+0166" # Tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="216:U+00D8" # Oslash 19="222:U+00DE" # THORN 1A="247:U+00F7" # division 1B="215:U+00D7" # multiply 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="198:U+00C6" # AE 1F="2814:U+201E" # doublelowquotemark 20="2770:U+201C" # leftdoublequotemark 21="91:U+005B" # bracketleft 22="93:U+005D" # bracketright 23="673:U+0126" # Hstroke 24="65121" # dead_hook 25="419:U+0141" # Lstroke 26="419:U+0141" # Lstroke 27="65105:U+00B4" # dead_acute 29="184:U+00B8" # cedilla 2A="65505" # Shift_L 2B="164:U+00A4" # currency 2C="2768:U+2018" # leftsinglequotemark 2D="2769:U+2019" # rightsinglequotemark 2E="162:U+00A2" # cent 2F="64:U+0040" # at 30="123:U+007B" # braceleft 31="125:U+007D" # braceright 32="167:U+00A7" # section 33="60:U+003C" # less 34="62:U+003E" # greater 35="2729:U+2014" # emdash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="47:U+002F" # slash 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="61:U+003D" # equal 0C="63:U+003F" # question 0D="42:U+002A" # asterisk 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="122:U+007A" # z 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="441:U+0161" # scaron 1B="496:U+0111" # dstroke 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="488:U+010D" # ccaron 28="486:U+0107" # cacute 29="168:U+00A8" # diaeresis 2A="65505" # Shift_L 2B="446:U+017E" # zcaron 2C="121:U+0079" # y 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="126:U+007E" # asciitilde 03="439:U+02C7" # caron 04="94:U+005E" # asciicircum 05="418:U+02D8" # breve 06="176:U+00B0" # degree 07="434:U+02DB" # ogonek 08="96:U+0060" # grave 09="511:U+02D9" # abovedot 0A="39:U+0027" # apostrophe 0B="445:U+02DD" # doubleacute 0C="168:U+00A8" # diaeresis 0D="184:U+00B8" # cedilla 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="419:U+0141" # Lstroke 12="8364:U+20AC" # EuroSign 13="174:U+00AE" # registered 14="956:U+0167" # tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="248:U+00F8" # oslash 19="254:U+00FE" # thorn 1A="65112:U+00B0" # dead_abovering 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="230:U+00E6" # ae 1F="187:U+00BB" # guillemotright 20="171:U+00AB" # guillemotleft 21="170:U+00AA" # ordfeminine 22="957:U+014A" # ENG 23="689:U+0127" # hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="435:U+0142" # lstroke 27="65113:U+02DD" # dead_doubleacute 28="65114:U+02C7" # dead_caron 29="168:U+00A8" # diaeresis 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="187:U+00BB" # guillemotright 2D="171:U+00AB" # guillemotleft 2E="169:U+00A9" # copyright 2F="96:U+0060" # grave 30="39:U+0027" # apostrophe 31="125:U+007D" # braceright 32="186:U+00BA" # masculine 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="2730:U+2013" # endash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65452:U+002C" # KP_Separator ================================================ FILE: instfiles/km-00000426.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwerty) # setxkbmap -rules evdev -model pc104 -layout lv -variant ergonomic # Description: lv-LV # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="102:U+0066" # f 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="1022:U+016B" # umacron 11="103:U+0067" # g 12="106:U+006A" # j 13="114:U+0072" # r 14="109:U+006D" # m 15="118:U+0076" # v 16="110:U+006E" # n 17="122:U+007A" # z 18="954:U+0113" # emacron 19="488:U+010D" # ccaron 1A="446:U+017E" # zcaron 1B="104:U+0068" # h 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="441:U+0161" # scaron 1F="117:U+0075" # u 20="115:U+0073" # s 21="105:U+0069" # i 22="108:U+006C" # l 23="100:U+0064" # d 24="97:U+0061" # a 25="116:U+0074" # t 26="101:U+0065" # e 27="99:U+0063" # c 28="65028" # ISO_Level3_Latch 29="96:U+0060" # grave 2A="65505" # Shift_L 2B="1011:U+0137" # kcedilla 2C="1009:U+0146" # ncedilla 2D="98:U+0062" # b 2E="1007:U+012B" # imacron 2F="107:U+006B" # k 30="112:U+0070" # p 31="111:U+006F" # o 32="992:U+0101" # amacron 33="44:U+002C" # comma 34="46:U+002E" # period 35="950:U+013C" # lcedilla 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="955:U+0123" # gcedilla 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="94:U+005E" # asciicircum 08="38:U+0026" # ampersand 09="42:U+002A" # asterisk 0A="40:U+0028" # parenleft 0B="41:U+0029" # parenright 0C="95:U+005F" # underscore 0D="70:U+0046" # F 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="990:U+016A" # Umacron 11="71:U+0047" # G 12="74:U+004A" # J 13="82:U+0052" # R 14="77:U+004D" # M 15="86:U+0056" # V 16="78:U+004E" # N 17="90:U+005A" # Z 18="938:U+0112" # Emacron 19="456:U+010C" # Ccaron 1A="430:U+017D" # Zcaron 1B="72:U+0048" # H 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="425:U+0160" # Scaron 1F="85:U+0055" # U 20="83:U+0053" # S 21="73:U+0049" # I 22="76:U+004C" # L 23="68:U+0044" # D 24="65:U+0041" # A 25="84:U+0054" # T 26="69:U+0045" # E 27="67:U+0043" # C 28="34:U+0022" # quotedbl 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="979:U+0136" # Kcedilla 2C="977:U+0145" # Ncedilla 2D="66:U+0042" # B 2E="975:U+012A" # Imacron 2F="75:U+004B" # K 30="80:U+0050" # P 31="79:U+004F" # O 32="960:U+0100" # Amacron 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="934:U+013B" # Lcedilla 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="939:U+0122" # Gcedilla 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="185:U+00B9" # onesuperior 03="955:U+0123" # gcedilla 04="179:U+00B3" # threesuperior 05="8364:U+20AC" # EuroSign 06="189:U+00BD" # onehalf 07="190:U+00BE" # threequarters 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="2730:U+2013" # endash 0D="61:U+003D" # equal 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="103:U+0067" # g 12="106:U+006A" # j 13="947:U+0157" # rcedilla 14="109:U+006D" # m 15="119:U+0077" # w 16="121:U+0079" # y 17="122:U+007A" # z 18="954:U+0113" # emacron 19="488:U+010D" # ccaron 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="441:U+0161" # scaron 1F="117:U+0075" # u 20="115:U+0073" # s 21="105:U+0069" # i 22="108:U+006C" # l 23="100:U+0064" # d 24="97:U+0061" # a 25="116:U+0074" # t 26="101:U+0065" # e 27="99:U+0063" # c 28="39:U+0027" # apostrophe 29="180:U+00B4" # acute 2A="65505" # Shift_L 2B="47:U+002F" # slash 2C="1009:U+0146" # ncedilla 2D="120:U+0078" # x 2E="1007:U+012B" # imacron 2F="107:U+006B" # k 30="112:U+0070" # p 31="1010:U+014D" # omacron 32="992:U+0101" # amacron 33="60:U+003C" # less 34="62:U+003E" # greater 35="63:U+003F" # question 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="39:U+0027" # apostrophe 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="955:U+0123" # gcedilla 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="939:U+0122" # Gcedilla 04="163:U+00A3" # sterling 05="162:U+00A2" # cent 06="2756:U+215C" # threeeighths 07="2757:U+215D" # fiveeighths 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="2729:U+2014" # emdash 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="71:U+0047" # G 12="74:U+004A" # J 13="931:U+0156" # Rcedilla 14="77:U+004D" # M 15="87:U+0057" # W 16="89:U+0059" # Y 17="90:U+005A" # Z 18="938:U+0112" # Emacron 19="456:U+010C" # Ccaron 1A="123:U+007B" # braceleft 1B="125:U+007D" # braceright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="425:U+0160" # Scaron 1F="85:U+0055" # U 20="83:U+0053" # S 21="73:U+0049" # I 22="76:U+004C" # L 23="68:U+0044" # D 24="65:U+0041" # A 25="84:U+0054" # T 26="69:U+0045" # E 27="67:U+0043" # C 28="34:U+0022" # quotedbl 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="977:U+0145" # Ncedilla 2D="88:U+0058" # X 2E="975:U+012A" # Imacron 2F="75:U+004B" # K 30="80:U+0050" # P 31="978:U+014C" # Omacron 32="960:U+0100" # Amacron 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="47:U+002F" # slash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="939:U+0122" # Gcedilla 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="70:U+0046" # F 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="990:U+016A" # Umacron 11="71:U+0047" # G 12="74:U+004A" # J 13="82:U+0052" # R 14="77:U+004D" # M 15="86:U+0056" # V 16="78:U+004E" # N 17="90:U+005A" # Z 18="938:U+0112" # Emacron 19="456:U+010C" # Ccaron 1A="430:U+017D" # Zcaron 1B="72:U+0048" # H 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="425:U+0160" # Scaron 1F="85:U+0055" # U 20="83:U+0053" # S 21="73:U+0049" # I 22="76:U+004C" # L 23="68:U+0044" # D 24="65:U+0041" # A 25="84:U+0054" # T 26="69:U+0045" # E 27="67:U+0043" # C 28="65028" # ISO_Level3_Latch 29="96:U+0060" # grave 2A="65505" # Shift_L 2B="979:U+0136" # Kcedilla 2C="977:U+0145" # Ncedilla 2D="66:U+0042" # B 2E="975:U+012A" # Imacron 2F="75:U+004B" # K 30="80:U+0050" # P 31="79:U+004F" # O 32="960:U+0100" # Amacron 33="44:U+002C" # comma 34="46:U+002E" # period 35="934:U+013B" # Lcedilla 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="939:U+0122" # Gcedilla 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="185:U+00B9" # onesuperior 03="939:U+0122" # Gcedilla 04="179:U+00B3" # threesuperior 05="8364:U+20AC" # EuroSign 06="189:U+00BD" # onehalf 07="190:U+00BE" # threequarters 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="2730:U+2013" # endash 0D="61:U+003D" # equal 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="71:U+0047" # G 12="74:U+004A" # J 13="931:U+0156" # Rcedilla 14="77:U+004D" # M 15="87:U+0057" # W 16="89:U+0059" # Y 17="90:U+005A" # Z 18="938:U+0112" # Emacron 19="456:U+010C" # Ccaron 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="425:U+0160" # Scaron 1F="85:U+0055" # U 20="83:U+0053" # S 21="73:U+0049" # I 22="76:U+004C" # L 23="68:U+0044" # D 24="65:U+0041" # A 25="84:U+0054" # T 26="69:U+0045" # E 27="67:U+0043" # C 28="39:U+0027" # apostrophe 29="180:U+00B4" # acute 2A="65505" # Shift_L 2B="47:U+002F" # slash 2C="977:U+0145" # Ncedilla 2D="88:U+0058" # X 2E="975:U+012A" # Imacron 2F="75:U+004B" # K 30="80:U+0050" # P 31="978:U+014C" # Omacron 32="960:U+0100" # Amacron 33="60:U+003C" # less 34="62:U+003E" # greater 35="63:U+003F" # question 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="39:U+0027" # apostrophe 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="939:U+0122" # Gcedilla 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="94:U+005E" # asciicircum 08="38:U+0026" # ampersand 09="42:U+002A" # asterisk 0A="40:U+0028" # parenleft 0B="41:U+0029" # parenright 0C="95:U+005F" # underscore 0D="102:U+0066" # f 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="1022:U+016B" # umacron 11="103:U+0067" # g 12="106:U+006A" # j 13="114:U+0072" # r 14="109:U+006D" # m 15="118:U+0076" # v 16="110:U+006E" # n 17="122:U+007A" # z 18="954:U+0113" # emacron 19="488:U+010D" # ccaron 1A="446:U+017E" # zcaron 1B="104:U+0068" # h 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="441:U+0161" # scaron 1F="117:U+0075" # u 20="115:U+0073" # s 21="105:U+0069" # i 22="108:U+006C" # l 23="100:U+0064" # d 24="97:U+0061" # a 25="116:U+0074" # t 26="101:U+0065" # e 27="99:U+0063" # c 28="34:U+0022" # quotedbl 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="1011:U+0137" # kcedilla 2C="1009:U+0146" # ncedilla 2D="98:U+0062" # b 2E="1007:U+012B" # imacron 2F="107:U+006B" # k 30="112:U+0070" # p 31="111:U+006F" # o 32="992:U+0101" # amacron 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="950:U+013C" # lcedilla 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="955:U+0123" # gcedilla 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="939:U+0122" # Gcedilla 04="163:U+00A3" # sterling 05="162:U+00A2" # cent 06="2756:U+215C" # threeeighths 07="2757:U+215D" # fiveeighths 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="2729:U+2014" # emdash 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="103:U+0067" # g 12="106:U+006A" # j 13="947:U+0157" # rcedilla 14="109:U+006D" # m 15="119:U+0077" # w 16="121:U+0079" # y 17="122:U+007A" # z 18="954:U+0113" # emacron 19="488:U+010D" # ccaron 1A="123:U+007B" # braceleft 1B="125:U+007D" # braceright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="441:U+0161" # scaron 1F="117:U+0075" # u 20="115:U+0073" # s 21="105:U+0069" # i 22="108:U+006C" # l 23="100:U+0064" # d 24="97:U+0061" # a 25="116:U+0074" # t 26="101:U+0065" # e 27="99:U+0063" # c 28="34:U+0022" # quotedbl 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="1009:U+0146" # ncedilla 2D="120:U+0078" # x 2E="1007:U+012B" # imacron 2F="107:U+006B" # k 30="112:U+0070" # p 31="1010:U+014D" # omacron 32="992:U+0101" # amacron 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="47:U+002F" # slash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="955:U+0123" # gcedilla 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65454:U+002E" # KP_Decimal ================================================ FILE: instfiles/km-00000807.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwertz) # setxkbmap -rules evdev -model pc105 -layout ch # Description: de-CH # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="39:U+0027" # apostrophe 0D="65106:U+005E" # dead_circumflex 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="122:U+007A" # z 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="252:U+00FC" # udiaeresis 1B="65111:U+00A8" # dead_diaeresis 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="246:U+00F6" # odiaeresis 28="228:U+00E4" # adiaeresis 29="167:U+00A7" # section 2A="65505" # Shift_L 2B="36:U+0024" # dollar 2C="121:U+0079" # y 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="43:U+002B" # plus 03="34:U+0022" # quotedbl 04="42:U+002A" # asterisk 05="231:U+00E7" # ccedilla 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="47:U+002F" # slash 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="61:U+003D" # equal 0C="63:U+003F" # question 0D="65104:U+0060" # dead_grave 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="90:U+005A" # Z 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="232:U+00E8" # egrave 1B="33:U+0021" # exclam 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="233:U+00E9" # eacute 28="224:U+00E0" # agrave 29="176:U+00B0" # degree 2A="65505" # Shift_L 2B="163:U+00A3" # sterling 2C="89:U+0059" # Y 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="124:U+007C" # bar 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="188:U+00BC" # onequarter 06="189:U+00BD" # onehalf 07="172:U+00AC" # notsign 08="124:U+007C" # bar 09="162:U+00A2" # cent 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="65105:U+00B4" # dead_acute 0D="65107:U+007E" # dead_tilde 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="64:U+0040" # at 11="435:U+0142" # lstroke 12="8364:U+20AC" # EuroSign 13="182:U+00B6" # paragraph 14="956:U+0167" # tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="5053:U+0153" # oe 19="254:U+00FE" # thorn 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="230:U+00E6" # ae 1F="223:U+00DF" # ssharp 20="240:U+00F0" # eth 21="496:U+0111" # dstroke 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="435:U+0142" # lstroke 27="65105:U+00B4" # dead_acute 28="123:U+007B" # braceleft 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="125:U+007D" # braceright 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="162:U+00A2" # cent 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="110:U+006E" # n 32="181:U+00B5" # mu 33="2211" # horizconnector 34="183:U+00B7" # periodcentered 35="65120" # dead_belowdot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="92:U+005C" # backslash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="2755:U+215B" # oneeighth 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="2756:U+215C" # threeeighths 07="2757:U+215D" # fiveeighths 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="65116:U+02DB" # dead_ogonek 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="419:U+0141" # Lstroke 12="69:U+0045" # E 13="174:U+00AE" # registered 14="940:U+0166" # Tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="5052:U+0152" # OE 19="222:U+00DE" # THORN 1A="65112:U+00B0" # dead_abovering 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="198:U+00C6" # AE 1F="167:U+00A7" # section 20="208:U+00D0" # ETH 21="170:U+00AA" # ordfeminine 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="419:U+0141" # Lstroke 27="65113:U+02DD" # dead_doubleacute 28="65114:U+02C7" # dead_caron 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="78:U+004E" # N 32="186:U+00BA" # masculine 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="39:U+0027" # apostrophe 0D="65106:U+005E" # dead_circumflex 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="90:U+005A" # Z 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="220:U+00DC" # Udiaeresis 1B="65111:U+00A8" # dead_diaeresis 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="214:U+00D6" # Odiaeresis 28="196:U+00C4" # Adiaeresis 29="167:U+00A7" # section 2A="65505" # Shift_L 2B="36:U+0024" # dollar 2C="89:U+0059" # Y 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="124:U+007C" # bar 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="188:U+00BC" # onequarter 06="189:U+00BD" # onehalf 07="172:U+00AC" # notsign 08="124:U+007C" # bar 09="162:U+00A2" # cent 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="65105:U+00B4" # dead_acute 0D="65107:U+007E" # dead_tilde 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="64:U+0040" # at 11="419:U+0141" # Lstroke 12="8364:U+20AC" # EuroSign 13="182:U+00B6" # paragraph 14="940:U+0166" # Tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="5052:U+0152" # OE 19="222:U+00DE" # THORN 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="198:U+00C6" # AE 20="208:U+00D0" # ETH 21="464:U+0110" # Dstroke 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="419:U+0141" # Lstroke 27="65105:U+00B4" # dead_acute 28="123:U+007B" # braceleft 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="125:U+007D" # braceright 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="162:U+00A2" # cent 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="78:U+004E" # N 33="2211" # horizconnector 34="183:U+00B7" # periodcentered 35="65120" # dead_belowdot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="92:U+005C" # backslash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="43:U+002B" # plus 03="34:U+0022" # quotedbl 04="42:U+002A" # asterisk 05="199:U+00C7" # Ccedilla 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="47:U+002F" # slash 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="61:U+003D" # equal 0C="63:U+003F" # question 0D="65104:U+0060" # dead_grave 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="122:U+007A" # z 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="200:U+00C8" # Egrave 1B="33:U+0021" # exclam 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="201:U+00C9" # Eacute 28="192:U+00C0" # Agrave 29="176:U+00B0" # degree 2A="65505" # Shift_L 2B="163:U+00A3" # sterling 2C="121:U+0079" # y 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="2755:U+215B" # oneeighth 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="2756:U+215C" # threeeighths 07="2757:U+215D" # fiveeighths 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="65116:U+02DB" # dead_ogonek 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="435:U+0142" # lstroke 12="69:U+0045" # E 13="174:U+00AE" # registered 14="956:U+0167" # tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="5053:U+0153" # oe 19="254:U+00FE" # thorn 1A="65112:U+00B0" # dead_abovering 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="230:U+00E6" # ae 1F="167:U+00A7" # section 20="240:U+00F0" # eth 21="170:U+00AA" # ordfeminine 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="435:U+0142" # lstroke 27="65113:U+02DD" # dead_doubleacute 28="65114:U+02C7" # dead_caron 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="110:U+006E" # n 32="186:U+00BA" # masculine 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65454:U+002E" # KP_Decimal ================================================ FILE: instfiles/km-00000809.ini ================================================ [noshift] Key8=65406:0 Key9=65307:27 Key10=49:49 Key11=50:50 Key12=51:51 Key13=52:52 Key14=53:53 Key15=54:54 Key16=55:55 Key17=56:56 Key18=57:57 Key19=48:48 Key20=45:45 Key21=61:61 Key22=65288:8 Key23=65289:9 Key24=113:113 Key25=119:119 Key26=101:101 Key27=114:114 Key28=116:116 Key29=121:121 Key30=117:117 Key31=105:105 Key32=111:111 Key33=112:112 Key34=91:91 Key35=93:93 Key36=65293:13 Key37=65507:0 Key38=97:97 Key39=115:115 Key40=100:100 Key41=102:102 Key42=103:103 Key43=104:104 Key44=106:106 Key45=107:107 Key46=108:108 Key47=59:59 Key48=39:39 Key49=96:96 Key50=65505:0 Key51=35:35 Key52=122:122 Key53=120:120 Key54=99:99 Key55=118:118 Key56=98:98 Key57=110:110 Key58=109:109 Key59=44:44 Key60=46:46 Key61=47:47 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shift] Key8=65406:0 Key9=65307:27 Key10=33:33 Key11=34:34 Key12=163:163 Key13=36:36 Key14=37:37 Key15=94:94 Key16=38:38 Key17=42:42 Key18=40:40 Key19=41:41 Key20=95:95 Key21=43:43 Key22=65288:8 Key23=65056:0 Key24=81:81 Key25=87:87 Key26=69:69 Key27=82:82 Key28=84:84 Key29=89:89 Key30=85:85 Key31=73:73 Key32=79:79 Key33=80:80 Key34=123:123 Key35=125:125 Key36=65293:13 Key37=65507:0 Key38=65:65 Key39=83:83 Key40=68:68 Key41=70:70 Key42=71:71 Key43=72:72 Key44=74:74 Key45=75:75 Key46=76:76 Key47=58:58 Key48=64:64 Key49=172:172 Key50=65505:0 Key51=126:126 Key52=90:90 Key53=88:88 Key54=67:67 Key55=86:86 Key56=66:66 Key57=78:78 Key58=77:77 Key59=60:60 Key60=62:62 Key61=63:63 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [altgr] Key8=65406:0 Key9=65307:27 Key10=185:185 Key11=178:178 Key12=179:179 Key13=8364:8364 Key14=189:189 Key15=190:190 Key16=123:123 Key17=91:91 Key18=93:93 Key19=125:125 Key20=92:92 Key21=65115:184 Key22=65288:8 Key23=65289:9 Key24=64:64 Key25=435:322 Key26=101:101 Key27=182:182 Key28=956:359 Key29=2299:8592 Key30=2302:8595 Key31=2301:8594 Key32=248:248 Key33=254:254 Key34=65111:168 Key35=65107:126 Key36=65293:13 Key37=65507:0 Key38=230:230 Key39=223:223 Key40=240:240 Key41=496:273 Key42=959:331 Key43=689:295 Key44=65121:0 Key45=930:312 Key46=435:322 Key47=65105:180 Key48=65106:94 Key49=124:124 Key50=65505:0 Key51=65104:96 Key52=171:171 Key53=187:187 Key54=162:162 Key55=2770:8220 Key56=2771:8221 Key57=110:110 Key58=181:181 Key59=2211:0 Key60=183:183 Key61=65120:0 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftaltgr] Key8=65406:0 Key9=65307:27 Key10=161:161 Key11=2755:8539 Key12=163:163 Key13=188:188 Key14=2756:8540 Key15=2757:8541 Key16=2758:8542 Key17=2761:8482 Key18=177:177 Key19=176:176 Key20=191:191 Key21=65116:731 Key22=65288:8 Key23=65056:0 Key24=2009:937 Key25=419:321 Key26=69:69 Key27=174:174 Key28=940:358 Key29=165:165 Key30=2300:8593 Key31=697:305 Key32=216:216 Key33=222:222 Key34=65112:176 Key35=65108:175 Key36=65293:13 Key37=65507:0 Key38=198:198 Key39=167:167 Key40=208:208 Key41=170:170 Key42=957:330 Key43=673:294 Key44=65122:0 Key45=38:38 Key46=419:321 Key47=65113:733 Key48=65114:711 Key49=124:124 Key50=65505:0 Key51=65109:728 Key52=60:60 Key53=62:62 Key54=169:169 Key55=2768:8216 Key56=2769:8217 Key57=78:78 Key58=186:186 Key59=215:215 Key60=247:247 Key61=65110:729 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [capslock] Key8=65406:0 Key9=65307:27 Key10=49:49 Key11=50:50 Key12=51:51 Key13=52:52 Key14=53:53 Key15=54:54 Key16=55:55 Key17=56:56 Key18=57:57 Key19=48:48 Key20=45:45 Key21=61:61 Key22=65288:8 Key23=65289:9 Key24=81:81 Key25=87:87 Key26=69:69 Key27=82:82 Key28=84:84 Key29=89:89 Key30=85:85 Key31=73:73 Key32=79:79 Key33=80:80 Key34=91:91 Key35=93:93 Key36=65293:13 Key37=65507:0 Key38=65:65 Key39=83:83 Key40=68:68 Key41=70:70 Key42=71:71 Key43=72:72 Key44=74:74 Key45=75:75 Key46=76:76 Key47=59:59 Key48=39:39 Key49=96:96 Key50=65505:0 Key51=35:35 Key52=90:90 Key53=88:88 Key54=67:67 Key55=86:86 Key56=66:66 Key57=78:78 Key58=77:77 Key59=44:44 Key60=46:46 Key61=47:47 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [capslockaltgr] Key8=65406:0 Key9=65307:27 Key10=185:185 Key11=178:178 Key12=179:179 Key13=8364:8364 Key14=189:189 Key15=190:190 Key16=123:123 Key17=91:91 Key18=93:93 Key19=125:125 Key20=92:92 Key21=65115:184 Key22=65288:8 Key23=65289:9 Key24=64:64 Key25=419:321 Key26=69:69 Key27=182:182 Key28=940:358 Key29=2299:8592 Key30=2302:8595 Key31=2301:8594 Key32=216:216 Key33=222:222 Key34=65111:168 Key35=65107:126 Key36=65293:13 Key37=65507:0 Key38=198:198 Key39=223:223 Key40=208:208 Key41=464:272 Key42=957:330 Key43=673:294 Key44=65121:0 Key45=930:312 Key46=419:321 Key47=65105:180 Key48=65106:94 Key49=124:124 Key50=65505:0 Key51=65104:96 Key52=171:171 Key53=187:187 Key54=162:162 Key55=2770:8220 Key56=2771:8221 Key57=78:78 Key58=924:0 Key59=2211:0 Key60=183:183 Key61=65120:0 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftcapslock] Key8=65406:0 Key9=65307:27 Key10=33:33 Key11=34:34 Key12=163:163 Key13=36:36 Key14=37:37 Key15=94:94 Key16=38:38 Key17=42:42 Key18=40:40 Key19=41:41 Key20=95:95 Key21=43:43 Key22=65288:8 Key23=65056:0 Key24=113:113 Key25=119:119 Key26=101:101 Key27=114:114 Key28=116:116 Key29=121:121 Key30=117:117 Key31=105:105 Key32=111:111 Key33=112:112 Key34=123:123 Key35=125:125 Key36=65293:13 Key37=65507:0 Key38=97:97 Key39=115:115 Key40=100:100 Key41=102:102 Key42=103:103 Key43=104:104 Key44=106:106 Key45=107:107 Key46=108:108 Key47=58:58 Key48=64:64 Key49=172:172 Key50=65505:0 Key51=126:126 Key52=122:122 Key53=120:120 Key54=99:99 Key55=118:118 Key56=98:98 Key57=110:110 Key58=109:109 Key59=60:60 Key60=62:62 Key61=63:63 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftcapslockaltgr] Key8=65406:0 Key9=65307:27 Key10=161:161 Key11=2755:8539 Key12=163:163 Key13=188:188 Key14=2756:8540 Key15=2757:8541 Key16=2758:8542 Key17=2761:8482 Key18=177:177 Key19=176:176 Key20=191:191 Key21=65116:731 Key22=65288:8 Key23=65056:0 Key24=2009:937 Key25=435:322 Key26=101:101 Key27=174:174 Key28=956:359 Key29=165:165 Key30=2300:8593 Key31=697:305 Key32=248:248 Key33=254:254 Key34=65112:176 Key35=65108:175 Key36=65293:13 Key37=65507:0 Key38=230:230 Key39=167:167 Key40=240:240 Key41=170:170 Key42=959:331 Key43=689:295 Key44=65122:0 Key45=38:38 Key46=435:322 Key47=65113:733 Key48=65114:711 Key49=124:124 Key50=65505:0 Key51=65109:728 Key52=60:60 Key53=62:62 Key54=169:169 Key55=2768:8216 Key56=2769:8217 Key57=110:110 Key58=186:186 Key59=215:215 Key60=247:247 Key61=65110:729 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 ================================================ FILE: instfiles/km-00000809.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwerty) # setxkbmap -rules evdev -model pc105 -layout gb # Description: en-GB # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="61:U+003D" # equal 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="59:U+003B" # semicolon 28="39:U+0027" # apostrophe 29="96:U+0060" # grave 2A="65505" # Shift_L 2B="35:U+0023" # numbersign 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="44:U+002C" # comma 34="46:U+002E" # period 35="47:U+002F" # slash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="92:U+005C" # backslash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="94:U+005E" # asciicircum 08="38:U+0026" # ampersand 09="42:U+002A" # asterisk 0A="40:U+0028" # parenleft 0B="41:U+0029" # parenright 0C="95:U+005F" # underscore 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="123:U+007B" # braceleft 1B="125:U+007D" # braceright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="58:U+003A" # colon 28="64:U+0040" # at 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="126:U+007E" # asciitilde 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="60:U+003C" # less 34="62:U+003E" # greater 35="63:U+003F" # question 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="185:U+00B9" # onesuperior 03="178:U+00B2" # twosuperior 04="179:U+00B3" # threesuperior 05="8364:U+20AC" # EuroSign 06="189:U+00BD" # onehalf 07="190:U+00BE" # threequarters 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="92:U+005C" # backslash 0D="65115:U+00B8" # dead_cedilla 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="64:U+0040" # at 11="435:U+0142" # lstroke 12="101:U+0065" # e 13="182:U+00B6" # paragraph 14="956:U+0167" # tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="248:U+00F8" # oslash 19="254:U+00FE" # thorn 1A="65111:U+00A8" # dead_diaeresis 1B="65107:U+007E" # dead_tilde 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="230:U+00E6" # ae 1F="223:U+00DF" # ssharp 20="240:U+00F0" # eth 21="496:U+0111" # dstroke 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="435:U+0142" # lstroke 27="65105:U+00B4" # dead_acute 28="65106:U+005E" # dead_circumflex 29="124:U+007C" # bar 2A="65505" # Shift_L 2B="65104:U+0060" # dead_grave 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="162:U+00A2" # cent 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="110:U+006E" # n 32="181:U+00B5" # mu 33="2211" # horizconnector 34="183:U+00B7" # periodcentered 35="65120" # dead_belowdot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="2755:U+215B" # oneeighth 04="163:U+00A3" # sterling 05="188:U+00BC" # onequarter 06="2756:U+215C" # threeeighths 07="2757:U+215D" # fiveeighths 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="65116:U+02DB" # dead_ogonek 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="419:U+0141" # Lstroke 12="69:U+0045" # E 13="174:U+00AE" # registered 14="940:U+0166" # Tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="216:U+00D8" # Oslash 19="222:U+00DE" # THORN 1A="65112:U+00B0" # dead_abovering 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="198:U+00C6" # AE 1F="167:U+00A7" # section 20="208:U+00D0" # ETH 21="170:U+00AA" # ordfeminine 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="419:U+0141" # Lstroke 27="65113:U+02DD" # dead_doubleacute 28="65114:U+02C7" # dead_caron 29="124:U+007C" # bar 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="78:U+004E" # N 32="186:U+00BA" # masculine 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="61:U+003D" # equal 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="59:U+003B" # semicolon 28="39:U+0027" # apostrophe 29="96:U+0060" # grave 2A="65505" # Shift_L 2B="35:U+0023" # numbersign 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="44:U+002C" # comma 34="46:U+002E" # period 35="47:U+002F" # slash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="92:U+005C" # backslash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="185:U+00B9" # onesuperior 03="178:U+00B2" # twosuperior 04="179:U+00B3" # threesuperior 05="8364:U+20AC" # EuroSign 06="189:U+00BD" # onehalf 07="190:U+00BE" # threequarters 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="92:U+005C" # backslash 0D="65115:U+00B8" # dead_cedilla 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="64:U+0040" # at 11="419:U+0141" # Lstroke 12="69:U+0045" # E 13="182:U+00B6" # paragraph 14="940:U+0166" # Tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="216:U+00D8" # Oslash 19="222:U+00DE" # THORN 1A="65111:U+00A8" # dead_diaeresis 1B="65107:U+007E" # dead_tilde 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="198:U+00C6" # AE 20="208:U+00D0" # ETH 21="464:U+0110" # Dstroke 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="419:U+0141" # Lstroke 27="65105:U+00B4" # dead_acute 28="65106:U+005E" # dead_circumflex 29="124:U+007C" # bar 2A="65505" # Shift_L 2B="65104:U+0060" # dead_grave 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="162:U+00A2" # cent 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="78:U+004E" # N 33="2211" # horizconnector 34="183:U+00B7" # periodcentered 35="65120" # dead_belowdot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="94:U+005E" # asciicircum 08="38:U+0026" # ampersand 09="42:U+002A" # asterisk 0A="40:U+0028" # parenleft 0B="41:U+0029" # parenright 0C="95:U+005F" # underscore 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="123:U+007B" # braceleft 1B="125:U+007D" # braceright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="58:U+003A" # colon 28="64:U+0040" # at 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="126:U+007E" # asciitilde 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="60:U+003C" # less 34="62:U+003E" # greater 35="63:U+003F" # question 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="2755:U+215B" # oneeighth 04="163:U+00A3" # sterling 05="188:U+00BC" # onequarter 06="2756:U+215C" # threeeighths 07="2757:U+215D" # fiveeighths 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="65116:U+02DB" # dead_ogonek 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="435:U+0142" # lstroke 12="101:U+0065" # e 13="174:U+00AE" # registered 14="956:U+0167" # tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="248:U+00F8" # oslash 19="254:U+00FE" # thorn 1A="65112:U+00B0" # dead_abovering 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="230:U+00E6" # ae 1F="167:U+00A7" # section 20="240:U+00F0" # eth 21="170:U+00AA" # ordfeminine 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="435:U+0142" # lstroke 27="65113:U+02DD" # dead_doubleacute 28="65114:U+02C7" # dead_caron 29="124:U+007C" # bar 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="110:U+006E" # n 32="186:U+00BA" # masculine 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65454:U+002E" # KP_Decimal ================================================ FILE: instfiles/km-0000080a.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwerty) # setxkbmap -rules evdev -model pc105 -layout latam # Description: es-MX # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="39:U+0027" # apostrophe 0D="191:U+00BF" # questiondown 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="65105:U+00B4" # dead_acute 1B="43:U+002B" # plus 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="241:U+00F1" # ntilde 28="123:U+007B" # braceleft 29="124:U+007C" # bar 2A="65505" # Shift_L 2B="125:U+007D" # braceright 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="47:U+002F" # slash 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="61:U+003D" # equal 0C="63:U+003F" # question 0D="161:U+00A1" # exclamdown 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="65111:U+00A8" # dead_diaeresis 1B="42:U+002A" # asterisk 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="209:U+00D1" # Ntilde 28="91:U+005B" # bracketleft 29="176:U+00B0" # degree 2A="65505" # Shift_L 2B="93:U+005D" # bracketright 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="124:U+007C" # bar 03="64:U+0040" # at 04="183:U+00B7" # periodcentered 05="126:U+007E" # asciitilde 06="189:U+00BD" # onehalf 07="172:U+00AC" # notsign 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="92:U+005C" # backslash 0D="65115:U+00B8" # dead_cedilla 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="64:U+0040" # at 11="435:U+0142" # lstroke 12="8364:U+20AC" # EuroSign 13="182:U+00B6" # paragraph 14="956:U+0167" # tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="248:U+00F8" # oslash 19="254:U+00FE" # thorn 1A="65111:U+00A8" # dead_diaeresis 1B="126:U+007E" # asciitilde 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="230:U+00E6" # ae 1F="223:U+00DF" # ssharp 20="240:U+00F0" # eth 21="496:U+0111" # dstroke 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="435:U+0142" # lstroke 27="126:U+007E" # asciitilde 28="65106:U+005E" # dead_circumflex 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="65104:U+0060" # dead_grave 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="162:U+00A2" # cent 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="110:U+006E" # n 32="181:U+00B5" # mu 33="2211" # horizconnector 34="183:U+00B7" # periodcentered 35="65120" # dead_belowdot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="2755:U+215B" # oneeighth 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="2756:U+215C" # threeeighths 07="2757:U+215D" # fiveeighths 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="65116:U+02DB" # dead_ogonek 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="419:U+0141" # Lstroke 12="162:U+00A2" # cent 13="174:U+00AE" # registered 14="940:U+0166" # Tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="216:U+00D8" # Oslash 19="222:U+00DE" # THORN 1A="65112:U+00B0" # dead_abovering 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="198:U+00C6" # AE 1F="167:U+00A7" # section 20="208:U+00D0" # ETH 21="170:U+00AA" # ordfeminine 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="419:U+0141" # Lstroke 27="65113:U+02DD" # dead_doubleacute 28="123:U+007B" # braceleft 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="125:U+007D" # braceright 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="78:U+004E" # N 32="186:U+00BA" # masculine 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="39:U+0027" # apostrophe 0D="191:U+00BF" # questiondown 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="65105:U+00B4" # dead_acute 1B="43:U+002B" # plus 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="209:U+00D1" # Ntilde 28="123:U+007B" # braceleft 29="124:U+007C" # bar 2A="65505" # Shift_L 2B="125:U+007D" # braceright 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="124:U+007C" # bar 03="64:U+0040" # at 04="183:U+00B7" # periodcentered 05="126:U+007E" # asciitilde 06="189:U+00BD" # onehalf 07="172:U+00AC" # notsign 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="92:U+005C" # backslash 0D="65115:U+00B8" # dead_cedilla 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="64:U+0040" # at 11="419:U+0141" # Lstroke 12="8364:U+20AC" # EuroSign 13="182:U+00B6" # paragraph 14="940:U+0166" # Tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="216:U+00D8" # Oslash 19="222:U+00DE" # THORN 1A="65111:U+00A8" # dead_diaeresis 1B="126:U+007E" # asciitilde 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="198:U+00C6" # AE 20="208:U+00D0" # ETH 21="464:U+0110" # Dstroke 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="419:U+0141" # Lstroke 27="126:U+007E" # asciitilde 28="65106:U+005E" # dead_circumflex 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="65104:U+0060" # dead_grave 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="162:U+00A2" # cent 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="78:U+004E" # N 33="2211" # horizconnector 34="183:U+00B7" # periodcentered 35="65120" # dead_belowdot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="47:U+002F" # slash 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="61:U+003D" # equal 0C="63:U+003F" # question 0D="161:U+00A1" # exclamdown 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="65111:U+00A8" # dead_diaeresis 1B="42:U+002A" # asterisk 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="241:U+00F1" # ntilde 28="91:U+005B" # bracketleft 29="176:U+00B0" # degree 2A="65505" # Shift_L 2B="93:U+005D" # bracketright 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="2755:U+215B" # oneeighth 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="2756:U+215C" # threeeighths 07="2757:U+215D" # fiveeighths 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="65116:U+02DB" # dead_ogonek 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="435:U+0142" # lstroke 12="162:U+00A2" # cent 13="174:U+00AE" # registered 14="956:U+0167" # tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="248:U+00F8" # oslash 19="254:U+00FE" # thorn 1A="65112:U+00B0" # dead_abovering 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="230:U+00E6" # ae 1F="167:U+00A7" # section 20="240:U+00F0" # eth 21="170:U+00AA" # ordfeminine 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="435:U+0142" # lstroke 27="65113:U+02DD" # dead_doubleacute 28="123:U+007B" # braceleft 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="125:U+007D" # braceright 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="110:U+006E" # n 32="186:U+00BA" # masculine 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65454:U+002E" # KP_Decimal ================================================ FILE: instfiles/km-0000080c.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(azerty) # setxkbmap -rules evdev -model pc105 -layout be -variant oss # Description: fr-BE # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="38:U+0026" # ampersand 03="233:U+00E9" # eacute 04="34:U+0022" # quotedbl 05="39:U+0027" # apostrophe 06="40:U+0028" # parenleft 07="167:U+00A7" # section 08="232:U+00E8" # egrave 09="33:U+0021" # exclam 0A="231:U+00E7" # ccedilla 0B="224:U+00E0" # agrave 0C="41:U+0029" # parenright 0D="45:U+002D" # minus 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="97:U+0061" # a 11="122:U+007A" # z 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="65106:U+005E" # dead_circumflex 1B="36:U+0024" # dollar 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="113:U+0071" # q 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="109:U+006D" # m 28="249:U+00F9" # ugrave 29="178:U+00B2" # twosuperior 2A="65505" # Shift_L 2B="181:U+00B5" # mu 2C="119:U+0077" # w 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="44:U+002C" # comma 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="61:U+003D" # equal 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="176:U+00B0" # degree 0D="95:U+005F" # underscore 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="65:U+0041" # A 11="90:U+005A" # Z 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="65111:U+00A8" # dead_diaeresis 1B="42:U+002A" # asterisk 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="81:U+0051" # Q 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="77:U+004D" # M 28="37:U+0025" # percent 29="179:U+00B3" # threesuperior 2A="65505" # Shift_L 2B="163:U+00A3" # sterling 2C="87:U+0057" # W 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="63:U+003F" # question 33="46:U+002E" # period 34="47:U+002F" # slash 35="43:U+002B" # plus 36="65506" # Shift_R 37="16786117:U+22C5" # U22C5 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="16785938:U+2212" # U2212 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="46:U+002E" # period 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="16785941:U+2215" # U2215 E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="124:U+007C" # bar 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="65115:U+00B8" # dead_cedilla 06="65114:U+02C7" # dead_caron 07="94:U+005E" # asciicircum 08="96:U+0060" # grave 09="126:U+007E" # asciitilde 0A="123:U+007B" # braceleft 0B="125:U+007D" # braceright 0C="248:U+00F8" # oslash 0D="16785425:U+2011" # U2011 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="230:U+00E6" # ae 11="226:U+00E2" # acircumflex 12="8364:U+20AC" # EuroSign 13="234:U+00EA" # ecircumflex 14="254:U+00FE" # thorn 15="255:U+00FF" # ydiaeresis 16="251:U+00FB" # ucircumflex 17="238:U+00EE" # icircumflex 18="5053:U+0153" # oe 19="244:U+00F4" # ocircumflex 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="228:U+00E4" # adiaeresis 1F="223:U+00DF" # ssharp 20="235:U+00EB" # ediaeresis 21="2768:U+2018" # leftsinglequotemark 22="2769:U+2019" # rightsinglequotemark 23="240:U+00F0" # eth 24="252:U+00FC" # udiaeresis 25="239:U+00EF" # idiaeresis 26="65123" # dead_stroke 27="246:U+00F6" # odiaeresis 28="65105:U+00B4" # dead_acute 29="185:U+00B9" # onesuperior 2A="65505" # Shift_L 2B="65104:U+0060" # dead_grave 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="169:U+00A9" # copyright 2F="16785455:U+202F" # U202F 30="2302:U+2193" # downarrow 31="172:U+00AC" # notsign 32="191:U+00BF" # questiondown 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65107:U+007E" # dead_tilde 36="65506" # Shift_R 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="16785814:U+2196" # U2196 48="16785809:U+2191" # U2191 49="16785815:U+2197" # U2197 4A="16785938:U+2212" # U2212 4B="16785808:U+2190" # U2190 4C="16785812:U+2194" # U2194 4D="16785810:U+2192" # U2192 4F="16785817:U+2199" # U2199 50="16785811:U+2193" # U2193 51="16785816:U+2198" # U2198 52="16785813:U+2195" # U2195 53="44:U+002C" # comma 56="92:U+005C" # backslash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="2238:U+2265" # greaterthanequal 03="201:U+00C9" # Eacute 04="65109:U+02D8" # dead_breve 05="16785428:U+2014" # U2014 06="16785427:U+2013" # U2013 07="2761:U+2122" # trademark 08="200:U+00C8" # Egrave 09="161:U+00A1" # exclamdown 0A="199:U+00C7" # Ccedilla 0B="192:U+00C0" # Agrave 0C="216:U+00D8" # Oslash 0D="177:U+00B1" # plusminus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="198:U+00C6" # AE 11="194:U+00C2" # Acircumflex 12="162:U+00A2" # cent 13="202:U+00CA" # Ecircumflex 14="222:U+00DE" # THORN 15="5054:U+0178" # Ydiaeresis 16="219:U+00DB" # Ucircumflex 17="206:U+00CE" # Icircumflex 18="5052:U+0152" # OE 19="212:U+00D4" # Ocircumflex 1A="65112:U+00B0" # dead_abovering 1B="65116:U+02DB" # dead_ogonek 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="196:U+00C4" # Adiaeresis 1F="2814:U+201E" # doublelowquotemark 20="203:U+00CB" # Ediaeresis 21="2813:U+201A" # singlelowquotemark 22="165:U+00A5" # yen 23="208:U+00D0" # ETH 24="220:U+00DC" # Udiaeresis 25="207:U+00CF" # Idiaeresis 26="16777535:U+013F" # U013F 27="214:U+00D6" # Odiaeresis 28="217:U+00D9" # Ugrave 29="2236:U+2264" # lessthanequal 2A="65505" # Shift_L 2B="65108:U+00AF" # dead_macron 2C="2770:U+201C" # leftdoublequotemark 2D="2771:U+201D" # rightdoublequotemark 2E="174:U+00AE" # registered 2F="2299:U+2190" # leftarrow 30="2300:U+2191" # uparrow 31="2301:U+2192" # rightarrow 32="16785446:U+2026" # U2026 33="16786117:U+22C5" # U22C5 34="16785941:U+2215" # U2215 35="16785938:U+2212" # U2212 36="65506" # Shift_R 37="16777215" # VoidSymbol 38="65511" # Meta_L 39="160:U+00A0" # nobreakspace 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="16785878:U+21D6" # U21D6 48="16785873:U+21D1" # U21D1 49="16785879:U+21D7" # U21D7 4A="16777215" # VoidSymbol 4B="16785872:U+21D0" # U21D0 4C="16785876:U+21D4" # U21D4 4D="16785874:U+21D2" # U21D2 4E="16777215" # VoidSymbol 4F="16785881:U+21D9" # U21D9 50="16785875:U+21D3" # U21D3 51="16785880:U+21D8" # U21D8 52="16785877:U+21D5" # U21D5 53="16785455:U+202F" # U202F 56="2237:U+2260" # notequal 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="16777215" # VoidSymbol E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="38:U+0026" # ampersand 03="201:U+00C9" # Eacute 04="34:U+0022" # quotedbl 05="39:U+0027" # apostrophe 06="40:U+0028" # parenleft 07="167:U+00A7" # section 08="200:U+00C8" # Egrave 09="33:U+0021" # exclam 0A="199:U+00C7" # Ccedilla 0B="192:U+00C0" # Agrave 0C="41:U+0029" # parenright 0D="45:U+002D" # minus 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="65:U+0041" # A 11="90:U+005A" # Z 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="65106:U+005E" # dead_circumflex 1B="36:U+0024" # dollar 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="81:U+0051" # Q 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="77:U+004D" # M 28="217:U+00D9" # Ugrave 29="178:U+00B2" # twosuperior 2A="65505" # Shift_L 2C="87:U+0057" # W 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="44:U+002C" # comma 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="61:U+003D" # equal 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="124:U+007C" # bar 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="65115:U+00B8" # dead_cedilla 06="65114:U+02C7" # dead_caron 07="94:U+005E" # asciicircum 08="96:U+0060" # grave 09="126:U+007E" # asciitilde 0A="123:U+007B" # braceleft 0B="125:U+007D" # braceright 0C="216:U+00D8" # Oslash 0D="16785425:U+2011" # U2011 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="198:U+00C6" # AE 11="194:U+00C2" # Acircumflex 12="8364:U+20AC" # EuroSign 13="202:U+00CA" # Ecircumflex 14="222:U+00DE" # THORN 15="5054:U+0178" # Ydiaeresis 16="219:U+00DB" # Ucircumflex 17="206:U+00CE" # Icircumflex 18="5052:U+0152" # OE 19="212:U+00D4" # Ocircumflex 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="196:U+00C4" # Adiaeresis 20="203:U+00CB" # Ediaeresis 21="2768:U+2018" # leftsinglequotemark 22="2769:U+2019" # rightsinglequotemark 23="208:U+00D0" # ETH 24="220:U+00DC" # Udiaeresis 25="207:U+00CF" # Idiaeresis 26="65123" # dead_stroke 27="214:U+00D6" # Odiaeresis 28="65105:U+00B4" # dead_acute 29="185:U+00B9" # onesuperior 2A="65505" # Shift_L 2B="65104:U+0060" # dead_grave 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="169:U+00A9" # copyright 2F="16785455:U+202F" # U202F 30="2302:U+2193" # downarrow 31="172:U+00AC" # notsign 32="191:U+00BF" # questiondown 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65107:U+007E" # dead_tilde 36="65506" # Shift_R 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="16785814:U+2196" # U2196 48="16785809:U+2191" # U2191 49="16785815:U+2197" # U2197 4A="16785938:U+2212" # U2212 4B="16785808:U+2190" # U2190 4C="16785812:U+2194" # U2194 4D="16785810:U+2192" # U2192 4F="16785817:U+2199" # U2199 50="16785811:U+2193" # U2193 51="16785816:U+2198" # U2198 52="16785813:U+2195" # U2195 53="44:U+002C" # comma 56="92:U+005C" # backslash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="176:U+00B0" # degree 0D="95:U+005F" # underscore 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="97:U+0061" # a 11="122:U+007A" # z 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="65111:U+00A8" # dead_diaeresis 1B="42:U+002A" # asterisk 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="113:U+0071" # q 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="109:U+006D" # m 28="37:U+0025" # percent 29="179:U+00B3" # threesuperior 2A="65505" # Shift_L 2B="163:U+00A3" # sterling 2C="119:U+0077" # w 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="63:U+003F" # question 33="46:U+002E" # period 34="47:U+002F" # slash 35="43:U+002B" # plus 36="65506" # Shift_R 37="16786117:U+22C5" # U22C5 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="16785938:U+2212" # U2212 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="46:U+002E" # period 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="16785941:U+2215" # U2215 E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="2238:U+2265" # greaterthanequal 03="201:U+00C9" # Eacute 04="65109:U+02D8" # dead_breve 05="16785428:U+2014" # U2014 06="16785427:U+2013" # U2013 07="2761:U+2122" # trademark 08="200:U+00C8" # Egrave 09="161:U+00A1" # exclamdown 0A="199:U+00C7" # Ccedilla 0B="192:U+00C0" # Agrave 0C="216:U+00D8" # Oslash 0D="177:U+00B1" # plusminus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="230:U+00E6" # ae 11="226:U+00E2" # acircumflex 12="162:U+00A2" # cent 13="234:U+00EA" # ecircumflex 14="254:U+00FE" # thorn 15="255:U+00FF" # ydiaeresis 16="251:U+00FB" # ucircumflex 17="238:U+00EE" # icircumflex 18="5053:U+0153" # oe 19="244:U+00F4" # ocircumflex 1A="65112:U+00B0" # dead_abovering 1B="65116:U+02DB" # dead_ogonek 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="228:U+00E4" # adiaeresis 1F="2814:U+201E" # doublelowquotemark 20="235:U+00EB" # ediaeresis 21="2813:U+201A" # singlelowquotemark 22="165:U+00A5" # yen 23="240:U+00F0" # eth 24="252:U+00FC" # udiaeresis 25="239:U+00EF" # idiaeresis 26="16777535:U+013F" # U013F 27="246:U+00F6" # odiaeresis 28="217:U+00D9" # Ugrave 29="2236:U+2264" # lessthanequal 2A="65505" # Shift_L 2B="65108:U+00AF" # dead_macron 2C="2770:U+201C" # leftdoublequotemark 2D="2771:U+201D" # rightdoublequotemark 2E="174:U+00AE" # registered 2F="2299:U+2190" # leftarrow 30="2300:U+2191" # uparrow 31="2301:U+2192" # rightarrow 32="16785446:U+2026" # U2026 33="16786117:U+22C5" # U22C5 34="16785941:U+2215" # U2215 35="16785938:U+2212" # U2212 36="65506" # Shift_R 37="16777215" # VoidSymbol 38="65511" # Meta_L 39="160:U+00A0" # nobreakspace 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="16785878:U+21D6" # U21D6 48="16785873:U+21D1" # U21D1 49="16785879:U+21D7" # U21D7 4A="16777215" # VoidSymbol 4B="16785872:U+21D0" # U21D0 4C="16785876:U+21D4" # U21D4 4D="16785874:U+21D2" # U21D2 4E="16777215" # VoidSymbol 4F="16785881:U+21D9" # U21D9 50="16785875:U+21D3" # U21D3 51="16785880:U+21D8" # U21D8 52="16785877:U+21D5" # U21D5 53="16785455:U+202F" # U202F 56="2237:U+2260" # notequal 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="16777215" # VoidSymbol E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="46:U+002E" # period ================================================ FILE: instfiles/km-00000813.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(azerty) # setxkbmap -rules evdev -model pc105 -layout be # Description: nl-BE # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="38:U+0026" # ampersand 03="233:U+00E9" # eacute 04="34:U+0022" # quotedbl 05="39:U+0027" # apostrophe 06="40:U+0028" # parenleft 07="167:U+00A7" # section 08="232:U+00E8" # egrave 09="33:U+0021" # exclam 0A="231:U+00E7" # ccedilla 0B="224:U+00E0" # agrave 0C="41:U+0029" # parenright 0D="45:U+002D" # minus 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="97:U+0061" # a 11="122:U+007A" # z 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="65106:U+005E" # dead_circumflex 1B="36:U+0024" # dollar 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="113:U+0071" # q 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="109:U+006D" # m 28="249:U+00F9" # ugrave 29="178:U+00B2" # twosuperior 2A="65505" # Shift_L 2B="181:U+00B5" # mu 2C="119:U+0077" # w 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="44:U+002C" # comma 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="61:U+003D" # equal 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="176:U+00B0" # degree 0D="95:U+005F" # underscore 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="65:U+0041" # A 11="90:U+005A" # Z 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="65111:U+00A8" # dead_diaeresis 1B="42:U+002A" # asterisk 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="81:U+0051" # Q 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="77:U+004D" # M 28="37:U+0025" # percent 29="179:U+00B3" # threesuperior 2A="65505" # Shift_L 2B="163:U+00A3" # sterling 2C="87:U+0057" # W 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="63:U+003F" # question 33="46:U+002E" # period 34="47:U+002F" # slash 35="43:U+002B" # plus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="124:U+007C" # bar 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="188:U+00BC" # onequarter 06="189:U+00BD" # onehalf 07="94:U+005E" # asciicircum 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="123:U+007B" # braceleft 0B="125:U+007D" # braceright 0C="92:U+005C" # backslash 0D="65115:U+00B8" # dead_cedilla 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="64:U+0040" # at 11="435:U+0142" # lstroke 12="8364:U+20AC" # EuroSign 13="182:U+00B6" # paragraph 14="956:U+0167" # tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="5053:U+0153" # oe 19="254:U+00FE" # thorn 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="230:U+00E6" # ae 1F="223:U+00DF" # ssharp 20="240:U+00F0" # eth 21="496:U+0111" # dstroke 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="435:U+0142" # lstroke 27="65105:U+00B4" # dead_acute 28="65105:U+00B4" # dead_acute 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="65104:U+0060" # dead_grave 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="162:U+00A2" # cent 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="110:U+006E" # n 32="65115:U+00B8" # dead_cedilla 33="2211" # horizconnector 34="183:U+00B7" # periodcentered 35="65107:U+007E" # dead_tilde 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="92:U+005C" # backslash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="2755:U+215B" # oneeighth 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="2756:U+215C" # threeeighths 07="2757:U+215D" # fiveeighths 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="65116:U+02DB" # dead_ogonek 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="419:U+0141" # Lstroke 12="162:U+00A2" # cent 13="174:U+00AE" # registered 14="940:U+0166" # Tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="5052:U+0152" # OE 19="222:U+00DE" # THORN 1A="65112:U+00B0" # dead_abovering 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="198:U+00C6" # AE 1F="167:U+00A7" # section 20="208:U+00D0" # ETH 21="170:U+00AA" # ordfeminine 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="419:U+0141" # Lstroke 27="65113:U+02DD" # dead_doubleacute 28="65114:U+02C7" # dead_caron 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="78:U+004E" # N 32="186:U+00BA" # masculine 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="92:U+005C" # backslash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="38:U+0026" # ampersand 03="201:U+00C9" # Eacute 04="34:U+0022" # quotedbl 05="39:U+0027" # apostrophe 06="40:U+0028" # parenleft 07="167:U+00A7" # section 08="200:U+00C8" # Egrave 09="33:U+0021" # exclam 0A="199:U+00C7" # Ccedilla 0B="192:U+00C0" # Agrave 0C="41:U+0029" # parenright 0D="45:U+002D" # minus 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="65:U+0041" # A 11="90:U+005A" # Z 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="65106:U+005E" # dead_circumflex 1B="36:U+0024" # dollar 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="81:U+0051" # Q 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="77:U+004D" # M 28="217:U+00D9" # Ugrave 29="178:U+00B2" # twosuperior 2A="65505" # Shift_L 2C="87:U+0057" # W 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="44:U+002C" # comma 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="61:U+003D" # equal 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="124:U+007C" # bar 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="188:U+00BC" # onequarter 06="189:U+00BD" # onehalf 07="94:U+005E" # asciicircum 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="123:U+007B" # braceleft 0B="125:U+007D" # braceright 0C="92:U+005C" # backslash 0D="65115:U+00B8" # dead_cedilla 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="64:U+0040" # at 11="419:U+0141" # Lstroke 12="8364:U+20AC" # EuroSign 13="182:U+00B6" # paragraph 14="940:U+0166" # Tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="5052:U+0152" # OE 19="222:U+00DE" # THORN 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="198:U+00C6" # AE 20="208:U+00D0" # ETH 21="464:U+0110" # Dstroke 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="419:U+0141" # Lstroke 27="65105:U+00B4" # dead_acute 28="65105:U+00B4" # dead_acute 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="65104:U+0060" # dead_grave 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="162:U+00A2" # cent 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="78:U+004E" # N 32="65115:U+00B8" # dead_cedilla 33="2211" # horizconnector 34="183:U+00B7" # periodcentered 35="65107:U+007E" # dead_tilde 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="92:U+005C" # backslash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="176:U+00B0" # degree 0D="95:U+005F" # underscore 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="97:U+0061" # a 11="122:U+007A" # z 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="65111:U+00A8" # dead_diaeresis 1B="42:U+002A" # asterisk 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="113:U+0071" # q 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="109:U+006D" # m 28="37:U+0025" # percent 29="179:U+00B3" # threesuperior 2A="65505" # Shift_L 2B="163:U+00A3" # sterling 2C="119:U+0077" # w 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="63:U+003F" # question 33="46:U+002E" # period 34="47:U+002F" # slash 35="43:U+002B" # plus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="2755:U+215B" # oneeighth 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="2756:U+215C" # threeeighths 07="2757:U+215D" # fiveeighths 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="65116:U+02DB" # dead_ogonek 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="435:U+0142" # lstroke 12="162:U+00A2" # cent 13="174:U+00AE" # registered 14="956:U+0167" # tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="5053:U+0153" # oe 19="254:U+00FE" # thorn 1A="65112:U+00B0" # dead_abovering 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="230:U+00E6" # ae 1F="167:U+00A7" # section 20="240:U+00F0" # eth 21="170:U+00AA" # ordfeminine 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="435:U+0142" # lstroke 27="65113:U+02DD" # dead_doubleacute 28="65114:U+02C7" # dead_caron 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="110:U+006E" # n 32="186:U+00BA" # masculine 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="92:U+005C" # backslash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65454:U+002E" # KP_Decimal ================================================ FILE: instfiles/km-00000816.ini ================================================ [noshift] Key8=65406:0 Key9=65307:27 Key10=49:49 Key11=50:50 Key12=51:51 Key13=52:52 Key14=53:53 Key15=54:54 Key16=55:55 Key17=56:56 Key18=57:57 Key19=48:48 Key20=39:39 Key21=171:171 Key22=65288:8 Key23=65289:9 Key24=113:113 Key25=119:119 Key26=101:101 Key27=114:114 Key28=116:116 Key29=121:121 Key30=117:117 Key31=105:105 Key32=111:111 Key33=112:112 Key34=43:43 Key35=65105:180 Key36=65293:13 Key37=65507:0 Key38=97:97 Key39=115:115 Key40=100:100 Key41=102:102 Key42=103:103 Key43=104:104 Key44=106:106 Key45=107:107 Key46=108:108 Key47=231:231 Key48=186:186 Key49=92:92 Key50=65505:0 Key51=65107:126 Key52=122:122 Key53=120:120 Key54=99:99 Key55=118:118 Key56=98:98 Key57=110:110 Key58=109:109 Key59=44:44 Key60=46:46 Key61=45:45 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shift] Key8=65406:0 Key9=65307:27 Key10=33:33 Key11=34:34 Key12=35:35 Key13=36:36 Key14=37:37 Key15=38:38 Key16=47:47 Key17=40:40 Key18=41:41 Key19=61:61 Key20=63:63 Key21=187:187 Key22=65288:8 Key23=65056:0 Key24=81:81 Key25=87:87 Key26=69:69 Key27=82:82 Key28=84:84 Key29=89:89 Key30=85:85 Key31=73:73 Key32=79:79 Key33=80:80 Key34=42:42 Key35=65104:96 Key36=65293:13 Key37=65507:0 Key38=65:65 Key39=83:83 Key40=68:68 Key41=70:70 Key42=71:71 Key43=72:72 Key44=74:74 Key45=75:75 Key46=76:76 Key47=199:199 Key48=170:170 Key49=124:124 Key50=65505:0 Key51=65106:94 Key52=90:90 Key53=88:88 Key54=67:67 Key55=86:86 Key56=66:66 Key57=78:78 Key58=77:77 Key59=59:59 Key60=58:58 Key61=95:95 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [altgr] Key8=65406:0 Key9=65307:27 Key10=185:185 Key11=64:64 Key12=163:163 Key13=167:167 Key14=189:189 Key15=172:172 Key16=123:123 Key17=91:91 Key18=93:93 Key19=125:125 Key20=92:92 Key21=65115:184 Key22=65288:8 Key23=65289:9 Key24=64:64 Key25=435:322 Key26=8364:8364 Key27=182:182 Key28=956:359 Key29=2299:8592 Key30=2302:8595 Key31=2301:8594 Key32=248:248 Key33=254:254 Key34=65111:168 Key35=65107:126 Key36=65293:13 Key37=65507:0 Key38=230:230 Key39=223:223 Key40=240:240 Key41=496:273 Key42=959:331 Key43=689:295 Key44=65121:0 Key45=930:312 Key46=435:322 Key47=65105:180 Key48=65106:94 Key49=172:172 Key50=65505:0 Key51=65104:96 Key52=171:171 Key53=187:187 Key54=162:162 Key55=2770:8220 Key56=2771:8221 Key57=110:110 Key58=181:181 Key59=2211:0 Key60=183:183 Key61=65120:0 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftaltgr] Key8=65406:0 Key9=65307:27 Key10=161:161 Key11=2755:8539 Key12=163:163 Key13=36:36 Key14=2756:8540 Key15=2757:8541 Key16=2758:8542 Key17=2761:8482 Key18=177:177 Key19=176:176 Key20=191:191 Key21=65116:731 Key22=65288:8 Key23=65056:0 Key24=2009:937 Key25=419:321 Key26=162:162 Key27=174:174 Key28=940:358 Key29=165:165 Key30=2300:8593 Key31=697:305 Key32=216:216 Key33=222:222 Key34=65112:176 Key35=65108:175 Key36=65293:13 Key37=65507:0 Key38=198:198 Key39=167:167 Key40=208:208 Key41=170:170 Key42=957:330 Key43=673:294 Key44=65122:0 Key45=38:38 Key46=419:321 Key47=65113:733 Key48=65114:711 Key49=172:172 Key50=65505:0 Key51=65109:728 Key52=60:60 Key53=62:62 Key54=169:169 Key55=2768:8216 Key56=2769:8217 Key57=78:78 Key58=186:186 Key59=215:215 Key60=247:247 Key61=65110:729 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [capslock] Key8=65406:0 Key9=65307:27 Key10=49:49 Key11=50:50 Key12=51:51 Key13=52:52 Key14=53:53 Key15=54:54 Key16=55:55 Key17=56:56 Key18=57:57 Key19=48:48 Key20=39:39 Key21=171:171 Key22=65288:8 Key23=65289:9 Key24=81:81 Key25=87:87 Key26=69:69 Key27=82:82 Key28=84:84 Key29=89:89 Key30=85:85 Key31=73:73 Key32=79:79 Key33=80:80 Key34=43:43 Key35=65105:180 Key36=65293:13 Key37=65507:0 Key38=65:65 Key39=83:83 Key40=68:68 Key41=70:70 Key42=71:71 Key43=72:72 Key44=74:74 Key45=75:75 Key46=76:76 Key47=199:199 Key48=186:186 Key49=92:92 Key50=65505:0 Key51=65107:126 Key52=90:90 Key53=88:88 Key54=67:67 Key55=86:86 Key56=66:66 Key57=78:78 Key58=77:77 Key59=44:44 Key60=46:46 Key61=45:45 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [capslockaltgr] Key8=65406:0 Key9=65307:27 Key10=185:185 Key11=64:64 Key12=163:163 Key13=167:167 Key14=189:189 Key15=172:172 Key16=123:123 Key17=91:91 Key18=93:93 Key19=125:125 Key20=92:92 Key21=65115:184 Key22=65288:8 Key23=65289:9 Key24=64:64 Key25=419:321 Key26=8364:8364 Key27=182:182 Key28=940:358 Key29=2299:8592 Key30=2302:8595 Key31=2301:8594 Key32=216:216 Key33=222:222 Key34=65111:168 Key35=65107:126 Key36=65293:13 Key37=65507:0 Key38=198:198 Key39=223:223 Key40=208:208 Key41=464:272 Key42=957:330 Key43=673:294 Key44=65121:0 Key45=930:312 Key46=419:321 Key47=65105:180 Key48=65106:94 Key49=172:172 Key50=65505:0 Key51=65104:96 Key52=171:171 Key53=187:187 Key54=162:162 Key55=2770:8220 Key56=2771:8221 Key57=78:78 Key58=924:0 Key59=2211:0 Key60=183:183 Key61=65120:0 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftcapslock] Key8=65406:0 Key9=65307:27 Key10=33:33 Key11=34:34 Key12=35:35 Key13=36:36 Key14=37:37 Key15=38:38 Key16=47:47 Key17=40:40 Key18=41:41 Key19=61:61 Key20=63:63 Key21=187:187 Key22=65288:8 Key23=65056:0 Key24=113:113 Key25=119:119 Key26=101:101 Key27=114:114 Key28=116:116 Key29=121:121 Key30=117:117 Key31=105:105 Key32=111:111 Key33=112:112 Key34=42:42 Key35=65104:96 Key36=65293:13 Key37=65507:0 Key38=97:97 Key39=115:115 Key40=100:100 Key41=102:102 Key42=103:103 Key43=104:104 Key44=106:106 Key45=107:107 Key46=108:108 Key47=231:231 Key48=170:170 Key49=124:124 Key50=65505:0 Key51=65106:94 Key52=122:122 Key53=120:120 Key54=99:99 Key55=118:118 Key56=98:98 Key57=110:110 Key58=109:109 Key59=59:59 Key60=58:58 Key61=95:95 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftcapslockaltgr] Key8=65406:0 Key9=65307:27 Key10=161:161 Key11=2755:8539 Key12=163:163 Key13=36:36 Key14=2756:8540 Key15=2757:8541 Key16=2758:8542 Key17=2761:8482 Key18=177:177 Key19=176:176 Key20=191:191 Key21=65116:731 Key22=65288:8 Key23=65056:0 Key24=2009:937 Key25=435:322 Key26=162:162 Key27=174:174 Key28=956:359 Key29=165:165 Key30=2300:8593 Key31=697:305 Key32=248:248 Key33=254:254 Key34=65112:176 Key35=65108:175 Key36=65293:13 Key37=65507:0 Key38=230:230 Key39=167:167 Key40=240:240 Key41=170:170 Key42=959:331 Key43=689:295 Key44=65122:0 Key45=38:38 Key46=435:322 Key47=65113:733 Key48=65114:711 Key49=172:172 Key50=65505:0 Key51=65109:728 Key52=60:60 Key53=62:62 Key54=169:169 Key55=2768:8216 Key56=2769:8217 Key57=110:110 Key58=186:186 Key59=215:215 Key60=247:247 Key61=65110:729 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 ================================================ FILE: instfiles/km-00000816.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwerty) # setxkbmap -rules evdev -model pc104 -layout pt # Description: pt-PT # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="39:U+0027" # apostrophe 0D="171:U+00AB" # guillemotleft 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="43:U+002B" # plus 1B="65105:U+00B4" # dead_acute 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="231:U+00E7" # ccedilla 28="186:U+00BA" # masculine 29="92:U+005C" # backslash 2A="65505" # Shift_L 2B="65107:U+007E" # dead_tilde 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="47:U+002F" # slash 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="61:U+003D" # equal 0C="63:U+003F" # question 0D="187:U+00BB" # guillemotright 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="42:U+002A" # asterisk 1B="65104:U+0060" # dead_grave 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="199:U+00C7" # Ccedilla 28="170:U+00AA" # ordfeminine 29="124:U+007C" # bar 2A="65505" # Shift_L 2B="65106:U+005E" # dead_circumflex 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="185:U+00B9" # onesuperior 03="64:U+0040" # at 04="163:U+00A3" # sterling 05="167:U+00A7" # section 06="189:U+00BD" # onehalf 07="172:U+00AC" # notsign 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="92:U+005C" # backslash 0D="65115:U+00B8" # dead_cedilla 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="64:U+0040" # at 11="435:U+0142" # lstroke 12="8364:U+20AC" # EuroSign 13="182:U+00B6" # paragraph 14="956:U+0167" # tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="248:U+00F8" # oslash 19="254:U+00FE" # thorn 1A="65111:U+00A8" # dead_diaeresis 1B="65107:U+007E" # dead_tilde 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="230:U+00E6" # ae 1F="223:U+00DF" # ssharp 20="240:U+00F0" # eth 21="496:U+0111" # dstroke 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="435:U+0142" # lstroke 27="65105:U+00B4" # dead_acute 28="65106:U+005E" # dead_circumflex 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="65104:U+0060" # dead_grave 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="162:U+00A2" # cent 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="110:U+006E" # n 32="181:U+00B5" # mu 33="2211" # horizconnector 34="183:U+00B7" # periodcentered 35="65120" # dead_belowdot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="92:U+005C" # backslash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="2755:U+215B" # oneeighth 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="2756:U+215C" # threeeighths 07="2757:U+215D" # fiveeighths 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="65116:U+02DB" # dead_ogonek 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="419:U+0141" # Lstroke 12="162:U+00A2" # cent 13="174:U+00AE" # registered 14="940:U+0166" # Tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="216:U+00D8" # Oslash 19="222:U+00DE" # THORN 1A="65112:U+00B0" # dead_abovering 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="198:U+00C6" # AE 1F="167:U+00A7" # section 20="208:U+00D0" # ETH 21="170:U+00AA" # ordfeminine 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="419:U+0141" # Lstroke 27="65113:U+02DD" # dead_doubleacute 28="65114:U+02C7" # dead_caron 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="78:U+004E" # N 32="186:U+00BA" # masculine 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="92:U+005C" # backslash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="39:U+0027" # apostrophe 0D="171:U+00AB" # guillemotleft 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="43:U+002B" # plus 1B="65105:U+00B4" # dead_acute 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="199:U+00C7" # Ccedilla 28="186:U+00BA" # masculine 29="92:U+005C" # backslash 2A="65505" # Shift_L 2B="65107:U+007E" # dead_tilde 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="185:U+00B9" # onesuperior 03="64:U+0040" # at 04="163:U+00A3" # sterling 05="167:U+00A7" # section 06="189:U+00BD" # onehalf 07="172:U+00AC" # notsign 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="92:U+005C" # backslash 0D="65115:U+00B8" # dead_cedilla 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="64:U+0040" # at 11="419:U+0141" # Lstroke 12="8364:U+20AC" # EuroSign 13="182:U+00B6" # paragraph 14="940:U+0166" # Tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="216:U+00D8" # Oslash 19="222:U+00DE" # THORN 1A="65111:U+00A8" # dead_diaeresis 1B="65107:U+007E" # dead_tilde 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="198:U+00C6" # AE 20="208:U+00D0" # ETH 21="464:U+0110" # Dstroke 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="419:U+0141" # Lstroke 27="65105:U+00B4" # dead_acute 28="65106:U+005E" # dead_circumflex 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="65104:U+0060" # dead_grave 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="162:U+00A2" # cent 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="78:U+004E" # N 33="2211" # horizconnector 34="183:U+00B7" # periodcentered 35="65120" # dead_belowdot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="92:U+005C" # backslash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="34:U+0022" # quotedbl 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="47:U+002F" # slash 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="61:U+003D" # equal 0C="63:U+003F" # question 0D="187:U+00BB" # guillemotright 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="42:U+002A" # asterisk 1B="65104:U+0060" # dead_grave 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="231:U+00E7" # ccedilla 28="170:U+00AA" # ordfeminine 29="124:U+007C" # bar 2A="65505" # Shift_L 2B="65106:U+005E" # dead_circumflex 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="2755:U+215B" # oneeighth 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="2756:U+215C" # threeeighths 07="2757:U+215D" # fiveeighths 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="65116:U+02DB" # dead_ogonek 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="435:U+0142" # lstroke 12="162:U+00A2" # cent 13="174:U+00AE" # registered 14="956:U+0167" # tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="248:U+00F8" # oslash 19="254:U+00FE" # thorn 1A="65112:U+00B0" # dead_abovering 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="230:U+00E6" # ae 1F="167:U+00A7" # section 20="240:U+00F0" # eth 21="170:U+00AA" # ordfeminine 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="435:U+0142" # lstroke 27="65113:U+02DD" # dead_doubleacute 28="65114:U+02C7" # dead_caron 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="110:U+006E" # n 32="186:U+00BA" # masculine 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="92:U+005C" # backslash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65454:U+002E" # KP_Decimal ================================================ FILE: instfiles/km-0000100c.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwertz) # setxkbmap -rules evdev -model pc105 -layout ch -variant fr # Description: fr-CH # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="39:U+0027" # apostrophe 0D="65106:U+005E" # dead_circumflex 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="122:U+007A" # z 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="232:U+00E8" # egrave 1B="65111:U+00A8" # dead_diaeresis 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="233:U+00E9" # eacute 28="224:U+00E0" # agrave 29="167:U+00A7" # section 2A="65505" # Shift_L 2B="36:U+0024" # dollar 2C="121:U+0079" # y 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="43:U+002B" # plus 03="34:U+0022" # quotedbl 04="42:U+002A" # asterisk 05="231:U+00E7" # ccedilla 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="47:U+002F" # slash 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="61:U+003D" # equal 0C="63:U+003F" # question 0D="65104:U+0060" # dead_grave 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="90:U+005A" # Z 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="252:U+00FC" # udiaeresis 1B="33:U+0021" # exclam 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="246:U+00F6" # odiaeresis 28="228:U+00E4" # adiaeresis 29="176:U+00B0" # degree 2A="65505" # Shift_L 2B="163:U+00A3" # sterling 2C="89:U+0059" # Y 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="124:U+007C" # bar 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="188:U+00BC" # onequarter 06="189:U+00BD" # onehalf 07="172:U+00AC" # notsign 08="124:U+007C" # bar 09="162:U+00A2" # cent 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="65105:U+00B4" # dead_acute 0D="65107:U+007E" # dead_tilde 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="64:U+0040" # at 11="435:U+0142" # lstroke 12="8364:U+20AC" # EuroSign 13="182:U+00B6" # paragraph 14="956:U+0167" # tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="5053:U+0153" # oe 19="254:U+00FE" # thorn 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="230:U+00E6" # ae 1F="223:U+00DF" # ssharp 20="240:U+00F0" # eth 21="496:U+0111" # dstroke 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="435:U+0142" # lstroke 27="65105:U+00B4" # dead_acute 28="123:U+007B" # braceleft 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="125:U+007D" # braceright 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="162:U+00A2" # cent 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="110:U+006E" # n 32="181:U+00B5" # mu 33="2211" # horizconnector 34="183:U+00B7" # periodcentered 35="65120" # dead_belowdot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="92:U+005C" # backslash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="2755:U+215B" # oneeighth 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="2756:U+215C" # threeeighths 07="2757:U+215D" # fiveeighths 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="65116:U+02DB" # dead_ogonek 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="419:U+0141" # Lstroke 12="69:U+0045" # E 13="174:U+00AE" # registered 14="940:U+0166" # Tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="5052:U+0152" # OE 19="222:U+00DE" # THORN 1A="65112:U+00B0" # dead_abovering 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="198:U+00C6" # AE 1F="167:U+00A7" # section 20="208:U+00D0" # ETH 21="170:U+00AA" # ordfeminine 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="419:U+0141" # Lstroke 27="65113:U+02DD" # dead_doubleacute 28="65114:U+02C7" # dead_caron 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="78:U+004E" # N 32="186:U+00BA" # masculine 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="39:U+0027" # apostrophe 0D="65106:U+005E" # dead_circumflex 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="90:U+005A" # Z 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="200:U+00C8" # Egrave 1B="65111:U+00A8" # dead_diaeresis 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="201:U+00C9" # Eacute 28="192:U+00C0" # Agrave 29="167:U+00A7" # section 2A="65505" # Shift_L 2B="36:U+0024" # dollar 2C="89:U+0059" # Y 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="44:U+002C" # comma 34="46:U+002E" # period 35="45:U+002D" # minus 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="124:U+007C" # bar 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="188:U+00BC" # onequarter 06="189:U+00BD" # onehalf 07="172:U+00AC" # notsign 08="124:U+007C" # bar 09="162:U+00A2" # cent 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="65105:U+00B4" # dead_acute 0D="65107:U+007E" # dead_tilde 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="64:U+0040" # at 11="419:U+0141" # Lstroke 12="8364:U+20AC" # EuroSign 13="182:U+00B6" # paragraph 14="940:U+0166" # Tslash 15="2299:U+2190" # leftarrow 16="2302:U+2193" # downarrow 17="2301:U+2192" # rightarrow 18="5052:U+0152" # OE 19="222:U+00DE" # THORN 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="198:U+00C6" # AE 20="208:U+00D0" # ETH 21="464:U+0110" # Dstroke 22="957:U+014A" # ENG 23="673:U+0126" # Hstroke 24="65121" # dead_hook 25="930:U+0138" # kra 26="419:U+0141" # Lstroke 27="65105:U+00B4" # dead_acute 28="123:U+007B" # braceleft 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="125:U+007D" # braceright 2C="171:U+00AB" # guillemotleft 2D="187:U+00BB" # guillemotright 2E="162:U+00A2" # cent 2F="2770:U+201C" # leftdoublequotemark 30="2771:U+201D" # rightdoublequotemark 31="78:U+004E" # N 33="2211" # horizconnector 34="183:U+00B7" # periodcentered 35="65120" # dead_belowdot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="92:U+005C" # backslash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="43:U+002B" # plus 03="34:U+0022" # quotedbl 04="42:U+002A" # asterisk 05="199:U+00C7" # Ccedilla 06="37:U+0025" # percent 07="38:U+0026" # ampersand 08="47:U+002F" # slash 09="40:U+0028" # parenleft 0A="41:U+0029" # parenright 0B="61:U+003D" # equal 0C="63:U+003F" # question 0D="65104:U+0060" # dead_grave 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="122:U+007A" # z 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="220:U+00DC" # Udiaeresis 1B="33:U+0021" # exclam 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="214:U+00D6" # Odiaeresis 28="196:U+00C4" # Adiaeresis 29="176:U+00B0" # degree 2A="65505" # Shift_L 2B="163:U+00A3" # sterling 2C="121:U+0079" # y 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="59:U+003B" # semicolon 34="58:U+003A" # colon 35="95:U+005F" # underscore 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="2755:U+215B" # oneeighth 04="163:U+00A3" # sterling 05="36:U+0024" # dollar 06="2756:U+215C" # threeeighths 07="2757:U+215D" # fiveeighths 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="65116:U+02DB" # dead_ogonek 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="2009:U+03A9" # Greek_OMEGA 11="435:U+0142" # lstroke 12="69:U+0045" # E 13="174:U+00AE" # registered 14="956:U+0167" # tslash 15="165:U+00A5" # yen 16="2300:U+2191" # uparrow 17="697:U+0131" # idotless 18="5053:U+0153" # oe 19="254:U+00FE" # thorn 1A="65112:U+00B0" # dead_abovering 1B="65108:U+00AF" # dead_macron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="230:U+00E6" # ae 1F="167:U+00A7" # section 20="240:U+00F0" # eth 21="170:U+00AA" # ordfeminine 22="959:U+014B" # eng 23="689:U+0127" # hstroke 24="65122" # dead_horn 25="38:U+0026" # ampersand 26="435:U+0142" # lstroke 27="65113:U+02DD" # dead_doubleacute 28="65114:U+02C7" # dead_caron 29="172:U+00AC" # notsign 2A="65505" # Shift_L 2B="65109:U+02D8" # dead_breve 2C="60:U+003C" # less 2D="62:U+003E" # greater 2E="169:U+00A9" # copyright 2F="2768:U+2018" # leftsinglequotemark 30="2769:U+2019" # rightsinglequotemark 31="110:U+006E" # n 32="186:U+00BA" # masculine 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="65110:U+02D9" # dead_abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65454:U+002E" # KP_Decimal ================================================ FILE: instfiles/km-00010409.ini ================================================ [noshift] Key8=65406:0 Key9=65307:27 Key10=49:49 Key11=50:50 Key12=51:51 Key13=52:52 Key14=53:53 Key15=54:54 Key16=55:55 Key17=56:56 Key18=57:57 Key19=48:48 Key20=91:91 Key21=93:93 Key22=65288:8 Key23=65289:9 Key24=39:39 Key25=44:44 Key26=46:46 Key27=112:112 Key28=121:121 Key29=102:102 Key30=103:103 Key31=99:99 Key32=114:114 Key33=108:108 Key34=47:47 Key35=61:61 Key36=65293:13 Key37=65507:0 Key38=97:97 Key39=111:111 Key40=101:101 Key41=117:117 Key42=105:105 Key43=100:100 Key44=104:104 Key45=116:116 Key46=110:110 Key47=115:115 Key48=45:45 Key49=96:96 Key50=65505:0 Key51=92:92 Key52=59:59 Key53=113:113 Key54=106:106 Key55=107:107 Key56=120:120 Key57=98:98 Key58=109:109 Key59=119:119 Key60=118:118 Key61=122:122 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=60:60 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shift] Key8=65406:0 Key9=65307:27 Key10=33:33 Key11=64:64 Key12=35:35 Key13=36:36 Key14=37:37 Key15=94:94 Key16=38:38 Key17=42:42 Key18=40:40 Key19=41:41 Key20=123:123 Key21=125:125 Key22=65288:8 Key23=65056:0 Key24=34:34 Key25=60:60 Key26=62:62 Key27=80:80 Key28=89:89 Key29=70:70 Key30=71:71 Key31=67:67 Key32=82:82 Key33=76:76 Key34=63:63 Key35=43:43 Key36=65293:13 Key37=65507:0 Key38=65:65 Key39=79:79 Key40=69:69 Key41=85:85 Key42=73:73 Key43=68:68 Key44=72:72 Key45=84:84 Key46=78:78 Key47=83:83 Key48=95:95 Key49=126:126 Key50=65505:0 Key51=124:124 Key52=58:58 Key53=81:81 Key54=74:74 Key55=75:75 Key56=88:88 Key57=66:66 Key58=77:77 Key59=87:87 Key60=86:86 Key61=90:90 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65463:55 Key80=65464:56 Key81=65465:57 Key82=65453:45 Key83=65460:52 Key84=65461:53 Key85=65462:54 Key86=65451:43 Key87=65457:49 Key88=65458:50 Key89=65459:51 Key90=65456:48 Key91=65454:46 Key92=65377:0 Key94=62:62 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=65469:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [altgr] Key8=65406:0 Key9=65307:27 Key10=49:49 Key11=50:50 Key12=51:51 Key13=52:52 Key14=53:53 Key15=65106:94 Key16=55:55 Key17=56:56 Key18=65104:96 Key19=48:48 Key20=91:91 Key21=65107:126 Key22=65288:8 Key23=65289:9 Key24=65105:180 Key25=65115:184 Key26=65110:729 Key27=112:112 Key28=121:121 Key29=102:102 Key30=103:103 Key31=99:99 Key32=114:114 Key33=108:108 Key34=47:47 Key35=61:61 Key36=65293:13 Key37=65507:0 Key38=97:97 Key39=111:111 Key40=101:101 Key41=117:117 Key42=105:105 Key43=100:100 Key44=104:104 Key45=116:116 Key46=110:110 Key47=115:115 Key48=45:45 Key49=65104:96 Key50=65505:0 Key51=92:92 Key52=65116:731 Key53=113:113 Key54=106:106 Key55=107:107 Key56=120:120 Key57=98:98 Key58=109:109 Key59=119:119 Key60=118:118 Key61=122:122 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=124:124 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftaltgr] Key8=65406:0 Key9=65307:27 Key10=33:33 Key11=64:64 Key12=35:35 Key13=36:36 Key14=37:37 Key15=65106:94 Key16=38:38 Key17=42:42 Key19=41:41 Key20=123:123 Key22=65288:8 Key23=65056:0 Key24=65111:168 Key25=65114:711 Key26=183:183 Key27=80:80 Key28=89:89 Key29=70:70 Key30=71:71 Key31=67:67 Key32=82:82 Key33=76:76 Key34=63:63 Key35=43:43 Key36=65293:13 Key37=65507:0 Key38=65:65 Key39=79:79 Key40=69:69 Key41=85:85 Key42=73:73 Key43=68:68 Key44=72:72 Key45=84:84 Key46=78:78 Key47=83:83 Key48=95:95 Key49=65107:126 Key50=65505:0 Key51=124:124 Key52=65113:733 Key53=81:81 Key54=74:74 Key55=75:75 Key56=88:88 Key57=66:66 Key58=77:77 Key59=87:87 Key60=86:86 Key61=90:90 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65463:55 Key80=65464:56 Key81=65465:57 Key82=65453:45 Key83=65460:52 Key84=65461:53 Key85=65462:54 Key86=65451:43 Key87=65457:49 Key88=65458:50 Key89=65459:51 Key90=65456:48 Key91=65454:46 Key92=65377:0 Key94=166:166 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=65469:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [capslock] Key8=65406:0 Key9=65307:27 Key10=49:49 Key11=50:50 Key12=51:51 Key13=52:52 Key14=53:53 Key15=54:54 Key16=55:55 Key17=56:56 Key18=57:57 Key19=48:48 Key20=91:91 Key21=93:93 Key22=65288:8 Key23=65289:9 Key24=39:39 Key25=44:44 Key26=46:46 Key27=80:80 Key28=89:89 Key29=70:70 Key30=71:71 Key31=67:67 Key32=82:82 Key33=76:76 Key34=47:47 Key35=61:61 Key36=65293:13 Key37=65507:0 Key38=65:65 Key39=79:79 Key40=69:69 Key41=85:85 Key42=73:73 Key43=68:68 Key44=72:72 Key45=84:84 Key46=78:78 Key47=83:83 Key48=45:45 Key49=96:96 Key50=65505:0 Key51=92:92 Key52=59:59 Key53=81:81 Key54=74:74 Key55=75:75 Key56=88:88 Key57=66:66 Key58=77:77 Key59=87:87 Key60=86:86 Key61=90:90 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=60:60 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [capslockaltgr] Key8=65406:0 Key9=65307:27 Key10=49:49 Key11=50:50 Key12=51:51 Key13=52:52 Key14=53:53 Key15=65106:94 Key16=55:55 Key17=56:56 Key18=65104:96 Key19=48:48 Key20=91:91 Key21=65107:126 Key22=65288:8 Key23=65289:9 Key24=65105:180 Key25=65115:184 Key26=65110:729 Key27=80:80 Key28=89:89 Key29=70:70 Key30=71:71 Key31=67:67 Key32=82:82 Key33=76:76 Key34=47:47 Key35=61:61 Key36=65293:13 Key37=65507:0 Key38=65:65 Key39=79:79 Key40=69:69 Key41=85:85 Key42=73:73 Key43=68:68 Key44=72:72 Key45=84:84 Key46=78:78 Key47=83:83 Key48=45:45 Key49=65104:96 Key50=65505:0 Key51=92:92 Key52=65116:731 Key53=81:81 Key54=74:74 Key55=75:75 Key56=88:88 Key57=66:66 Key58=77:77 Key59=87:87 Key60=86:86 Key61=90:90 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key92=65377:0 Key94=124:124 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key126=65469:61 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025044:0 Key173=269025046:0 Key174=269025045:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftcapslock] Key8=65406:0 Key9=65307:27 Key10=33:33 Key11=64:64 Key12=35:35 Key13=36:36 Key14=37:37 Key15=94:94 Key16=38:38 Key17=42:42 Key18=40:40 Key19=41:41 Key20=123:123 Key21=125:125 Key22=65288:8 Key23=65056:0 Key24=34:34 Key25=60:60 Key26=62:62 Key27=112:112 Key28=121:121 Key29=102:102 Key30=103:103 Key31=99:99 Key32=114:114 Key33=108:108 Key34=63:63 Key35=43:43 Key36=65293:13 Key37=65507:0 Key38=97:97 Key39=111:111 Key40=101:101 Key41=117:117 Key42=105:105 Key43=100:100 Key44=104:104 Key45=116:116 Key46=110:110 Key47=115:115 Key48=95:95 Key49=126:126 Key50=65505:0 Key51=124:124 Key52=58:58 Key53=113:113 Key54=106:106 Key55=107:107 Key56=120:120 Key57=98:98 Key58=109:109 Key59=119:119 Key60=118:118 Key61=122:122 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65463:55 Key80=65464:56 Key81=65465:57 Key82=65453:45 Key83=65460:52 Key84=65461:53 Key85=65462:54 Key86=65451:43 Key87=65457:49 Key88=65458:50 Key89=65459:51 Key90=65456:48 Key91=65454:46 Key92=65377:0 Key94=62:62 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=65469:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 [shiftcapslockaltgr] Key8=65406:0 Key9=65307:27 Key10=33:33 Key11=64:64 Key12=35:35 Key13=36:36 Key14=37:37 Key15=65106:94 Key16=38:38 Key17=42:42 Key19=41:41 Key20=123:123 Key22=65288:8 Key23=65056:0 Key24=65111:168 Key25=65114:711 Key26=183:183 Key27=112:112 Key28=121:121 Key29=102:102 Key30=103:103 Key31=99:99 Key32=114:114 Key33=108:108 Key34=63:63 Key35=43:43 Key36=65293:13 Key37=65507:0 Key38=97:97 Key39=111:111 Key40=101:101 Key41=117:117 Key42=105:105 Key43=100:100 Key44=104:104 Key45=116:116 Key46=110:110 Key47=115:115 Key48=95:95 Key49=65107:126 Key50=65505:0 Key51=124:124 Key52=65113:733 Key53=113:113 Key54=106:106 Key55=107:107 Key56=120:120 Key57=98:98 Key58=109:109 Key59=119:119 Key60=118:118 Key61=122:122 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65463:55 Key80=65464:56 Key81=65465:57 Key82=65453:45 Key83=65460:52 Key84=65461:53 Key85=65462:54 Key86=65451:43 Key87=65457:49 Key88=65458:50 Key89=65459:51 Key90=65456:48 Key91=65454:46 Key92=65377:0 Key94=166:166 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key114=269025049:0 Key115=65515:0 Key116=65516:0 Key118=269025153:0 Key119=269025093:0 Key120=269025094:0 Key121=269025042:0 Key122=269025041:0 Key123=269025043:0 Key124=65027:0 Key125=65513:0 Key126=65469:61 Key127=65515:0 Key128=65517:0 Key136=65385:0 Key156=269025089:0 Key157=269025090:0 Key163=269025049:0 Key164=269025072:0 Key166=269025062:0 Key167=269025063:0 Key171=269025047:0 Key172=269025073:0 Key173=269025046:0 Key174=269025068:0 Key180=269025048:0 Key181=269025139:0 Key225=269025051:0 Key234=269025074:0 ================================================ FILE: instfiles/km-00010409.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwerty) # setxkbmap -rules evdev -model pc104 -layout us -variant dvorak # Description: en-US # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="91:U+005B" # bracketleft 0D="93:U+005D" # bracketright 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="39:U+0027" # apostrophe 11="44:U+002C" # comma 12="46:U+002E" # period 13="112:U+0070" # p 14="121:U+0079" # y 15="102:U+0066" # f 16="103:U+0067" # g 17="99:U+0063" # c 18="114:U+0072" # r 19="108:U+006C" # l 1A="47:U+002F" # slash 1B="61:U+003D" # equal 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="111:U+006F" # o 20="101:U+0065" # e 21="117:U+0075" # u 22="105:U+0069" # i 23="100:U+0064" # d 24="104:U+0068" # h 25="116:U+0074" # t 26="110:U+006E" # n 27="115:U+0073" # s 28="45:U+002D" # minus 29="96:U+0060" # grave 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="59:U+003B" # semicolon 2D="113:U+0071" # q 2E="106:U+006A" # j 2F="107:U+006B" # k 30="120:U+0078" # x 31="98:U+0062" # b 32="109:U+006D" # m 33="119:U+0077" # w 34="118:U+0076" # v 35="122:U+007A" # z 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65514" # Alt_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="94:U+005E" # asciicircum 08="38:U+0026" # ampersand 09="42:U+002A" # asterisk 0A="40:U+0028" # parenleft 0B="41:U+0029" # parenright 0C="123:U+007B" # braceleft 0D="125:U+007D" # braceright 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="34:U+0022" # quotedbl 11="60:U+003C" # less 12="62:U+003E" # greater 13="80:U+0050" # P 14="89:U+0059" # Y 15="70:U+0046" # F 16="71:U+0047" # G 17="67:U+0043" # C 18="82:U+0052" # R 19="76:U+004C" # L 1A="63:U+003F" # question 1B="43:U+002B" # plus 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="79:U+004F" # O 20="69:U+0045" # E 21="85:U+0055" # U 22="73:U+0049" # I 23="68:U+0044" # D 24="72:U+0048" # H 25="84:U+0054" # T 26="78:U+004E" # N 27="83:U+0053" # S 28="95:U+005F" # underscore 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="124:U+007C" # bar 2C="58:U+003A" # colon 2D="81:U+0051" # Q 2E="74:U+004A" # J 2F="75:U+004B" # K 30="88:U+0058" # X 31="66:U+0042" # B 32="77:U+004D" # M 33="87:U+0057" # W 34="86:U+0056" # V 35="90:U+005A" # Z 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65512" # Meta_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="65106:U+005E" # dead_circumflex 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="65104:U+0060" # dead_grave 0B="48:U+0030" # 0 0C="91:U+005B" # bracketleft 0D="65107:U+007E" # dead_tilde 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="65105:U+00B4" # dead_acute 11="65115:U+00B8" # dead_cedilla 12="65110:U+02D9" # dead_abovedot 13="112:U+0070" # p 14="121:U+0079" # y 15="102:U+0066" # f 16="103:U+0067" # g 17="99:U+0063" # c 18="114:U+0072" # r 19="108:U+006C" # l 1A="47:U+002F" # slash 1B="61:U+003D" # equal 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="111:U+006F" # o 20="101:U+0065" # e 21="117:U+0075" # u 22="105:U+0069" # i 23="100:U+0064" # d 24="104:U+0068" # h 25="116:U+0074" # t 26="110:U+006E" # n 27="115:U+0073" # s 28="45:U+002D" # minus 29="65104:U+0060" # dead_grave 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="65116:U+02DB" # dead_ogonek 2D="113:U+0071" # q 2E="106:U+006A" # j 2F="107:U+006B" # k 30="120:U+0078" # x 31="98:U+0062" # b 32="109:U+006D" # m 33="119:U+0077" # w 34="118:U+0076" # v 35="122:U+007A" # z 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65514" # Alt_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="65106:U+005E" # dead_circumflex 08="38:U+0026" # ampersand 09="42:U+002A" # asterisk 0A="65109:U+02D8" # dead_breve 0B="41:U+0029" # parenright 0C="123:U+007B" # braceleft 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="65111:U+00A8" # dead_diaeresis 11="65114:U+02C7" # dead_caron 12="183:U+00B7" # periodcentered 13="80:U+0050" # P 14="89:U+0059" # Y 15="70:U+0046" # F 16="71:U+0047" # G 17="67:U+0043" # C 18="82:U+0052" # R 19="76:U+004C" # L 1A="63:U+003F" # question 1B="43:U+002B" # plus 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="79:U+004F" # O 20="69:U+0045" # E 21="85:U+0055" # U 22="73:U+0049" # I 23="68:U+0044" # D 24="72:U+0048" # H 25="84:U+0054" # T 26="78:U+004E" # N 27="83:U+0053" # S 28="95:U+005F" # underscore 29="65107:U+007E" # dead_tilde 2A="65505" # Shift_L 2B="124:U+007C" # bar 2C="65113:U+02DD" # dead_doubleacute 2D="81:U+0051" # Q 2E="74:U+004A" # J 2F="75:U+004B" # K 30="88:U+0058" # X 31="66:U+0042" # B 32="77:U+004D" # M 33="87:U+0057" # W 34="86:U+0056" # V 35="90:U+005A" # Z 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65512" # Meta_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="91:U+005B" # bracketleft 0D="93:U+005D" # bracketright 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="39:U+0027" # apostrophe 11="44:U+002C" # comma 12="46:U+002E" # period 13="80:U+0050" # P 14="89:U+0059" # Y 15="70:U+0046" # F 16="71:U+0047" # G 17="67:U+0043" # C 18="82:U+0052" # R 19="76:U+004C" # L 1A="47:U+002F" # slash 1B="61:U+003D" # equal 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="79:U+004F" # O 20="69:U+0045" # E 21="85:U+0055" # U 22="73:U+0049" # I 23="68:U+0044" # D 24="72:U+0048" # H 25="84:U+0054" # T 26="78:U+004E" # N 27="83:U+0053" # S 28="45:U+002D" # minus 29="96:U+0060" # grave 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="59:U+003B" # semicolon 2D="81:U+0051" # Q 2E="74:U+004A" # J 2F="75:U+004B" # K 30="88:U+0058" # X 31="66:U+0042" # B 32="77:U+004D" # M 33="87:U+0057" # W 34="86:U+0056" # V 35="90:U+005A" # Z 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65514" # Alt_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="65106:U+005E" # dead_circumflex 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="65104:U+0060" # dead_grave 0B="48:U+0030" # 0 0C="91:U+005B" # bracketleft 0D="65107:U+007E" # dead_tilde 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="65105:U+00B4" # dead_acute 11="65115:U+00B8" # dead_cedilla 12="65110:U+02D9" # dead_abovedot 13="80:U+0050" # P 14="89:U+0059" # Y 15="70:U+0046" # F 16="71:U+0047" # G 17="67:U+0043" # C 18="82:U+0052" # R 19="76:U+004C" # L 1A="47:U+002F" # slash 1B="61:U+003D" # equal 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="79:U+004F" # O 20="69:U+0045" # E 21="85:U+0055" # U 22="73:U+0049" # I 23="68:U+0044" # D 24="72:U+0048" # H 25="84:U+0054" # T 26="78:U+004E" # N 27="83:U+0053" # S 28="45:U+002D" # minus 29="65104:U+0060" # dead_grave 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="65116:U+02DB" # dead_ogonek 2D="81:U+0051" # Q 2E="74:U+004A" # J 2F="75:U+004B" # K 30="88:U+0058" # X 31="66:U+0042" # B 32="77:U+004D" # M 33="87:U+0057" # W 34="86:U+0056" # V 35="90:U+005A" # Z 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65514" # Alt_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="94:U+005E" # asciicircum 08="38:U+0026" # ampersand 09="42:U+002A" # asterisk 0A="40:U+0028" # parenleft 0B="41:U+0029" # parenright 0C="123:U+007B" # braceleft 0D="125:U+007D" # braceright 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="34:U+0022" # quotedbl 11="60:U+003C" # less 12="62:U+003E" # greater 13="112:U+0070" # p 14="121:U+0079" # y 15="102:U+0066" # f 16="103:U+0067" # g 17="99:U+0063" # c 18="114:U+0072" # r 19="108:U+006C" # l 1A="63:U+003F" # question 1B="43:U+002B" # plus 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="111:U+006F" # o 20="101:U+0065" # e 21="117:U+0075" # u 22="105:U+0069" # i 23="100:U+0064" # d 24="104:U+0068" # h 25="116:U+0074" # t 26="110:U+006E" # n 27="115:U+0073" # s 28="95:U+005F" # underscore 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="124:U+007C" # bar 2C="58:U+003A" # colon 2D="113:U+0071" # q 2E="106:U+006A" # j 2F="107:U+006B" # k 30="120:U+0078" # x 31="98:U+0062" # b 32="109:U+006D" # m 33="119:U+0077" # w 34="118:U+0076" # v 35="122:U+007A" # z 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65512" # Meta_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="65106:U+005E" # dead_circumflex 08="38:U+0026" # ampersand 09="42:U+002A" # asterisk 0A="65109:U+02D8" # dead_breve 0B="41:U+0029" # parenright 0C="123:U+007B" # braceleft 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="65111:U+00A8" # dead_diaeresis 11="65114:U+02C7" # dead_caron 12="183:U+00B7" # periodcentered 13="112:U+0070" # p 14="121:U+0079" # y 15="102:U+0066" # f 16="103:U+0067" # g 17="99:U+0063" # c 18="114:U+0072" # r 19="108:U+006C" # l 1A="63:U+003F" # question 1B="43:U+002B" # plus 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="111:U+006F" # o 20="101:U+0065" # e 21="117:U+0075" # u 22="105:U+0069" # i 23="100:U+0064" # d 24="104:U+0068" # h 25="116:U+0074" # t 26="110:U+006E" # n 27="115:U+0073" # s 28="95:U+005F" # underscore 29="65107:U+007E" # dead_tilde 2A="65505" # Shift_L 2B="124:U+007C" # bar 2C="65113:U+02DD" # dead_doubleacute 2D="113:U+0071" # q 2E="106:U+006A" # j 2F="107:U+006B" # k 30="120:U+0078" # x 31="98:U+0062" # b 32="109:U+006D" # m 33="119:U+0077" # w 34="118:U+0076" # v 35="122:U+007A" # z 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65512" # Meta_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65454:U+002E" # KP_Decimal ================================================ FILE: instfiles/km-00010426.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwerty) # setxkbmap -rules evdev -model pc104 -layout lv # Description: lv-LV # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="61:U+003D" # equal 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="59:U+003B" # semicolon 28="39:U+0027" # apostrophe 29="96:U+0060" # grave 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="44:U+002C" # comma 34="46:U+002E" # period 35="47:U+002F" # slash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="94:U+005E" # asciicircum 08="38:U+0026" # ampersand 09="42:U+002A" # asterisk 0A="40:U+0028" # parenleft 0B="41:U+0029" # parenright 0C="95:U+005F" # underscore 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="123:U+007B" # braceleft 1B="125:U+007D" # braceright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="58:U+003A" # colon 28="34:U+0022" # quotedbl 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="124:U+007C" # bar 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="60:U+003C" # less 34="62:U+003E" # greater 35="63:U+003F" # question 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="185:U+00B9" # onesuperior 03="178:U+00B2" # twosuperior 04="179:U+00B3" # threesuperior 05="8364:U+20AC" # EuroSign 06="189:U+00BD" # onehalf 07="190:U+00BE" # threequarters 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="92:U+005C" # backslash 0D="2730:U+2013" # endash 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="954:U+0113" # emacron 13="947:U+0157" # rcedilla 14="116:U+0074" # t 15="121:U+0079" # y 16="1022:U+016B" # umacron 17="1007:U+012B" # imacron 18="1010:U+014D" # omacron 19="112:U+0070" # p 1A="171:U+00AB" # guillemotleft 1B="187:U+00BB" # guillemotright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="992:U+0101" # amacron 1F="441:U+0161" # scaron 20="100:U+0064" # d 21="102:U+0066" # f 22="955:U+0123" # gcedilla 23="104:U+0068" # h 24="106:U+006A" # j 25="1011:U+0137" # kcedilla 26="950:U+013C" # lcedilla 27="59:U+003B" # semicolon 28="2770:U+201C" # leftdoublequotemark 29="180:U+00B4" # acute 2A="65505" # Shift_L 2B="96:U+0060" # grave 2C="446:U+017E" # zcaron 2D="120:U+0078" # x 2E="488:U+010D" # ccaron 2F="118:U+0076" # v 30="98:U+0062" # b 31="1009:U+0146" # ncedilla 32="109:U+006D" # m 33="2211" # horizconnector 34="183:U+00B7" # periodcentered 35="47:U+002F" # slash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="2755:U+215B" # oneeighth 04="163:U+00A3" # sterling 05="162:U+00A2" # cent 06="2756:U+215C" # threeeighths 07="2757:U+215D" # fiveeighths 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="2729:U+2014" # emdash 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="938:U+0112" # Emacron 13="931:U+0156" # Rcedilla 14="84:U+0054" # T 15="89:U+0059" # Y 16="990:U+016A" # Umacron 17="975:U+012A" # Imacron 18="978:U+014C" # Omacron 19="80:U+0050" # P 1A="2770:U+201C" # leftdoublequotemark 1B="2771:U+201D" # rightdoublequotemark 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="960:U+0100" # Amacron 1F="425:U+0160" # Scaron 20="68:U+0044" # D 21="70:U+0046" # F 22="939:U+0122" # Gcedilla 23="72:U+0048" # H 24="74:U+004A" # J 25="979:U+0136" # Kcedilla 26="934:U+013B" # Lcedilla 27="58:U+003A" # colon 28="2814:U+201E" # doublelowquotemark 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="418:U+02D8" # breve 2C="430:U+017D" # Zcaron 2D="88:U+0058" # X 2E="456:U+010C" # Ccaron 2F="86:U+0056" # V 30="66:U+0042" # B 31="977:U+0145" # Ncedilla 32="77:U+004D" # M 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="511:U+02D9" # abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="61:U+003D" # equal 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="69:U+0045" # E 13="82:U+0052" # R 14="84:U+0054" # T 15="89:U+0059" # Y 16="85:U+0055" # U 17="73:U+0049" # I 18="79:U+004F" # O 19="80:U+0050" # P 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="83:U+0053" # S 20="68:U+0044" # D 21="70:U+0046" # F 22="71:U+0047" # G 23="72:U+0048" # H 24="74:U+004A" # J 25="75:U+004B" # K 26="76:U+004C" # L 27="59:U+003B" # semicolon 28="39:U+0027" # apostrophe 29="96:U+0060" # grave 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="78:U+004E" # N 32="77:U+004D" # M 33="44:U+002C" # comma 34="46:U+002E" # period 35="47:U+002F" # slash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="60:U+003C" # less 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="185:U+00B9" # onesuperior 03="178:U+00B2" # twosuperior 04="179:U+00B3" # threesuperior 05="8364:U+20AC" # EuroSign 06="189:U+00BD" # onehalf 07="190:U+00BE" # threequarters 08="123:U+007B" # braceleft 09="91:U+005B" # bracketleft 0A="93:U+005D" # bracketright 0B="125:U+007D" # braceright 0C="92:U+005C" # backslash 0D="2730:U+2013" # endash 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="938:U+0112" # Emacron 13="931:U+0156" # Rcedilla 14="84:U+0054" # T 15="89:U+0059" # Y 16="990:U+016A" # Umacron 17="975:U+012A" # Imacron 18="978:U+014C" # Omacron 19="80:U+0050" # P 1A="171:U+00AB" # guillemotleft 1B="187:U+00BB" # guillemotright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="960:U+0100" # Amacron 1F="425:U+0160" # Scaron 20="68:U+0044" # D 21="70:U+0046" # F 22="939:U+0122" # Gcedilla 23="72:U+0048" # H 24="74:U+004A" # J 25="979:U+0136" # Kcedilla 26="934:U+013B" # Lcedilla 27="59:U+003B" # semicolon 28="2770:U+201C" # leftdoublequotemark 29="180:U+00B4" # acute 2A="65505" # Shift_L 2B="96:U+0060" # grave 2C="430:U+017D" # Zcaron 2D="88:U+0058" # X 2E="456:U+010C" # Ccaron 2F="86:U+0056" # V 30="66:U+0042" # B 31="977:U+0145" # Ncedilla 32="77:U+004D" # M 33="2211" # horizconnector 34="183:U+00B7" # periodcentered 35="47:U+002F" # slash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="124:U+007C" # bar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="94:U+005E" # asciicircum 08="38:U+0026" # ampersand 09="42:U+002A" # asterisk 0A="40:U+0028" # parenleft 0B="41:U+0029" # parenright 0C="95:U+005F" # underscore 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="101:U+0065" # e 13="114:U+0072" # r 14="116:U+0074" # t 15="121:U+0079" # y 16="117:U+0075" # u 17="105:U+0069" # i 18="111:U+006F" # o 19="112:U+0070" # p 1A="123:U+007B" # braceleft 1B="125:U+007D" # braceright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="115:U+0073" # s 20="100:U+0064" # d 21="102:U+0066" # f 22="103:U+0067" # g 23="104:U+0068" # h 24="106:U+006A" # j 25="107:U+006B" # k 26="108:U+006C" # l 27="58:U+003A" # colon 28="34:U+0022" # quotedbl 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="124:U+007C" # bar 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="110:U+006E" # n 32="109:U+006D" # m 33="60:U+003C" # less 34="62:U+003E" # greater 35="63:U+003F" # question 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="62:U+003E" # greater 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="2755:U+215B" # oneeighth 04="163:U+00A3" # sterling 05="162:U+00A2" # cent 06="2756:U+215C" # threeeighths 07="2757:U+215D" # fiveeighths 08="2758:U+215E" # seveneighths 09="2761:U+2122" # trademark 0A="177:U+00B1" # plusminus 0B="176:U+00B0" # degree 0C="191:U+00BF" # questiondown 0D="2729:U+2014" # emdash 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="954:U+0113" # emacron 13="947:U+0157" # rcedilla 14="116:U+0074" # t 15="121:U+0079" # y 16="1022:U+016B" # umacron 17="1007:U+012B" # imacron 18="1010:U+014D" # omacron 19="112:U+0070" # p 1A="2770:U+201C" # leftdoublequotemark 1B="2771:U+201D" # rightdoublequotemark 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="992:U+0101" # amacron 1F="441:U+0161" # scaron 20="100:U+0064" # d 21="102:U+0066" # f 22="955:U+0123" # gcedilla 23="104:U+0068" # h 24="106:U+006A" # j 25="1011:U+0137" # kcedilla 26="950:U+013C" # lcedilla 27="58:U+003A" # colon 28="2814:U+201E" # doublelowquotemark 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="418:U+02D8" # breve 2C="446:U+017E" # zcaron 2D="120:U+0078" # x 2E="488:U+010D" # ccaron 2F="118:U+0076" # v 30="98:U+0062" # b 31="1009:U+0146" # ncedilla 32="109:U+006D" # m 33="215:U+00D7" # multiply 34="247:U+00F7" # division 35="511:U+02D9" # abovedot 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="166:U+00A6" # brokenbar 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65454:U+002E" # KP_Decimal ================================================ FILE: instfiles/km-00060409.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwerty) # setxkbmap -rules evdev -model pc104 -layout us -variant colemak # Description: en-US # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=false [noshift] 01="65307:U+001B" # Escape 02="49:U+0031" # 1 03="50:U+0032" # 2 04="51:U+0033" # 3 05="52:U+0034" # 4 06="53:U+0035" # 5 07="54:U+0036" # 6 08="55:U+0037" # 7 09="56:U+0038" # 8 0A="57:U+0039" # 9 0B="48:U+0030" # 0 0C="45:U+002D" # minus 0D="61:U+003D" # equal 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="113:U+0071" # q 11="119:U+0077" # w 12="102:U+0066" # f 13="112:U+0070" # p 14="103:U+0067" # g 15="106:U+006A" # j 16="108:U+006C" # l 17="117:U+0075" # u 18="121:U+0079" # y 19="59:U+003B" # semicolon 1A="91:U+005B" # bracketleft 1B="93:U+005D" # bracketright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="114:U+0072" # r 20="115:U+0073" # s 21="116:U+0074" # t 22="100:U+0064" # d 23="104:U+0068" # h 24="110:U+006E" # n 25="101:U+0065" # e 26="105:U+0069" # i 27="111:U+006F" # o 28="39:U+0027" # apostrophe 29="96:U+0060" # grave 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="122:U+007A" # z 2D="120:U+0078" # x 2E="99:U+0063" # c 2F="118:U+0076" # v 30="98:U+0062" # b 31="107:U+006B" # k 32="109:U+006D" # m 33="44:U+002C" # comma 34="46:U+002E" # period 35="47:U+002F" # slash 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65288:U+0008" # BackSpace 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="45:U+002D" # minus 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="33:U+0021" # exclam 03="64:U+0040" # at 04="35:U+0023" # numbersign 05="36:U+0024" # dollar 06="37:U+0025" # percent 07="94:U+005E" # asciicircum 08="38:U+0026" # ampersand 09="42:U+002A" # asterisk 0A="40:U+0028" # parenleft 0B="41:U+0029" # parenright 0C="95:U+005F" # underscore 0D="43:U+002B" # plus 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="81:U+0051" # Q 11="87:U+0057" # W 12="70:U+0046" # F 13="80:U+0050" # P 14="71:U+0047" # G 15="74:U+004A" # J 16="76:U+004C" # L 17="85:U+0055" # U 18="89:U+0059" # Y 19="58:U+003A" # colon 1A="123:U+007B" # braceleft 1B="125:U+007D" # braceright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="82:U+0052" # R 20="83:U+0053" # S 21="84:U+0054" # T 22="68:U+0044" # D 23="72:U+0048" # H 24="78:U+004E" # N 25="69:U+0045" # E 26="73:U+0049" # I 27="79:U+004F" # O 28="34:U+0022" # quotedbl 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="124:U+007C" # bar 2C="90:U+005A" # Z 2D="88:U+0058" # X 2E="67:U+0043" # C 2F="86:U+0056" # V 30="66:U+0042" # B 31="75:U+004B" # K 32="77:U+004D" # M 33="60:U+003C" # less 34="62:U+003E" # greater 35="63:U+003F" # question 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65288:U+0008" # BackSpace 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="95:U+005F" # underscore 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="161:U+00A1" # exclamdown 03="186:U+00BA" # masculine 04="170:U+00AA" # ordfeminine 05="162:U+00A2" # cent 06="8364:U+20AC" # EuroSign 07="689:U+0127" # hstroke 08="240:U+00F0" # eth 09="254:U+00FE" # thorn 0A="2768:U+2018" # leftsinglequotemark 0B="2769:U+2019" # rightsinglequotemark 0C="2730:U+2013" # endash 0D="215:U+00D7" # multiply 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="228:U+00E4" # adiaeresis 11="229:U+00E5" # aring 12="227:U+00E3" # atilde 13="248:U+00F8" # oslash 14="65116:U+02DB" # dead_ogonek 15="496:U+0111" # dstroke 16="435:U+0142" # lstroke 17="250:U+00FA" # uacute 18="252:U+00FC" # udiaeresis 19="246:U+00F6" # odiaeresis 1A="171:U+00AB" # guillemotleft 1B="187:U+00BB" # guillemotright 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="225:U+00E1" # aacute 1F="65104:U+0060" # dead_grave 20="223:U+00DF" # ssharp 21="65105:U+00B4" # dead_acute 22="65111:U+00A8" # dead_diaeresis 23="65114:U+02C7" # dead_caron 24="241:U+00F1" # ntilde 25="233:U+00E9" # eacute 26="237:U+00ED" # iacute 27="243:U+00F3" # oacute 28="245:U+00F5" # otilde 29="65107:U+007E" # dead_tilde 2A="65505" # Shift_L 2B="126:U+007E" # asciitilde 2C="230:U+00E6" # ae 2D="65106:U+005E" # dead_circumflex 2E="231:U+00E7" # ccedilla 2F="5053:U+0153" # oe 30="65109:U+02D8" # dead_breve 31="65112:U+00B0" # dead_abovering 32="65108:U+00AF" # dead_macron 33="65115:U+00B8" # dead_cedilla 34="65110:U+02D9" # dead_abovedot 35="191:U+00BF" # questiondown 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65288:U+0008" # BackSpace 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="2730:U+2013" # endash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="185:U+00B9" # onesuperior 03="178:U+00B2" # twosuperior 04="179:U+00B3" # threesuperior 05="163:U+00A3" # sterling 06="165:U+00A5" # yen 07="673:U+0126" # Hstroke 08="208:U+00D0" # ETH 09="222:U+00DE" # THORN 0A="2770:U+201C" # leftdoublequotemark 0B="2771:U+201D" # rightdoublequotemark 0C="2729:U+2014" # emdash 0D="247:U+00F7" # division 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="196:U+00C4" # Adiaeresis 11="197:U+00C5" # Aring 12="195:U+00C3" # Atilde 13="216:U+00D8" # Oslash 14="126:U+007E" # asciitilde 15="464:U+0110" # Dstroke 16="419:U+0141" # Lstroke 17="218:U+00DA" # Uacute 18="220:U+00DC" # Udiaeresis 19="214:U+00D6" # Odiaeresis 1A="16785465:U+2039" # U2039 1B="16785466:U+203A" # U203A 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="193:U+00C1" # Aacute 1F="126:U+007E" # asciitilde 20="16785054:U+1E9E" # U1E9E 21="65113:U+02DD" # dead_doubleacute 22="126:U+007E" # asciitilde 23="126:U+007E" # asciitilde 24="209:U+00D1" # Ntilde 25="201:U+00C9" # Eacute 26="205:U+00CD" # Iacute 27="211:U+00D3" # Oacute 28="213:U+00D5" # Otilde 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="126:U+007E" # asciitilde 2C="198:U+00C6" # AE 2D="126:U+007E" # asciitilde 2E="199:U+00C7" # Ccedilla 2F="5052:U+0152" # OE 30="126:U+007E" # asciitilde 31="126:U+007E" # asciitilde 32="126:U+007E" # asciitilde 33="126:U+007E" # asciitilde 34="126:U+007E" # asciitilde 35="126:U+007E" # asciitilde 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="160:U+00A0" # nobreakspace 3A="65288:U+0008" # BackSpace 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="2729:U+2014" # emdash 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65027" # ISO_Level3_Shift E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65463:U+0037" # KP_7 48="65464:U+0038" # KP_8 49="65465:U+0039" # KP_9 4A="65453:U+002D" # KP_Subtract 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="65451:U+002B" # KP_Add 4F="65457:U+0031" # KP_1 50="65458:U+0032" # KP_2 51="65459:U+0033" # KP_3 52="65456:U+0030" # KP_0 53="65454:U+002E" # KP_Decimal ================================================ FILE: instfiles/km-19360409.ini ================================================ [noshift] Key8=65406:0 Key9=65307:27 Key10=38:38 Key11=91:91 Key12=123:123 Key13=125:125 Key14=40:40 Key15=61:61 Key16=42:42 Key17=41:41 Key18=43:43 Key19=93:93 Key20=33:33 Key21=35:35 Key22=65288:8 Key23=65289:9 Key24=59:59 Key25=44:44 Key26=46:46 Key27=112:112 Key28=121:121 Key29=102:102 Key30=103:103 Key31=99:99 Key32=114:114 Key33=108:108 Key34=47:47 Key35=64:64 Key36=65293:13 Key37=65507:0 Key38=97:97 Key39=111:111 Key40=101:101 Key41=117:117 Key42=105:105 Key43=100:100 Key44=104:104 Key45=116:116 Key46=110:110 Key47=115:115 Key48=45:45 Key49=36:36 Key50=65505:0 Key51=92:92 Key52=39:39 Key53=113:113 Key54=106:106 Key55=107:107 Key56=120:120 Key57=98:98 Key58=109:109 Key59=119:119 Key60=118:118 Key61=122:122 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key115=65515:0 Key116=65516:0 Key117=65383:0 Key124=65027:0 Key126=65469:61 Key134=65454:46 Key144=269025046:0 Key150=269025071:0 Key153=269025047:0 Key160=269025042:0 Key161=269025053:0 Key162=269025044:0 Key164=269025045:0 Key170=269025068:0 Key174=269025041:0 Key176=269025043:0 Key178=269025070:0 Key204=269025068:0 Key214=269025113:0 Key215=269025028:0 Key216=269025030:0 Key217=269025029:0 Key222=269025066:0 Key223=269025040:0 Key227=269025067:0 Key229=269025051:0 Key230=269025072:0 Key231=269025139:0 Key232=269025064:0 Key233=269025063:0 Key234=269025062:0 Key235=269025075:0 Key236=269025049:0 Key237=269025074:0 Key244=269025171:0 Key246=269025173:0 [shift] Key8=65406:0 Key9=65307:27 Key10=37:37 Key11=55:55 Key12=53:53 Key13=51:51 Key14=49:49 Key15=57:57 Key16=48:48 Key17=50:50 Key18=52:52 Key19=54:54 Key20=56:56 Key21=96:96 Key22=65288:8 Key23=65056:0 Key24=58:58 Key25=60:60 Key26=62:62 Key27=80:80 Key28=89:89 Key29=70:70 Key30=71:71 Key31=67:67 Key32=82:82 Key33=76:76 Key34=63:63 Key35=94:94 Key36=65293:13 Key37=65507:0 Key38=65:65 Key39=79:79 Key40=69:69 Key41=85:85 Key42=73:73 Key43=68:68 Key44=72:72 Key45=84:84 Key46=78:78 Key47=83:83 Key48=95:95 Key49=126:126 Key50=65505:0 Key51=124:124 Key52=34:34 Key53=81:81 Key54=74:74 Key55=75:75 Key56=88:88 Key57=66:66 Key58=77:77 Key59=87:87 Key60=86:86 Key61=90:90 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key115=65515:0 Key116=65516:0 Key117=65383:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key134=65454:46 Key144=269025046:0 Key150=269025071:0 Key153=269025047:0 Key156=65511:0 Key160=269025042:0 Key161=269025053:0 Key162=269025073:0 Key164=269025068:0 Key170=269025068:0 Key174=269025041:0 Key176=269025043:0 Key178=269025070:0 Key204=269025068:0 Key214=269025113:0 Key215=269025028:0 Key216=269025030:0 Key217=269025029:0 Key222=269025066:0 Key223=269025040:0 Key227=269025067:0 Key229=269025051:0 Key230=269025072:0 Key231=269025139:0 Key232=269025064:0 Key233=269025063:0 Key234=269025062:0 Key235=269025075:0 Key236=269025049:0 Key237=269025074:0 Key244=269025171:0 Key246=269025173:0 [altgr] Key8=65406:0 Key9=65307:27 Key10=38:38 Key11=164:164 Key12=162:162 Key13=165:165 Key14=8364:8364 Key15=163:163 Key17=189:189 Key20=161:161 Key21=65104:96 Key22=65288:8 Key23=65289:9 Key24=65111:168 Key25=171:171 Key26=187:187 Key27=182:182 Key28=252:252 Key29=102:102 Key30=103:103 Key31=231:231 Key32=174:174 Key33=108:108 Key34=191:191 Key35=65106:94 Key36=65293:13 Key37=65507:0 Key38=229:229 Key39=248:248 Key40=230:230 Key41=233:233 Key42=105:105 Key43=240:240 Key44=65105:180 Key45=254:254 Key46=241:241 Key47=223:223 Key48=173:173 Key49=65107:126 Key50=65505:0 Key51=92:92 Key52=65105:180 Key53=113:113 Key54=106:106 Key55=107:107 Key56=120:120 Key57=98:98 Key58=109:109 Key59=119:119 Key60=118:118 Key61=122:122 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key115=65515:0 Key116=65516:0 Key117=65383:0 Key124=65027:0 Key126=65469:61 Key134=65454:46 Key144=269025046:0 Key150=269025071:0 Key153=269025047:0 Key160=269025042:0 Key161=269025053:0 Key162=269025044:0 Key164=269025045:0 Key170=269025068:0 Key174=269025041:0 Key176=269025043:0 Key178=269025070:0 Key204=269025068:0 Key214=269025113:0 Key215=269025028:0 Key216=269025030:0 Key217=269025029:0 Key222=269025066:0 Key223=269025040:0 Key227=269025067:0 Key229=269025051:0 Key230=269025072:0 Key231=269025139:0 Key232=269025064:0 Key233=269025063:0 Key234=269025062:0 Key235=269025075:0 Key236=269025049:0 Key237=269025074:0 Key244=269025171:0 Key246=269025173:0 [shiftaltgr] Key8=65406:0 Key9=65307:27 Key10=37:37 Key20=16789016:11800 Key22=65288:8 Key23=65056:0 Key24=65111:168 Key25=16785436:8220 Key26=16785437:8221 Key27=167:167 Key28=220:220 Key29=70:70 Key30=71:71 Key31=199:199 Key32=2761:8482 Key33=76:76 Key34=16785469:8253 Key35=65114:711 Key36=65293:13 Key37=65507:0 Key38=197:197 Key39=216:216 Key40=198:198 Key41=201:201 Key42=73:73 Key43=208:208 Key45=222:222 Key46=209:209 Key47=16785054:7838 Key48=2730:8211 Key49=65107:126 Key50=65505:0 Key51=124:124 Key52=65113:733 Key53=81:81 Key54=74:74 Key55=75:75 Key56=88:88 Key57=66:66 Key58=77:77 Key59=87:87 Key60=86:86 Key61=90:90 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key115=65515:0 Key116=65516:0 Key117=65383:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key134=65454:46 Key144=269025046:0 Key150=269025071:0 Key153=269025047:0 Key156=65511:0 Key160=269025042:0 Key161=269025053:0 Key162=269025073:0 Key164=269025068:0 Key170=269025068:0 Key174=269025041:0 Key176=269025043:0 Key178=269025070:0 Key204=269025068:0 Key214=269025113:0 Key215=269025028:0 Key216=269025030:0 Key217=269025029:0 Key222=269025066:0 Key223=269025040:0 Key227=269025067:0 Key229=269025051:0 Key230=269025072:0 Key231=269025139:0 Key232=269025064:0 Key233=269025063:0 Key234=269025062:0 Key235=269025075:0 Key236=269025049:0 Key237=269025074:0 Key244=269025171:0 Key246=269025173:0 [capslock] Key8=65406:0 Key9=65307:27 Key10=38:38 Key11=55:55 Key12=53:53 Key13=51:51 Key14=49:49 Key15=57:57 Key16=48:48 Key17=50:50 Key18=52:52 Key19=54:54 Key20=56:56 Key21=35:35 Key22=65288:8 Key23=65289:9 Key24=59:59 Key25=44:44 Key26=46:46 Key27=80:80 Key28=89:89 Key29=70:70 Key30=71:71 Key31=67:67 Key32=82:82 Key33=76:76 Key34=47:47 Key35=64:64 Key36=65293:13 Key37=65507:0 Key38=65:65 Key39=79:79 Key40=69:69 Key41=85:85 Key42=73:73 Key43=68:68 Key44=72:72 Key45=84:84 Key46=78:78 Key47=83:83 Key48=95:95 Key49=36:36 Key50=65505:0 Key51=92:92 Key52=39:39 Key53=81:81 Key54=74:74 Key55=75:75 Key56=88:88 Key57=66:66 Key58=77:77 Key59=87:87 Key60=86:86 Key61=90:90 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key115=65515:0 Key116=65516:0 Key117=65383:0 Key124=65027:0 Key126=65469:61 Key134=65454:46 Key144=269025046:0 Key150=269025071:0 Key153=269025047:0 Key160=269025042:0 Key161=269025053:0 Key162=269025044:0 Key164=269025045:0 Key170=269025068:0 Key174=269025041:0 Key176=269025043:0 Key178=269025070:0 Key204=269025068:0 Key214=269025113:0 Key215=269025028:0 Key216=269025030:0 Key217=269025029:0 Key222=269025066:0 Key223=269025040:0 Key227=269025067:0 Key229=269025051:0 Key230=269025072:0 Key231=269025139:0 Key232=269025064:0 Key233=269025063:0 Key234=269025062:0 Key235=269025075:0 Key236=269025049:0 Key237=269025074:0 Key244=269025171:0 Key246=269025173:0 [capslockaltgr] Key8=65406:0 Key9=65307:27 Key10=38:38 Key20=16789016:11800 Key21=65104:96 Key22=65288:8 Key23=65289:9 Key24=65111:168 Key25=171:171 Key26=187:187 Key27=182:182 Key28=220:220 Key29=70:70 Key30=71:71 Key31=199:199 Key32=174:174 Key33=76:76 Key34=191:191 Key35=65106:94 Key36=65293:13 Key37=65507:0 Key38=197:197 Key39=216:216 Key40=198:198 Key41=201:201 Key42=73:73 Key43=208:208 Key44=65105:180 Key45=222:222 Key46=209:209 Key47=223:223 Key48=2730:8211 Key49=65107:126 Key50=65505:0 Key51=92:92 Key52=65105:180 Key53=81:81 Key54=74:74 Key55=75:75 Key56=88:88 Key57=66:66 Key58=77:77 Key59=87:87 Key60=86:86 Key61=90:90 Key62=65506:0 Key63=65450:42 Key64=65513:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65514:0 Key115=65515:0 Key116=65516:0 Key117=65383:0 Key124=65027:0 Key126=65469:61 Key134=65454:46 Key144=269025046:0 Key150=269025071:0 Key153=269025047:0 Key160=269025042:0 Key161=269025053:0 Key162=269025044:0 Key164=269025045:0 Key170=269025068:0 Key174=269025041:0 Key176=269025043:0 Key178=269025070:0 Key204=269025068:0 Key214=269025113:0 Key215=269025028:0 Key216=269025030:0 Key217=269025029:0 Key222=269025066:0 Key223=269025040:0 Key227=269025067:0 Key229=269025051:0 Key230=269025072:0 Key231=269025139:0 Key232=269025064:0 Key233=269025063:0 Key234=269025062:0 Key235=269025075:0 Key236=269025049:0 Key237=269025074:0 Key244=269025171:0 Key246=269025173:0 [shiftcapslock] Key8=65406:0 Key9=65307:27 Key10=37:37 Key11=91:91 Key12=123:123 Key13=125:125 Key14=40:40 Key15=61:61 Key16=42:42 Key17=41:41 Key18=43:43 Key19=93:93 Key20=33:33 Key21=96:96 Key22=65288:8 Key23=65056:0 Key24=58:58 Key25=60:60 Key26=62:62 Key27=112:112 Key28=121:121 Key29=102:102 Key30=103:103 Key31=99:99 Key32=114:114 Key33=108:108 Key34=63:63 Key35=94:94 Key36=65293:13 Key37=65507:0 Key38=97:97 Key39=111:111 Key40=101:101 Key41=117:117 Key42=105:105 Key43=100:100 Key44=104:104 Key45=116:116 Key46=110:110 Key47=115:115 Key48=45:45 Key49=126:126 Key50=65505:0 Key51=124:124 Key52=34:34 Key53=113:113 Key54=106:106 Key55=107:107 Key56=120:120 Key57=98:98 Key58=109:109 Key59=119:119 Key60=118:118 Key61=122:122 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key115=65515:0 Key116=65516:0 Key117=65383:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key134=65454:46 Key144=269025046:0 Key150=269025071:0 Key153=269025047:0 Key156=65511:0 Key160=269025042:0 Key161=269025053:0 Key162=269025073:0 Key164=269025068:0 Key170=269025068:0 Key174=269025041:0 Key176=269025043:0 Key178=269025070:0 Key204=269025068:0 Key214=269025113:0 Key215=269025028:0 Key216=269025030:0 Key217=269025029:0 Key222=269025066:0 Key223=269025040:0 Key227=269025067:0 Key229=269025051:0 Key230=269025072:0 Key231=269025139:0 Key232=269025064:0 Key233=269025063:0 Key234=269025062:0 Key235=269025075:0 Key236=269025049:0 Key237=269025074:0 Key244=269025171:0 Key246=269025173:0 [shiftcapslockaltgr] Key8=65406:0 Key9=65307:27 Key10=37:37 Key11=164:164 Key12=162:162 Key13=165:165 Key14=8364:8364 Key15=163:163 Key17=189:189 Key20=161:161 Key22=65288:8 Key23=65056:0 Key24=65111:168 Key25=16785436:8220 Key26=16785437:8221 Key27=167:167 Key28=252:252 Key29=102:102 Key30=103:103 Key31=231:231 Key32=2761:8482 Key33=108:108 Key34=16785469:8253 Key35=65114:711 Key36=65293:13 Key37=65507:0 Key38=229:229 Key39=248:248 Key40=230:230 Key41=233:233 Key42=105:105 Key43=240:240 Key45=254:254 Key46=241:241 Key47=16785054:7838 Key48=173:173 Key49=65107:126 Key50=65505:0 Key51=124:124 Key52=65113:733 Key53=113:113 Key54=106:106 Key55=107:107 Key56=120:120 Key57=98:98 Key58=109:109 Key59=119:119 Key60=118:118 Key61=122:122 Key62=65506:0 Key63=65450:42 Key64=65511:0 Key65=32:32 Key66=65509:0 Key67=65470:0 Key68=65471:0 Key69=65472:0 Key70=65473:0 Key71=65474:0 Key72=65475:0 Key73=65476:0 Key74=65477:0 Key75=65478:0 Key76=65479:0 Key77=65407:0 Key78=65300:0 Key79=65429:0 Key80=65431:0 Key81=65434:0 Key82=65453:45 Key83=65430:0 Key84=65437:0 Key85=65432:0 Key86=65451:43 Key87=65436:0 Key88=65433:0 Key89=65435:0 Key90=65438:0 Key91=65439:0 Key94=65312:0 Key95=65480:0 Key96=65481:0 Key97=65360:0 Key98=65362:0 Key99=65365:0 Key100=65361:0 Key102=65363:0 Key103=65367:0 Key104=65364:0 Key105=65366:0 Key106=65379:0 Key107=65535:127 Key108=65421:13 Key109=65508:0 Key110=65299:0 Key111=65377:0 Key112=65455:47 Key113=65512:0 Key115=65515:0 Key116=65516:0 Key117=65383:0 Key124=65027:0 Key125=65513:0 Key126=61:61 Key127=65515:0 Key128=65517:0 Key134=65454:46 Key144=269025046:0 Key150=269025071:0 Key153=269025047:0 Key156=65511:0 Key160=269025042:0 Key161=269025053:0 Key162=269025073:0 Key164=269025068:0 Key170=269025068:0 Key174=269025041:0 Key176=269025043:0 Key178=269025070:0 Key204=269025068:0 Key214=269025113:0 Key215=269025028:0 Key216=269025030:0 Key217=269025029:0 Key222=269025066:0 Key223=269025040:0 Key227=269025067:0 Key229=269025051:0 Key230=269025072:0 Key231=269025139:0 Key232=269025064:0 Key233=269025063:0 Key234=269025062:0 Key235=269025075:0 Key236=269025049:0 Key237=269025074:0 Key244=269025171:0 Key246=269025173:0 ================================================ FILE: instfiles/km-19360409.toml ================================================ # Created by xrdp-genkeymap V0.10.80 # Key code set: evdev+aliases(qwerty) # setxkbmap -rules evdev -model pc105 -layout us -variant dvp -option "" -option compose:102 -option caps:shift -option numpad:sg -option numpad:shift3 -option keypad:hex -option keypad:atm -option kpdl:semi -option lv3:ralt_alt # Description: en-US # Operating system: Ubuntu 22.04.5 LTS [General] version=2 caps_lock_supported=true [noshift] 01="65307:U+001B" # Escape 02="38:U+0026" # ampersand 03="91:U+005B" # bracketleft 04="123:U+007B" # braceleft 05="125:U+007D" # braceright 06="40:U+0028" # parenleft 07="61:U+003D" # equal 08="42:U+002A" # asterisk 09="41:U+0029" # parenright 0A="43:U+002B" # plus 0B="93:U+005D" # bracketright 0C="33:U+0021" # exclam 0D="35:U+0023" # numbersign 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="59:U+003B" # semicolon 11="44:U+002C" # comma 12="46:U+002E" # period 13="112:U+0070" # p 14="121:U+0079" # y 15="102:U+0066" # f 16="103:U+0067" # g 17="99:U+0063" # c 18="114:U+0072" # r 19="108:U+006C" # l 1A="47:U+002F" # slash 1B="64:U+0040" # at 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="111:U+006F" # o 20="101:U+0065" # e 21="117:U+0075" # u 22="105:U+0069" # i 23="100:U+0064" # d 24="104:U+0068" # h 25="116:U+0074" # t 26="110:U+006E" # n 27="115:U+0073" # s 28="45:U+002D" # minus 29="36:U+0024" # dollar 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="39:U+0027" # apostrophe 2D="113:U+0071" # q 2E="106:U+006A" # j 2F="107:U+006B" # k 30="120:U+0078" # x 31="98:U+0062" # b 32="109:U+006D" # m 33="119:U+0077" # w 34="118:U+0076" # v 35="122:U+007A" # z 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="65312" # Multi_key 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65514" # Alt_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shift] 01="65307:U+001B" # Escape 02="37:U+0025" # percent 03="55:U+0037" # 7 04="53:U+0035" # 5 05="51:U+0033" # 3 06="49:U+0031" # 1 07="57:U+0039" # 9 08="48:U+0030" # 0 09="50:U+0032" # 2 0A="52:U+0034" # 4 0B="54:U+0036" # 6 0C="56:U+0038" # 8 0D="96:U+0060" # grave 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="58:U+003A" # colon 11="60:U+003C" # less 12="62:U+003E" # greater 13="80:U+0050" # P 14="89:U+0059" # Y 15="70:U+0046" # F 16="71:U+0047" # G 17="67:U+0043" # C 18="82:U+0052" # R 19="76:U+004C" # L 1A="63:U+003F" # question 1B="94:U+005E" # asciicircum 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="79:U+004F" # O 20="69:U+0045" # E 21="85:U+0055" # U 22="73:U+0049" # I 23="68:U+0044" # D 24="72:U+0048" # H 25="84:U+0054" # T 26="78:U+004E" # N 27="83:U+0053" # S 28="95:U+005F" # underscore 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="124:U+007C" # bar 2C="34:U+0022" # quotedbl 2D="81:U+0051" # Q 2E="74:U+004A" # J 2F="75:U+004B" # K 30="88:U+0058" # X 31="66:U+0042" # B 32="77:U+004D" # M 33="87:U+0057" # W 34="86:U+0056" # V 35="90:U+005A" # Z 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="65312" # Multi_key 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65512" # Meta_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [altgr] 01="65307:U+001B" # Escape 02="38:U+0026" # ampersand 03="164:U+00A4" # currency 04="162:U+00A2" # cent 05="165:U+00A5" # yen 06="8364:U+20AC" # EuroSign 07="163:U+00A3" # sterling 09="189:U+00BD" # onehalf 0C="161:U+00A1" # exclamdown 0D="65104:U+0060" # dead_grave 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="65111:U+00A8" # dead_diaeresis 11="171:U+00AB" # guillemotleft 12="187:U+00BB" # guillemotright 13="182:U+00B6" # paragraph 14="252:U+00FC" # udiaeresis 15="102:U+0066" # f 16="103:U+0067" # g 17="231:U+00E7" # ccedilla 18="174:U+00AE" # registered 19="108:U+006C" # l 1A="191:U+00BF" # questiondown 1B="65106:U+005E" # dead_circumflex 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="229:U+00E5" # aring 1F="248:U+00F8" # oslash 20="230:U+00E6" # ae 21="233:U+00E9" # eacute 22="105:U+0069" # i 23="240:U+00F0" # eth 24="65105:U+00B4" # dead_acute 25="254:U+00FE" # thorn 26="241:U+00F1" # ntilde 27="223:U+00DF" # ssharp 28="173:U+00AD" # hyphen 29="65107:U+007E" # dead_tilde 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="65105:U+00B4" # dead_acute 2D="113:U+0071" # q 2E="106:U+006A" # j 2F="107:U+006B" # k 30="120:U+0078" # x 31="98:U+0062" # b 32="109:U+006D" # m 33="119:U+0077" # w 34="118:U+0076" # v 35="122:U+007A" # z 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="65312" # Multi_key 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65514" # Alt_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftaltgr] 01="65307:U+001B" # Escape 02="37:U+0025" # percent 0C="16789016:U+2E18" # U2E18 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="65111:U+00A8" # dead_diaeresis 11="16785436:U+201C" # U201C 12="16785437:U+201D" # U201D 13="167:U+00A7" # section 14="220:U+00DC" # Udiaeresis 15="70:U+0046" # F 16="71:U+0047" # G 17="199:U+00C7" # Ccedilla 18="2761:U+2122" # trademark 19="76:U+004C" # L 1A="16785469:U+203D" # U203D 1B="65114:U+02C7" # dead_caron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="197:U+00C5" # Aring 1F="216:U+00D8" # Oslash 20="198:U+00C6" # AE 21="201:U+00C9" # Eacute 22="73:U+0049" # I 23="208:U+00D0" # ETH 25="222:U+00DE" # THORN 26="209:U+00D1" # Ntilde 27="16785054:U+1E9E" # U1E9E 28="2730:U+2013" # endash 29="65107:U+007E" # dead_tilde 2A="65505" # Shift_L 2B="124:U+007C" # bar 2C="65113:U+02DD" # dead_doubleacute 2D="81:U+0051" # Q 2E="74:U+004A" # J 2F="75:U+004B" # K 30="88:U+0058" # X 31="66:U+0042" # B 32="77:U+004D" # M 33="87:U+0057" # W 34="86:U+0056" # V 35="90:U+005A" # Z 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="65312" # Multi_key 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65512" # Meta_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslock] 01="65307:U+001B" # Escape 02="38:U+0026" # ampersand 03="55:U+0037" # 7 04="53:U+0035" # 5 05="51:U+0033" # 3 06="49:U+0031" # 1 07="57:U+0039" # 9 08="48:U+0030" # 0 09="50:U+0032" # 2 0A="52:U+0034" # 4 0B="54:U+0036" # 6 0C="56:U+0038" # 8 0D="35:U+0023" # numbersign 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="59:U+003B" # semicolon 11="44:U+002C" # comma 12="46:U+002E" # period 13="80:U+0050" # P 14="89:U+0059" # Y 15="70:U+0046" # F 16="71:U+0047" # G 17="67:U+0043" # C 18="82:U+0052" # R 19="76:U+004C" # L 1A="47:U+002F" # slash 1B="64:U+0040" # at 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="65:U+0041" # A 1F="79:U+004F" # O 20="69:U+0045" # E 21="85:U+0055" # U 22="73:U+0049" # I 23="68:U+0044" # D 24="72:U+0048" # H 25="84:U+0054" # T 26="78:U+004E" # N 27="83:U+0053" # S 28="95:U+005F" # underscore 29="36:U+0024" # dollar 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="39:U+0027" # apostrophe 2D="81:U+0051" # Q 2E="74:U+004A" # J 2F="75:U+004B" # K 30="88:U+0058" # X 31="66:U+0042" # B 32="77:U+004D" # M 33="87:U+0057" # W 34="86:U+0056" # V 35="90:U+005A" # Z 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="65312" # Multi_key 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65514" # Alt_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [capslockaltgr] 01="65307:U+001B" # Escape 02="38:U+0026" # ampersand 0C="16789016:U+2E18" # U2E18 0D="65104:U+0060" # dead_grave 0E="65288:U+0008" # BackSpace 0F="65289:U+0009" # Tab 10="65111:U+00A8" # dead_diaeresis 11="171:U+00AB" # guillemotleft 12="187:U+00BB" # guillemotright 13="182:U+00B6" # paragraph 14="220:U+00DC" # Udiaeresis 15="70:U+0046" # F 16="71:U+0047" # G 17="199:U+00C7" # Ccedilla 18="174:U+00AE" # registered 19="76:U+004C" # L 1A="191:U+00BF" # questiondown 1B="65106:U+005E" # dead_circumflex 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="197:U+00C5" # Aring 1F="216:U+00D8" # Oslash 20="198:U+00C6" # AE 21="201:U+00C9" # Eacute 22="73:U+0049" # I 23="208:U+00D0" # ETH 24="65105:U+00B4" # dead_acute 25="222:U+00DE" # THORN 26="209:U+00D1" # Ntilde 27="16785054:U+1E9E" # U1E9E 28="2730:U+2013" # endash 29="65107:U+007E" # dead_tilde 2A="65505" # Shift_L 2B="92:U+005C" # backslash 2C="65105:U+00B4" # dead_acute 2D="81:U+0051" # Q 2E="74:U+004A" # J 2F="75:U+004B" # K 30="88:U+0058" # X 31="66:U+0042" # B 32="77:U+004D" # M 33="87:U+0057" # W 34="86:U+0056" # V 35="90:U+005A" # Z 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65513" # Alt_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="65312" # Multi_key 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025044" # XF86AudioPlay E0_24="269025045" # XF86AudioStop E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65514" # Alt_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslock] 01="65307:U+001B" # Escape 02="37:U+0025" # percent 03="91:U+005B" # bracketleft 04="123:U+007B" # braceleft 05="125:U+007D" # braceright 06="40:U+0028" # parenleft 07="61:U+003D" # equal 08="42:U+002A" # asterisk 09="41:U+0029" # parenright 0A="43:U+002B" # plus 0B="93:U+005D" # bracketright 0C="33:U+0021" # exclam 0D="96:U+0060" # grave 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="58:U+003A" # colon 11="60:U+003C" # less 12="62:U+003E" # greater 13="112:U+0070" # p 14="121:U+0079" # y 15="102:U+0066" # f 16="103:U+0067" # g 17="99:U+0063" # c 18="114:U+0072" # r 19="108:U+006C" # l 1A="63:U+003F" # question 1B="94:U+005E" # asciicircum 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="97:U+0061" # a 1F="111:U+006F" # o 20="101:U+0065" # e 21="117:U+0075" # u 22="105:U+0069" # i 23="100:U+0064" # d 24="104:U+0068" # h 25="116:U+0074" # t 26="110:U+006E" # n 27="115:U+0073" # s 28="45:U+002D" # minus 29="126:U+007E" # asciitilde 2A="65505" # Shift_L 2B="124:U+007C" # bar 2C="34:U+0022" # quotedbl 2D="113:U+0071" # q 2E="106:U+006A" # j 2F="107:U+006B" # k 30="120:U+0078" # x 31="98:U+0062" # b 32="109:U+006D" # m 33="119:U+0077" # w 34="118:U+0076" # v 35="122:U+007A" # z 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="65312" # Multi_key 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65512" # Meta_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [shiftcapslockaltgr] 01="65307:U+001B" # Escape 02="37:U+0025" # percent 03="164:U+00A4" # currency 04="162:U+00A2" # cent 05="165:U+00A5" # yen 06="8364:U+20AC" # EuroSign 07="163:U+00A3" # sterling 09="189:U+00BD" # onehalf 0C="161:U+00A1" # exclamdown 0E="65288:U+0008" # BackSpace 0F="65056" # ISO_Left_Tab 10="65111:U+00A8" # dead_diaeresis 11="16785436:U+201C" # U201C 12="16785437:U+201D" # U201D 13="167:U+00A7" # section 14="252:U+00FC" # udiaeresis 15="102:U+0066" # f 16="103:U+0067" # g 17="231:U+00E7" # ccedilla 18="2761:U+2122" # trademark 19="108:U+006C" # l 1A="16785469:U+203D" # U203D 1B="65114:U+02C7" # dead_caron 1C="65293:U+000D" # Return 1D="65507" # Control_L 1E="229:U+00E5" # aring 1F="248:U+00F8" # oslash 20="230:U+00E6" # ae 21="233:U+00E9" # eacute 22="105:U+0069" # i 23="240:U+00F0" # eth 25="254:U+00FE" # thorn 26="241:U+00F1" # ntilde 27="223:U+00DF" # ssharp 28="173:U+00AD" # hyphen 29="65107:U+007E" # dead_tilde 2A="65505" # Shift_L 2B="124:U+007C" # bar 2C="65113:U+02DD" # dead_doubleacute 2D="113:U+0071" # q 2E="106:U+006A" # j 2F="107:U+006B" # k 30="120:U+0078" # x 31="98:U+0062" # b 32="109:U+006D" # m 33="119:U+0077" # w 34="118:U+0076" # v 35="122:U+007A" # z 36="65506" # Shift_R 37="65450:U+002A" # KP_Multiply 38="65511" # Meta_L 39="32:U+0020" # space 3A="65509" # Caps_Lock 3B="65470" # F1 3C="65471" # F2 3D="65472" # F3 3E="65473" # F4 3F="65474" # F5 40="65475" # F6 41="65476" # F7 42="65477" # F8 43="65478" # F9 44="65479" # F10 45="65407" # Num_Lock 46="65300" # Scroll_Lock 47="65429" # KP_Home 48="65431" # KP_Up 49="65434" # KP_Prior 4A="65453:U+002D" # KP_Subtract 4B="65430" # KP_Left 4C="65437" # KP_Begin 4D="65432" # KP_Right 4E="65451:U+002B" # KP_Add 4F="65436" # KP_End 50="65433" # KP_Down 51="65435" # KP_Next 52="65438" # KP_Insert 53="65439" # KP_Delete 56="65312" # Multi_key 57="65480" # F11 58="65481" # F12 70="65319" # Hiragana_Katakana 79="65315" # Henkan_Mode 7B="65314" # Muhenkan 7E="65454:U+002E" # KP_Decimal E0_10="269025046" # XF86AudioPrev E0_19="269025047" # XF86AudioNext E0_1C="65421:U+000D" # KP_Enter E0_1D="65508" # Control_R E0_20="269025042" # XF86AudioMute E0_21="269025053" # XF86Calculator E0_22="269025073" # XF86AudioPause E0_24="269025068" # XF86Eject E0_2E="269025041" # XF86AudioLowerVolume E0_30="269025043" # XF86AudioRaiseVolume E0_32="269025048" # XF86HomePage E0_35="65455:U+002F" # KP_Divide E0_37="65377" # Print E0_38="65512" # Meta_R E0_47="65360" # Home E0_48="65362" # Up E0_49="65365" # Prior E0_4B="65361" # Left E0_4D="65363" # Right E0_4F="65367" # End E0_50="65364" # Down E0_51="65366" # Next E0_52="65379" # Insert E0_53="65535:U+007F" # Delete E0_5B="65515" # Super_L E0_5C="65516" # Super_R E0_5D="65383" # Menu E0_65="269025051" # XF86Search E0_66="269025072" # XF86Favorites E0_6B="269025075" # XF86MyComputer E0_6C="269025049" # XF86Mail E1_1D="65299" # Pause [numlock] 47="65457:U+0031" # KP_1 48="65458:U+0032" # KP_2 49="65459:U+0033" # KP_3 4A="45:U+002D" # minus 4B="65460:U+0034" # KP_4 4C="65461:U+0035" # KP_5 4D="65462:U+0036" # KP_6 4E="43:U+002B" # plus 4F="65463:U+0037" # KP_7 50="65464:U+0038" # KP_8 51="65465:U+0039" # KP_9 52="65456:U+0030" # KP_0 53="65454:U+002E" # KP_Decimal ================================================ FILE: instfiles/pam.d/Makefile.am ================================================ PAM_FILES = \ xrdp-sesman.arch \ xrdp-sesman.debian \ xrdp-sesman.freebsd \ xrdp-sesman.macos \ xrdp-sesman.redhat \ xrdp-sesman.suse \ xrdp-sesman.system \ xrdp-sesman.unix EXTRA_DIST = $(PAM_FILES) mkpamrules CLEANFILES = xrdp-sesman if SESMAN_NOPAM PAMFILE = else if SESMAN_PAMUSERPASS PAMFILE = else if SESMAN_KERBEROS PAMFILE = else PAMFILE = xrdp-sesman endif endif endif pamddir = $(pamconfdir) pamd_DATA = \ $(PAMFILE) xrdp-sesman: mkpamrules $(srcdir)/mkpamrules $(PAM_RULES) $(srcdir) $@ ================================================ FILE: instfiles/pam.d/mkpamrules ================================================ #!/bin/sh # Find suitable PAM config file rules="$1" srcdir="$2" outfile="$3" service="xrdp-sesman" pamdir="/etc/pam.d" pamdir_suse="/usr/lib/pam.d" if [ ! -d $pamdir_suse ]; then # Older SUSE distros uses /usr/etc/pam.d pamdir_suse="/usr/etc/pam.d" fi # Modules needed by xrdp-sesman.unix, if we get to that unix_modules_needed="pam_unix.so pam_env.so pam_nologin.so" # Directories where pam modules might be installed # Add to this list as platforms are added pam_module_dir_searchpath="/lib*/security /usr/lib*/security /lib/*/security /usr/lib/*/security" find_pam_module_dir() { # Looks for the pam security module directory set -- $pam_module_dir_searchpath for d in "$@"; do if [ -s "$d/pam_unix.so" ]; then echo "$d" break fi done } can_apply_unix_config() { result=0 module_dir="$1" for m in $unix_modules_needed; do if [ ! -s "$module_dir/$m" ]; then echo " ** $m not found" >&2 result=1 fi done return $result } guess_rules () { rules= if [ -s "$pamdir/password-auth" ]; then rules="redhat" elif [ -s "$pamdir_suse/common-account" ]; then rules="suse" elif [ -s "$pamdir/common-account" ]; then if grep "^@include" "$pamdir/passwd" >/dev/null 2>&1; then rules="debian" else rules="suse" fi elif [ ! -f "$pamdir/system-auth" -a -s "$pamdir/system" ]; then rules="freebsd" elif [ -s "$pamdir/authorization" ]; then rules="macos" elif [ -s "$pamdir/system-remote-login" ]; then rules="arch" elif [ -s "$pamdir/system-auth" ]; then rules="system" else module_dir=`find_pam_module_dir` if [ -d "$module_dir" ]; then #echo "- Found pam modules in $module_dir" >&2 if can_apply_unix_config "$module_dir" ; then rules="unix" fi fi fi } if [ "$rules" = "auto" ]; then guess_rules if [ -z "$rules" ]; then echo "** Can't guess PAM rules for this system" exit 1 fi fi if [ -s "$srcdir/$service.$rules" ]; then ln -nsf "$srcdir/$service.$rules" "$outfile" else echo "Cannot find $srcdir/$service.$rules" exit 1 fi ================================================ FILE: instfiles/pam.d/xrdp-sesman.arch ================================================ auth include system-remote-login -auth optional pam_gnome_keyring.so -auth optional pam_kwallet5.so account include system-remote-login password include system-remote-login session include system-remote-login # For wtmp/lastlog support uncomment one of the following lines:- #session optional pam_lastlog.so quiet #session optional pam_lastlog2.so silent -session optional pam_gnome_keyring.so auto_start -session optional pam_kwallet5.so auto_start ================================================ FILE: instfiles/pam.d/xrdp-sesman.debian ================================================ #%PAM-1.0 auth required pam_env.so readenv=1 auth required pam_env.so readenv=1 envfile=/etc/default/locale @include common-auth -auth optional pam_gnome_keyring.so -auth optional pam_kwallet5.so @include common-account @include common-password # Ensure resource limits are applied session required pam_limits.so # Set the loginuid process attribute. session required pam_loginuid.so # Update wtmp/lastlog session optional pam_lastlog.so quiet @include common-session -session optional pam_gnome_keyring.so auto_start -session optional pam_kwallet5.so auto_start ================================================ FILE: instfiles/pam.d/xrdp-sesman.freebsd ================================================ #%PAM-1.0 auth include system account include system password include system session include system ================================================ FILE: instfiles/pam.d/xrdp-sesman.macos ================================================ # xrdp-sesman: auth account password session # based on Apple's sshd PAM configuration auth optional pam_krb5.so use_kcminit auth optional pam_ntlm.so try_first_pass auth optional pam_mount.so try_first_pass auth required pam_opendirectory.so try_first_pass account required pam_nologin.so account required pam_sacl.so sacl_service=ssh account required pam_opendirectory.so password required pam_opendirectory.so session required pam_launchd.so session optional pam_mount.so ================================================ FILE: instfiles/pam.d/xrdp-sesman.redhat ================================================ #%PAM-1.0 auth include password-auth account include password-auth # Set the loginuid process attribute. session required pam_loginuid.so # Update wtmp/lastlog session optional pam_lastlog.so quiet session include password-auth password include password-auth ================================================ FILE: instfiles/pam.d/xrdp-sesman.suse ================================================ #%PAM-1.0 auth include common-auth account include common-account # Set the loginuid process attribute. session required pam_loginuid.so # Update lastlog database session optional pam_lastlog2.so silent session include common-session password include common-password ================================================ FILE: instfiles/pam.d/xrdp-sesman.system ================================================ #%PAM-1.0 auth include system-auth account include system-auth password include system-auth # For wtmp/lastlog support uncomment one of the following lines:- #session optional pam_lastlog.so quiet #session optional pam_lastlog2.so silent session include system-auth ================================================ FILE: instfiles/pam.d/xrdp-sesman.unix ================================================ #%PAM-1.0 # # Really basic authentication set when nothing else is available # # You may need to edit this to suit your system depending on the # required functionality. # auth required pam_unix.so shadow auth required pam_env.so password required pam_unix.so account required pam_unix.so account required pam_nologin.so session required pam_unix.so ================================================ FILE: instfiles/pulse/Makefile.am ================================================ pulsedir = $(sysconfdir)/$(sysconfsubdir)/pulse dist_pulse_DATA = default.pa ================================================ FILE: instfiles/pulse/default.pa ================================================ .nofail .fail load-module module-augment-properties load-module module-always-sink .ifexists module-xrdp-sink.so load-module module-xrdp-sink .endif .ifexists module-xrdp-source.so load-module module-xrdp-source .endif load-module module-native-protocol-unix ================================================ FILE: instfiles/rc.d/Makefile.am ================================================ startscriptdir = $(sysconfdir)/rc.d dist_startscript_SCRIPTS = xrdp xrdp-sesman ================================================ FILE: instfiles/rc.d/xrdp ================================================ #!/bin/sh # # Copyright (c) 1992-2018 The FreeBSD Project. All rights reserved. # Copyright (c) 2015-2018 Koichiro Iwao # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # $FreeBSD$ # # REQUIRE: DAEMON # PROVIDE: xrdp # # Add the following line to /etc/rc.conf to enable xrdp: # # xrdp_enable="YES" # xrdp_sesman_enable="YES" . /etc/rc.subr name="xrdp" rcvar="xrdp_enable" load_rc_config "$name" : ${xrdp_enable="NO"} extra_commands="status allstart allstop allrestart" command="%%PREFIX%%/sbin/xrdp" allstart_cmd="xrdp_allstart" allstop_cmd="xrdp_allstop" allrestart_cmd="xrdp_allrestart" stop_postcmd="xrdp_poststop" xrdp_allstart() { run_rc_command "start" if checkyesno "xrdp_sesman_enable" && \ ! %%PREFIX%%/etc/rc.d/xrdp-sesman forcestatus 1>/dev/null 2>&1; then %%PREFIX%%/etc/rc.d/xrdp-sesman start || return 1 fi } xrdp_allstop() { if checkyesno "xrdp_sesman_enable" && \ %%PREFIX%%/etc/rc.d/xrdp-sesman forcestatus 1>/dev/null 2>&1; then %%PREFIX%%/etc/rc.d/xrdp-sesman stop || return 1 fi run_rc_command "stop" } xrdp_allrestart() { if checkyesno "xrdp_sesman_enable" && \ %%PREFIX%%/etc/rc.d/xrdp-sesman forcestatus 1>/dev/null 2>&1; then %%PREFIX%%/etc/rc.d/xrdp-sesman restart || return 1 fi run_rc_command "restart" } xrdp_poststop() { # If running with dropped privileges, xrdp can't delete its own # PID file rm -f %%LOCALSTATEDIR%%/run/xrdp.pid } run_rc_command "$1" ================================================ FILE: instfiles/rc.d/xrdp-sesman ================================================ #!/bin/sh # # Copyright (c) 1992-2015 The FreeBSD Project. All rights reserved. # Copyright (c) 2015-2018 Koichiro Iwao # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # $FreeBSD$ # # REQUIRE: LOGIN # PROVIDE: xrdp_sesman # . /etc/rc.subr name="xrdp_sesman" rcvar="xrdp_sesman_enable" load_rc_config "$name" : ${xrdp_sesman_enable="NO"} extra_commands="status" command="%%PREFIX%%/sbin/xrdp-sesman" run_rc_command "$1" ================================================ FILE: instfiles/xrdp-sesman.service.in ================================================ [Unit] Description=xrdp session manager Documentation=man:xrdp-sesman(8) man:sesman.ini(5) After=network.target StopWhenUnneeded=true BindsTo=xrdp.service [Service] Type=exec EnvironmentFile=-@sysconfdir@/sysconfig/xrdp EnvironmentFile=-@sysconfdir@/default/xrdp ExecStart=@sbindir@/xrdp-sesman $SESMAN_OPTIONS --nodaemon ExecReload=kill -HUP $MAINPID [Install] WantedBy=multi-user.target ================================================ FILE: instfiles/xrdp.service.in ================================================ [Unit] Description=xrdp daemon Documentation=man:xrdp(8) man:xrdp.ini(5) Requires=xrdp-sesman.service After=network-online.target xrdp-sesman.service [Service] Type=exec EnvironmentFile=-@sysconfdir@/sysconfig/xrdp EnvironmentFile=-@sysconfdir@/default/xrdp ExecStart=@sbindir@/xrdp $XRDP_OPTIONS --nodaemon SystemCallArchitectures=native SystemCallFilter=@system-service # Uncomment the following line if you wish xrdp connections to survive # an xrdp restart. # # This is not recommended, as the xrdp and xrdp-sesman processes can # end up with API differences if the restart was caused by an upgrade. It # may however be useful for some use cases. #KillMode=process [Install] WantedBy=multi-user.target ================================================ FILE: keygen/Makefile.am ================================================ EXTRA_DIST = openssl.conf AM_CPPFLAGS = \ -DXRDP_CFG_PATH=\"${sysconfdir}/${sysconfsubdir}\" \ -DXRDP_SBIN_PATH=\"${sbindir}\" \ -DXRDP_SHARE_PATH=\"${datadir}/xrdp\" \ -DXRDP_PID_PATH=\"${localstatedir}/run\" \ -I$(top_srcdir)/common bin_PROGRAMS = \ xrdp-keygen xrdp_keygen_SOURCES = keygen.c xrdp_keygen_LDADD = \ $(top_builddir)/common/libcommon.la xrdpsysconfdir = $(sysconfdir)/$(sysconfsubdir) install-data-hook: umask 077 && \ if [ ! -f $(DESTDIR)$(xrdpsysconfdir)/rsakeys.ini ]; then \ ./xrdp-keygen xrdp $(DESTDIR)$(xrdpsysconfdir)/rsakeys.ini; \ fi && \ if [ ! -f $(DESTDIR)$(xrdpsysconfdir)/cert.pem ]; then \ $(OPENSSL) req -x509 -newkey rsa:2048 -sha256 -nodes \ -keyout $(DESTDIR)$(xrdpsysconfdir)/key.pem -out \ $(DESTDIR)$(xrdpsysconfdir)/cert.pem -days 365 \ -subj /C=US/ST=CA/L=Sunnyvale/O=xrdp/CN=www.xrdp.org \ -config $(srcdir)/openssl.conf; \ fi uninstall-hook: rm -f $(DESTDIR)$(xrdpsysconfdir)/rsakeys.ini rm -f $(DESTDIR)$(xrdpsysconfdir)/cert.pem rm -f $(DESTDIR)$(xrdpsysconfdir)/key.pem ================================================ FILE: keygen/keygen.c ================================================ /** * xrdp: A Remote Desktop Protocol server. * * Copyright (C) Jay Sorg 2004-2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * rsa key generator for xrdp */ /* references: http://www.securiteam.com/windowsntfocus/5EP010KG0G.html */ #if defined(HAVE_CONFIG_H) #include #endif #include "os_calls.h" #include "string_calls.h" #include "ssl_calls.h" #include "arch.h" #include "list.h" #include "file.h" /* this is the signature size in bytes */ #define TSSK_KEY_LENGTH 64 /* default to 2048 bit key size, can set changed, set */ static int g_key_size_bits = 2048; static tui8 g_exponent[4] = { 0x01, 0x00, 0x01, 0x00 }; /* 4 bytes public exponent */ static tui8 g_ppk_e[4] = { 0x5B, 0x7B, 0x88, 0xC0 }; /* 64 byte modulus */ static tui8 g_ppk_n[72] = /* 64 bytes + 8 bytes pad */ { 0x3D, 0x3A, 0x5E, 0xBD, 0x72, 0x43, 0x3E, 0xC9, 0x4D, 0xBB, 0xC1, 0x1E, 0x4A, 0xBA, 0x5F, 0xCB, 0x3E, 0x88, 0x20, 0x87, 0xEF, 0xF5, 0xC1, 0xE2, 0xD7, 0xB7, 0x6B, 0x9A, 0xF2, 0x52, 0x45, 0x95, 0xCE, 0x63, 0x65, 0x6B, 0x58, 0x3A, 0xFE, 0xEF, 0x7C, 0xE7, 0xBF, 0xFE, 0x3D, 0xF6, 0x5C, 0x7D, 0x6C, 0x5E, 0x06, 0x09, 0x1A, 0xF5, 0x61, 0xBB, 0x20, 0x93, 0x09, 0x5F, 0x05, 0x6D, 0xEA, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; /* 64 bytes private exponent */ static tui8 g_ppk_d[108] = /* 64 bytes + 44 bytes pad */ { 0x87, 0xA7, 0x19, 0x32, 0xDA, 0x11, 0x87, 0x55, 0x58, 0x00, 0x16, 0x16, 0x25, 0x65, 0x68, 0xF8, 0x24, 0x3E, 0xE6, 0xFA, 0xE9, 0x67, 0x49, 0x94, 0xCF, 0x92, 0xCC, 0x33, 0x99, 0xE8, 0x08, 0x60, 0x17, 0x9A, 0x12, 0x9F, 0x24, 0xDD, 0xB1, 0x24, 0x99, 0xC7, 0x3A, 0xB8, 0x0A, 0x7B, 0x0D, 0xDD, 0x35, 0x07, 0x79, 0x17, 0x0B, 0x51, 0x9B, 0xB3, 0xC7, 0x10, 0x01, 0x13, 0xE7, 0x3F, 0xF3, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; /* 512 bit proprietary certificate dwVersion 0 4 bytes always 0x00000001 dwSigAlgId 4 4 bytes always 0x00000001 dwKeyAlgId 8 4 bytes always 0x00000001 wPublicKeyBlobType 12 2 bytes always 0x0006 wPublicKeyBlobLen 14 2 bytes 0x005C 92 bytes magic 16 4 bytes always 0x31415352 keylen 20 4 bytes 0x0048 72 bytes bitlen 24 4 bytes 0x0200 512 bits datalen 28 4 bytes 0x003F 63 bytes pubExp 32 4 bytes 0x00010001 modulus 36 72 bytes wSignatureBlobType 108 2 bytes always 0x0008 wSignatureBlobLen 110 2 bytes 0x0048 72 bytes SignatureBlob 112 72 bytes */ static tui8 g_testkey512[184] = /* 512 bit test key */ { 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, /* 0 */ 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x5c, 0x00, 0x52, 0x53, 0x41, 0x31, 0x48, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x79, 0x6f, 0xb4, 0xdf, /* 32 */ 0xa6, 0x95, 0xb9, 0xa9, 0x61, 0xe3, 0xc4, 0x5e, 0xff, 0x6b, 0xd8, 0x81, 0x8a, 0x12, 0x4a, 0x93, 0x42, 0x97, 0x18, 0x93, 0xac, 0xd1, 0x3a, 0x38, 0x3c, 0x68, 0x50, 0x19, 0x31, 0xb6, 0x84, 0x51, /* 64 */ 0x79, 0xfb, 0x1c, 0xe7, 0xe3, 0x99, 0x20, 0xc7, 0x84, 0xdf, 0xd1, 0xaa, 0xb5, 0x15, 0xef, 0x47, 0x7e, 0xfc, 0x88, 0xeb, 0x29, 0xc3, 0x27, 0x5a, 0x35, 0xf8, 0xfd, 0xaa, 0x00, 0x00, 0x00, 0x00, /* 96 */ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x48, 0x00, 0x32, 0x3b, 0xde, 0x6f, 0x18, 0x97, 0x1e, 0xc3, 0x6b, 0x2b, 0x2d, 0xe4, 0xfc, 0x2d, 0xa2, 0x8e, 0x32, 0x3c, 0xf3, 0x1b, 0x24, 0x90, 0x57, 0x4d, /* 128 */ 0x8e, 0xe4, 0x69, 0xfc, 0x16, 0x8d, 0x41, 0x92, 0x78, 0xc7, 0x9c, 0xb4, 0x26, 0xff, 0xe8, 0x3e, 0xa1, 0x8a, 0xf5, 0x57, 0xc0, 0x7f, 0x3e, 0x21, 0x17, 0x32, 0x30, 0x6f, 0x79, 0xe1, 0x36, 0xcd, /* 160 */ 0xb6, 0x8e, 0xbe, 0x57, 0x57, 0xd2, 0xa9, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; /* 2048 bit proprietary certificate dwVersion 0 4 bytes always 0x00000001 dwSigAlgId 4 4 bytes always 0x00000001 dwKeyAlgId 8 4 bytes always 0x00000001 wPublicKeyBlobType 12 2 bytes always 0x0006 wPublicKeyBlobLen 14 2 bytes 0x011C 284 bytes magic 16 4 bytes always 0x31415352 keylen 20 4 bytes 0x0108 264 bytes bitlen 24 4 bytes 0x0800 2048 bits datalen 28 4 bytes 0x00FF 255 bytes pubExp 32 4 bytes 0x00010001 modulus 36 264 bytes wSignatureBlobType 300 2 bytes always 0x0008 wSignatureBlobLen 302 2 bytes 0x0048 72 bytes SignatureBlob 304 72 bytes */ static tui8 g_testkey2048[376] = /* 2048 bit test key */ { 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, /* 0 */ 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x1c, 0x01, 0x52, 0x53, 0x41, 0x31, 0x08, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x13, 0x77, 0x6d, 0xd8, /* 32 */ 0x7b, 0x6e, 0x6f, 0xb4, 0x27, 0x6d, 0x70, 0x3a, 0x97, 0x5f, 0xcb, 0x50, 0x9b, 0x13, 0x6b, 0xc7, 0xba, 0xdf, 0x73, 0x54, 0x17, 0x35, 0xf0, 0x09, 0x9e, 0x9d, 0x0b, 0x6a, 0x2c, 0x9f, 0xd1, 0x0c, /* 64 */ 0xc6, 0x47, 0x83, 0xde, 0xca, 0x90, 0x20, 0xac, 0x70, 0x63, 0x9b, 0xb7, 0x49, 0x07, 0x0b, 0xf5, 0xf2, 0x38, 0x2a, 0x40, 0xff, 0xf1, 0xba, 0x97, 0x79, 0x3e, 0xd4, 0xd1, 0xf3, 0x41, 0x0f, 0x91, /* 96 */ 0xfe, 0x1a, 0x86, 0xf4, 0x1b, 0xef, 0xcc, 0x29, 0xa3, 0x35, 0x6f, 0x60, 0xfa, 0x98, 0x53, 0x51, 0x80, 0x57, 0x15, 0x2f, 0xe1, 0x8b, 0xd7, 0x86, 0x15, 0x2d, 0xb5, 0xec, 0x7a, 0xdd, 0xc5, 0x1d, /* 128 */ 0x1b, 0x88, 0x53, 0x67, 0x86, 0xe1, 0x6e, 0xcd, 0x4e, 0x2e, 0xfd, 0xd2, 0x49, 0x04, 0xfb, 0x1d, 0x95, 0xf0, 0xe9, 0x7f, 0x97, 0xa3, 0x1b, 0xb2, 0x92, 0x2e, 0x62, 0x2a, 0x96, 0xd4, 0xea, 0x18, /* 160 */ 0x8e, 0x99, 0x41, 0xea, 0x83, 0xb5, 0xf1, 0x0e, 0xea, 0x53, 0x70, 0x99, 0xd7, 0x9e, 0x0c, 0x65, 0x2b, 0xf4, 0xdc, 0x0e, 0xe7, 0x9e, 0xce, 0x04, 0x25, 0x01, 0x88, 0xc4, 0xc1, 0xd2, 0xa4, 0x18, /* 192 */ 0xc2, 0x8a, 0x52, 0x0f, 0x01, 0xb2, 0x71, 0x30, 0x44, 0x3f, 0x5b, 0x11, 0x2e, 0xe7, 0x53, 0xa0, 0xc8, 0x1f, 0x77, 0xaf, 0xb5, 0xbb, 0xaf, 0x12, 0xe8, 0x19, 0x0c, 0xf6, 0x1f, 0xa8, 0x3e, 0x11, /* 224 */ 0x34, 0xe4, 0xac, 0x1c, 0x1c, 0x00, 0xbb, 0xb9, 0x2f, 0xbb, 0x81, 0x76, 0x4e, 0x46, 0xda, 0x73, 0x00, 0x82, 0x71, 0xa4, 0x62, 0xc3, 0xd4, 0x3f, 0xda, 0x34, 0x54, 0x27, 0xe3, 0xd0, 0x3a, 0x73, /* 256 */ 0x2f, 0x99, 0xc4, 0x91, 0x56, 0x12, 0x98, 0xa8, 0x3b, 0x8d, 0x61, 0x83, 0x62, 0xb7, 0x20, 0x61, 0x4d, 0xc9, 0x41, 0xd1, 0x40, 0x02, 0x11, 0x4b, 0x63, 0x46, 0xc7, 0xc1, 0x00, 0x00, 0x00, 0x00, /* 288 */ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x48, 0x00, 0x00, 0x50, 0xb7, 0x75, 0xf3, 0x77, 0x99, 0xb2, 0xd3, 0xdd, 0xcd, 0x83, 0x6e, 0xdb, 0x0a, 0x29, 0x88, 0x05, 0xb5, 0x8a, 0x49, 0xd5, 0xa8, 0x5a, /* 320 */ 0xc3, 0xb7, 0x18, 0xc2, 0x3c, 0x1e, 0xde, 0xd3, 0x8f, 0xdd, 0x21, 0x27, 0x84, 0xa0, 0xc8, 0x8d, 0x65, 0xce, 0x5d, 0x3d, 0x46, 0x65, 0x88, 0xfc, 0x35, 0x0a, 0x04, 0xa0, 0xda, 0xc1, 0xab, 0xbf, /* 352 */ 0xcd, 0xf1, 0x7e, 0x71, 0x7b, 0xf8, 0x4a, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; /*****************************************************************************/ static int out_params(void) { g_writeln("%s", ""); g_writeln("xrdp rsa key gen utility examples"); g_writeln(" xrdp-keygen xrdp ['path and file name' | auto] [512 or 2048]"); g_writeln(" xrdp-keygen test"); g_writeln("%s", ""); return 0; } /*****************************************************************************/ /* this is the special key signing algorithm */ static int sign_key(const char *e_data, int e_len, const char *n_data, int n_len, char *sign_data, int sign_len) { char *key; char *md5_final; void *md5; if ((e_len != 4) || ((n_len != 64) && (n_len != 256)) || (sign_len != 64)) { return 1; } if (n_len == 64) { key = (char *)g_malloc(184, 0); md5_final = (char *)g_malloc(64, 0); md5 = ssl_md5_info_create(); /* copy the test key */ g_memcpy(key, g_testkey512, 184); /* replace e and n */ g_memcpy(key + 32, e_data, e_len); g_memcpy(key + 36, n_data, n_len); ssl_md5_clear(md5); /* the first 108 bytes */ ssl_md5_transform(md5, key, 108); /* set the whole thing with 0xff */ g_memset(md5_final, 0xff, 64); /* digest 16 bytes */ ssl_md5_complete(md5, md5_final); /* set non 0xff array items */ md5_final[16] = 0; md5_final[62] = 1; md5_final[63] = 0; /* encrypt */ ssl_mod_exp(sign_data, sign_len, md5_final, 64, (char *)g_ppk_n, 64, (char *)g_ppk_d, 64); /* cleanup */ ssl_md5_info_delete(md5); g_free(key); g_free(md5_final); } else if (n_len == 256) { key = (char *)g_malloc(376, 0); md5_final = (char *)g_malloc(64, 0); md5 = ssl_md5_info_create(); /* copy the test key */ g_memcpy(key, g_testkey2048, 376); /* replace e and n */ g_memcpy(key + 32, e_data, e_len); g_memcpy(key + 36, n_data, n_len); ssl_md5_clear(md5); /* the first 300 bytes */ ssl_md5_transform(md5, key, 300); /* set the whole thing with 0xff */ g_memset(md5_final, 0xff, 64); /* digest 16 bytes */ ssl_md5_complete(md5, md5_final); /* set non 0xff array items */ md5_final[16] = 0; md5_final[62] = 1; md5_final[63] = 0; /* encrypt */ ssl_mod_exp(sign_data, sign_len, md5_final, 64, (char *)g_ppk_n, 64, (char *)g_ppk_d, 64); /* cleanup */ ssl_md5_info_delete(md5); g_free(key); g_free(md5_final); } return 0; } /*****************************************************************************/ static int write_out_line(int fd, const char *name, const char *data, int len) { int max; int error; int index; int data_item; int buf_pos; char *buf; char *text; text = (char *)g_malloc(256, 0); max = len; max = max * 10; buf_pos = g_strlen(name); max = max + buf_pos + 16; buf = (char *)g_malloc(max, 0); g_strncpy(buf, name, max - 1); buf[buf_pos] = '='; buf_pos++; for (index = 0; index < len; index++) { data_item = (tui8)(data[index]); g_snprintf(text, 255, "0x%2.2x", data_item); if (index != 0) { buf[buf_pos] = ','; buf_pos++; } buf[buf_pos] = text[0]; buf_pos++; buf[buf_pos] = text[1]; buf_pos++; buf[buf_pos] = text[2]; buf_pos++; buf[buf_pos] = text[3]; buf_pos++; } buf[buf_pos] = '\n'; buf_pos++; buf[buf_pos] = 0; error = g_file_write(fd, buf, buf_pos) == -1; g_free(buf); g_free(text); return error; } /*****************************************************************************/ static int save_all(const char *e_data, int e_len, const char *n_data, int n_len, const char *d_data, int d_len, const char *sign_data, int sign_len, const char *path_and_file_name) { int fd; char filename[256]; if (path_and_file_name == 0) { g_strncpy(filename, "rsakeys.ini", 255); } else { g_strncpy(filename, path_and_file_name, 255); } g_writeln("saving to %s", filename); g_writeln("%s", ""); if (g_file_exist(filename)) { if (g_file_delete(filename) == 0) { g_writeln("problem deleting %s, maybe no rights", filename); return 1; } } fd = g_file_open_rw(filename); if (fd != -1) { if (e_data == NULL) { /* FIPS mode */ g_file_close(fd); return 0; } if (g_file_write(fd, "[keys]\n", 7) == -1) { g_writeln("problem writing to %s, maybe no rights", filename); g_file_close(fd); return 1; } write_out_line(fd, "pub_exp", e_data, e_len); write_out_line(fd, "pub_mod", n_data, n_len); write_out_line(fd, "pub_sig", sign_data, sign_len); write_out_line(fd, "pri_exp", d_data, d_len); } else { g_writeln("problem opening %s, maybe no rights", filename); return 1; } g_file_close(fd); return 0; } /*****************************************************************************/ static int key_gen(const char *path_and_file_name) { char *e_data = NULL; char n_data[256] = {0}; char d_data[256] = {0}; char sign_data[64] = {0}; int e_len = 4; int n_len = g_key_size_bits / 8; int d_len = n_len; int sign_len = sizeof(sign_data); int error = 0; if (g_fips_mode_enabled()) { g_writeln("%s", ""); g_writeln("This machine is running in FIPS mode - keys will not be generated"); g_writeln("%s", ""); } else { e_data = (char *)g_exponent; g_writeln("%s", ""); g_writeln("Generating %d bit rsa key...", g_key_size_bits); g_writeln("%s", ""); if (error == 0) { error = ssl_gen_key_xrdp1(g_key_size_bits, e_data, e_len, n_data, n_len, d_data, d_len); if (error != 0) { g_writeln("error %d in key_gen, ssl_gen_key_xrdp1", error); } } if (error == 0) { g_writeln("ssl_gen_key_xrdp1 ok"); g_writeln("%s", ""); error = sign_key(e_data, e_len, n_data, n_len, sign_data, sign_len); if (error != 0) { g_writeln("error %d in key_gen, sign_key", error); } } } if (error == 0) { error = save_all(e_data, e_len, n_data, n_len, d_data, d_len, sign_data, sign_len, path_and_file_name); if (error != 0) { g_writeln("error %d in key_gen, save_all", error); } } return error; } /*****************************************************************************/ static int key_gen_auto(void) { return key_gen(XRDP_CFG_PATH "/rsakeys.ini"); } /*****************************************************************************/ static int key_test512(void) { char *md5_final; char *sig; void *md5; md5_final = (char *)g_malloc(64, 0); sig = (char *)g_malloc(64, 0); md5 = ssl_md5_info_create(); g_writeln("original key is:"); g_hexdump((char *)g_testkey512, 184); g_writeln("original exponent is:"); g_hexdump((char *)g_testkey512 + 32, 4); g_writeln("original modulus is:"); g_hexdump((char *)g_testkey512 + 36, 64); g_writeln("original signature is:"); g_hexdump((char *)g_testkey512 + 112, 64); ssl_md5_clear(md5); ssl_md5_transform(md5, (char *)g_testkey512, 108); g_memset(md5_final, 0xff, 64); ssl_md5_complete(md5, md5_final); g_writeln("md5 hash of first 108 bytes of this key is:"); g_hexdump(md5_final, 16); md5_final[16] = 0; md5_final[62] = 1; md5_final[63] = 0; ssl_mod_exp(sig, 64, md5_final, 64, (char *)g_ppk_n, 64, (char *)g_ppk_d, 64); g_writeln("produced signature(this should match original " "signature above) is:"); g_hexdump(sig, 64); g_memset(md5_final, 0, 64); ssl_mod_exp(md5_final, 64, (char *)g_testkey512 + 112, 64, (char *)g_ppk_n, 64, (char *)g_ppk_e, 4); g_writeln("decrypted hash of first 108 bytes of this key is:"); g_hexdump(md5_final, 64); ssl_md5_info_delete(md5); g_free(md5_final); g_free(sig); return 0; } /*****************************************************************************/ static int key_test2048(void) { char *md5_final; char *sig; void *md5; md5_final = (char *)g_malloc(64, 0); sig = (char *)g_malloc(64, 0); md5 = ssl_md5_info_create(); g_writeln("original key is:"); g_hexdump((char *)g_testkey2048, 376); g_writeln("original exponent is:"); g_hexdump((char *)g_testkey2048 + 32, 4); g_writeln("original modulus is:"); g_hexdump((char *)g_testkey2048 + 36, 256); g_writeln("original signature is:"); g_hexdump((char *)g_testkey2048 + 304, 64); ssl_md5_clear(md5); ssl_md5_transform(md5, (char *)g_testkey2048, 300); g_memset(md5_final, 0xff, 64); ssl_md5_complete(md5, md5_final); g_writeln("md5 hash of first 300 bytes of this key is:"); g_hexdump(md5_final, 16); md5_final[16] = 0; md5_final[62] = 1; md5_final[63] = 0; ssl_mod_exp(sig, 64, md5_final, 64, (char *)g_ppk_n, 64, (char *)g_ppk_d, 64); g_writeln("produced signature(this should match original " "signature above) is:"); g_hexdump(sig, 64); g_memset(md5_final, 0, 64); ssl_mod_exp(md5_final, 64, (char *)g_testkey2048 + 304, 64, (char *)g_ppk_n, 64, (char *)g_ppk_e, 4); g_writeln("decrypted hash of first 108 bytes of this key is:"); g_hexdump(md5_final, 64); ssl_md5_info_delete(md5); g_free(md5_final); g_free(sig); return 0; } /*****************************************************************************/ int main(int argc, char **argv) { if (argc > 1) { if (g_strcasecmp(argv[1], "xrdp") == 0) { if (argc > 2) { if (argc > 3) { g_key_size_bits = g_atoi(argv[3]); if ((g_key_size_bits != 512) && (g_key_size_bits != 2048)) { out_params(); return 0; } } if (g_strcasecmp(argv[2], "auto") == 0) { if (g_getuid() != 0) { g_writeln("must run as root"); return 0; } return key_gen_auto(); } else { return key_gen(argv[2]); } } else { return key_gen(0); } } else if (g_strcasecmp(argv[1], "test") == 0) { g_writeln("%s", ""); g_writeln("testing 512 bit key"); key_test512(); g_writeln("%s", ""); g_writeln("testing 2048 bit key"); key_test2048(); return 0; } } out_params(); return 0; } ================================================ FILE: keygen/openssl.conf ================================================ [req] distinguished_name = req_distinguished_name # The extensions to add to the self signed cert x509_extensions = v3_ca [req_distinguished_name] [v3_ca] # Extensions for a typical CA - PKIX recommendation. subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always, issuer # This is what PKIX recommends but some broken software chokes on critical # extensions. #basicConstraints = critical, CA:true # So we do this instead. basicConstraints = CA:true # Key usage: this is typical for a CA certificate. However since it will # prevent it being used as an test self-signed certificate it is best # left out by default. #keyUsage = cRLSign, keyCertSign # Some might want this also #nsCertType = sslCA, emailCA # Include email address in subject alt name: another PKIX recommendation #subjectAltName = email:copy # Copy issuer details #issuerAltName = issuer:copy # DER hex encoding of an extension: experts only! #obj = DER:02:03 # Where 'obj' is a standard or added object # You can even override a supported extension: #basicConstraints = critical, DER:30:03:01:01:FF ================================================ FILE: libipm/Doxyfile ================================================ # Doxyfile 1.8.17 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a double hash (##) is considered a comment and is placed in # front of the TAG it is preceding. # # All text after a single hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the configuration # file that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # https://www.gnu.org/software/libiconv/ for the list of possible encodings. # The default value is: UTF-8. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded by # double-quotes, unless you are using Doxywizard) that should identify the # project for which the documentation is generated. This name is used in the # title of most generated pages and in a few other places. # The default value is: My Project. PROJECT_NAME = xrdp/libipm # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version # control system is used. PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify a logo or an icon that is included # in the documentation. The maximum height of the logo should not exceed 55 # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. OUTPUT_DIRECTORY = ../docs/libipm # If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- # directories (in 2 levels) under the output directory of each output format and # will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes # performance problems for the file system. # The default value is: NO. CREATE_SUBDIRS = NO # If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode # U+3044. # The default value is: NO. ALLOW_UNICODE_NAMES = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, # Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), # Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, # Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), # Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, # Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, # Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, # Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English # The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all generated output in the proper direction. # Possible values are: None, LTR, RTL and Context. # The default value is: None. OUTPUT_TEXT_DIRECTION = None # If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief # description of a member or function before the detailed description # # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. # The default value is: YES. REPEAT_BRIEF = NO # This tag implements a quasi-intelligent brief description abbreviator that is # used to form the text in various listings. Each string in this list, if found # as the leading text of the brief description, will be stripped from the text # and the result, after processing the whole list, is used as the annotated # text. Otherwise, the brief description is used as-is. If left blank, the # following values are used ($name is automatically replaced with the name of # the entity):The $name class, The $name widget, The $name file, is, provides, # specifies, contains, represents, a, an and the. ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # doxygen will generate a detailed section even if there is only a brief # description. # The default value is: NO. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. # The default value is: NO. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. FULL_PATH_NAMES = YES # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. # Stripping is only done if one of the specified strings matches the left-hand # part of the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the path to # strip. # # Note that you can specify absolute paths here, but also relative paths, which # will be relative from the directory where doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the # path mentioned in the documentation of a class, which tells the reader which # header file to include in order to use a class. If left blank only the name of # the header file containing the class definition is used. Otherwise one should # specify the list of include paths that are normally passed to the compiler # using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but # less readable) file names. This can be useful is your file systems doesn't # support long names like on DOS, Mac, or CD-ROM. # The default value is: NO. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the # first line (until the first dot) of a Javadoc-style comment as the brief # description. If set to NO, the Javadoc-style will behave just like regular Qt- # style comments (thus requiring an explicit @brief command for a brief # description.) # The default value is: NO. JAVADOC_AUTOBRIEF = NO # If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line # such as # /*************** # as being the beginning of a Javadoc-style comment "banner". If set to NO, the # Javadoc-style will behave just like regular comments and it will not be # interpreted by doxygen. # The default value is: NO. JAVADOC_BANNER = NO # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus # requiring an explicit \brief command for a brief description.) # The default value is: NO. QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a # multi-line C++ special comment block (i.e. a block of //! or /// comments) as # a brief description. This used to be the default behavior. The new default is # to treat a multi-line C++ comment block as a detailed description. Set this # tag to YES if you prefer the old behavior instead. # # Note that setting this tag to YES also means that rational rose comments are # not recognized any more. # The default value is: NO. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new # page for each member. If set to NO, the documentation of a member will be part # of the file/class/namespace that contains it. # The default value is: NO. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen # uses this value to replace tabs by spaces in code fragments. # Minimum value: 1, maximum value: 16, default value: 4. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that act as commands in # the documentation. An alias has the form: # name=value # For example adding # "sideeffect=@par Side Effects:\n" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading # "Side Effects:". You can put \n's in the value part of an alias to insert # newlines (in the resulting output). You can put ^^ in the value part of an # alias to insert a newline as if a physical newline was in the original file. # When you need a literal { or } or , in the value part of an alias you have to # escape them by means of a backslash (\), this can lead to conflicts with the # commands \{ and \} for these it is advised to use the version @{ and @} or use # a double escape (\\{ and \\}) ALIASES = # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding "class=itcl::class" # will allow you to use the command class in the itcl::class meaning. TCL_SUBST = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For # instance, some of the names that are used will be different. The list of all # members will be omitted, etc. # The default value is: NO. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or # Python sources only. Doxygen will then generate output that is more tailored # for that language. For instance, namespaces will be presented as packages, # qualified scopes will look different, etc. # The default value is: NO. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources. Doxygen will then generate output that is tailored for Fortran. # The default value is: NO. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for VHDL. # The default value is: NO. OPTIMIZE_OUTPUT_VHDL = NO # Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice # sources only. Doxygen will then generate output that is more tailored for that # language. For instance, namespaces will be presented as modules, types will be # separated into more groups, etc. # The default value is: NO. OPTIMIZE_OUTPUT_SLICE = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and # language is one of the parsers supported by doxygen: IDL, Java, JavaScript, # Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, # Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: # FortranFree, unknown formatted Fortran: Fortran. In the later case the parser # tries to guess whether the code is fixed or free formatted code, this is the # default for Fortran type files), VHDL, tcl. For instance to make doxygen treat # .inc files as Fortran files (default is PHP), and .f files as C (default is # Fortran), use: inc=Fortran f=C. # # Note: For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise # the files are not read by doxygen. EXTENSION_MAPPING = # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments # according to the Markdown format, which allows for more readable # documentation. See https://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you can # mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in # case of backward compatibilities issues. # The default value is: YES. MARKDOWN_SUPPORT = YES # When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up # to that level are automatically included in the table of contents, even if # they do not have an id attribute. # Note: This feature currently applies only to Markdown headings. # Minimum value: 0, maximum value: 99, default value: 5. # This tag requires that the tag MARKDOWN_SUPPORT is set to YES. TOC_INCLUDE_HEADINGS = 5 # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by putting a % sign in front of the word or # globally by setting AUTOLINK_SUPPORT to NO. # The default value is: YES. AUTOLINK_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should set this # tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); # versus func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. # The default value is: NO. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. # The default value is: NO. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: # https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen # will parse them like normal C++ but will assume all classes use public instead # of private inheritance when no explicit protection keyword is present. # The default value is: NO. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate # getter and setter methods for a property. Setting this option to YES will make # doxygen to replace the get and set methods by a property in the documentation. # This will only work if the methods are indeed getting or setting a simple # type. If this is not the case, or you want to show the methods anyway, you # should set this option to NO. # The default value is: YES. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. # The default value is: NO. DISTRIBUTE_GROUP_DOC = NO # If one adds a struct or class to a group and this option is enabled, then also # any nested class or struct is added to the same group. By default this option # is disabled and one has to add nested compounds explicitly via \ingroup. # The default value is: NO. GROUP_NESTED_COMPOUNDS = NO # Set the SUBGROUPING tag to YES to allow class member groups of the same type # (for instance a group of public functions) to be put as a subgroup of that # type (e.g. under the Public Functions section). Set it to NO to prevent # subgrouping. Alternatively, this can be done per class using the # \nosubgrouping command. # The default value is: YES. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions # are shown inside the group in which they are included (e.g. using \ingroup) # instead of on a separate page (for HTML and Man pages) or section (for LaTeX # and RTF). # # Note that this feature does not work in combination with # SEPARATE_MEMBER_PAGES. # The default value is: NO. INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions # with only public data fields or simple typedef fields will be shown inline in # the documentation of the scope in which they are defined (i.e. file, # namespace, or group documentation), provided this scope is documented. If set # to NO, structs, classes, and unions are shown on a separate page (for HTML and # Man pages) or section (for LaTeX and RTF). # The default value is: NO. INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or # enum is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically be # useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. # The default value is: NO. TYPEDEF_HIDES_STRUCT = NO # The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This # cache is used to resolve symbols given their name and scope. Since this can be # an expensive process and often the same symbol appears multiple times in the # code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small # doxygen will become slower. If the cache is too large, memory is wasted. The # cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range # is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 # symbols. At the end of a run doxygen will report the cache usage and suggest # the optimal cache size from a speed point of view. # Minimum value: 0, maximum value: 9, default value: 0. LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in # documentation are documented, even if no documentation was available. Private # class members and static file members will be hidden unless the # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. # Note: This will also disable the warnings about undocumented members that are # normally produced when WARNINGS is set to YES. # The default value is: NO. EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will # be included in the documentation. # The default value is: NO. EXTRACT_PRIVATE = NO # If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual # methods of a class will be included in the documentation. # The default value is: NO. EXTRACT_PRIV_VIRTUAL = NO # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. # The default value is: NO. EXTRACT_PACKAGE = NO # If the EXTRACT_STATIC tag is set to YES, all static members of a file will be # included in the documentation. # The default value is: NO. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined # locally in source files will be included in the documentation. If set to NO, # only classes defined in header files are included. Does not have any effect # for Java sources. # The default value is: YES. EXTRACT_LOCAL_CLASSES = NO # This flag is only useful for Objective-C code. If set to YES, local methods, # which are defined in the implementation section but not in the interface are # included in the documentation. If set to NO, only methods in the interface are # included. # The default value is: NO. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base name of # the file that contains the anonymous namespace. By default anonymous namespace # are hidden. # The default value is: NO. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation # section is generated. This option has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_MEMBERS = YES # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO, these classes will be included in the various overviews. This option # has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = YES # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend # declarations. If set to NO, these declarations will be included in the # documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any # documentation blocks found inside the body of a function. If set to NO, these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation that is typed after a # \internal command is included. If the tag is set to NO then the documentation # will be excluded. Set it to YES to include the internal documentation. # The default value is: NO. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file # names in lower-case letters. If set to YES, upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # (including Cygwin) ands Mac users are advised to set this option to NO. # The default value is: system dependent. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with # their full class and namespace scopes in the documentation. If set to YES, the # scope will be hidden. # The default value is: NO. HIDE_SCOPE_NAMES = NO # If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will # append additional text to a page's title, such as Class Reference. If set to # YES the compound reference will be hidden. # The default value is: NO. HIDE_COMPOUND_REFERENCE= NO # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. SHOW_INCLUDE_FILES = YES # If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each # grouped member an include statement to the documentation, telling the reader # which file to include in order to use the member. # The default value is: NO. SHOW_GROUPED_MEMB_INC = NO # If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include # files with double quotes in the documentation rather than with sharp brackets. # The default value is: NO. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the # documentation for inline members. # The default value is: YES. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the # (detailed) documentation of file and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. # The default value is: YES. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. Note that # this will also influence the order of the classes in the class list. # The default value is: NO. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the # (brief and detailed) documentation of class members so that constructors and # destructors are listed first. If set to NO the constructors will appear in the # respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. # Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief # member documentation. # Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting # detailed member documentation. # The default value is: NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy # of group names into alphabetical order. If set to NO the group names will # appear in their defined order. # The default value is: NO. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by # fully-qualified names, including namespaces. If set to NO, the class list will # be sorted only by class name, not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the alphabetical # list. # The default value is: NO. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper # type resolution of all parameters of a function it will reject a match between # the prototype and the implementation of a member function even if there is # only one candidate or it is obvious which candidate to choose by doing a # simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still # accept a match between prototype and implementation in such cases. # The default value is: NO. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo # list. This list is created by putting \todo commands in the documentation. # The default value is: YES. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test # list. This list is created by putting \test commands in the documentation. # The default value is: YES. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug # list. This list is created by putting \bug commands in the documentation. # The default value is: YES. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) # the deprecated list. This list is created by putting \deprecated commands in # the documentation. # The default value is: YES. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional documentation # sections, marked by \if ... \endif and \cond # ... \endcond blocks. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the # initial value of a variable or macro / define can have for it to appear in the # documentation. If the initializer consists of more lines than specified here # it will be hidden. Use a value of 0 to hide initializers completely. The # appearance of the value of individual variables and macros / defines can be # controlled using \showinitializer or \hideinitializer command in the # documentation regardless of this setting. # Minimum value: 0, maximum value: 10000, default value: 30. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated at # the bottom of the documentation of classes and structs. If set to YES, the # list will mention the files that were used to generate the documentation. # The default value is: YES. SHOW_USED_FILES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. This # will remove the Files entry from the Quick Index and from the Folder Tree View # (if specified). # The default value is: YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces # page. This will remove the Namespaces entry from the Quick Index and from the # Folder Tree View (if specified). # The default value is: YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command command input-file, where command is the value of the # FILE_VERSION_FILTER tag, and input-file is the name of an input file provided # by doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml # will be used as the name of the layout file. # # Note that if you run doxygen from a directory containing a file called # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib # extension is automatically appended if omitted. This requires the bibtex tool # to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. # For LaTeX the style of the bibliography can be controlled using # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the # search path. See also \cite for info how to create references. CITE_BIB_FILES = #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated to # standard output by doxygen. If QUIET is set to YES this implies that the # messages are off. # The default value is: NO. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated to standard error (stderr) by doxygen. If WARNINGS is set to YES # this implies that the warnings are on. # # Tip: Turn warnings on while writing the documentation. # The default value is: YES. WARNINGS = YES # If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: YES. WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some parameters # in a documented function, or documenting parameters that don't exist or using # markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return # value. If set to NO, doxygen will only warn about wrong or incomplete # parameter documentation, but not about the absence of documentation. If # EXTRACT_ALL is set to YES then this flag will automatically be disabled. # The default value is: NO. WARN_NO_PARAMDOC = NO # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when # a warning is encountered. # The default value is: NO. WARN_AS_ERROR = NO # The WARN_FORMAT tag determines the format of the warning messages that doxygen # can produce. The string should contain the $file, $line, and $text tags, which # will be replaced by the file and line number from which the warning originated # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard # error (stderr). WARN_LOGFILE = #--------------------------------------------------------------------------- # Configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag is used to specify the files and/or directories that contain # documented source files. You may enter file names like myfile.cpp or # directories like /usr/src/myproject. Separate the files or directories with # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. INPUT = # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv # documentation (see: https://www.gnu.org/software/libiconv/) for the list of # possible encodings. # The default value is: UTF-8. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # read by doxygen. # # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, # *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, # *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment), # *.doc (to be provided as doxygen C comment), *.txt (to be provided as doxygen # C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f, *.for, *.tcl, *.vhd, # *.vhdl, *.ucf, *.qsf and *.ice. FILE_PATTERNS = # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well. # The default value is: NO. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. # The default value is: NO. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include # command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and # *.h) to filter out the source-files in the directories. If left blank all # files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude commands # irrespective of the value of the RECURSIVE tag. # The default value is: NO. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or directories # that contain images that are to be included in the documentation (see the # \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command: # # # # where is the value of the INPUT_FILTER tag, and is the # name of an input file. Doxygen will then use the output that the filter # program writes to standard output. If FILTER_PATTERNS is specified, this tag # will be ignored. # # Note that the filter must not add or remove lines; it is applied before the # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: pattern=filter # (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how # filters are used. If the FILTER_PATTERNS tag is empty or if none of the # patterns match the file name, INPUT_FILTER is applied. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will also be used to filter the input files that are used for # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). # The default value is: NO. FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) and # it is also possible to disable source filtering for a specific pattern using # *.ext= (so without naming a filter). # This tag requires that the tag FILTER_SOURCE_FILES is set to YES. FILTER_SOURCE_PATTERNS = # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. USE_MDFILE_AS_MAINPAGE = #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will be # generated. Documented entities will be cross-referenced with these sources. # # Note: To get rid of all source code in the generated output, make sure that # also VERBATIM_HEADERS is set to NO. # The default value is: NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body of functions, # classes and enums directly into the documentation. # The default value is: NO. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any # special comment blocks from generated source code fragments. Normal C, C++ and # Fortran comments will always remain visible. # The default value is: YES. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES then for each documented # entity all documented functions referencing it will be listed. # The default value is: NO. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES then for each documented function # all documented entities called/used by that function will be listed. # The default value is: NO. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set # to YES then the hyperlinks from functions in REFERENCES_RELATION and # REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will # link to the documentation. # The default value is: YES. REFERENCES_LINK_SOURCE = YES # If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the # source code will show a tooltip with additional information such as prototype, # brief description and links to the definition and documentation. Since this # will make the HTML file larger and loading of large files a bit slower, you # can opt to disable this feature. # The default value is: YES. # This tag requires that the tag SOURCE_BROWSER is set to YES. SOURCE_TOOLTIPS = YES # If the USE_HTAGS tag is set to YES then the references to source code will # point to the HTML generated by the htags(1) tool instead of doxygen built-in # source browser. The htags tool is part of GNU's global source tagging system # (see https://www.gnu.org/software/global/global.html). You will need version # 4.8.6 or higher. # # To use it do the following: # - Install the latest version of global # - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file # - Make sure the INPUT points to the root of the source tree # - Run doxygen as normal # # Doxygen will invoke htags (and that will in turn invoke gtags), so these # tools must be available from the command line (i.e. in the search path). # # The result: instead of the source browser generated by doxygen, the links to # source code will now point to the output of htags. # The default value is: NO. # This tag requires that the tag SOURCE_BROWSER is set to YES. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a # verbatim copy of the header file for each class for which an include is # specified. Set to NO to disable this. # See also: Section \class. # The default value is: YES. VERBATIM_HEADERS = YES # If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the # clang parser (see: http://clang.llvm.org/) for more accurate parsing at the # cost of reduced performance. This can be particularly helpful with template # rich C++ code for which doxygen's built-in parser lacks the necessary type # information. # Note: The availability of this option depends on whether or not doxygen was # generated with the -Duse_libclang=ON option for CMake. # The default value is: NO. CLANG_ASSISTED_PARSING = NO # If clang assisted parsing is enabled you can provide the compiler with command # line options that you would normally use when invoking the compiler. Note that # the include paths will already be set by doxygen for the files and directories # specified with INPUT and INCLUDE_PATH. # This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. CLANG_OPTIONS = # If clang assisted parsing is enabled you can provide the clang parser with the # path to the compilation database (see: # http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) used when the files # were built. This is equivalent to specifying the "-p" option to a clang tool, # such as clang-check. These options will then be passed to the parser. # Note: The availability of this option depends on whether or not doxygen was # generated with the -Duse_libclang=ON option for CMake. CLANG_DATABASE_PATH = #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all # compounds will be generated. Enable this if the project contains a lot of # classes, structs, unions or interfaces. # The default value is: YES. ALPHABETICAL_INDEX = YES # The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in # which the alphabetical index list will be split. # Minimum value: 1, maximum value: 20, default value: 5. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all classes will # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag # can be used to specify a prefix (or a list of prefixes) that should be ignored # while generating the index headers. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output # The default value is: YES. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of # it. # The default directory is: html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each # generated HTML page (for example: .htm, .php, .asp). # The default value is: .html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a user-defined HTML header file for # each generated HTML page. If the tag is left blank doxygen will generate a # standard header. # # To get valid HTML the header file that includes any scripts and style sheets # that doxygen needs, which is dependent on the configuration options used (e.g. # the setting GENERATE_TREEVIEW). It is highly recommended to start with a # default header using # doxygen -w html new_header.html new_footer.html new_stylesheet.css # YourConfigFile # and then modify the file new_header.html. See also section "Doxygen usage" # for information on how to generate the default header that doxygen normally # uses. # Note: The header is subject to change so you typically have to regenerate the # default header when upgrading to a newer version of doxygen. For a description # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard # footer. See HTML_HEADER for more information on how to generate a default # footer and what special commands can be used inside the footer. See also # section "Doxygen usage" for information on how to generate the default footer # that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of # the HTML output. If left blank doxygen will generate a default style sheet. # See also section "Doxygen usage" for information on how to generate the style # sheet that doxygen normally uses. # Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as # it is more robust and this tag (HTML_STYLESHEET) will in the future become # obsolete. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined # cascading style sheets that are included after the standard style sheets # created by doxygen. Using this option one can overrule certain style aspects. # This is preferred over using HTML_STYLESHEET since it does not replace the # standard style sheet and is therefore more robust against future updates. # Doxygen will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the # list). For an example see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that the # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to # this color. Hue is specified as an angle on a colorwheel, see # https://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. # Minimum value: 0, maximum value: 359, default value: 220. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors # in the HTML output. For a value of 0 the output will use grayscales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the # luminance component of the colors in the HTML output. Values below 100 # gradually make the output lighter, whereas values above 100 make the output # darker. The value divided by 100 is the actual gamma applied, so 80 represents # a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not # change the gamma. # Minimum value: 40, maximum value: 240, default value: 80. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting this # to YES can help to show when doxygen was last run and thus if the # documentation is up to date. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_TIMESTAMP = NO # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML # documentation will contain a main index with vertical navigation menus that # are dynamically created via JavaScript. If disabled, the navigation index will # consists of multiple levels of tabs that are statically embedded in every HTML # page. Disable this option to support browsers that do not have JavaScript, # like the Qt help browser. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_DYNAMIC_MENUS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_DYNAMIC_SECTIONS = NO # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand # and collapse entries dynamically later on. Doxygen will expand the tree to # such a level that at most the specified number of entries are visible (unless # a fully collapsed tree already exceeds this amount). So setting the number of # entries 1 will produce a full collapsed tree by default. 0 is a special value # representing an infinite number of entries and will result in a full expanded # tree by default. # Minimum value: 0, maximum value: 9999, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development # environment (see: https://developer.apple.com/xcode/), introduced with OSX # 10.5 (Leopard). To create a documentation set, doxygen will generate a # Makefile in the HTML output directory. Running make will produce the docset in # that directory and running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at # startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy # genXcode/_index.html for more information. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_DOCSET = NO # This tag determines the name of the docset feed. A documentation feed provides # an umbrella under which multiple documentation sets from a single provider # (such as a company or product suite) can be grouped. # The default value is: Doxygen generated docs. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_FEEDNAME = "Doxygen generated docs" # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_BUNDLE_ID = org.doxygen.Project # The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. # The default value is: org.doxygen.Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. # The default value is: Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop # (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on # Windows. # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML # files are now used as the Windows 98 help format, and will replace the old # Windows help format (.hlp) on all Windows platforms in the future. Compressed # HTML files also contain an index, a table of contents, and you can search for # words in the documentation. The HTML workshop also contains a viewer for # compressed HTML files. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_HTMLHELP = NO # The CHM_FILE tag can be used to specify the file name of the resulting .chm # file. You can add a path in front of the file if the result should not be # written to the html output directory. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler (hhc.exe). If non-empty, # doxygen will try to run the HTML help compiler on the generated index.hhp. # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated # (YES) or that it should be included in the master .chm file (NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. GENERATE_CHI = NO # The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_INDEX_ENCODING = # The BINARY_TOC flag controls whether a binary table of contents is generated # (YES) or a normal table of contents (NO) in the .chm file. Furthermore it # enables the Previous and Next buttons. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members to # the table of contents of the HTML help documentation and to the tree view. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help # (.qch) of the generated HTML documentation. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify # the file name of the resulting .qch file. The path specified is relative to # the HTML output folder. # This tag requires that the tag GENERATE_QHP is set to YES. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace # (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual # Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual- # folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom # Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom # Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = # The QHG_LOCATION tag can be used to specify the location of Qt's # qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the # generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be # generated, together with the HTML files, they form an Eclipse help plugin. To # install this plugin and make it available under the help contents menu in # Eclipse, the contents of the directory containing the HTML and XML files needs # to be copied into the plugins directory of eclipse. The name of the directory # within the plugins directory should be the same as the ECLIPSE_DOC_ID value. # After copying Eclipse needs to be restarted before the help appears. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_ECLIPSEHELP = NO # A unique identifier for the Eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have this # name. Each documentation set should have its own identifier. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. ECLIPSE_DOC_ID = org.doxygen.Project # If you want full control over the layout of the generated HTML pages it might # be necessary to disable the index and replace it with your own. The # DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top # of each HTML page. A value of NO enables the index and the value YES disables # it. Since the tabs in the index contain the same information as the navigation # tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. If the tag # value is set to YES, a side panel will be generated containing a tree-like # index structure (just like the one that is generated for HTML Help). For this # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can # further fine-tune the look of the index. As an example, the default style # sheet generated by doxygen has an example that shows how to put an image at # the root of the tree instead of the PROJECT_NAME. Since the tree basically has # the same information as the tab index, you could consider setting # DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. # # Note that a value of 0 will completely suppress the enum values from appearing # in the overview section. # Minimum value: 0, maximum value: 20, default value: 4. # This tag requires that the tag GENERATE_HTML is set to YES. ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used # to set the initial width (in pixels) of the frame in which the tree is shown. # Minimum value: 0, maximum value: 1500, default value: 250. # This tag requires that the tag GENERATE_HTML is set to YES. TREEVIEW_WIDTH = 250 # If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful # doxygen run you need to manually remove any form_*.png images from the HTML # output directory to force them to be regenerated. # Minimum value: 8, maximum value: 50, default value: 10. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANSPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are not # supported properly for IE 6.0, but are supported on all modern browsers. # # Note that when changing this option you need to delete any form_*.png files in # the HTML output directory before the changes have effect. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_TRANSPARENT = YES # The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands # to create new LaTeX commands to be used in formulas as building blocks. See # the section "Including formulas" for details. FORMULA_MACROFILE = # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see # https://www.mathjax.org) which uses client side JavaScript for the rendering # instead of using pre-rendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path # to it using the MATHJAX_RELPATH option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. USE_MATHJAX = NO # When MathJax is enabled you can set the default output format to be used for # the MathJax output. See the MathJax site (see: # http://docs.mathjax.org/en/latest/output.html) for more details. # Possible values are: HTML-CSS (which is slower, but has the best # compatibility), NativeMML (i.e. MathML) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_FORMAT = HTML-CSS # When MathJax is enabled you need to specify the location relative to the HTML # output directory using the MATHJAX_RELPATH option. The destination directory # should contain the MathJax.js script. For instance, if the mathjax directory # is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of # MathJax from https://www.mathjax.org before deployment. # The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/ # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site # (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_CODEFILE = # When the SEARCHENGINE tag is enabled doxygen will generate a search box for # the HTML output. The underlying search engine uses javascript and DHTML and # should work on any modern browser. Note that when using HTML help # (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) # there is already a search function so this one should typically be disabled. # For large projects the javascript based search engine can be slow, then # enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to # search using the keyboard; to jump to the search box use + S # (what the is depends on the OS and browser, but it is typically # , /