diff -Nru fcitx-4.2.2/cmake/FindEnchant.cmake fcitx-4.2.4.1/cmake/FindEnchant.cmake --- fcitx-4.2.2/cmake/FindEnchant.cmake 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/cmake/FindEnchant.cmake 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,33 @@ +# - Try to find the Enchant libraries +# Once done this will define +# +# ENCHANT_FOUND - system has ENCHANT +# ENCHANT_INCLUDE_DIR - the ENCHANT include directory +# ENCHANT_LIBRARIES - ENCHANT library +# +# Copyright (c) 2012 CSSlayer +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +if(ENCHANT_INCLUDE_DIR AND ENCHANT_LIBRARIES) + # Already in cache, be silent + set(ENCHANT_FIND_QUIETLY TRUE) +endif(ENCHANT_INCLUDE_DIR AND ENCHANT_LIBRARIES) + +find_package(PkgConfig) +pkg_check_modules(PC_ENCHANT enchant) + +find_path(ENCHANT_INCLUDE_DIR + NAMES enchant.h + HINTS ${PC_ENCHANT_INCLUDEDIR} + PATH_SUFFIXES "enchant") + +find_library(ENCHANT_LIBRARIES + NAMES enchant + HINTS ${PC_ENCHANT_LIBDIR}) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Enchant DEFAULT_MSG ENCHANT_LIBRARIES ENCHANT_INCLUDE_DIR) + +mark_as_advanced(ENCHANT_INCLUDE_DIR ENCHANT_LIBRARIES PC_ENCHANT_INCLUDEDIR PC_ENCHANT_LIBDIR) diff -Nru fcitx-4.2.2/cmake/FindIsoCodes.cmake fcitx-4.2.4.1/cmake/FindIsoCodes.cmake --- fcitx-4.2.2/cmake/FindIsoCodes.cmake 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/cmake/FindIsoCodes.cmake 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,32 @@ +# - Try to find the IsoCodes libraries +# Once done this will define +# +# ISOCODES_FOUND - system has ISOCODES +# ISOCODES_INCLUDE_DIR - the ISOCODES include directory +# ISOCODES_LIBRARIES - ISOCODES library +# +# Copyright (c) 2012 CSSlayer +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +if(ISOCODES_INCLUDE_DIR AND ISOCODES_LIBRARIES) + # Already in cache, be silent + set(ISOCODES_FIND_QUIETLY TRUE) +endif(ISOCODES_INCLUDE_DIR AND ISOCODES_LIBRARIES) + +find_package(PkgConfig) +pkg_check_modules(PC_ISOCODES iso-codes) + +find_file(ISOCODES_ISO639_XML iso_639.xml + HINTS "${PC_ISOCODES_PREFIX}/share/xml/iso-codes/" + ) + +find_file(ISOCODES_ISO3166_XML iso_3166.xml + HINTS "${PC_ISOCODES_PREFIX}/share/xml/iso-codes/" + ) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(IsoCodes DEFAULT_MSG ISOCODES_ISO639_XML ISOCODES_ISO3166_XML) + +mark_as_advanced(ISOCODES_ISO639_XML ISOCODES_ISO3166_XML) diff -Nru fcitx-4.2.2/cmake/FindPresage.cmake fcitx-4.2.4.1/cmake/FindPresage.cmake --- fcitx-4.2.2/cmake/FindPresage.cmake 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/cmake/FindPresage.cmake 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,27 @@ +# - Try to find the PRESAGE libraries +# Once done this will define +# +# PRESAGE_FOUND - system has PRESAGE +# PRESAGE_INCLUDE_DIR - the PRESAGE include directory +# PRESAGE_LIBRARIES - PRESAGE library +# +# Copyright (c) 2012 CSSlayer +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +if(PRESAGE_INCLUDE_DIR AND PRESAGE_LIBRARIES) + # Already in cache, be silent + set(PRESAGE_FIND_QUIETLY TRUE) +endif(PRESAGE_INCLUDE_DIR AND PRESAGE_LIBRARIES) + +find_path(PRESAGE_INCLUDE_DIR + NAMES presage.h) + +find_library(PRESAGE_LIBRARIES + NAMES presage) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Presage DEFAULT_MSG PRESAGE_LIBRARIES PRESAGE_INCLUDE_DIR) + +mark_as_advanced(PRESAGE_INCLUDE_DIR PRESAGE_LIBRARIES) diff -Nru fcitx-4.2.2/cmake/FindXkbFile.cmake fcitx-4.2.4.1/cmake/FindXkbFile.cmake --- fcitx-4.2.2/cmake/FindXkbFile.cmake 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/cmake/FindXkbFile.cmake 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,35 @@ +# - Try to find the XKBFILE libraries +# Once done this will define +# +# XKBFILE_FOUND - system has XKBFILE +# XKBFILE_INCLUDE_DIR - the XKBFILE include directory +# XKBFILE_LIBRARIES - XKBFILE library +# +# Copyright (c) 2012 CSSlayer +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +if(XKBFILE_INCLUDE_DIR AND XKBFILE_LIBRARIES) + # Already in cache, be silent + set(XKBFILE_FIND_QUIETLY TRUE) +endif(XKBFILE_INCLUDE_DIR AND XKBFILE_LIBRARIES) + +find_package(PkgConfig) +pkg_check_modules(PC_LIBXKBFILE xkbfile) + +find_path(XKBFILE_MAIN_INCLUDE_DIR + NAMES XKBfile.h + HINTS ${PC_LIBXKBFILE_INCLUDEDIR} + PATH_SUFFIXES "X11/extensions") + +find_library(XKBFILE_LIBRARIES + NAMES xkbfile + HINTS ${PC_LIBXKBFILE_LIBDIR}) + +set(XKBFILE_INCLUDE_DIR "${XKBFILE_MAIN_INCLUDE_DIR}") + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(XkbFile DEFAULT_MSG XKBFILE_LIBRARIES XKBFILE_MAIN_INCLUDE_DIR) + +mark_as_advanced(XKBFILE_INCLUDE_DIR XKBFILE_LIBRARIES) diff -Nru fcitx-4.2.2/cmake/GObjectIntrospection.cmake fcitx-4.2.4.1/cmake/GObjectIntrospection.cmake --- fcitx-4.2.2/cmake/GObjectIntrospection.cmake 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/cmake/GObjectIntrospection.cmake 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,210 @@ +include(CMakeParseArguments) +include(FindPkgConfig) + +pkg_check_modules(GOBJECT_INTROSPECTION REQUIRED gobject-introspection-1.0) +_pkgconfig_invoke("gobject-introspection-1.0" GOBJECT_INTROSPECTION GIRDIR "" "--variable=girdir") +_pkgconfig_invoke("gobject-introspection-1.0" GOBJECT_INTROSPECTION TYPELIBDIR "" "--variable=typelibdir") + +find_program(GIR_SCANNER NAMES g-ir-scanner DOC "g-ir-scanner executable") +mark_as_advanced(GIR_SCANNER) +find_program(GIR_COMPILER NAMES g-ir-compiler DOC "g-ir-compiler executable") +mark_as_advanced(GIR_COMPILER) +find_program(GIR_GENERATE NAMES g-ir-generate DOC "g-ir-generate executable") +mark_as_advanced(GIR_GENERATE) + +macro(_gir_list_prefix _newlist _list _prefix) + set(${_newlist}) + foreach(_item IN LISTS ${_list}) + list(APPEND ${_newlist} ${_prefix}${_item}) + endforeach(_item) +endmacro(_gir_list_prefix) + +function(gobject_introspection _FIRST_ARG) + set(options QUIET VERBOSE) + set(oneValueArgs + FILENAME + FORMAT + LIBRARY + NAMESPACE + NSVERSION + PROGRAM + PROGRAM_ARG + PACKAGE_EXPORT + ) + set(multiValueArgs + BUILT_SOURCES + CFLAGS + COMPILER_ARGS + HEADERS + IDENTIFIER_PREFIXES + PACKAGES + INCLUDE + SCANNER_ARGS + SOURCES + SYMBOL_PREFIXES + ) + + CMAKE_PARSE_ARGUMENTS(GIR "${options}" "${oneValueArgs}" "${multiValueArgs}" ${_FIRST_ARG} ${ARGN}) + + if(ADD_GIR_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Unknown keys given to ADD_GIR_INTROSPECTION(): \"${ADD_GIR_UNPARSED_ARGUMENTS}\"") + endif(ADD_GIR_UNPARSED_ARGUMENTS) + + ########################################################################### + # make sure that the user set some variables... + ########################################################################### + if(NOT GIR_FILENAME) + message(FATAL_ERROR "No gir filename given") + endif(NOT GIR_FILENAME) + + if(NOT GIR_NAMESPACE) + # the caller didn't give us a namespace, try to grab it from the filename + string(REGEX REPLACE "([^-]+)-.*" "\\1" GIR_NAMESPACE "${GIR_FILENAME}") + if(NOT GIR_NAMESPACE) + message(FATAL_ERROR "No namespace given and couldn't find one in FILENAME") + endif(NOT GIR_NAMESPACE) + endif(NOT GIR_NAMESPACE) + + if(NOT GIR_NSVERSION) + # the caller didn't give us a namespace version, try to grab it from the filemenu + string(REGEX REPLACE ".*-([^-]+).gir" "\\1" GIR_NSVERSION "${GIR_FILENAME}") + if(NOT GIR_NSVERSION) + message(FATAL_ERROR "No namespace version given and couldn't find one in FILENAME") + endif(NOT GIR_NSVERSION) + endif(NOT GIR_NSVERSION) + + if(NOT GIR_CFLAGS) + get_directory_property(GIR_CFLAGS INCLUDE_DIRECTORIES) + _gir_list_prefix(GIR_REAL_CFLAGS GIR_CFLAGS "-I") + endif(NOT GIR_CFLAGS) + + ########################################################################### + # Fix up some of our arguments + ########################################################################### + if(GIR_VERBOSE) + set(GIR_VERBOSE "--verbose") + else(GIR_VERBOSE) + set(GIR_VERBOSE "") + endif(GIR_VERBOSE) + + if(GIR_QUIET) + set(GIR_QUIET "--quiet") + else(GIR_QUIET) + set(GIR_QUIET "") + endif(GIR_QUIET) + + if(GIR_FORMAT) + set(GIR_FORMAT "--format=${GIR_FORMAT}") + endif(GIR_FORMAT) + + # if library is set, we need to prepend --library= on to it + if(GIR_LIBRARY) + set(GIR_REAL_LIBRARY "--library=${GIR_LIBRARY}") + endif(GIR_LIBRARY) + + # if program has been set, we prepend --program= on to it + if(GIR_PROGRAM) + set(GIR_PROGRAM "--program=${GIR_PROGRAM}") + endif(GIR_PROGRAM) + + # if program_arg has been set, we prepend --program-arg= on to it + if(GIR_PROGRAM_ARG) + set(GIR_PROGRAM_ARG "--program-arg=${GIR_PROGRAM_ARG}") + endif(GIR_PROGRAM_ARG) + + # if the user specified PACKAGE_EXPORT we need to prefix each with --pkg-export + if(GIR_PACKAGE_EXPORT) + set(GIR_REAL_PACKAGE_EXPORT GIR_PACKAGE_EXPORT "--pkg-export=") + endif(GIR_PACKAGE_EXPORT) + + ########################################################################### + # Clean up any of the multivalue items that all need to be prefixed + ########################################################################### + + # if the user specified IDENTIFIER_PREFIXES we need to prefix each with --identifier-prefix + if(GIR_IDENTIFIER_PREFIXES) + _gir_list_prefix(GIR_REAL_IDENTIFIER_PREFIXES GIR_IDENTIFIER_PREFIXES "--identifier-prefix=") + endif(GIR_IDENTIFIER_PREFIXES) + + # if the user specified SYMBOL_PREFIXES we need to prefix each with --symbol-prefix= + if(GIR_SYMBOL_PREFIXES) + _gir_list_prefix(GIR_REAL_SYMBOL_PREFIXES GIR_SYMBOL_PREFIXES "--symbol-prefix=") + endif(GIR_SYMBOL_PREFIXES) + + # if the user specified PACKAGES we need to prefix each with --pkg + if(GIR_PACKAGES) + _gir_list_prefix(GIR_REAL_PACKAGES GIR_PACKAGES "--pkg=") + endif(GIR_PACKAGES) + + # if the user specified PACKAGES we need to prefix each with --pkg + if(GIR_INCLUDE) + _gir_list_prefix(GIR_REAL_INCLUDE GIR_INCLUDE "--include=") + endif(GIR_INCLUDE) + + if (GIR_SOURCES) + set(GIR_REAL_SOURCES) + + foreach(ITEM ${GIR_SOURCES}) + get_source_file_property(LOCATION ${ITEM} LOCATION) + list(APPEND GIR_REAL_SOURCES "${LOCATION}") + endforeach(ITEM) + endif(GIR_SOURCES) + + # if the user specified BUILT_SOURCES, we need to get their paths since + # they could be in CMAKE_CURRENT_BUILD_DIR + if(GIR_BUILT_SOURCES) + set(GIR_REAL_BUILT_SOURCES) + + foreach(ITEM ${GIR_BUILT_SOURCES}) + get_source_file_property(LOCATION ${ITEM} LOCATION) + list(APPEND GIR_REAL_BUILT_SOURCES "${LOCATION}") + endforeach(ITEM) + endif(GIR_BUILT_SOURCES) + + ########################################################################### + # Add the custom commands + ########################################################################### + set(ENV{CFLAGS} ${GIR_REAL_CFLAGS}) + add_custom_command( + COMMAND ${GIR_SCANNER} ${GIR_SCANNER_ARGS} + --namespace=${GIR_NAMESPACE} + --nsversion=${GIR_NSVERSION} + ${GIR_REAL_CFLAGS} + ${GIR_FORMAT} + ${GIR_REAL_LIBRARY} + ${GIR_PROGRAM} ${GIR_PROGRAM_ARGS} + ${GIR_QUIET} ${GIR_VERBOSE} + ${GIR_REAL_IDENTIFIER_PREFIXES} + ${GIR_REAL_SYMBOL_PREFIXES} + ${GIR_REAL_PACKAGES} + ${GIR_REAL_INCLUDE} + --no-libtool + -L ${CMAKE_CURRENT_BINARY_DIR} + --output=${CMAKE_CURRENT_BINARY_DIR}/${GIR_FILENAME} + ${GIR_PACKAGE_EXPORT} + ${GIR_SCANNER_FLAGS} + ${GIR_REAL_SOURCES} + ${GIR_REAL_BUILT_SOURCES} + OUTPUT ${GIR_FILENAME} + DEPENDS ${GIR_LIBRARY} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + VERBATIM + ) + + add_custom_target(${GIR_FILENAME}.target ALL DEPENDS ${GIR_LIBRARY} ${GIR_FILENAME}) + + # create the name of the typelib + string(REPLACE ".gir" ".typelib" GIR_TYPELIB "${GIR_FILENAME}") + + add_custom_command( + COMMAND ${GIR_COMPILER} ${GIR_COMPILER_ARGS} + ${CMAKE_CURRENT_BINARY_DIR}/${GIR_FILENAME} + --output=${CMAKE_CURRENT_BINARY_DIR}/${GIR_TYPELIB} + OUTPUT ${GIR_TYPELIB} + DEPENDS ${GIR_FILENAME} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + ) + + add_custom_target(${GIR_TYPELIB}.target ALL DEPENDS ${GIR_LIBRARY} ${GIR_FILENAME} ${GIR_TYPELIB}) +endfunction(gobject_introspection) + diff -Nru fcitx-4.2.2/CMakeLists.txt fcitx-4.2.4.1/CMakeLists.txt --- fcitx-4.2.2/CMakeLists.txt 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/CMakeLists.txt 2012-06-10 14:34:48.000000000 +0000 @@ -2,7 +2,7 @@ project(fcitx) -set(version 4.2.2) +set(version 4.2.4.1) set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH}) @@ -15,9 +15,11 @@ option(ENABLE_GTK3_IM_MODULE "Enable GTK3 IM Module" OFF) option(ENABLE_QT_IM_MODULE "Enable Qt IM Module" OFF) option(ENABLE_OPENCC "Enable OpenCC for Chinese Transform" ON) +option(ENABLE_LUA "Enable Lua support" OFF) option(ENABLE_STATIC "Build Static Library" OFF) option(ENABLE_TEST "Test build" OFF) option(ENABLE_SNOOPER "Enable Key Snooper for gtk app" On) +option(ENABLE_GIR "Enable GObject Introspection" On) if (NOT NO_SNOOPER_APPS) set(NO_SNOOPER_APPS ".*chrome.*,.*chromium.*,firefox.*,Do.*" CACHE STRING "Disable Key Snooper for following app") @@ -48,12 +50,33 @@ FIND_PACKAGE(Libiconv REQUIRED) FIND_PACKAGE(Pthread REQUIRED) FIND_PACKAGE(Libexecinfo REQUIRED) +FIND_PACKAGE(LibXml2 REQUIRED) FIND_PACKAGE(Libkvm) FIND_PACKAGE(DL REQUIRED) +find_package(XkbFile REQUIRED) +find_package(Enchant REQUIRED) +find_package(IsoCodes REQUIRED) +find_package(Presage) +find_package(ICU REQUIRED) +FIND_PACKAGE(X11 REQUIRED) + +if (NOT X11_Xkb_FOUND) + message(FATAL_ERROR "Xkb is needed") +endif (NOT X11_Xkb_FOUND) + + FIND_PROGRAM(WGET wget) FIND_PROGRAM(TAR tar) -FIND_PACKAGE(X11 REQUIRED) +find_program(some_x_program NAMES iceauth xrdb xterm) +if (NOT some_x_program) + set(some_x_program /usr/bin/xrdb) + message("Warning: Could not determine X binary directory. Assuming /usr/bin.") +endif (NOT some_x_program) +get_filename_component(proto_xbindir "${some_x_program}" PATH) +get_filename_component(XBINDIR "${proto_xbindir}" ABSOLUTE) +get_filename_component(xrootdir "${XBINDIR}" PATH) +set(XLIBDIR "${xrootdir}/lib/X11") if (ENABLE_TEST) ENABLE_TESTING() diff -Nru fcitx-4.2.2/config.h.in fcitx-4.2.4.1/config.h.in --- fcitx-4.2.2/config.h.in 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/config.h.in 2012-06-10 14:34:48.000000000 +0000 @@ -14,6 +14,12 @@ #cmakedefine LIBICONV_SECOND_ARGUMENT_IS_CONST #cmakedefine ENABLE_SNOOPER #define NO_SNOOPER_APPS "@NO_SNOOPER_APPS@" +#define ISOCODES_ISO639_XML "@ISOCODES_ISO639_XML@" +#define ISOCODES_ISO3166_XML "@ISOCODES_ISO3166_XML@" +#cmakedefine XLIBDIR "${XLIBDIR}" +#cmakedefine XKB_RULES_XML_FILE "${XKB_RULES_XML_FILE}" +#cmakedefine LIBICONV_SECOND_ARGUMENT_IS_CONST +#cmakedefine PRESAGE_FOUND #define PACKAGE "@package@" #ifdef FCITX_USE_INTERNAL_PATH diff -Nru fcitx-4.2.2/data/addon.desc fcitx-4.2.4.1/data/addon.desc --- fcitx-4.2.2/data/addon.desc 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/data/addon.desc 2012-06-10 14:34:48.000000000 +0000 @@ -71,5 +71,10 @@ DefaultValue= Description=Fallback UI Addon +[Addon/Advance] +Type=Boolean +DefaultValue=False +Description=Do not show in GUI + [DescriptionFile] LocaleDomain=fcitx diff -Nru fcitx-4.2.2/data/CMakeLists.txt fcitx-4.2.4.1/data/CMakeLists.txt --- fcitx-4.2.2/data/CMakeLists.txt 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/data/CMakeLists.txt 2012-06-10 14:34:48.000000000 +0000 @@ -16,6 +16,7 @@ AutoEng.dat gbks2t.tab punc.mb.zh_CN + punc.mb.zh_HK punc.mb.zh_TW vk.conf ) diff -Nru fcitx-4.2.2/data/config.desc fcitx-4.2.4.1/data/config.desc --- fcitx-4.2.2/data/config.desc 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/data/config.desc 2012-06-10 14:34:48.000000000 +0000 @@ -1,3 +1,103 @@ +[Hotkey/TriggerKey] +Type=Hotkey +DefaultValue=CTRL_SPACE +Description=Trigger Input Method + +[Hotkey/SwitchKey] +Type=Enum +EnumCount=9 +Enum0=R_CTRL +Enum1=R_SHIFT +Enum2=L_SHIFT +Enum3=L_CTRL +Enum4=ALT_L_SHIFT +Enum5=ALT_R_SHIFT +Enum6=CTRL Both +Enum7=SHIFT Both +Enum8=Disabled +DefaultValue=L_CTRL +Description=Extra key for trigger input method + +[Hotkey/ActivateKey] +Type=Hotkey +DefaultValue= +Description=Activate input method + +[Hotkey/InactivateKey] +Type=Hotkey +DefaultValue= +Description=Inactivate Input Method + +[Hotkey/IMSwitchKey] +Type=Boolean +DefaultValue=True +Description=Enable Hotkey to scroll Between Input Method + +[Hotkey/IMSwitchHotkey] +Type=Enum +EnumCount=4 +Enum0=CTRL_SHIFT +Enum1=ALT_SHIFT +Enum2=CTRL_SUPER +Enum3=ALT_SUPER +DefaultValue=CTRL_SHIFT +Description=Scroll between Input Method + +[Hotkey/DoubleSwitchKey] +Type=Boolean +DefaultValue=False +Description=Press Switch Key twice to Change Mode + +[Hotkey/TimeInterval] +Type=Integer +DefaultValue=250 +Description=Interval of Two Key Input + +[Hotkey/VKSwitchKey] +Type=Hotkey +DefaultValue=CTRL_ALT_B +Description=Switching Virtual Keyboard + +[Hotkey/RemindSwitchKey] +Type=Hotkey +DefaultValue= +Description=Switching Remind Mode + +[Hotkey/FullWidthSwitchKey] +Type=Hotkey +DefaultValue= +Description=Switching Full Width Character Mode + +[Hotkey/PuncSwitchKey] +Type=Hotkey +DefaultValue=CTRL_. +Description=Switch Full Width Punc Mode + +[Hotkey/PrevPageKey] +Type=Hotkey +DefaultValue=- +Description=Prev Page + +[Hotkey/NextPageKey] +Type=Hotkey +DefaultValue== +Description=Next Page + +[Hotkey/SecondThirdCandWordKey] +Type=String +DefaultValue= +Description=Choose Second and Third Candidate Word + +[Hotkey/SaveAllKey] +Type=Hotkey +DefaultValue=CTRL_ALT_S +Description=Saving All Config and Input History + +[Hotkey/SwitchPreedit] +Type=Hotkey +DefaultValue=CTRL_ALT_P +Description=Switch Embeded Preedit + [Program/DelayStart] Type=Integer DefaultValue=0 @@ -14,23 +114,12 @@ [Program/DefaultInputMethodState] Type=Enum -DefaultValue=Close -EnumCount=3 -Enum0=Close -Enum1=Inactive -Enum2=Active +DefaultValue=Inactive +EnumCount=2 +Enum0=Inactive +Enum1=Active Description=Default Input Method State -[Program/FirstRun] -Type=Boolean -DefaultValue=True -Description=It's the first time Fcitx Start. - -[Program/FirstAsInactive] -Type=Boolean -DefaultValue=False -Description=Use first input method as inactive state - [Output/HalfPuncAfterNumber] Type=Boolean DefaultValue=True @@ -72,14 +161,9 @@ [Appearance/ShowInputWindowAfterTriggering] Type=Boolean -DefaultValue=True +DefaultValue=False Description=Show Input Window After Trigger Input Mode -[Appearance/ShowPointAfterIndex] -Type=Boolean -DefaultValue=True -Description=Show Point After Index - [Appearance/ShowInputSpeed] Type=Boolean DefaultValue=True @@ -98,85 +182,7 @@ [Appearance/HideInputWindowWhenOnlyOneCandidate] Type=Boolean DefaultValue=False -Description=Do not show input window if there is one one candidate (Hide when only preedit string must be selected) - -[Hotkey/TriggerKey] -Type=Hotkey -DefaultValue=CTRL_SPACE -Description=Hot key of Triggering Input Method - -[Hotkey/IMSwitchKey] -Type=Boolean -DefaultValue=True -Description=Enable Left Ctrl + Left Shift to Switch Between Input Method - -[Hotkey/SwitchKey] -Type=Enum -EnumCount=7 -Enum0=R_CTRL -Enum1=R_SHIFT -Enum2=L_SHIFT -Enum3=L_CTRL -Enum4=ALT_L_SHIFT -Enum5=ALT_R_SHIFT -Enum6=Disabled -DefaultValue=L_CTRL -Description=Hotkey of Switching Active and Inactive Mode - -[Hotkey/DoubleSwitchKey] -Type=Boolean -DefaultValue=False -Description=Press Switch Key twice to Change Mode - -[Hotkey/TimeInterval] -Type=Integer -DefaultValue=250 -Description=Interval of Two Key Input - -[Hotkey/VKSwitchKey] -Type=Hotkey -DefaultValue=CTRL_ALT_B -Description=Hotkey of Switching Virtual Keyboard - -[Hotkey/RemindSwitchKey] -Type=Hotkey -DefaultValue= -Description=Hotkey of Switching Remind Mode - -[Hotkey/FullWidthSwitchKey] -Type=Hotkey -DefaultValue=SHIFT_SPACE -Description=Hotkey of Switching Full Width Character Mode - -[Hotkey/PuncSwitchKey] -Type=Hotkey -DefaultValue=ALT_SPACE -Description=Hotkey of Switch Full Width Punc Mode - -[Hotkey/PrevPageKey] -Type=Hotkey -DefaultValue=- -Description=Hotkey of Going Prev Page - -[Hotkey/NextPageKey] -Type=Hotkey -DefaultValue== -Description=Hotkey of Going Next Page - -[Hotkey/SecondThirdCandWordKey] -Type=String -DefaultValue=SHIFT -Description=Hotkey to Choose Second and Third Candidate Word - -[Hotkey/SaveAllKey] -Type=Hotkey -DefaultValue=CTRL_ALT_S -Description=Hotkey of Saving All Config and Input History - -[Hotkey/SwitchPreedit] -Type=Hotkey -DefaultValue=CTRL_ALT_P -Description=Hotkey of Switch Embeded Preedit +Description=Do not show input window if there is only one candidate (Hide when only preedit string must be selected) [DescriptionFile] LocaleDomain=fcitx diff -Nru fcitx-4.2.2/data/fcitx.desktop.in fcitx-4.2.4.1/data/fcitx.desktop.in --- fcitx-4.2.2/data/fcitx.desktop.in 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/data/fcitx.desktop.in 2012-06-10 14:34:48.000000000 +0000 @@ -1,6 +1,6 @@ [Desktop Entry] _Name=Fcitx -_Comment=Chinese Input Method +_Comment=Input Method Exec=fcitx Icon=fcitx Terminal=false diff -Nru fcitx-4.2.2/data/punc.mb.zh_HK fcitx-4.2.4.1/data/punc.mb.zh_HK --- fcitx-4.2.2/data/punc.mb.zh_HK 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/data/punc.mb.zh_HK 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,20 @@ +. 。 +, , +? ? +" “ ” +: : +; ; +' ‘ ’ +< 《 +> 》 +\ 、 +! ! +$ ¥ +^ …… +* × +_ —— +( ( +) ) +[ · +] 「 」 +~ ~ diff -Nru fcitx-4.2.2/data/script/fcitx-configtool fcitx-4.2.4.1/data/script/fcitx-configtool --- fcitx-4.2.2/data/script/fcitx-configtool 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/data/script/fcitx-configtool 2012-06-10 14:34:48.000000000 +0000 @@ -26,9 +26,13 @@ fi if [ $haskde = "1" ]; then - exec $command kcm_fcitx + if [ x"$1" != x ]; then + exec $command kcm_fcitx --args $1 + else + exec $command kcm_fcitx + fi else - run_gtk + run_gtk $1 fi } @@ -46,9 +50,9 @@ { command=`which fcitx-config-gtk3 2>&1` if [ $? -eq 0 ]; then - exec $command + exec $command $1 else - run_gtk + run_gtk $1 fi } @@ -56,7 +60,11 @@ { command=`which xdg-open` if [ $? -eq 0 ]; then - exec $command $HOME/.config/fcitx/config + if [ x"$1" != x ]; then + exec $command "$HOME/.config/fcitx/conf/$1.config" + else + exec $command "$HOME/.config/fcitx/config" + fi else exit 0 fi @@ -73,9 +81,9 @@ case "$DE" in kde) - run_kde + run_kde $1 ;; *) - run_gtk3 + run_gtk3 $1 ;; esac diff -Nru fcitx-4.2.2/data/table/wbpy.conf.in fcitx-4.2.4.1/data/table/wbpy.conf.in --- fcitx-4.2.2/data/table/wbpy.conf.in 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/data/table/wbpy.conf.in 2012-06-10 14:34:48.000000000 +0000 @@ -14,4 +14,5 @@ ExactMatch=False PromptTableCode=False Enabled=True -LangCode=zh_CN \ No newline at end of file +LangCode=zh_CN +NoMatchDontCommit=True \ No newline at end of file diff -Nru fcitx-4.2.2/data/table/wbx.conf.in fcitx-4.2.4.1/data/table/wbx.conf.in --- fcitx-4.2.2/data/table/wbx.conf.in 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/data/table/wbx.conf.in 2012-06-10 14:34:48.000000000 +0000 @@ -19,4 +19,5 @@ PromptTableCode=False Symbol=zzzz Enabled=True -LangCode=zh_CN \ No newline at end of file +LangCode=zh_CN +NoMatchDontCommit=True \ No newline at end of file diff -Nru fcitx-4.2.2/data/vk.conf fcitx-4.2.4.1/data/vk.conf --- fcitx-4.2.2/data/vk.conf 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/data/vk.conf 2012-06-10 14:34:48.000000000 +0000 @@ -1,7 +1,7 @@ -#格式: 键名=全角字符 上档键对应字符 +#Format: Key=Character Shift-Character [VK] -NAME=西文半角 +NAME=Latin `=` ~ 1=1 ! 2=2 @ @@ -51,7 +51,7 @@ /=/ ? [VK] -NAME=全角符号 +NAME=Fullwidth `=`  ̄ 1=1 ! 2=2 @ @@ -101,7 +101,7 @@ /=/ ? [VK] -NAME=希腊字母 +NAME=Greek w=ς Σ e=ε Ε r=ρ Ρ @@ -120,8 +120,8 @@ j=ξ Ξ k=κ Κ l=λ Λ -z=ζ Ζ -x=χ Χ +z=ζ Ζ +x=χ Χ c=ψ Ψ v=ω Ω b=β Β @@ -129,7 +129,7 @@ m=μ Μ [VK] -NAME=俄文字母 +NAME=Russian q=й Ц w=ц Ц e=у У @@ -166,7 +166,7 @@ 3=3 № [VK] -NAME=数字序号 +NAME=Index 1=Ⅰ 2=Ⅱ 3=Ⅲ @@ -211,7 +211,7 @@ /=⑽ ⒇ [VK] -NAME=数学符号 +NAME=Math `=≈ 1=≡ 2=≠ @@ -252,7 +252,7 @@ .=√ [VK] -NAME=数字符号 +NAME=Number 1=° 2=′ 3=″ @@ -289,7 +289,7 @@ v=微 [VK] -NAME=特殊符号 +NAME=Special q=§ w=№ e=☆ @@ -320,7 +320,7 @@ .=℃ [VK] -NAME=日文平假名 +NAME=Hiragana `=ぁ あ 1=ぃ い 2=ぅ う @@ -370,7 +370,7 @@ /=を ? [VK] -NAME=日文片假名 +NAME=Katakana `=ァ ア 1=ィ イ 2=ゥ ウ @@ -420,7 +420,7 @@ /=ヲ ? [VK] -NAME=制表符 +NAME=Table Symbol `=┌ ┕ 1=┍ ┕ 2=┎ ┖ diff -Nru fcitx-4.2.2/debian/changelog fcitx-4.2.4.1/debian/changelog --- fcitx-4.2.2/debian/changelog 2012-04-26 18:47:16.000000000 +0000 +++ fcitx-4.2.4.1/debian/changelog 2012-06-30 09:25:16.000000000 +0000 @@ -1,4 +1,74 @@ -fcitx (1:4.2.2-1~precise) precise; urgency=low +fcitx (1:4.2.4.1-2~precise) precise; urgency=low + + * Upstream patches + - icon fallback chain fix + - fix a memory overflow + * fix the section of gir1.2-fcitx-1.0 to introspection. + + -- YunQiang Su Mon, 18 Jun 2012 17:20:32 +0800 + +fcitx (1:4.2.4.1-1) unstable; urgency=low + + [ Aron Xu ] + * Some small changes. + * Remove B-D that does not need to declare. + + [ YunQiang Su ] + * Rebase to upstream bugfix release 4.2.4.1 + + -- YunQiang Su Mon, 11 Jun 2012 00:49:35 +0800 + +fcitx (1:4.2.4-2) unstable; urgency=low + + [ Aron Xu ] + * Various small changes. + + [ YunQiang Su ] + * Disable huge .xsession-errors. + + -- YunQiang Su Sat, 09 Jun 2012 14:39:39 +0800 + +fcitx (1:4.2.4-1) unstable; urgency=low + + * Import upstream release. + - fcitx-keyboard merged into fcitx-module-x11. + - Add gir1.2-fcitx-1.0 package. + - Install imicon/* to fcitx-data. + - Install imselector module to fcitx-modules. + * Drop patches merged into upstream: + - 0001-dont-show-dialog-at-first-run.patch + - 0004-upstream-post-release-changes.patch + + -- YunQiang Su Fri, 25 May 2012 02:43:02 +0800 + +fcitx (1:4.2.3-2) unstable; urgency=low + + * debian/patches/0004-upstream-post-release-changes.patch: + Add upstream fix for testpinyin, to avoid its segfaults. + + -- Aron Xu Sat, 12 May 2012 01:37:19 +0800 + +fcitx (1:4.2.3-1) unstable; urgency=low + + * New upstream release: + - Lua extension support. + - Surrounding text support. + - Super key can be used in shortcuts, again. + - Update fcitx-pinyin algorithm. + - txt2mb and mb2txt support new English format + - Commit input when losing focus. + - Bug fixes and classic ui improvements. + * Add binary package: fcitx-module-lua + * Rename fcitx-ui-kimpanel to fcitx-module-kimpanel, related + package descriptions are modified. + * Enable Xinerama support for multi-head display. + * Improve dependency relations. + * Bump std-ver to 3.9.3 from 3.9.2, no change required. + * dh_install now called with --fail-missing + + -- Aron Xu Sun, 06 May 2012 22:37:00 +0000 + +fcitx (1:4.2.2-1) unstable; urgency=low * New upstream release. * rm rec: kdebase-bin, sug: plasma-widgets-addons. diff -Nru fcitx-4.2.2/debian/control fcitx-4.2.4.1/debian/control --- fcitx-4.2.2/debian/control 2012-04-08 06:44:47.000000000 +0000 +++ fcitx-4.2.4.1/debian/control 2012-06-30 09:26:09.000000000 +0000 @@ -4,10 +4,12 @@ Maintainer: IME Packaging Team Uploaders: Aron Xu , YunQiang Su DM-Upload-Allowed: yes -Build-Depends: debhelper (>= 9), cmake, intltool (>= 0.35.0), +Build-Depends: debhelper (>= 9), cmake, intltool (>= 0.35.0), liblua5.1-0-dev, libdbus-1-dev (>= 1.1.0), libpango1.0-dev (>= 1.0), libcairo2-dev (>= 1.0), - libdbus-glib-1-dev, libopencc-dev (>= 0.1.1~), libicu-dev, - libgtk2.0-dev, libqt4-dev, libgtk-3-dev, libkvm-dev [kfreebsd-any] + libopencc-dev (>= 0.1.1~), libicu-dev, x11proto-xinerama-dev, + libgtk2.0-dev, libqt4-dev, libgtk-3-dev, libkvm-dev [kfreebsd-any], + libenchant-dev, libpresage-dev, libxml2-dev, libxkbfile-dev, gobject-introspection, + libgirepository1.0-dev, iso-codes Standards-Version: 3.9.3 Homepage: http://code.google.com/p/fcitx/ Vcs-Git: git://git.debian.org/pkg-ime/fcitx.git @@ -15,13 +17,12 @@ Package: fcitx Architecture: all -Depends: ${misc:Depends}, fcitx-bin, fcitx-data, fcitx-modules, - fcitx-module-x11, fcitx-ui-classic -Recommends: fcitx-pinyin, fcitx-googlepinyin | fcitx-sunpinyin, - fcitx-table-wubi | fcitx-table-wbpy, fcitx-config-gtk, - fcitx-frontend-gtk2, fcitx-frontend-gtk3, fcitx-frontend-qt4, +Depends: ${misc:Depends}, fcitx-bin, fcitx-data, fcitx-modules +Recommends: fcitx-config-gtk | kde-config-fcitx, + fcitx-frontend-all | fcitx-frontend-fbterm, + fcitx-ui-classic | fcitx-ui-light, im-config (>= 0.5) | im-switch -Suggests: fcitx-tools +Suggests: fcitx-tools, fcitx-m17n Description: Flexible Input Method Framework Fcitx is a input method framework with extension support, which provides an interface for entering characters of different scripts in applications @@ -60,12 +61,12 @@ Package: fcitx-data Architecture: all +Multi-Arch: foreign Depends: ${misc:Depends} Recommends: fcitx-bin Suggests: fcitx (>= 1:4.2.0) Replaces: fcitx (<< 1:4.2.0) Breaks: fcitx (<< 1:4.2.0) -Multi-arch: foreign Description: Flexible Input Method Framework - essential data files Fcitx is a input method framework with extension support, which provides an interface for entering characters of different scripts in applications @@ -124,15 +125,14 @@ . This package provides the library development files. -Package: fcitx-dbg +Package: gir1.2-fcitx-1.0 Architecture: any -Section: debug -Priority: extra -Depends: ${misc:Depends}, fcitx-libs (= ${binary:Version}) -Provides: fcitx-libs-dbg -Replaces: fcitx (<< 1:4.2.0), fcitx-libs-dbg -Breaks: fcitx (<< 1:4.2.0), fcitx-libs-dbg -Description: Flexible Input Method Framework - debugging symbols +Section: introspection +Depends: ${gir:Depends}, ${misc:Depends} +Suggests: fcitx (>= 1:4.2.0) +Replaces: fcitx (<< 1:4.2.0) +Breaks: fcitx (<< 1:4.2.0) +Description: Flexible Input Method Framework - GObject introspection Fcitx is a input method framework with extension support, which provides an interface for entering characters of different scripts in applications using a variety of mapping systems. @@ -143,14 +143,18 @@ for UIs based on Fbterm, pure Xlib, GTK+, or KDE, and a developer-friendly API. . - This package provides the debugging symbols of the whole Fcitx. + This package can be used by other packages using the GIRepository format to + generate dynamic bindings. -Package: fcitx-ui-kimpanel +Package: fcitx-dbg Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, fcitx-module-dbus +Section: debug +Priority: extra +Multi-Arch: same +Depends: ${misc:Depends}, fcitx-libs (= ${binary:Version}) Replaces: fcitx (<< 1:4.2.0) Breaks: fcitx (<< 1:4.2.0) -Description: Flexible Input Method Framework - KIMPanel user interface +Description: Flexible Input Method Framework - debugging symbols Fcitx is a input method framework with extension support, which provides an interface for entering characters of different scripts in applications using a variety of mapping systems. @@ -161,10 +165,7 @@ for UIs based on Fbterm, pure Xlib, GTK+, or KDE, and a developer-friendly API. . - This package provides the KIMPanel user interface of Fcitx, which is a - good choice for KDE4 users. Also it implements a protocol to talk with - D-Bus, so it might be needed by other desktop environment users like - GNOME Shell and Unity. + This package provides the debugging symbols of the whole Fcitx. Package: fcitx-ui-classic Architecture: any @@ -191,8 +192,8 @@ Package: fcitx-frontend-all Architecture: all -Depends: ${misc:Depends}, fcitx-frontend-gtk2, fcitx-frontend-gtk3, - fcitx-frontend-qt4, fcitx-module-x11, fcitx-module-dbus +Depends: ${misc:Depends} +Recommends: fcitx-frontend-gtk2, fcitx-frontend-gtk3, fcitx-frontend-qt4 Description: Flexible Input Method Framework - frontends metapackage Fcitx is a input method framework with extension support, which provides an interface for entering characters of different scripts in applications @@ -208,12 +209,10 @@ * XIM protocol client * GTK+ 2/3 IM Module * QT 4 IM Module - * IPC frontend (based on D-Bus, used by various IM Modules) Package: fcitx-frontend-gtk2 Architecture: any Multi-Arch: same -Pre-Depends: ${misc:Pre-Depends} Depends: ${shlibs:Depends}, ${misc:Depends}, fcitx-module-dbus Recommends: fcitx-frontend-gtk3 Description: Flexible Input Method Framework - GTK+ 2 IM Module frontend @@ -233,7 +232,6 @@ Package: fcitx-frontend-gtk3 Architecture: any Multi-Arch: same -Pre-Depends: ${misc:Pre-Depends} Depends: ${shlibs:Depends}, ${misc:Depends}, fcitx-module-dbus Recommends: fcitx-frontend-gtk2 Description: Flexible Input Method Framework - GTK+ 3 IM Module frontend @@ -253,6 +251,7 @@ Package: fcitx-frontend-qt4 Architecture: any +Multi-Arch: same Depends: ${shlibs:Depends}, ${misc:Depends}, fcitx-module-dbus Description: Flexible Input Method Framework - QT 4 IM Module frontend Fcitx is a input method framework with extension support, which provides @@ -287,7 +286,7 @@ API. . This package provides the classic Pinyin input method, which features - very short responding time by reading all words into RAM during + very short responding time by loading the whole dict into RAM during activation. Package: fcitx-qw @@ -313,6 +312,7 @@ Depends: ${shlibs:Depends}, ${misc:Depends}, fcitx (>= 1:4.2.0), fcitx-pinyin (>= 1:4.2.0) Replaces: fcitx (<< 1:4.2.0) Breaks: fcitx (<< 1:4.2.0) +Suggests: fcitx-table-all Description: Flexible Input Method Framework - table engine Fcitx is a input method framework with extension support, which provides an interface for entering characters of different scripts in applications @@ -330,7 +330,8 @@ Package: fcitx-table-all Architecture: all -Depends: ${misc:Depends}, fcitx-table-bingchan, fcitx-table-cangjie, +Depends: ${misc:Depends} +Recommends: fcitx-table-bingchan, fcitx-table-cangjie, fcitx-table-dianbaoma, fcitx-table-erbi, fcitx-table-wanfeng, fcitx-table-wbpy, fcitx-table-wubi, fcitx-table-ziranma Description: Flexible Input Method Framework - tables metapackage @@ -344,7 +345,7 @@ for UIs based on Fbterm, pure Xlib, GTK+, or KDE, and a developer-friendly API. . - This metapackage pulls in the following tables: + This metapackage pulls in tables shipped with Fcitx main program: * Cangjie * Dianbaoma * Erbi @@ -485,10 +486,11 @@ Package: fcitx-modules Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} -Recommends: fcitx (>= 1:4.2.0), fcitx-module-vk, fcitx-module-x11, - fcitx-module-dbus -Replaces: fcitx (<< 1:4.2.0) -Breaks: fcitx (<< 1:4.2.0) +Recommends: fcitx (>= 1:4.2.0), fcitx-module-dbus, + fcitx-module-kimpanel, fcitx-module-lua, fcitx-module-x11 +Replaces: fcitx (<< 1:4.2.0), fcitx-keyboard +Breaks: fcitx (<< 1:4.2.0), fcitx-keyboard +Provides: fcitx-keyboard Description: Flexible Input Method Framework - core modules Fcitx is a input method framework with extension support, which provides an interface for entering characters of different scripts in applications @@ -500,7 +502,7 @@ for UIs based on Fbterm, pure Xlib, GTK+, or KDE, and a developer-friendly API. . - This metapackage pulls in the following modules: + This package includes the following common modules: * autoeng: automatically change to English mode while inputing specific string * chttrans: convert Simplified Chinese text to Traditional (libopencc backend) * fullwidthchar: full-width character input support @@ -523,8 +525,8 @@ for UIs based on Fbterm, pure Xlib, GTK+, or KDE, and a developer-friendly API. . - This package provides the D-Bus module and IPC frontend which are directly - used by various IM Modules and UIs like KIMPanel support for instance. + This package provides the D-Bus module and IPC interface which are directly + used by IM Modules and KIMPanel support for instance. Package: fcitx-module-x11 Architecture: any @@ -548,6 +550,46 @@ XIM frontend (client) is placed in this package too because of its nature of being the basic input protocol supported by X. +Package: fcitx-module-lua +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, fcitx-modules +Description: Flexible Input Method Framework - Lua module + Fcitx is a input method framework with extension support, which provides + an interface for entering characters of different scripts in applications + using a variety of mapping systems. + . + It offers a pleasant and modern experience, with intuitive graphical + configuration tools and customizable skins and mapping tables. It is + highly modularized and extensible, with GTK+ 2/3 and Qt4 IM Modules, support + for UIs based on Fbterm, pure Xlib, GTK+, or KDE, and a developer-friendly + API. + . + This package provides the Lua module, which enables users to extend their + usage with the Lua programming language. + +Package: fcitx-module-kimpanel +Architecture: any +Multi-Arch: foreign +Depends: ${shlibs:Depends}, ${misc:Depends}, fcitx-module-dbus +Replaces: fcitx (<< 1:4.2.0), fcitx-ui-kimpanel +Provides: fcitx-ui-kimpanel +Breaks: fcitx (<< 1:4.2.0) +Suggests: kdebase-bin, plasma-widgets-addons +Description: Flexible Input Method Framework - KIMPanel protocol module + Fcitx is a input method framework with extension support, which provides + an interface for entering characters of different scripts in applications + using a variety of mapping systems. + . + It offers a pleasant and modern experience, with intuitive graphical + configuration tools and customizable skins and mapping tables. It is + highly modularized and extensible, with GTK+ 2/3 and Qt4 IM Modules, support + for UIs based on Fbterm, pure Xlib, GTK+, or KDE, and a developer-friendly + API. + . + This package provides the KIMPanel protocol module of Fcitx, which + implements a protocol to talk with D-Bus and is usually needed by the + plugin for environments like KIMPanel/(Q)KIMToy, GNOME Shell and Unity. + Package: fcitx-tools Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} diff -Nru fcitx-4.2.2/debian/control.in fcitx-4.2.4.1/debian/control.in --- fcitx-4.2.2/debian/control.in 2012-02-05 13:32:57.000000000 +0000 +++ fcitx-4.2.4.1/debian/control.in 2012-06-18 09:31:43.000000000 +0000 @@ -2,27 +2,27 @@ Section: utils Priority: optional Maintainer: IME Packaging Team -Uploaders: Aron Xu , LI Daobing , - YunQiang Su +Uploaders: Aron Xu , YunQiang Su DM-Upload-Allowed: yes -Build-Depends: debhelper (>= 9), cmake, intltool (>= 0.35.0), +Build-Depends: debhelper (>= 9), cmake, intltool (>= 0.35.0), liblua5.1-0-dev, libdbus-1-dev (>= 1.1.0), libpango1.0-dev (>= 1.0), libcairo2-dev (>= 1.0), - libdbus-glib-1-dev, libopencc-dev (>= 0.1.1~), libicu-dev, - libgtk2.0-dev, libqt4-dev, libgtk-3-dev, libkvm-dev [kfreebsd-any] -Standards-Version: 3.9.2 + libopencc-dev (>= 0.1.1~), libicu-dev, x11proto-xinerama-dev, + libgtk2.0-dev, libqt4-dev, libgtk-3-dev, libkvm-dev [kfreebsd-any], + libenchant-dev, libpresage-dev, libxml2-dev, libxkbfile-dev, gobject-introspection, + libgirepository1.0-dev, iso-codes +Standards-Version: 3.9.3 Homepage: http://code.google.com/p/fcitx/ Vcs-Git: git://git.debian.org/pkg-ime/fcitx.git Vcs-Browser: http://git.debian.org/?p=pkg-ime/fcitx.git Package: fcitx Architecture: all -Depends: ${misc:Depends}, fcitx-bin, fcitx-data, fcitx-modules, - fcitx-module-x11, fcitx-ui-classic -Recommends: fcitx-pinyin, fcitx-googlepinyin | fcitx-sunpinyin, - fcitx-table-wubi | fcitx-table-wbpy, fcitx-config-gtk, - fcitx-frontend-gtk2, fcitx-frontend-gtk3, fcitx-frontend-qt4, +Depends: ${misc:Depends}, fcitx-bin, fcitx-data, fcitx-modules +Recommends: fcitx-config-gtk | kde-config-fcitx, + fcitx-frontend-all | fcitx-frontend-fbterm, + fcitx-ui-classic | fcitx-ui-light, im-config (>= 0.5) | im-switch -Suggests: fcitx-tools +Suggests: fcitx-tools, fcitx-m17n Description: Flexible Input Method Framework Fcitx is a input method framework with extension support, which provides an interface for entering characters of different scripts in applications @@ -41,9 +41,9 @@ Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Recommends: fcitx-data, fcitx-modules -Suggests: fcitx (>= 1:4.1.2) -Replaces: fcitx (<< 1:4.1.2) -Breaks: fcitx (<< 1:4.1.2) +Suggests: fcitx (>= 1:4.2.0) +Replaces: fcitx (<< 1:4.2.0) +Breaks: fcitx (<< 1:4.2.0) Description: Flexible Input Method Framework - essential binaries Fcitx is a input method framework with extension support, which provides an interface for entering characters of different scripts in applications @@ -61,12 +61,12 @@ Package: fcitx-data Architecture: all +Multi-Arch: foreign Depends: ${misc:Depends} Recommends: fcitx-bin -Suggests: fcitx (>= 1:4.1.2) -Replaces: fcitx (<< 1:4.1.2) -Breaks: fcitx (<< 1:4.1.2) -Multi-arch: foreign +Suggests: fcitx (>= 1:4.2.0) +Replaces: fcitx (<< 1:4.2.0) +Breaks: fcitx (<< 1:4.2.0) Description: Flexible Input Method Framework - essential data files Fcitx is a input method framework with extension support, which provides an interface for entering characters of different scripts in applications @@ -87,9 +87,9 @@ Multi-Arch: same Pre-Depends: ${misc:Pre-Depends} Depends: ${shlibs:Depends}, ${misc:Depends} -Suggests: fcitx (>= 1:4.1.2) -Replaces: fcitx (<< 1:4.1.2) -Breaks: fcitx (<< 1:4.1.2) +Suggests: fcitx (>= 1:4.2.0) +Replaces: fcitx (<< 1:4.2.0) +Breaks: fcitx (<< 1:4.2.0) Description: Flexible Input Method Framework - library files Fcitx is a input method framework with extension support, which provides an interface for entering characters of different scripts in applications @@ -110,8 +110,8 @@ Architecture: any Section: libdevel Depends: ${misc:Depends}, fcitx-libs (= ${binary:Version}) -Replaces: fcitx (<< 1:4.1.2) -Breaks: fcitx (<< 1:4.1.2) +Replaces: fcitx (<< 1:4.2.0) +Breaks: fcitx (<< 1:4.2.0) Description: Flexible Input Method Framework - library development files Fcitx is a input method framework with extension support, which provides an interface for entering characters of different scripts in applications @@ -125,15 +125,14 @@ . This package provides the library development files. -Package: fcitx-dbg +Package: gir1.2-fcitx-1.0 Architecture: any -Section: debug -Priority: extra -Depends: ${misc:Depends}, fcitx-libs (= ${binary:Version}) -Provides: fcitx-libs-dbg -Replaces: fcitx (<< 1:4.1.2), fcitx-libs-dbg -Breaks: fcitx (<< 1:4.1.2), fcitx-libs-dbg -Description: Flexible Input Method Framework - debugging symbols +Section: introspection +Depends: ${gir:Depends}, ${misc:Depends} +Suggests: fcitx (>= 1:4.2.0) +Replaces: fcitx (<< 1:4.2.0) +Breaks: fcitx (<< 1:4.2.0) +Description: Flexible Input Method Framework - GObject introspection Fcitx is a input method framework with extension support, which provides an interface for entering characters of different scripts in applications using a variety of mapping systems. @@ -144,16 +143,18 @@ for UIs based on Fbterm, pure Xlib, GTK+, or KDE, and a developer-friendly API. . - This package provides the debugging symbols of the whole Fcitx. + This package can be used by other packages using the GIRepository format to + generate dynamic bindings. -Package: fcitx-ui-kimpanel +Package: fcitx-dbg Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, fcitx-module-dbus -Recommends: kdebase-bin -Replaces: fcitx (<< 1:4.1.2) -Breaks: fcitx (<< 1:4.1.2) -Suggests: plasma-widgets-addons -Description: Flexible Input Method Framework - KIMPanel user interface +Section: debug +Priority: extra +Multi-Arch: same +Depends: ${misc:Depends}, fcitx-libs (= ${binary:Version}) +Replaces: fcitx (<< 1:4.2.0) +Breaks: fcitx (<< 1:4.2.0) +Description: Flexible Input Method Framework - debugging symbols Fcitx is a input method framework with extension support, which provides an interface for entering characters of different scripts in applications using a variety of mapping systems. @@ -164,17 +165,14 @@ for UIs based on Fbterm, pure Xlib, GTK+, or KDE, and a developer-friendly API. . - This package provides the KIMPanel user interface of Fcitx, which is a - good choice for KDE4 users. Also it implements a protocol to talk with - D-Bus, so it might be needed by other desktop environment users like - GNOME Shell and Unity. + This package provides the debugging symbols of the whole Fcitx. Package: fcitx-ui-classic Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, fcitx-module-x11 -Recommends: fcitx (>= 1:4.1.2), zenity -Replaces: fcitx (<< 1:4.1.2) -Breaks: fcitx (<< 1:4.1.2) +Recommends: fcitx (>= 1:4.2.0), zenity +Replaces: fcitx (<< 1:4.2.0) +Breaks: fcitx (<< 1:4.2.0) Description: Flexible Input Method Framework - Classic user interface Fcitx is a input method framework with extension support, which provides an interface for entering characters of different scripts in applications @@ -194,8 +192,8 @@ Package: fcitx-frontend-all Architecture: all -Depends: ${misc:Depends}, fcitx-frontend-gtk2, fcitx-frontend-gtk3, - fcitx-frontend-qt4, fcitx-module-x11, fcitx-module-dbus +Depends: ${misc:Depends} +Recommends: fcitx-frontend-gtk2, fcitx-frontend-gtk3, fcitx-frontend-qt4 Description: Flexible Input Method Framework - frontends metapackage Fcitx is a input method framework with extension support, which provides an interface for entering characters of different scripts in applications @@ -211,7 +209,6 @@ * XIM protocol client * GTK+ 2/3 IM Module * QT 4 IM Module - * IPC frontend (based on D-Bus, used by various IM Modules) Package: fcitx-frontend-gtk2 Architecture: any @@ -273,10 +270,10 @@ Package: fcitx-pinyin Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, fcitx-bin, - fcitx-data (>= 1:4.1.2), fcitx-modules -Recommends: fcitx (>= 1:4.1.2) -Replaces: fcitx (<< 1:4.1.2) -Breaks: fcitx (<< 1:4.1.2) + fcitx-data (>= 1:4.2.0), fcitx-modules +Recommends: fcitx (>= 1:4.2.0) +Replaces: fcitx (<< 1:4.2.0) +Breaks: fcitx (<< 1:4.2.0) Description: Flexible Input Method Framework - classic Pinyin engine Fcitx is a input method framework with extension support, which provides an interface for entering characters of different scripts in applications @@ -289,14 +286,14 @@ API. . This package provides the classic Pinyin input method, which features - very short responding time by reading all words into RAM during + very short responding time by loading the whole dict into RAM during activation. Package: fcitx-qw Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, fcitx (>= 1:4.1.2) -Replaces: fcitx (<< 1:4.1.2) -Breaks: fcitx (<< 1:4.1.2) +Depends: ${shlibs:Depends}, ${misc:Depends}, fcitx (>= 1:4.2.0) +Replaces: fcitx (<< 1:4.2.0) +Breaks: fcitx (<< 1:4.2.0) Description: Flexible Input Method Framework - QuWei engine Fcitx is a input method framework with extension support, which provides an interface for entering characters of different scripts in applications @@ -312,9 +309,10 @@ Package: fcitx-table Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, fcitx (>= 1:4.1.2), fcitx-pinyin (>= 1:4.1.2) -Replaces: fcitx (<< 1:4.1.2) -Breaks: fcitx (<< 1:4.1.2) +Depends: ${shlibs:Depends}, ${misc:Depends}, fcitx (>= 1:4.2.0), fcitx-pinyin (>= 1:4.2.0) +Replaces: fcitx (<< 1:4.2.0) +Breaks: fcitx (<< 1:4.2.0) +Suggests: fcitx-table-all Description: Flexible Input Method Framework - table engine Fcitx is a input method framework with extension support, which provides an interface for entering characters of different scripts in applications @@ -332,7 +330,8 @@ Package: fcitx-table-all Architecture: all -Depends: ${misc:Depends}, fcitx-table-bingchan, fcitx-table-cangjie, +Depends: ${misc:Depends} +Recommends: fcitx-table-bingchan, fcitx-table-cangjie, fcitx-table-dianbaoma, fcitx-table-erbi, fcitx-table-wanfeng, fcitx-table-wbpy, fcitx-table-wubi, fcitx-table-ziranma Description: Flexible Input Method Framework - tables metapackage @@ -346,7 +345,7 @@ for UIs based on Fbterm, pure Xlib, GTK+, or KDE, and a developer-friendly API. . - This metapackage pulls in the following tables: + This metapackage pulls in tables shipped with Fcitx main program: * Cangjie * Dianbaoma * Erbi @@ -487,10 +486,11 @@ Package: fcitx-modules Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} -Recommends: fcitx (>= 1:4.1.2), fcitx-module-vk, fcitx-module-x11, - fcitx-module-dbus -Replaces: fcitx (<< 1:4.1.2) -Breaks: fcitx (<< 1:4.1.2) +Recommends: fcitx (>= 1:4.2.0), fcitx-module-dbus, + fcitx-module-kimpanel, fcitx-module-lua, fcitx-module-x11 +Replaces: fcitx (<< 1:4.2.0), fcitx-keyboard +Breaks: fcitx (<< 1:4.2.0), fcitx-keyboard +Provides: fcitx-keyboard Description: Flexible Input Method Framework - core modules Fcitx is a input method framework with extension support, which provides an interface for entering characters of different scripts in applications @@ -502,7 +502,7 @@ for UIs based on Fbterm, pure Xlib, GTK+, or KDE, and a developer-friendly API. . - This metapackage pulls in the following modules: + This package includes the following common modules: * autoeng: automatically change to English mode while inputing specific string * chttrans: convert Simplified Chinese text to Traditional (libopencc backend) * fullwidthchar: full-width character input support @@ -525,8 +525,8 @@ for UIs based on Fbterm, pure Xlib, GTK+, or KDE, and a developer-friendly API. . - This package provides the D-Bus module and IPC frontend which are directly - used by various IM Modules and UIs like KIMPanel support for instance. + This package provides the D-Bus module and IPC interface which are directly + used by IM Modules and KIMPanel support for instance. Package: fcitx-module-x11 Architecture: any @@ -550,12 +550,52 @@ XIM frontend (client) is placed in this package too because of its nature of being the basic input protocol supported by X. +Package: fcitx-module-lua +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, fcitx-modules +Description: Flexible Input Method Framework - Lua module + Fcitx is a input method framework with extension support, which provides + an interface for entering characters of different scripts in applications + using a variety of mapping systems. + . + It offers a pleasant and modern experience, with intuitive graphical + configuration tools and customizable skins and mapping tables. It is + highly modularized and extensible, with GTK+ 2/3 and Qt4 IM Modules, support + for UIs based on Fbterm, pure Xlib, GTK+, or KDE, and a developer-friendly + API. + . + This package provides the Lua module, which enables users to extend their + usage with the Lua programming language. + +Package: fcitx-module-kimpanel +Architecture: any +Multi-Arch: foreign +Depends: ${shlibs:Depends}, ${misc:Depends}, fcitx-module-dbus +Replaces: fcitx (<< 1:4.2.0), fcitx-ui-kimpanel +Provides: fcitx-ui-kimpanel +Breaks: fcitx (<< 1:4.2.0) +Suggests: kdebase-bin, plasma-widgets-addons +Description: Flexible Input Method Framework - KIMPanel protocol module + Fcitx is a input method framework with extension support, which provides + an interface for entering characters of different scripts in applications + using a variety of mapping systems. + . + It offers a pleasant and modern experience, with intuitive graphical + configuration tools and customizable skins and mapping tables. It is + highly modularized and extensible, with GTK+ 2/3 and Qt4 IM Modules, support + for UIs based on Fbterm, pure Xlib, GTK+, or KDE, and a developer-friendly + API. + . + This package provides the KIMPanel protocol module of Fcitx, which + implements a protocol to talk with D-Bus and is usually needed by the + plugin for environments like KIMPanel/(Q)KIMToy, GNOME Shell and Unity. + Package: fcitx-tools Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Suggests: fcitx -Replaces: fcitx (<< 1:4.0.0) -Breaks: fcitx (<< 1:4.0.0) +Replaces: fcitx (<< 1:4.2.0) +Breaks: fcitx (<< 1:4.2.0) Description: Flexible Input Method Framework - various tools Fcitx is a input method framework with extension support, which provides an interface for entering characters of different scripts in applications diff -Nru fcitx-4.2.2/debian/fcitx-data.install fcitx-4.2.4.1/debian/fcitx-data.install --- fcitx-4.2.2/debian/fcitx-data.install 2012-02-05 13:32:57.000000000 +0000 +++ fcitx-4.2.4.1/debian/fcitx-data.install 2012-05-25 03:12:00.000000000 +0000 @@ -2,6 +2,7 @@ usr/share/locale/* usr/share/applications/* usr/share/mime/packages/* +usr/share/fcitx/imicon/* usr/share/fcitx/configdesc/addon.desc usr/share/fcitx/configdesc/inputmethod.desc usr/share/fcitx/configdesc/config.desc diff -Nru fcitx-4.2.2/debian/fcitx-module-kimpanel.install fcitx-4.2.4.1/debian/fcitx-module-kimpanel.install --- fcitx-4.2.2/debian/fcitx-module-kimpanel.install 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/debian/fcitx-module-kimpanel.install 2012-05-25 03:12:00.000000000 +0000 @@ -0,0 +1,2 @@ +usr/lib/*/fcitx/fcitx-kimpanel-ui.so +usr/share/fcitx/addon/fcitx-kimpanel-ui.conf diff -Nru fcitx-4.2.2/debian/fcitx-module-lua.install fcitx-4.2.4.1/debian/fcitx-module-lua.install --- fcitx-4.2.2/debian/fcitx-module-lua.install 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/debian/fcitx-module-lua.install 2012-05-25 03:12:00.000000000 +0000 @@ -0,0 +1,2 @@ +usr/lib/*/fcitx/fcitx-lua.so +usr/share/fcitx/addon/fcitx-lua.conf diff -Nru fcitx-4.2.2/debian/fcitx-modules.install fcitx-4.2.4.1/debian/fcitx-modules.install --- fcitx-4.2.2/debian/fcitx-modules.install 2012-04-08 06:41:10.000000000 +0000 +++ fcitx-4.2.4.1/debian/fcitx-modules.install 2012-05-25 03:12:00.000000000 +0000 @@ -1,17 +1,20 @@ usr/lib/*/fcitx/fcitx-autoeng.so usr/lib/*/fcitx/fcitx-chttrans.so usr/lib/*/fcitx/fcitx-fullwidth-char.so +usr/lib/*/fcitx/fcitx-imselector.so usr/lib/*/fcitx/fcitx-punc.so usr/lib/*/fcitx/fcitx-quickphrase.so usr/lib/*/fcitx/fcitx-remote-module.so usr/share/fcitx/addon/fcitx-autoeng.conf usr/share/fcitx/addon/fcitx-chttrans.conf -usr/share/fcitx/configdesc/fcitx-chttrans.desc usr/share/fcitx/addon/fcitx-fullwidth-char.conf +usr/share/fcitx/addon/fcitx-imselector.conf usr/share/fcitx/addon/fcitx-punc.conf usr/share/fcitx/addon/fcitx-quickphrase.conf -usr/share/fcitx/configdesc/fcitx-quickphrase.desc usr/share/fcitx/addon/fcitx-remote-module.conf +usr/share/fcitx/configdesc/fcitx-chttrans.desc +usr/share/fcitx/configdesc/fcitx-imselector.desc +usr/share/fcitx/configdesc/fcitx-quickphrase.desc usr/share/fcitx/data/AutoEng.dat usr/share/fcitx/data/gbks2t.tab usr/share/fcitx/data/punc.mb.* diff -Nru fcitx-4.2.2/debian/fcitx-module-x11.install fcitx-4.2.4.1/debian/fcitx-module-x11.install --- fcitx-4.2.2/debian/fcitx-module-x11.install 2012-02-05 13:32:57.000000000 +0000 +++ fcitx-4.2.4.1/debian/fcitx-module-x11.install 2012-05-25 03:12:00.000000000 +0000 @@ -6,3 +6,11 @@ usr/lib/*/fcitx/fcitx-vk.so usr/share/fcitx/addon/fcitx-vk.conf usr/share/fcitx/data/vk.conf +usr/lib/*/fcitx/fcitx-xkb.so +usr/share/fcitx/addon/fcitx-xkb.conf +usr/share/fcitx/configdesc/fcitx-xkb.desc +usr/lib/*/fcitx/fcitx-xkbdbus.so +usr/share/fcitx/addon/fcitx-xkbdbus.conf +usr/lib/*/fcitx/fcitx-keyboard.so +usr/share/fcitx/addon/fcitx-keyboard.conf +usr/share/fcitx/configdesc/fcitx-keyboard.desc diff -Nru fcitx-4.2.2/debian/fcitx-ui-kimpanel.install fcitx-4.2.4.1/debian/fcitx-ui-kimpanel.install --- fcitx-4.2.2/debian/fcitx-ui-kimpanel.install 2012-02-05 13:32:57.000000000 +0000 +++ fcitx-4.2.4.1/debian/fcitx-ui-kimpanel.install 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -usr/lib/*/fcitx/fcitx-kimpanel-ui.so -usr/share/fcitx/addon/fcitx-kimpanel-ui.conf diff -Nru fcitx-4.2.2/debian/gir1.2-fcitx-1.0.install fcitx-4.2.4.1/debian/gir1.2-fcitx-1.0.install --- fcitx-4.2.2/debian/gir1.2-fcitx-1.0.install 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/debian/gir1.2-fcitx-1.0.install 2012-05-25 03:12:00.000000000 +0000 @@ -0,0 +1,2 @@ +usr/lib/girepository-1.0/Fcitx-1.0.typelib +usr/share/gir-1.0/Fcitx-1.0.gir diff -Nru fcitx-4.2.2/debian/patches/0001-increase-dbus-max-retry-times.patch fcitx-4.2.4.1/debian/patches/0001-increase-dbus-max-retry-times.patch --- fcitx-4.2.2/debian/patches/0001-increase-dbus-max-retry-times.patch 2012-02-05 13:32:57.000000000 +0000 +++ fcitx-4.2.4.1/debian/patches/0001-increase-dbus-max-retry-times.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -From: Aron Xu -Date: Sat, 4 Feb 2012 12:23:59 +0800 -Subject: [PATCH] increase dbus max retry times - ---- - src/module/dbus/dbusstuff.c | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -diff --git a/src/module/dbus/dbusstuff.c b/src/module/dbus/dbusstuff.c -index 165c77e..e5c3297 100644 ---- a/src/module/dbus/dbusstuff.c -+++ b/src/module/dbus/dbusstuff.c -@@ -45,7 +45,7 @@ typedef struct _FcitxDBus { - } FcitxDBus; - - #define RETRY_INTERVAL 2 --#define MAX_RETRY_TIMES 5 -+#define MAX_RETRY_TIMES 15 - - static void* DBusCreate(FcitxInstance* instance); - static void DBusSetFD(void* arg); --- diff -Nru fcitx-4.2.2/debian/patches/0001-Try-to-avoid-rpath.patch fcitx-4.2.4.1/debian/patches/0001-Try-to-avoid-rpath.patch --- fcitx-4.2.2/debian/patches/0001-Try-to-avoid-rpath.patch 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/debian/patches/0001-Try-to-avoid-rpath.patch 2012-06-18 09:15:29.000000000 +0000 @@ -0,0 +1,25 @@ +From: Aron Xu +Date: Sat, 4 Feb 2012 17:00:58 +0800 +Subject: Try to avoid rpath. + +--- + CMakeLists.txt | 6 ------ + 1 个文件被修改,删除 6 行(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 6897096..a09e4e8 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -149,12 +149,6 @@ set(includedir ${CMAKE_INSTALL_PREFIX}/include) + + list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${LIB_INSTALL_DIR}" _isSystemPlatformLibDir) + list(FIND CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "${LIB_INSTALL_DIR}" _isSystemCxxLibDir) +-if("${_isSystemPlatformLibDir}" STREQUAL "-1" AND "${_isSystemCxxLibDir}" STREQUAL "-1") +- set(CMAKE_SKIP_BUILD_RPATH FALSE) +- set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) +- set(CMAKE_INSTALL_RPATH "${LIB_INSTALL_DIR}") +- set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) +-endif("${_isSystemPlatformLibDir}" STREQUAL "-1" AND "${_isSystemCxxLibDir}" STREQUAL "-1") + + # For FcitxMacro + set(FCITX4_ADDON_INSTALL_DIR ${addondir}) diff -Nru fcitx-4.2.2/debian/patches/0002-dont-show-dialog-at-first-run.patch fcitx-4.2.4.1/debian/patches/0002-dont-show-dialog-at-first-run.patch --- fcitx-4.2.2/debian/patches/0002-dont-show-dialog-at-first-run.patch 2012-04-08 06:41:10.000000000 +0000 +++ fcitx-4.2.4.1/debian/patches/0002-dont-show-dialog-at-first-run.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ -From: Aron Xu -Date: Sat, 4 Feb 2012 12:22:58 +0800 -Subject: [PATCH] dont show dialog at first run - ---- - src/lib/fcitx/instance.c | 20 -------------------- - 1 files changed, 0 insertions(+), 20 deletions(-) - ---- a/src/lib/fcitx/instance.c -+++ b/src/lib/fcitx/instance.c -@@ -175,26 +175,6 @@ - char *strTemp; - asprintf(&strTemp, "@im=%s", imname); - -- if ((getenv("XMODIFIERS") != NULL && CHECK_ENV("XMODIFIERS", strTemp, true)) || -- (CHECK_ENV("GTK_IM_MODULE", "xim", false) && CHECK_ENV("GTK_IM_MODULE", "fcitx", false)) -- || (CHECK_ENV("QT_IM_MODULE", "xim", false) && CHECK_ENV("QT_IM_MODULE", "fcitx", false))) { -- char *msg[12]; -- msg[0] = _("Please check your environment varibles."); -- msg[1] = _("You can use tools provided by your distribution."); -- msg[2] = _("Or You may need to set environment varibles below to make fcitx work correctly."); -- msg[3] = "export XMODIFIERS=\"@im=fcitx\""; -- msg[4] = "export QT_IM_MODULE=xim"; -- msg[5] = "export GTK_IM_MODULE=xim"; -- msg[6] = _("Or (Depends on you install im module or not)"); -- msg[7] = "export XMODIFIERS=\"@im=fcitx\""; -- msg[8] = "export QT_IM_MODULE=fcitx"; -- msg[9] = "export GTK_IM_MODULE=fcitx"; -- msg[10] = _("If you use login manager like gdm or kdm, put those lines in your ~/.xprofile."); -- msg[11] = _("If you use ~/.xinitrc and startx, put those lines in ~/.xinitrc."); -- -- FcitxUIDisplayMessage(instance, _("Setting Hint"), msg, 12); -- } -- - free(strTemp); - } - /* make in order to use block X, query is not good here */ diff -Nru fcitx-4.2.2/debian/patches/0002-no-display-desktop.patch fcitx-4.2.4.1/debian/patches/0002-no-display-desktop.patch --- fcitx-4.2.2/debian/patches/0002-no-display-desktop.patch 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/debian/patches/0002-no-display-desktop.patch 2012-06-18 09:15:29.000000000 +0000 @@ -0,0 +1,20 @@ +From: IME Packaging Team +Date: Mon, 18 Jun 2012 17:11:40 +0800 +Subject: 0002-no-display-desktop + +--- + data/fcitx.desktop.in | 1 + + 1 个文件被修改,插入 1 行(+) + +diff --git a/data/fcitx.desktop.in b/data/fcitx.desktop.in +index f05cec4..6187a31 100644 +--- a/data/fcitx.desktop.in ++++ b/data/fcitx.desktop.in +@@ -4,6 +4,7 @@ _Comment=Input Method + Exec=fcitx + Icon=fcitx + Terminal=false ++NoDisplay=true + Type=Application + Categories=System;Utility; + StartupNotify=false diff -Nru fcitx-4.2.2/debian/patches/0003-backport-upstream-patch.patch fcitx-4.2.4.1/debian/patches/0003-backport-upstream-patch.patch --- fcitx-4.2.2/debian/patches/0003-backport-upstream-patch.patch 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/debian/patches/0003-backport-upstream-patch.patch 2012-06-18 09:19:55.000000000 +0000 @@ -0,0 +1,45 @@ +From: CSSlayer +Date: Mon, 18 Jun 2012 17:14:21 +0800 +Subject: backport upstream patch + +fix a memory overflow +backport icon fallback chain fix +--- + src/module/xkb/xkb.c | 5 ++--- + src/ui/classic/skin.c | 2 +- + 2 个文件被修改,插入 3 行(+),删除 4 行(-) + +diff --git a/src/module/xkb/xkb.c b/src/module/xkb/xkb.c +index 1cdc081..35922b2 100644 +--- a/src/module/xkb/xkb.c ++++ b/src/module/xkb/xkb.c +@@ -197,8 +197,7 @@ static char* FcitxXkbFindXkbRulesFile(FcitxXkb* xkb) + xkbParentDir = strdup("/usr/share/X11"); + } + +- rulesFile = fcitx_utils_malloc0(sizeof(char) * (1 + strlen(xkbParentDir) + strlen(rulesName) + strlen("/xkb/rules/"))); +- sprintf(rulesFile, "%s/xkb/rules/%s.xml", xkbParentDir, rulesName); ++ asprintf(&rulesFile, "%s/xkb/rules/%s.xml", xkbParentDir, rulesName); + fcitx_utils_free(xkbParentDir); + } + +@@ -900,4 +899,4 @@ void* FcitxXkbSetLayoutOverride(void* arg, FcitxModuleFunctionArg args) + FcitxXkbCurrentStateChanged(xkb); + + return NULL; +-} +\ No newline at end of file ++} +diff --git a/src/ui/classic/skin.c b/src/ui/classic/skin.c +index 24b1a66..22ac207 100644 +--- a/src/ui/classic/skin.c ++++ b/src/ui/classic/skin.c +@@ -216,7 +216,7 @@ SkinImage* LoadImageFromTable(SkinImage** imageTable, const char* skinType, cons + const char* fallbackChainNoFallback[] = { buf }; + const char* fallbackChainPanel[] = { buf, "skin/default" }; + const char* fallbackChainTray[] = { "imicon" }; +- const char* fallbackChainPanelIMIcon[] = { buf, "imicon" }; ++ const char* fallbackChainPanelIMIcon[] = { buf, "skin/default" }; + + HASH_FIND_STR(*imageTable, name, image); + if (image != NULL) { diff -Nru fcitx-4.2.2/debian/patches/0003-Fix-bashisms-in-scripts.patch fcitx-4.2.4.1/debian/patches/0003-Fix-bashisms-in-scripts.patch --- fcitx-4.2.2/debian/patches/0003-Fix-bashisms-in-scripts.patch 2012-02-05 13:32:57.000000000 +0000 +++ fcitx-4.2.4.1/debian/patches/0003-Fix-bashisms-in-scripts.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,67 +0,0 @@ -From: Aron Xu -Date: Sat, 4 Feb 2012 15:30:56 +0800 -Subject: [PATCH] Fix bashisms in scripts. - -This commit fixes bashisms in scripts that are targeted to user -systems, excluding developer-targeted own convenient scripts. This -means they are complying with POSIX standards now and should be -working with any POSIX compliant shell. ---- - data/script/fcitx-configtool | 4 ++-- - src/ui/classic/fcitx-skin-installer.sh | 10 +++++----- - 2 files changed, 7 insertions(+), 7 deletions(-) - -diff --git a/data/script/fcitx-configtool b/data/script/fcitx-configtool -index 592ddb3..0b573ac 100755 ---- a/data/script/fcitx-configtool -+++ b/data/script/fcitx-configtool -@@ -63,8 +63,8 @@ run_xdg() - } - - if [ ! -n "$DISPLAY" ]; then -- [ -n "$EDITOR" ] && which $EDITOR >& /dev/null && exec $EDITOR $HOME/.config/fcitx/config -- [ -n "$VISUAL" ] && which $VISUAL >& /dev/null && exec $VISUAL $HOME/.config/fcitx/config -+ [ -n "$EDITOR" ] && which $EDITOR > /dev/null 2>&1 && exec $EDITOR $HOME/.config/fcitx/config -+ [ -n "$VISUAL" ] && which $VISUAL > /dev/null 2>&1 && exec $VISUAL $HOME/.config/fcitx/config - echo 'Please run it under X, or set $EDITOR or $VISUAL' - exit 0 - fi -diff --git a/src/ui/classic/fcitx-skin-installer.sh b/src/ui/classic/fcitx-skin-installer.sh -index db3a8aa..bae110b 100644 ---- a/src/ui/classic/fcitx-skin-installer.sh -+++ b/src/ui/classic/fcitx-skin-installer.sh -@@ -13,28 +13,28 @@ else - MESSAGE_COMMON="echo" - fi - --function zenity_error() -+zenity_error() - { - zenity --error --text="$1" - } - --function zenity_info() -+zenity_info() - { - zenity --info --text="$1" - } - --function usage() -+usage() - { - echo "Usage: fcitx-skin-installer [skin file]" - exit 1 - } - --function message() -+message() - { - $MESSAGE_COMMON "$1" - } - --function error() -+error() - { - $MESSAGE_ERROR "$1" - } --- diff -Nru fcitx-4.2.2/debian/patches/0004-Try-to-avoid-rpath.patch fcitx-4.2.4.1/debian/patches/0004-Try-to-avoid-rpath.patch --- fcitx-4.2.2/debian/patches/0004-Try-to-avoid-rpath.patch 2012-04-08 06:41:10.000000000 +0000 +++ fcitx-4.2.4.1/debian/patches/0004-Try-to-avoid-rpath.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -From: Aron Xu -Date: Sat, 4 Feb 2012 17:00:58 +0800 -Subject: [PATCH] Try to avoid rpath. - ---- - CMakeLists.txt | 6 ------ - 1 files changed, 0 insertions(+), 6 deletions(-) - ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -126,12 +126,6 @@ - - list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${LIB_INSTALL_DIR}" _isSystemPlatformLibDir) - list(FIND CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "${LIB_INSTALL_DIR}" _isSystemCxxLibDir) --if("${_isSystemPlatformLibDir}" STREQUAL "-1" AND "${_isSystemCxxLibDir}" STREQUAL "-1") -- set(CMAKE_SKIP_BUILD_RPATH FALSE) -- set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) -- set(CMAKE_INSTALL_RPATH "${LIB_INSTALL_DIR}") -- set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) --endif("${_isSystemPlatformLibDir}" STREQUAL "-1" AND "${_isSystemCxxLibDir}" STREQUAL "-1") - - # For FcitxMacro - set(FCITX4_ADDON_INSTALL_DIR ${addondir}) diff -Nru fcitx-4.2.2/debian/patches/series fcitx-4.2.4.1/debian/patches/series --- fcitx-4.2.2/debian/patches/series 2012-04-08 06:41:10.000000000 +0000 +++ fcitx-4.2.4.1/debian/patches/series 2012-06-18 09:27:44.000000000 +0000 @@ -1,3 +1,3 @@ -0001-increase-dbus-max-retry-times.patch -0002-dont-show-dialog-at-first-run.patch -0004-Try-to-avoid-rpath.patch +0001-Try-to-avoid-rpath.patch +0002-no-display-desktop.patch +0003-backport-upstream-patch.patch diff -Nru fcitx-4.2.2/debian/rules fcitx-4.2.4.1/debian/rules --- fcitx-4.2.2/debian/rules 2012-02-05 13:32:57.000000000 +0000 +++ fcitx-4.2.4.1/debian/rules 2012-06-30 09:26:00.000000000 +0000 @@ -3,6 +3,8 @@ include debian/gencontrol.mk %: dh $@ +override_dh_auto_clean: gen_control + dh_auto_clean override_dh_auto_configure: gen_control dh_auto_configure -- \ -DLIB_INSTALL_DIR=/usr/lib/$(DEB_HOST_MULTIARCH) \ @@ -11,11 +13,17 @@ -DENABLE_PANGO=ON \ -DENABLE_DEBUG=ON \ -DENABLE_TABLE=ON \ - -DENABLE_STATIC=ON \ -DENABLE_GTK2_IM_MODULE=ON \ -DENABLE_GTK3_IM_MODULE=ON \ -DENABLE_QT_IM_MODULE=ON \ - -DENABLE_OPENCC=ON + -DENABLE_OPENCC=ON \ + -DENABLE_LUA=ON \ + -DENABLE_STATIC=ON \ + -DENABLE_TEST=ON \ + -DENABLE_SNOOPER=ON \ + -DENABLE_GIR=ON +override_dh_install: + dh_install --fail-missing override_dh_makeshlibs: dh_makeshlibs -pfcitx-libs override_dh_strip: diff -Nru fcitx-4.2.2/Doxyfile.in fcitx-4.2.4.1/Doxyfile.in --- fcitx-4.2.2/Doxyfile.in 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/Doxyfile.in 2012-06-10 14:34:48.000000000 +0000 @@ -14,276 +14,276 @@ # Project related configuration options #--------------------------------------------------------------------------- -# This tag specifies the encoding used for all characters in the config 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 +# This tag specifies the encoding used for all characters in the config 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 # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = "@PROJECT_NAME@" -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or +# 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 = "@version@" -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# 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 = "@DOXYFILE_OUTPUT_DIR@" -# 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 +# 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 cause performance problems for the file system. CREATE_SUBDIRS = 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. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, -# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, -# Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene, +# 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. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, +# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, +# Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene, # Spanish, Swedish, and Ukrainian. OUTPUT_LANGUAGE = English -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) 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. BRIEF_MEMBER_DESC = YES -# If the REPEAT_BRIEF tag is set to YES (the default) 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 +# If the REPEAT_BRIEF tag is set to YES (the default) 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. REPEAT_BRIEF = YES -# 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" +# 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" "the" -ABBREVIATE_BRIEF = +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 +# 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. 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 +# 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. INLINE_INHERITED_MEMB = NO -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set +# If the FULL_PATH_NAMES tag is set to YES then 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. FULL_PATH_NAMES = NO -# If the FULL_PATH_NAMES tag is set to YES then 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 +# If the FULL_PATH_NAMES tag is set to YES then 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. -STRIP_FROM_PATH = +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 include paths that +# 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 include paths that # are normally passed to the compiler using the -I flag. -STRIP_FROM_INC_PATH = +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 +# 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. 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 -# comments will behave just like regular Qt-style comments +# 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 +# comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = 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 comments -# will behave just like regular Qt-style comments (thus requiring +# 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 comments +# will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) 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 behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed +# 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 behaviour. +# 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 behaviour instead. MULTILINE_CPP_IS_BRIEF = NO -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it # re-implements. 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 +# 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. SEPARATE_MEMBER_PAGES = NO -# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# 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. TAB_SIZE = 8 -# This tag can be used to specify a number of aliases that acts -# 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:". +# This tag can be used to specify a number of aliases that acts +# 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. -ALIASES = +ALIASES = -# 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 +# 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. OPTIMIZE_OUTPUT_FOR_C = NO -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -# sources only. Doxygen will then generate output that is more tailored for -# Java. For instance, namespaces will be presented as packages, qualified +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources only. Doxygen will then generate output that is more tailored for +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for # Fortran. 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 +# 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. OPTIMIZE_OUTPUT_VHDL = 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, C#, C, C++, D, PHP, -# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat -# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), +# 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, C#, C, C++, D, PHP, +# Objective-C, Python, Fortran, VHDL, C, C++. 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 -EXTENSION_MAPPING = +EXTENSION_MAPPING = -# 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); v.s. -# func(std::string) {}). This also make the inheritance and collaboration +# 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); v.s. +# func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO -# If you use Microsoft's C++/CLI language, you should set this option to YES to +# If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO -# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. -# Doxygen will parse them like normal C++ but will assume all classes use public +# Set the SIP_SUPPORT tag to YES if your project consists of sip 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. 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 (the default) -# 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 +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# 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. 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 +# 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. DISTRIBUTE_GROUP_DOC = NO -# Set the SUBGROUPING tag to YES (the default) 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 +# Set the SUBGROUPING tag to YES (the default) 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. SUBGROUPING = YES -# When TYPEDEF_HIDES_STRUCT 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 +# When TYPEDEF_HIDES_STRUCT 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. TYPEDEF_HIDES_STRUCT = NO -# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to -# determine which symbols to keep in memory and which to flush to disk. -# When the cache is full, less often used symbols will be written to disk. -# For small to medium size projects (<1000 input files) the default value is -# probably good enough. For larger projects a too small cache size can cause -# doxygen to be busy swapping symbols to and from disk most of the time -# causing a significant performance penality. -# If the system has enough physical memory increasing the cache will improve the -# performance by keeping more symbols in memory. Note that the value works on -# a logarithmic scale so increasing the size by one will rougly double the -# memory usage. The cache size is given by this formula: -# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penality. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will rougly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 @@ -292,384 +292,385 @@ # 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 +# 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 and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO -# If the EXTRACT_STATIC tag is set to YES all static members of a file +# If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO -# 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 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. EXTRACT_LOCAL_CLASSES = YES -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. +# This flag is only useful for Objective-C code. When 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 (the default) only methods in the interface are included. 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 +# 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. EXTRACT_ANON_NSPACES = NO -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) 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. HIDE_UNDOC_MEMBERS = NO -# 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 (the default) these classes will be included in the various +# 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 (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the # documentation. 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 (the default) these blocks will be appended to the +# 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 (the default) these blocks will be appended to the # function's detailed documentation block. 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 (the default) then the documentation will be excluded. +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. 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 +# 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 # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES -# If the SORT_MEMBER_DOCS tag is set to YES (the default) 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 +# If the SORT_MEMBER_DOCS tag is set to YES (the default) 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. SORT_MEMBER_DOCS = YES -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = 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 default) +# 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 default) # the group names will appear in their defined order. 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 default), 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 +# 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 default), 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. SORT_BY_SCOPE_NAME = NO -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo +# 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. 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 +# 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. 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 +# 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. 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 +# 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. GENERATE_DEPRECATEDLIST= YES -# The ENABLED_SECTIONS tag can be used to enable conditional +# The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. -ENABLED_SECTIONS = +ENABLED_SECTIONS = -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of 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 initializer of individual variables and defines in the -# documentation can be controlled using \showinitializer or \hideinitializer +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of 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 initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. 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 +# 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. SHOW_USED_FILES = YES -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO -# 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 +# 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 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 +# 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 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 , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output +# 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 , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. -FILE_VERSION_FILTER = +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. The 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 +# 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. The 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. -LAYOUT_FILE = +LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- -# The QUIET tag can be used to turn on/off the messages that are generated +# The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = YES -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# If WARN_IF_UNDOCUMENTED 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. WARN_IF_UNDOCUMENTED = YES -# If WARN_IF_DOC_ERROR 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 +# If WARN_IF_DOC_ERROR 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. WARN_IF_DOC_ERROR = YES -# This WARN_NO_PARAMDOC option can be abled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = 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 +# 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) 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 +# 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 stderr. -WARN_LOGFILE = +WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- -# The INPUT tag can be 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 +# The INPUT tag can be 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. INPUT = src/lib/ -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is -# also the default input encoding. Doxygen uses libiconv (or the iconv built -# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. 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 pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# If the value of the INPUT tag contains directories, you can use the +# FILE_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 the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = *.h -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a +# The EXCLUDE tag can be used to specify files and/or directories that should +# 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. EXCLUDE = "src/lib/fcitx-utils/utarray.h" "src/lib/fcitx-utils/uthash.h" \ "src/lib/fcitx/addon-internal.h" "src/lib/fcitx/ime-internal.h" \ "src/lib/fcitx/context-internal.h" "src/lib/fcitx/instance-internal.h" \ "src/lib/fcitx/fcitx-internal.h" "src/lib/fcitx/ui-internal.h" \ - "src/lib/fcitx/hook-internal.h" -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix filesystem feature) are excluded + "src/lib/fcitx/hook-internal.h" \ + "src/lib/fcitx-config/keydata.h" +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. 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 +# 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, +# 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 -EXCLUDE_SYMBOLS = +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 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 = +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 +# 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 = +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. +# 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. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = "@CMAKE_CURRENT_SOURCE_DIR@" -# 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 +# 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. -INPUT_FILTER = +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 -# info on how filters are used. If FILTER_PATTERNS is empty, 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 +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. -FILTER_PATTERNS = +FILTER_PATTERNS = -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO @@ -678,54 +679,54 @@ # 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 also +# 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 also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO -# Setting the INLINE_SOURCES tag to YES will include the body +# Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES -# If the REFERENCED_BY_RELATION tag is set to YES -# then for each documented function all documented +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO -# If the REFERENCES_RELATION tag is set to YES -# then for each documented function all documented entities +# 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. REFERENCES_RELATION = NO -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# 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. +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# 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. REFERENCES_LINK_SOURCE = 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 http://www.gnu.org/software/global/global.html). You +# 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 http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for +# If the VERBATIM_HEADERS tag is set to YES (the default) 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. VERBATIM_HEADERS = YES @@ -734,238 +735,238 @@ # 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 +# 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. ALPHABETICAL_INDEX = NO -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) 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 one or more prefixes that +# 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 one or more prefixes that # should be ignored while generating the index headers. -IGNORE_PREFIX = +IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. 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 +# 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. If left blank `html' will be used as the default path. HTML_OUTPUT = "@DOXYFILE_HTML_DIR@" -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a # standard header. -HTML_HEADER = +HTML_HEADER = -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a # standard footer. -HTML_FOOTER = +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 the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own +# 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 the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! -HTML_STYLESHEET = +HTML_STYLESHEET = -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = 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. For this to work a browser that supports -# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# 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. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO -# 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, 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. +# 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, 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 http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. GENERATE_DOCSET = NO -# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the -# feed. A documentation feed provides an umbrella under which multiple -# documentation sets from a single provider (such as a company or product suite) +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# 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. DOCSET_FEEDNAME = "Doxygen generated docs" -# When GENERATE_DOCSET tag is set to YES, 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 +# When GENERATE_DOCSET tag is set to YES, 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. DOCSET_BUNDLE_ID = org.doxygen.Project -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO -# If the GENERATE_HTMLHELP tag is set to YES, 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 +# If the GENERATE_HTMLHELP tag is set to YES, 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. -CHM_FILE = +CHM_FILE = -# If the GENERATE_HTMLHELP tag is set to YES, 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 +# If the GENERATE_HTMLHELP tag is set to YES, 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. -HHC_LOCATION = +HHC_LOCATION = -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that +# If the GENERATE_HTMLHELP tag is set to YES, 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). GENERATE_CHI = NO -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING -# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. -CHM_INDEX_ENCODING = +CHM_INDEX_ENCODING = -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a +# If the GENERATE_HTMLHELP tag is set to YES, 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. BINARY_TOC = NO -# The TOC_EXPAND flag can be set to YES to add extra items for group members +# The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. 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 +# 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. 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. +# 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. -QCH_FILE = +QCH_FILE = -# The QHP_NAMESPACE tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace -QHP_NAMESPACE = +QHP_NAMESPACE = -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc -# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. -# For more information please see +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. +# For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters -QHP_CUST_FILTER_NAME = +QHP_CUST_FILTER_NAME = -# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see # Qt Help Project / Custom Filters. -QHP_CUST_FILTER_ATTRS = +QHP_CUST_FILTER_ATTRS = -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's -# filter section matches. +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's +# filter section matches. # Qt Help Project / Filter Attributes. -QHP_SECT_FILTER_ATTRS = +QHP_SECT_FILTER_ATTRS = -# If the GENERATE_QHP tag is set to YES, 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 +# If the GENERATE_QHP tag is set to YES, 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. -QHG_LOCATION = +QHG_LOCATION = -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO -# This tag can be used to set the number of enum values (range [1..20]) +# This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 -# 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 FRAME, 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 (for instance Mozilla 1.0+, -# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are -# probably better off using the HTML help feature. Other possible values -# for this tag are: HIERARCHIES, which will generate the Groups, Directories, -# and Class Hierarchy pages using a tree view instead of an ordered list; -# ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which -# disables this behavior completely. For backwards compatibility with previous -# releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE +# 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 FRAME, 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 (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. Other possible values +# for this tag are: HIERARCHIES, which will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list; +# ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which +# disables this behavior completely. For backwards compatibility with previous +# releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE # respectively. GENERATE_TREEVIEW = NONE -# 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 +# 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. TREEVIEW_WIDTH = 250 -# Use this tag to change the font size of Latex formulas included -# as images in the HTML documentation. The default is 10. Note that -# 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 +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# 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. FORMULA_FONTSIZE = 10 @@ -974,74 +975,74 @@ # configuration options related to the LaTeX output #--------------------------------------------------------------------------- -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = @DOXYFILE_GENERATE_LATEX@ -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = "@DOXYFILE_LATEX_DIR@" -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = "@LATEX_COMPILER@" -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = "@MAKEINDEX_COMPILER@" -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. -EXTRA_PACKAGES = +EXTRA_PACKAGES = -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! -LATEX_HEADER = +LATEX_HEADER = -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = @DOXYFILE_PDFLATEX@ -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = YES -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO @@ -1050,68 +1051,68 @@ # configuration options related to the RTF output #--------------------------------------------------------------------------- -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. -RTF_STYLESHEET_FILE = +RTF_STYLESHEET_FILE = -# Set optional variables used in the generation of an rtf document. +# Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. -RTF_EXTENSIONS_FILE = +RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man -# The MAN_EXTENSION tag determines the extension that is added to +# The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO @@ -1120,33 +1121,33 @@ # configuration options related to the XML output #--------------------------------------------------------------------------- -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the # syntax of the XML files. -XML_SCHEMA = +XML_SCHEMA = -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the # syntax of the XML files. -XML_DTD = +XML_DTD = -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES @@ -1155,10 +1156,10 @@ # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO @@ -1167,338 +1168,338 @@ # configuration options related to the Perl module output #--------------------------------------------------------------------------- -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. -# This is useful -# if you want to understand what is going on. -# On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. +# This is useful +# if you want to understand what is going on. +# On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. -PERLMOD_MAKEVAR_PREFIX = +PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- -# Configuration options related to the preprocessor +# Configuration options related to the preprocessor #--------------------------------------------------------------------------- -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by # the preprocessor. -INCLUDE_PATH = +INCLUDE_PATH = -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. -INCLUDE_FILE_PATTERNS = +INCLUDE_FILE_PATTERNS = -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator # instead of the = operator. -PREDEFINED = +PREDEFINED = -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. -EXPAND_AS_DEFINED = +EXPAND_AS_DEFINED = -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- -# Configuration::additions related to external references +# Configuration::additions related to external references #--------------------------------------------------------------------------- -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. -TAGFILES = +TAGFILES = -# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. -GENERATE_TAGFILE = +GENERATE_TAGFILE = -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES -# The PERL_PATH should be the absolute path and name of the perl script +# The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- -# Configuration options related to the dot tool +# Configuration options related to the dot tool #--------------------------------------------------------------------------- -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option is superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields more +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see -# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. -MSCGEN_PATH = +MSCGEN_PATH = -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = @DOXYFILE_DOT@ -# By default doxygen will write a font called FreeSans.ttf to the output -# directory and reference it in all dot files that doxygen generates. This -# font does not include all possible unicode characters however, so when you need -# these (or just want a differently looking font) you can specify the font name -# using DOT_FONTNAME. You need need to make sure dot is able to find the font, -# which can be done by putting it in a standard location or by setting the -# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory +# By default doxygen will write a font called FreeSans.ttf to the output +# directory and reference it in all dot files that doxygen generates. This +# font does not include all possible unicode characters however, so when you need +# these (or just want a differently looking font) you can specify the font name +# using DOT_FONTNAME. You need need to make sure dot is able to find the font, +# which can be done by putting it in a standard location or by setting the +# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = FreeSans -# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 -# By default doxygen will tell dot to use the output directory to look for the -# FreeSans.ttf font (which doxygen will put there itself). If you specify a -# different font using DOT_FONTNAME you can set the path where dot +# By default doxygen will tell dot to use the output directory to look for the +# FreeSans.ttf font (which doxygen will put there itself). If you specify a +# different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. -DOT_FONTPATH = +DOT_FONTPATH = -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO -# If set to YES, the inheritance and collaboration graphs will show the +# If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES -# If the CALL_GRAPH and HAVE_DOT options are set to YES then -# doxygen will generate a call dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable call graphs +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then -# doxygen will generate a caller dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable caller +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png -# The tag DOT_PATH can be used to specify the path where the dot tool can be +# The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = "@DOXYGEN_DOT_PATH@" -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the # \dotfile command). -DOTFILE_DIRS = +DOTFILE_DIRS = -# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of -# nodes that will be shown in the graph. If the number of nodes in a graph -# becomes larger than this value, doxygen will truncate the graph, which is -# visualized by representing a node as a red box. Note that doxygen if the -# number of direct children of the root node in a graph is already larger than -# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that the size of a graph can be further restricted by +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not -# seem to support this out of the box. Warning: Depending on the platform used, -# enabling this option may lead to badly anti-aliased labels on the edges of +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = YES -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES @@ -1507,7 +1508,7 @@ # Options related to the search engine #--------------------------------------------------------------------------- -# The SEARCHENGINE tag specifies whether or not a search engine should be +# The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO diff -Nru fcitx-4.2.2/.gitignore fcitx-4.2.4.1/.gitignore --- fcitx-4.2.2/.gitignore 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/.gitignore 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -*~ -build/* -data/pinyin.tar.gz -data/pinyin.tar.gz.md5 -data/table/table.tar.gz -data/table/table.tar.gz.md5 -fcitx.kdev4 -tools/pybase.mb -tools/pyphrase.mb -data/desc.po -.kdev_include_paths -.directory -*.kate-swp -*.orig -tags -astyle.sh diff -Nru fcitx-4.2.2/po/fcitx.pot fcitx-4.2.4.1/po/fcitx.pot --- fcitx-4.2.2/po/fcitx.pot 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/po/fcitx.pot 2012-06-10 14:34:48.000000000 +0000 @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-04-07 13:19+0800\n" +"POT-Creation-Date: 2012-05-26 20:27+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,6 +17,22 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +#: /home/saber/Develop/fcitx/src/module/imselector/fcitx-imselector.desc:4 +msgid "Local Input Method SelectKey" +msgstr "" + +#: /home/saber/Develop/fcitx/src/module/imselector/fcitx-imselector.desc:9 +msgid "Global Input Method SelectKey" +msgstr "" + +#: /home/saber/Develop/fcitx/src/module/xkb/fcitx-xkb.desc:4 +msgid "Allow to Override System XKB Settings" +msgstr "" + +#: /home/saber/Develop/fcitx/src/module/xkb/fcitx-xkb.desc:9 +msgid "Ignore Input Method Layout Request" +msgstr "" + #: /home/saber/Develop/fcitx/src/module/chttrans/fcitx-chttrans.desc:6 msgid "Traditional Chinese Translate Engine" msgstr "" @@ -127,8 +143,8 @@ msgstr "" #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:64 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:117 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:197 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:132 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:212 msgid "Background Image" msgstr "" @@ -141,94 +157,106 @@ msgstr "" #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:76 -msgid "Chinese Mode Icon" +msgid "Active Mode Icon" msgstr "" #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:80 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:121 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:209 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:136 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:224 msgid "Resize Margin Left" msgstr "" #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:84 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:125 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:213 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:140 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:228 msgid "Resize Margin Right" msgstr "" #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:88 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:129 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:201 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:144 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:216 msgid "Resize Margin Top" msgstr "" #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:92 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:133 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:205 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:148 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:220 msgid "Resize Margin Bottom" msgstr "" #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:96 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:173 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:225 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:188 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:240 msgid "Fill Background Vertical rule" msgstr "" #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:104 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:181 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:233 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:196 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:248 msgid "Fill Background Horizontal rule" msgstr "" #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:112 +msgid "Use Custom text icon color" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:117 +msgid "Active Text Icon Color" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:122 +msgid "Inactive Text Icon Color" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:127 msgid "Special Icon position" msgstr "" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:137 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:152 msgid "Color of Cursor" msgstr "" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:141 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:156 msgid "Left-down position of Input" msgstr "" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:145 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:160 msgid "Left-down position of Output" msgstr "" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:149 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:157 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:165 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:164 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:172 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:180 msgid "Prev Page Icon" msgstr "" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:153 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:161 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:169 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:168 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:176 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:184 msgid "Next Page Icon" msgstr "" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:189 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:204 msgid "Active Tray Icon" msgstr "" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:193 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:208 msgid "Inctive Tray Icon" msgstr "" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:217 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:232 msgid "Active Menu Color" msgstr "" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:221 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:236 msgid "Space Line Color" msgstr "" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:241 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:256 msgid "Virtual Keyboard Image" msgstr "" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:246 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:261 msgid "Key Color On Virutal Keyboard" msgstr "" @@ -265,169 +293,249 @@ msgstr "" #: /home/saber/Develop/fcitx/src/im/table/table.desc:43 -msgid "Auto Send Candidate Word to Client" +msgid "Auto Send Candidate Word" msgstr "" #: /home/saber/Develop/fcitx/src/im/table/table.desc:48 -msgid "Auto Send Candidate Word if no match in Code Table" +msgid "Minimum length trigger auto send candidate word when only one candidate" msgstr "" #: /home/saber/Develop/fcitx/src/im/table/table.desc:53 -msgid "End Key" +msgid "" +"Minimum length trigger auto send candidate when there will be no candidate" msgstr "" #: /home/saber/Develop/fcitx/src/im/table/table.desc:58 -msgid "Use Matching Key" +msgid "Send Raw Preedit" msgstr "" #: /home/saber/Develop/fcitx/src/im/table/table.desc:63 -msgid "Matching Key" +msgid "End Key" msgstr "" #: /home/saber/Develop/fcitx/src/im/table/table.desc:68 +msgid "Use Matching Key" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:73 +msgid "Matching Key" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:78 msgid "Exact Match" msgstr "" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:72 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:82 msgid "Auto Phrase" msgstr "" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:77 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:87 +msgid "" +"Keep current buffer when there is no match item and input length is equal " +"code length" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:92 msgid "Auto Phrase Length" msgstr "" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:82 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:97 msgid "Auto Phrase Phrase" msgstr "" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:87 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:102 msgid "Save Auto Phrase" msgstr "" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:92 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:107 msgid "Prompt Table Code" msgstr "" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:96 unknown +#: /home/saber/Develop/fcitx/src/im/table/table.desc:111 unknown msgid "Symbol" msgstr "" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:101 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:116 msgid "Symbol File" msgstr "" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:106 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:121 msgid "Choose" msgstr "" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:111 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:126 msgid "Language Code for this table" msgstr "" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:116 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:131 msgid "Enable" msgstr "" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:121 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:136 msgid "Use Custom Prompt String defined in table" msgstr "" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:126 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:141 msgid "Keyboard Layout to be used" msgstr "" +#: /home/saber/Develop/fcitx/src/im/table/table.desc:146 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:151 +msgid "Alternative Prev Page Key" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:156 +msgid "Alternative Next Page Key" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:161 +msgid "First Candidate Display as Preedit" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:166 +msgid "Commit and pass when invalid key of this table pressed" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:171 +msgid "Commit key for select first candidate" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:176 +msgid "Commit string when there is no match" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:181 +msgid "Ignore Punctuation" +msgstr "" + #: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:12 msgid "Default Shuangpin Schema" msgstr "" #: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:17 -msgid "Use Complete Pinyin" +msgid "Fix preedit cursor at head" msgstr "" #: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:22 -msgid "Auto Create Phrase" +msgid "Use Complete Pinyin" msgstr "" #: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:27 -msgid "Save Auto Created Phrase" +msgid "Auto Create Phrase" msgstr "" #: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:32 -msgid "Hotkey of Adding Frequent Word" +msgid "Save Auto Created Phrase" msgstr "" #: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:37 -msgid "Hotkey of Deleting Frequent Word" +msgid "Hotkey of Adding Frequent Word" msgstr "" #: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:42 -msgid "Hotkey of Delete User Phrase" +msgid "Hotkey of Deleting Frequent Word" msgstr "" #: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:47 +msgid "Hotkey of Delete User Phrase" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:52 msgid "Hotkey of Inputing Word From Phrase" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:56 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:61 msgid "Rule of Candidate Word Order" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:65 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:70 msgid "Rule of Candidate Phrase Order" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:74 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:79 msgid "Rule of Frequent Word Order" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:79 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:84 msgid "Fuzzy an and ang" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:84 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:89 msgid "Fuzzy en and eng" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:89 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:94 msgid "Fuzzy ian and iang" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:94 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:99 msgid "Fuzzy in and ing" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:99 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:104 msgid "Fuzzy ou and u" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:104 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:109 msgid "Fuzzy uan and uang" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:109 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:114 msgid "Fuzzy c and ch" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:114 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:119 msgid "Fuzzy f and h" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:119 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:124 msgid "Fuzzy l and n" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:124 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:129 msgid "Fuzzy s and sh" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:129 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:134 msgid "Fuzzy z and zh" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:134 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:139 msgid "Fix misstype gn/ng" msgstr "" +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:4 +msgid "Commit with extra space when choose candidate word" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:9 +msgid "Toggle the word hint" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:14 +msgid "Enable word hint if available" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:19 +msgid "Minimum Length to trigger word hint" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:24 +msgid "Use enter to commit the existing string" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:29 +msgid "Use presage to predict if possible." +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:38 +msgid "Preferred Enchant Provider (Need Restart)" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:43 +msgid "Add current input buffer to user dictionary" +msgstr "" + #: /home/saber/Develop/fcitx/src/frontend/xim/fcitx-xim.desc:4 msgid "Use On The Spot Style for XIM (Can not change during running)" msgstr "" @@ -529,134 +637,138 @@ msgid "Fallback UI Addon" msgstr "" +#: /home/saber/Develop/fcitx/data/addon.desc:77 +msgid "Do not show in GUI" +msgstr "" + #: /home/saber/Develop/fcitx/data/config.desc:4 -msgid "Seconds sleep before fcitx really start" +msgid "Trigger Input Method" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:13 -msgid "Share State Among Window" +#: /home/saber/Develop/fcitx/data/config.desc:19 +msgid "Extra key for trigger input method" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:22 -msgid "Default Input Method State" +#: /home/saber/Develop/fcitx/data/config.desc:24 +msgid "Activate input method" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:27 -msgid "It's the first time Fcitx Start." +#: /home/saber/Develop/fcitx/data/config.desc:29 +msgid "Inactivate Input Method" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:32 -msgid "Use first input method as inactive state" +#: /home/saber/Develop/fcitx/data/config.desc:34 +msgid "Enable Hotkey to scroll Between Input Method" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:37 -msgid "Type half width Punc After a Number" +#: /home/saber/Develop/fcitx/data/config.desc:44 +msgid "Scroll between Input Method" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:46 -msgid "Action after press enter" +#: /home/saber/Develop/fcitx/data/config.desc:49 +msgid "Press Switch Key twice to Change Mode" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:51 -msgid "Disable Paging in Remind Mode" +#: /home/saber/Develop/fcitx/data/config.desc:54 +msgid "Interval of Two Key Input" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:56 -msgid "Send typed raw text if Switch to inactive Mode" +#: /home/saber/Develop/fcitx/data/config.desc:59 +msgid "Switching Virtual Keyboard" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:61 -msgid "Candidate Word Number" +#: /home/saber/Develop/fcitx/data/config.desc:64 +msgid "Switching Remind Mode" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:66 -msgid "Give the tips of Phrase" +#: /home/saber/Develop/fcitx/data/config.desc:69 +msgid "Switching Full Width Character Mode" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:71 -msgid "Do not commit preedit text when unfocus a window" +#: /home/saber/Develop/fcitx/data/config.desc:74 +msgid "Switch Full Width Punc Mode" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:76 -msgid "Show Input Window After Trigger Input Mode" +#: /home/saber/Develop/fcitx/data/config.desc:79 +msgid "Prev Page" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:81 -msgid "Show Point After Index" +#: /home/saber/Develop/fcitx/data/config.desc:84 +msgid "Next Page" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:86 -msgid "Show Input Speed" +#: /home/saber/Develop/fcitx/data/config.desc:89 +msgid "Choose Second and Third Candidate Word" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:91 -msgid "Show Version" +#: /home/saber/Develop/fcitx/data/config.desc:94 +msgid "Saving All Config and Input History" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:96 -msgid "Do not show input window if there is only preedit string" +#: /home/saber/Develop/fcitx/data/config.desc:99 +msgid "Switch Embeded Preedit" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:101 -msgid "" -"Do not show input window if there is one one candidate (Hide when only " -"preedit string must be selected)" +#: /home/saber/Develop/fcitx/data/config.desc:104 +msgid "Seconds sleep before fcitx really start" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:106 -msgid "Hot key of Triggering Input Method" +#: /home/saber/Develop/fcitx/data/config.desc:113 +msgid "Share State Among Window" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:111 -msgid "Enable Left Ctrl + Left Shift to Switch Between Input Method" +#: /home/saber/Develop/fcitx/data/config.desc:121 +msgid "Default Input Method State" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:124 -msgid "Hotkey of Switching Active and Inactive Mode" +#: /home/saber/Develop/fcitx/data/config.desc:126 +msgid "Type half width Punc After a Number" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:129 -msgid "Press Switch Key twice to Change Mode" +#: /home/saber/Develop/fcitx/data/config.desc:135 +msgid "Action after press enter" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:134 -msgid "Interval of Two Key Input" +#: /home/saber/Develop/fcitx/data/config.desc:140 +msgid "Disable Paging in Remind Mode" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:139 -msgid "Hotkey of Switching Virtual Keyboard" +#: /home/saber/Develop/fcitx/data/config.desc:145 +msgid "Send typed raw text if Switch to inactive Mode" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:144 -msgid "Hotkey of Switching Remind Mode" +#: /home/saber/Develop/fcitx/data/config.desc:150 +msgid "Candidate Word Number" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:149 -msgid "Hotkey of Switching Full Width Character Mode" +#: /home/saber/Develop/fcitx/data/config.desc:155 +msgid "Give the tips of Phrase" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:154 -msgid "Hotkey of Switch Full Width Punc Mode" +#: /home/saber/Develop/fcitx/data/config.desc:160 +msgid "Do not commit preedit text when unfocus a window" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:159 -msgid "Hotkey of Going Prev Page" +#: /home/saber/Develop/fcitx/data/config.desc:165 +msgid "Show Input Window After Trigger Input Mode" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:164 -msgid "Hotkey of Going Next Page" +#: /home/saber/Develop/fcitx/data/config.desc:170 +msgid "Show Input Speed" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:169 -msgid "Hotkey to Choose Second and Third Candidate Word" +#: /home/saber/Develop/fcitx/data/config.desc:175 +msgid "Show Version" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:174 -msgid "Hotkey of Saving All Config and Input History" +#: /home/saber/Develop/fcitx/data/config.desc:180 +msgid "Do not show input window if there is only preedit string" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:179 -msgid "Hotkey of Switch Embeded Preedit" +#: /home/saber/Develop/fcitx/data/config.desc:185 +msgid "" +"Do not show input window if there is only one candidate (Hide when only " +"preedit string must be selected)" msgstr "" # unknown @@ -680,17 +792,26 @@ msgstr "" # unknown +msgid "IMSelector" +msgstr "" + +# unknown #: unknown msgid "InputMethod" msgstr "" # unknown +msgid "Keyboard" +msgstr "" + +# unknown msgid "Output" msgstr "" # unknown +#: /home/saber/Develop/fcitx/build/po/tmp/pinyin.conf.in.h:1 #: /home/saber/Develop/fcitx/build/po/tmp/fcitx-pinyin.conf.in.h:1 -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:110 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:111 msgid "Pinyin" msgstr "" @@ -742,6 +863,10 @@ msgid "Xim" msgstr "" +# unknown +msgid "X Keyboard" +msgstr "" + #: unknown msgid "ABC" msgstr "" @@ -775,15 +900,23 @@ msgstr "" #: unknown -msgid "Auto" +msgid "ALT_SHIFT" msgstr "" #: unknown -msgid "Clean" +msgid "ALT_SUPER" +msgstr "" + +#: unknown +msgid "Aspell" +msgstr "" + +#: unknown +msgid "Auto" msgstr "" #: unknown -msgid "Close" +msgid "Clean" msgstr "" #: unknown @@ -799,15 +932,30 @@ msgstr "" #: unknown +msgid "CTRL Both" +msgstr "" + +#: unknown +msgid "CTRL_SHIFT" +msgstr "" + +#: unknown +msgid "CTRL_SUPER" +msgstr "" + +#: unknown msgid "DBus" msgstr "" #: unknown -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:289 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:294 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:348 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:353 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:704 +msgid "Default" +msgstr "" + +#: unknown +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:305 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:310 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:370 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:375 msgid "Disabled" msgstr "" @@ -848,6 +996,10 @@ msgstr "" #: unknown +msgid "Myspell" +msgstr "" + +#: unknown msgid "Native" msgstr "" @@ -896,6 +1048,10 @@ msgstr "" #: unknown +msgid "SHIFT Both" +msgstr "" + +#: unknown msgid "Show" msgstr "" @@ -931,7 +1087,7 @@ msgid "Quick Phrase List" msgstr "" -#: unknown /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/skin.c:853 +#: unknown /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/skin.c:924 msgid "Skin" msgstr "" @@ -943,117 +1099,96 @@ msgid "Shuang Pin Schema" msgstr "" -#: /home/saber/Develop/fcitx/build/po/tmp/db.conf.in.h:1 -msgid "Dianbaoma" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-lua.conf.in.h:1 +msgid "Fcitx Lua Support" msgstr "" -#: /home/saber/Develop/fcitx/build/po/tmp/erbi.conf.in.h:1 -msgid "Erbi" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-lua.conf.in.h:2 +msgid "Add Lua script support for Fcitx" msgstr "" -#: /home/saber/Develop/fcitx/build/po/tmp/qxm.conf.in.h:1 -msgid "Bingchan" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-punc.conf.in.h:1 +msgid "Punctuation Support" msgstr "" -#: /home/saber/Develop/fcitx/build/po/tmp/wanfeng.conf.in.h:1 -msgid "Wanfeng" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-punc.conf.in.h:2 +msgid "Punctuation Conversion Support" msgstr "" -#: /home/saber/Develop/fcitx/build/po/tmp/wbpy.conf.in.h:1 -msgid "WubiPinyin" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-autoeng.conf.in.h:1 +msgid "Auto English Mode" msgstr "" -#: /home/saber/Develop/fcitx/build/po/tmp/wbx.conf.in.h:1 -msgid "Wubi" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-autoeng.conf.in.h:2 +msgid "Auto Change to English Mode while Input Specific String" msgstr "" -#: /home/saber/Develop/fcitx/build/po/tmp/cangjie.conf.in.h:1 -msgid "Cangjie" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-remote-module.conf.in.h:1 +msgid "Remote" msgstr "" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-pinyin.conf.in.h:2 -msgid "Simple Pinyin support for Fcitx" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-remote-module.conf.in.h:2 +msgid "Used by fcitx-remote to change Fcitx state from console" msgstr "" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-qw.conf.in.h:1 -#: /home/saber/Develop/fcitx/build/po/../..//src/im/qw/qw.c:68 -msgid "Quwei" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-imselector.conf.in.h:1 +msgid "Input method selector" msgstr "" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-qw.conf.in.h:2 -msgid "Quwei Input Method for Fcitx" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-imselector.conf.in.h:2 +msgid "Select specific input method via keyboard" msgstr "" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-table.conf.in.h:2 -msgid "Table Input Method for Fcitx" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-x11.conf.in.h:1 +msgid "X11 Support" msgstr "" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-chttrans.conf.in.h:1 -msgid "Convert Simplified Chinese To Traditional Chinese" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-x11.conf.in.h:2 +msgid "X11 Utilitiy used by other Addon" msgstr "" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-chttrans.conf.in.h:2 -msgid "Simplified Chinese To Traditional Chinese" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-xkbdbus.conf.in.h:1 +msgid "X Keyboard Integration export with DBus" msgstr "" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-punc.conf.in.h:1 -msgid "Punctuation Conversion Support" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-vk.conf.in.h:2 +msgid "Virtual Key Board in order to input special character" msgstr "" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-punc.conf.in.h:2 -msgid "Punctuation Support" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-xkb.conf.in.h:1 +msgid "X Keyboard Integration" msgstr "" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-quickphrase.conf.in.h:1 -msgid "Conveniently Input English or User-Defined Simple Table" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-dbus.conf.in.h:1 +msgid "DBus Support" msgstr "" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-quickphrase.conf.in.h:2 -msgid "Quickphrase" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-dbus.conf.in.h:2 +msgid "Provides DBus Support (Used by other Addon)" msgstr "" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-vk.conf.in.h:2 -msgid "Virtual Key Board in order to input special character" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-chttrans.conf.in.h:1 +msgid "Simplified Chinese To Traditional Chinese" msgstr "" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-x11.conf.in.h:1 -msgid "X11 Support" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-chttrans.conf.in.h:2 +msgid "Convert Simplified Chinese To Traditional Chinese" msgstr "" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-x11.conf.in.h:2 -msgid "X11 Utilitiy used by other Addon" -msgstr "" - -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-autoeng.conf.in.h:1 -msgid "Auto Change to English Mode while Input Specific String" -msgstr "" - -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-autoeng.conf.in.h:2 -msgid "Auto English Mode" -msgstr "" - -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-dbus.conf.in.h:1 -msgid "DBus Support" -msgstr "" - -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-dbus.conf.in.h:2 -msgid "Provides DBus Support (Used by other Addon)" -msgstr "" - -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-fullwidth-char.conf.in.h:1 -msgid "Fullwidth Character" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-fullwidth-char.conf.in.h:1 +msgid "Fullwidth Character" msgstr "" #: /home/saber/Develop/fcitx/build/po/tmp/fcitx-fullwidth-char.conf.in.h:2 msgid "Provides Fullwidth Character Input Support" msgstr "" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-remote-module.conf.in.h:1 -msgid "Remote" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-quickphrase.conf.in.h:1 +msgid "Quickphrase" msgstr "" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-remote-module.conf.in.h:2 -msgid "Used by fcitx-remote to change Fcitx state from console" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-quickphrase.conf.in.h:2 +msgid "Conveniently Input English or User-Defined Simple Table" msgstr "" #: /home/saber/Develop/fcitx/build/po/tmp/fcitx-classic-ui.conf.in.h:1 @@ -1072,12 +1207,35 @@ msgid "Kimpanel Support for Fcitx" msgstr "" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-ipc.conf.in.h:1 -msgid "Fcitx DBus Frontend " +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-table.conf.in.h:2 +msgid "Table Input Method for Fcitx" msgstr "" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-ipc.conf.in.h:2 -msgid "Frontend Used by IM Modules" +#: /home/saber/Develop/fcitx/build/po/tmp/qw.conf.in.h:1 +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-qw.conf.in.h:1 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/qw/qw.c:68 +msgid "Quwei" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-qw.conf.in.h:2 +msgid "Quwei Input Method for Fcitx" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/shuangpin.conf.in.h:1 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:127 +msgid "Shuangpin" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-pinyin.conf.in.h:2 +msgid "Simple Pinyin support for Fcitx" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-keyboard.conf.in.h:1 +msgid "Keyboard Input Method" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-keyboard.conf.in.h:2 +msgid "Use Keyboard Layout as Input Method" msgstr "" #: /home/saber/Develop/fcitx/build/po/tmp/fcitx-xim.conf.in.h:1 @@ -1088,511 +1246,651 @@ msgid "Provides XIM support" msgstr "" -#: ../..//data/fcitx-configtool.desktop.in.h:1 -msgid "Fcitx Config Tool" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-ipc.conf.in.h:1 +msgid "Fcitx DBus Frontend" msgstr "" -#: ../..//data/fcitx-configtool.desktop.in.h:2 -msgid "Fcitx GUI Config Tool" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-ipc.conf.in.h:2 +msgid "Frontend Used by IM Modules" msgstr "" -#: ../..//data/fcitx.desktop.in.h:1 -msgid "Chinese Input Method" +#: /home/saber/Develop/fcitx/build/po/tmp/qxm.conf.in.h:1 +msgid "Bingchan" msgstr "" -#: ../..//data/fcitx.desktop.in.h:2 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:276 -msgid "Fcitx" +#: /home/saber/Develop/fcitx/build/po/tmp/wbx.conf.in.h:1 +msgid "Wubi" msgstr "" -#: ../..//src/ui/classic/fcitx-skin-installer.desktop.in.h:1 -msgid "Fcitx Skin Installer" +#: /home/saber/Develop/fcitx/build/po/tmp/wanfeng.conf.in.h:1 +msgid "Wanfeng" msgstr "" -#: ../..//src/ui/classic/fcitx-skin-installer.desktop.in.h:2 -msgid "Installer Script for Fcitx Skin" +#: /home/saber/Develop/fcitx/build/po/tmp/db.conf.in.h:1 +msgid "Dianbaoma" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/core/errorhandler.c:59 -#, c-format -msgid "FCITX -- Get Signal No.: %d" +#: /home/saber/Develop/fcitx/build/po/tmp/wbpy.conf.in.h:1 +msgid "WubiPinyin" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:126 -msgid "Shuangpin" +#: /home/saber/Develop/fcitx/build/po/tmp/erbi.conf.in.h:1 +msgid "Erbi" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:359 -msgid "Can not find System Database of Pinyin!" +#: /home/saber/Develop/fcitx/build/po/tmp/cangjie.conf.in.h:1 +msgid "Cangjie" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:375 -#, c-format -msgid "Load extra dict: %s" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:141 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:485 +msgid "Full width punct" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:425 -msgid "Pinyin Index Magic Number Doesn't match" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:141 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:485 +msgid "Latin punct" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:765 -msgid "Press index to delete user phrase (ESC for cancel)" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:142 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:486 +msgid "Toggle Full Width Punctuation" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:776 -msgid "Press number to make word in frequent list" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:360 +msgid "Can't open punc file." msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:803 -#, c-format -msgid "Press 1 to delete %s in frequent list (ESC for cancel)" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/autoeng/AutoEng.c:263 +msgid "Too long item for AutoEng" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:805 -#, c-format -msgid "Press 1-%d to delete %s in frequent list (ESC for cancel)" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/autoeng/AutoEng.c:311 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:309 +msgid "Press Enter to input text" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:1773 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/remote/remote.c:71 #, c-format -msgid "Cannot Save User Pinyin Database: %s" +msgid "Can't open socket %s: %s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:1837 -#, c-format -msgid "Cannot Save Frequent word: %s" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/imselector/imselector.c:207 +msgid "Select global input method: " msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:1910 -#, c-format -msgid "Cannot Save Pinyin Index: %s" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/imselector/imselector.c:207 +msgid "Select local input method: " msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:2168 -msgid "Remind: " +#: /home/saber/Develop/fcitx/build/po/../..//src/module/imselector/imselector.c:212 +#, c-format +msgid "Current local input method is %s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:2301 -msgid "Migrate the old file path to the new one" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/imselector/imselector.c:216 +msgid "No local input method" msgstr "" -#. 读入码表 -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:34 -msgid "Loading Table Dict" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/imselector/imselector.c:227 +msgid "Clear local input method" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:37 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/xkbdbus/xkbdbus.c:159 #, c-format -msgid "Load Table Dict from %s" +msgid "%s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:169 -msgid "Load Table Dict OK" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/xkbdbus/xkbdbus.c:184 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/keyboard/keyboard.c:410 +msgid "English (US)" msgstr "" -#. 读取上次保存的自动词组信息 -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:196 -msgid "Loading Autophrase." +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:51 +msgid "Latin" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:236 -msgid "Load Autophrase OK" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:52 +msgid "Fullwidth" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:267 -msgid "Save dict error" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:53 +msgid "Greek" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:323 -msgid "Rename OK" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:54 +msgid "Russian" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:152 -#, c-format -msgid "Load Table Config File:%s" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:55 +msgid "Index" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:159 -#, c-format -msgid "Table Config %s is %s" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:56 +msgid "Math" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:400 -msgid "" -"Left/Right to choose selected character, Press Enter to confirm, Press " -"Escape to Cancel" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:57 +msgid "Number" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:426 -msgid "Pinyin: " +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:58 +msgid "Special" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:428 -msgid "Cannot found Pinyin" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:59 +msgid "Hiragana" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:475 -msgid "Choose the phrase to be put in the front, Press Escape to Cancel" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:60 +msgid "Katakana" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:483 -msgid "Choose the phrase to be deleted, Press Escape to Cancel" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:61 +msgid "Table Symbol" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:993 -msgid "Remind:" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:158 +msgid "Toggle Virtual Keyboard" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:1097 -msgid "Phrase is already in Dict " -msgstr "" - -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:1100 -msgid "Code is " +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:158 +msgid "Virtual Keyboard State" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:1102 -msgid " Ctrl+Delete To Delete" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:179 +msgid "Virtual Keyboard" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:127 -msgid "Traditional Chinese Translate" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:212 +msgid "Close virtual keyboard" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:222 -#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:324 -msgid "OpenCC initialization error" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/dbus/dbusstuff.c:86 +#, c-format +msgid "Connection Error (%s)" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:230 -#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:332 -msgid "OpenCC error" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/dbus/dbusstuff.c:106 +msgid "Add Watch Function Error" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:134 -msgid "Full Width Punctuation" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/dbus/dbusstuff.c:126 +#, c-format +msgid "Name Error (%s)" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:312 -msgid "Can't open punc file." +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:128 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:159 +msgid "Convert to Traditional Chinese" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:242 -#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:331 -msgid "Quick Phrase: " +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:128 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:159 +msgid "Convert to Simplified Chinese" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:307 -#: /home/saber/Develop/fcitx/build/po/../..//src/module/autoeng/AutoEng.c:311 -msgid "Press Enter to input text" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:129 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:160 +msgid "Toggle Simp/Trad Chinese Conversion" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:340 -#, c-format -msgid "Space for %s Enter for %s" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:230 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:332 +msgid "OpenCC initialization error" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:148 -#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:169 -msgid "Virtual Keyboard" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:238 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:340 +msgid "OpenCC error" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:148 -msgid "Virtual Keyboard State" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:116 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:181 +msgid "Full width Character" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/autoeng/AutoEng.c:263 -msgid "Too long item for AutoEng" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:116 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:181 +msgid "Half width Character" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/dbus/dbusstuff.c:86 -#, c-format -msgid "Connection Error (%s)" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:117 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:182 +msgid "Toggle Half/Full width Character" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/dbus/dbusstuff.c:104 -msgid "Add Watch Function Error" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:244 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:333 +msgid "Quick Phrase: " msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/dbus/dbusstuff.c:124 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:342 #, c-format -msgid "Name Error (%s)" +msgid "Space for %s Enter for %s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:114 -msgid "Full Width Character" +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/tray.c:164 +#, c-format +msgid "X error %i on opcode send" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/remote/remote.c:71 -#, c-format -msgid "Can't open socket %s: %s" +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/skin.c:139 +msgid "Can not load default skin, is installion correct?" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/tray.c:164 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/skin.c:144 #, c-format -msgid "X error %i on opcode send" +msgid "Can not load skin %s, return to default" msgstr "" #: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/InputWindow.c:166 msgid "DISPLAY InputWindow" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/MainWindow.c:137 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/MainWindow.c:135 msgid "DISPLAY MainWindow" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/MainWindow.c:152 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/MainWindow.c:145 msgid "DRAW MainWindow" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:145 -msgid "About Fcitx" +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:413 +msgid "Online Help" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:146 -msgid "Online Help" +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:476 +msgid "Configure Current Input Method" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:160 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:477 msgid "Configure" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:161 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:478 msgid "Exit" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:435 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:445 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:781 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:491 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-utils/utils.c:471 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-utils/utils.c:487 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-utils/utils.c:502 msgid "Unable to create process" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/skin.c:138 -msgid "Can not load default skin, is installion correct?" +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/cairostuff/font.c:49 +msgid "Error: Load fontconfig failed" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/skin.c:143 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/cairostuff/font.c:90 #, c-format -msgid "Can not load skin %s, return to default" +msgid "your current font is: %s" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/cairostuff/font.c:106 +msgid "no valid font." msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:290 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:295 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:349 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:354 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:704 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:292 +#: ../..//data/fcitx.desktop.in.h:1 +msgid "Fcitx" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:306 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:311 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:371 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:376 msgid "Input Method Disabled" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/cairostuff/font.c:49 -msgid "Error: Load fontconfig failed" +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:359 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:360 +msgid "No input window" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/cairostuff/font.c:90 +#: /home/saber/Develop/fcitx/build/po/../..//src/core/errorhandler.c:59 #, c-format -msgid "your current font is: %s" +msgid "FCITX -- Get Signal No.: %d" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/cairostuff/font.c:106 -msgid "no valid font." +#. 读入码表 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:34 +msgid "Loading Table Dict" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:350 -msgid "Enum option duplicated." +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:37 +#, c-format +msgid "Load Table Dict from %s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:363 -msgid "Enum option number must larger than 0" +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:176 +msgid "Load Table Dict OK" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:377 -msgid "Enum Option is invalid, take it as string" +#. 读取上次保存的自动词组信息 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:203 +msgid "Loading Autophrase." msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:383 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:243 +msgid "Load Autophrase OK" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:274 +msgid "Save dict error" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:330 +msgid "Rename OK" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:155 #, c-format -msgid "Unknown type, take it as string: %s" +msgid "Load Table Config File:%s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:387 -msgid "Missing type, take it as string" +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:162 +#, c-format +msgid "Table Config %s is %s" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:432 +msgid "" +"Left/Right to choose selected character, Press Enter to confirm, Press " +"Escape to Cancel" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:458 +msgid "Pinyin: " +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:460 +msgid "Cannot found Pinyin" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:507 +msgid "Choose the phrase to be put in the front, Press Escape to Cancel" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:515 +msgid "Choose the phrase to be deleted, Press Escape to Cancel" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:1050 +msgid "Remind:" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:860 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:1154 +msgid "Phrase is already in Dict " +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:1157 +msgid "Code is " +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:1159 +msgid " Ctrl+Delete To Delete" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:360 +msgid "Can not find System Database of Pinyin!" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:376 #, c-format -msgid "Configure group name error: line %d" +msgid "Load extra dict: %s" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:426 +msgid "Pinyin Index Magic Number Doesn't match" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:763 +msgid "Press index to delete user phrase (ESC for cancel)" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:774 +msgid "Press number to make word in frequent list" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:872 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:801 #, c-format -msgid "Duplicate group name, merge with the previous: %s :line %d" +msgid "Press 1 to delete %s in frequent list (ESC for cancel)" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:890 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:803 #, c-format -msgid "Invalid Entry: line %d missing '='" +msgid "Press 1-%d to delete %s in frequent list (ESC for cancel)" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:936 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:1778 #, c-format -msgid "Duplicate option, overwrite: line %d" +msgid "Cannot Save User Pinyin Database: %s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1083 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:1842 #, c-format -msgid "Option %s is Invalid, Use Default Value %s" +msgid "Cannot Save Frequent word: %s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1093 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:1915 #, c-format -msgid "Option %s is Invalid." +msgid "Cannot Save Pinyin Index: %s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1136 -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1145 -msgid "Available Value:" +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:2173 +msgid "Remind: " msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1157 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:2306 +msgid "Migrate the old file path to the new one" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/keyboard/keyboard.c:375 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/keyboard/keyboard.c:409 #, c-format -msgid "no default option for %s/%s" +msgid "Keyboard - %s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/addon.c:99 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/keyboard/keyboard.c:398 #, c-format -msgid "Load Addon Config File:%s" +msgid "Keyboard - %s - %s" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:140 +msgid "X11 not initialized" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:153 +msgid "Can't Create imWindow" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:164 +msgid "XMODIFIERS Error." msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/addon.c:107 +#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:168 +msgid "Please set XMODIFIERS." +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:247 #, c-format -msgid "Addon Config %s is %s" +msgid "Start XIM error. Another XIM daemon named %s is running?" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/addon.c:197 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:275 #, c-format -msgid "Disable addon %s, dependency %s can not be satisfied." +msgid "IM: open %s fail %s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/frontend.c:304 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:289 #, c-format -msgid "Frontend: open %s fail %s" +msgid "IM: bad im %s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/frontend.c:316 -msgid "Frontend: bad frontend" +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:494 +msgid "No available Input Method" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/frontend.c:337 -msgid "No available frontend" +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1363 +#: ../..//data/fcitx.desktop.in.h:2 +msgid "Input Method" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/module.c:65 -#, c-format -msgid "Module: open %s fail %s" +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1432 +msgid "Input Speed: " msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/module.c:77 -msgid "Module: bad module" +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1434 +msgid "/min Time Used: " +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1436 +msgid "min Num of Characters: " +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:160 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:321 +msgid "Use remind" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:160 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:321 +msgid "No remind" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:161 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:322 +msgid "Toggle Remind" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ui.c:203 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:297 +msgid "pthread mutex init failed" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ui.c:189 #, c-format msgid "UI: open %s fail %s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ui.c:216 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ui.c:202 msgid "UI: bad ui" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:156 -msgid "Remind" +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/frontend.c:404 +#, c-format +msgid "Frontend: open %s fail %s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:183 -msgid "Please check your environment varibles." +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/frontend.c:416 +msgid "Frontend: bad frontend" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:184 -msgid "You can use tools provided by your distribution." +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/frontend.c:437 +msgid "No available frontend" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:185 -msgid "" -"Or You may need to set environment varibles below to make fcitx work " -"correctly." +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/module.c:64 +#, c-format +msgid "Module: open %s fail %s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:189 -msgid "Or (Depends on you install im module or not)" +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/module.c:76 +msgid "Module: bad module" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:193 -msgid "" -"If you use login manager like gdm or kdm, put those lines in your ~/." -"xprofile." +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/addon.c:100 +#, c-format +msgid "Load Addon Config File:%s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:194 -msgid "If you use ~/.xinitrc and startx, put those lines in ~/.xinitrc." +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/addon.c:108 +#, c-format +msgid "Addon Config %s is %s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:196 -msgid "Setting Hint" +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/addon.c:207 +#, c-format +msgid "Disable addon %s, dependency %s can not be satisfied." msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:313 -msgid "pthread mutex init failed" +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:350 +msgid "Enum option duplicated." +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:363 +msgid "Enum option number must larger than 0" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:377 +msgid "Enum Option is invalid, take it as string" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:204 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:383 #, c-format -msgid "IM: open %s fail %s" +msgid "Unknown type, take it as string: %s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:218 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:387 +msgid "Missing type, take it as string" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:841 #, c-format -msgid "IM: bad im %s" +msgid "Configure group name error: line %d" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:381 -msgid "No available Input Method" +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:853 +#, c-format +msgid "Duplicate group name, merge with the previous: %s :line %d" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1161 -msgid "Input Method" +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:871 +#, c-format +msgid "Invalid Entry: line %d missing '='" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1226 -msgid "Input Speed: " +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:917 +#, c-format +msgid "Duplicate option, overwrite: line %d" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1228 -msgid "/min Time Used: " +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1064 +#, c-format +msgid "Option %s is Invalid, Use Default Value %s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1230 -msgid "min Num of Characters: " +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1074 +#, c-format +msgid "Option %s is Invalid." msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:135 -msgid "X11 not initialized" +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1117 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1126 +msgid "Available Value:" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:146 -msgid "Can't Create imWindow" +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1138 +#, c-format +msgid "no default option for %s/%s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:157 -msgid "XMODIFIERS Error." +#. kate: indent-mode cstyle; space-indent on; indent-width 4; +#: ../..//data/fcitx-configtool.desktop.in.h:1 +msgid "Fcitx Config Tool" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:161 -msgid "Please set XMODIFIERS." +#: ../..//data/fcitx-configtool.desktop.in.h:2 +msgid "Fcitx GUI Config Tool" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:239 -#, c-format -msgid "Start XIM error. Another XIM daemon named %s is running?" +#: ../..//src/ui/classic/fcitx-skin-installer.desktop.in.h:1 +msgid "Fcitx Skin Installer" +msgstr "" + +#: ../..//src/ui/classic/fcitx-skin-installer.desktop.in.h:2 +msgid "Installer Script for Fcitx Skin" msgstr "" #: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/fcitx-skin-installer.sh:48 diff -Nru fcitx-4.2.2/po/ja.po fcitx-4.2.4.1/po/ja.po --- fcitx-4.2.2/po/ja.po 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/po/ja.po 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,1922 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: fcitx\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-05-26 20:27+0800\n" +"PO-Revision-Date: 2012-04-28 13:17+0000\n" +"Last-Translator: csslayer \n" +"Language-Team: Japanese (http://www.transifex.net/projects/p/fcitx/language/" +"ja/)\n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0\n" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:1159 +msgid " Ctrl+Delete To Delete" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/xkbdbus/xkbdbus.c:159 +#, c-format +msgid "%s" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1434 +msgid "/min Time Used: " +msgstr "" + +#: unknown +msgid "ABC" +msgstr "" + +#: unknown +msgid "ALT_L_SHIFT" +msgstr "" + +#: unknown +msgid "ALT_R_SHIFT" +msgstr "" + +#: unknown +msgid "ALT_SHIFT" +msgstr "" + +#: unknown +msgid "ALT_SUPER" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:135 +msgid "Action after press enter" +msgstr "Enterキーの動作" + +#: /home/saber/Develop/fcitx/data/config.desc:24 +msgid "Activate input method" +msgstr "" + +#: unknown +msgid "Active" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:232 +msgid "Active Menu Color" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:56 +msgid "Active Menu Item Character Color" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:76 +msgid "Active Mode Icon" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:117 +msgid "Active Text Icon Color" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:204 +msgid "Active Tray Icon" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-lua.conf.in.h:2 +msgid "Add Lua script support for Fcitx" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/dbus/dbusstuff.c:106 +msgid "Add Watch Function Error" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:43 +msgid "Add current input buffer to user dictionary" +msgstr "" + +# unknown +msgid "Addon" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/addon.c:108 +#, c-format +msgid "Addon Config %s is %s" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:19 +msgid "Adjust Order" +msgstr "" + +#: unknown +msgid "AdjustFast" +msgstr "" + +#: unknown +msgid "AdjustFreq" +msgstr "" + +#: unknown +msgid "AdjustNo" +msgstr "" + +#: unknown +msgid "All" +msgstr "" + +#: /home/saber/Develop/fcitx/src/module/xkb/fcitx-xkb.desc:4 +msgid "Allow to Override System XKB Settings" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:156 +msgid "Alternative Next Page Key" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:146 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:151 +msgid "Alternative Prev Page Key" +msgstr "" + +# unknown +msgid "Appearance" +msgstr "" + +#: /home/saber/Develop/fcitx/data/addon.desc:67 +msgid "Argument for InputMethod Register" +msgstr "" + +#: unknown +msgid "Aspell" +msgstr "" + +#: unknown +msgid "Auto" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-autoeng.conf.in.h:2 +msgid "Auto Change to English Mode while Input Specific String" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:27 +msgid "Auto Create Phrase" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-autoeng.conf.in.h:1 +msgid "Auto English Mode" +msgstr "" + +#: unknown +msgid "Auto English Trigger Word" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:82 +msgid "Auto Phrase" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:92 +msgid "Auto Phrase Length" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:97 +msgid "Auto Phrase Phrase" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:43 +msgid "Auto Send Candidate Word" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1117 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1126 +msgid "Available Value:" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:64 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:132 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:212 +msgid "Background Image" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/qxm.conf.in.h:1 +msgid "Bingchan" +msgstr "" + +#: unknown +msgid "CTRL Both" +msgstr "" + +#: unknown +msgid "CTRL_SHIFT" +msgstr "" + +#: unknown +msgid "CTRL_SUPER" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:360 +msgid "Can not find System Database of Pinyin!" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/skin.c:139 +msgid "Can not load default skin, is installion correct?" +msgstr "" +"デフォールトスキンをロードできません、インストールが失敗した可能性があります" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/skin.c:144 +#, c-format +msgid "Can not load skin %s, return to default" +msgstr "%sスキンをロードできません、デフォールトスキンに戻ります。" + +#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:153 +msgid "Can't Create imWindow" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:360 +msgid "Can't open punc file." +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/remote/remote.c:71 +#, c-format +msgid "Can't open socket %s: %s" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:36 +msgid "Candidate Index Color" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:150 +msgid "Candidate Word Number" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/cangjie.conf.in.h:1 +msgid "Cangjie" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:1842 +#, c-format +msgid "Cannot Save Frequent word: %s" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:1915 +#, c-format +msgid "Cannot Save Pinyin Index: %s" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:1778 +#, c-format +msgid "Cannot Save User Pinyin Database: %s" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:460 +msgid "Cannot found Pinyin" +msgstr "" + +#: /home/saber/Develop/fcitx/data/addon.desc:22 +msgid "Category" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:121 +msgid "Choose" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:89 +msgid "Choose Second and Third Candidate Word" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:515 +msgid "Choose the phrase to be deleted, Press Escape to Cancel" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:507 +msgid "Choose the phrase to be put in the front, Press Escape to Cancel" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-classic-ui.conf.in.h:1 +msgid "Classic" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-classic-ui.conf.in.h:2 +msgid "Classic User Interface with Skin support" +msgstr "" + +# unknown +msgid "ClassicUI" +msgstr "" + +#: unknown +msgid "Clean" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/imselector/imselector.c:227 +msgid "Clear local input method" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:212 +msgid "Close virtual keyboard" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:15 +msgid "Code Table File" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:7 +msgid "Code Table Name" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:1157 +msgid "Code is " +msgstr "" + +# unknown +msgid "CodeTable" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:152 +msgid "Color of Cursor" +msgstr "" + +#: /home/saber/Develop/fcitx/data/addon.desc:12 +msgid "Comment" +msgstr "" + +#: unknown +msgid "Commit" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:166 +msgid "Commit and pass when invalid key of this table pressed" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:171 +msgid "Commit key for select first candidate" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:176 +msgid "Commit string when there is no match" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:4 +msgid "Commit with extra space when choose candidate word" +msgstr "" + +#: unknown +msgid "ConfigFile" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:477 +msgid "Configure" +msgstr "設定" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:476 +msgid "Configure Current Input Method" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:841 +#, c-format +msgid "Configure group name error: line %d" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/dbus/dbusstuff.c:86 +#, c-format +msgid "Connection Error (%s)" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-quickphrase.conf.in.h:2 +msgid "Conveniently Input English or User-Defined Simple Table" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-chttrans.conf.in.h:2 +msgid "Convert Simplified Chinese To Traditional Chinese" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:128 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:159 +msgid "Convert to Simplified Chinese" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:128 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:159 +msgid "Convert to Traditional Chinese" +msgstr "" + +#: unknown +msgid "Copy" +msgstr "" + +#: /home/saber/Develop/fcitx/data/profile.desc:22 +msgid "Current Enabled Input Method List" +msgstr "" + +#: /home/saber/Develop/fcitx/data/profile.desc:17 +msgid "Current Input Method Name" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/imselector/imselector.c:212 +#, c-format +msgid "Current local input method is %s" +msgstr "" + +#: unknown +msgid "DBus" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-dbus.conf.in.h:1 +msgid "DBus Support" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/InputWindow.c:166 +msgid "DISPLAY InputWindow" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/MainWindow.c:135 +msgid "DISPLAY MainWindow" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/MainWindow.c:145 +msgid "DRAW MainWindow" +msgstr "" + +#: unknown +msgid "Default" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:121 +msgid "Default Input Method State" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:12 +msgid "Default Shuangpin Schema" +msgstr "" + +#: /home/saber/Develop/fcitx/data/addon.desc:43 +msgid "Dependency" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:15 +msgid "Description of Skin" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/db.conf.in.h:1 +msgid "Dianbaoma" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:140 +msgid "Disable Paging in Remind Mode" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/addon.c:207 +#, c-format +msgid "Disable addon %s, dependency %s can not be satisfied." +msgstr "" + +#: unknown +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:305 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:310 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:370 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:375 +msgid "Disabled" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:160 +msgid "Do not commit preedit text when unfocus a window" +msgstr "" + +#: /home/saber/Develop/fcitx/data/addon.desc:77 +msgid "Do not show in GUI" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:185 +msgid "" +"Do not show input window if there is only one candidate (Hide when only " +"preedit string must be selected)" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:180 +msgid "Do not show input window if there is only preedit string" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:853 +#, c-format +msgid "Duplicate group name, merge with the previous: %s :line %d" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:917 +#, c-format +msgid "Duplicate option, overwrite: line %d" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:131 +msgid "Enable" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:34 +msgid "Enable Hotkey to scroll Between Input Method" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:14 +msgid "Enable word hint if available" +msgstr "" + +#: /home/saber/Develop/fcitx/data/addon.desc:27 +msgid "Enabled" +msgstr "" + +#: /home/saber/Develop/fcitx/src/module/chttrans/fcitx-chttrans.desc:12 +msgid "Enabled in input" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:63 +msgid "End Key" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/xkbdbus/xkbdbus.c:184 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/keyboard/keyboard.c:410 +msgid "English (US)" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:72 +msgid "English Mode Icon" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:377 +msgid "Enum Option is invalid, take it as string" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:350 +msgid "Enum option duplicated." +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:363 +msgid "Enum option number must larger than 0" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/erbi.conf.in.h:1 +msgid "Erbi" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/fcitx-skin-installer.sh:69 +#, sh-format +msgid "" +"Error: $HOME or $XDG_CONFIG_HOME is not set, cannot determine the install " +"path" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/cairostuff/font.c:49 +msgid "Error: Load fontconfig failed" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/fcitx-skin-installer.sh:78 +msgid "Error: skin failed to install" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/fcitx-skin-installer.sh:56 +msgid "Error: skin file doesn't contain skin config." +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/fcitx-skin-installer.sh:48 +msgid "Error: skin file should only contain one directory." +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:78 +msgid "Exact Match" +msgstr "" + +#: unknown +msgid "Exec" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:478 +msgid "Exit" +msgstr "閉じる" + +#: /home/saber/Develop/fcitx/data/config.desc:19 +msgid "Extra key for trigger input method" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/core/errorhandler.c:59 +#, c-format +msgid "FCITX -- Get Signal No.: %d" +msgstr "" + +#: /home/saber/Develop/fcitx/data/addon.desc:72 +msgid "Fallback UI Addon" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:292 +#: ../..//data/fcitx.desktop.in.h:1 +msgid "Fcitx" +msgstr "" + +#. kate: indent-mode cstyle; space-indent on; indent-width 4; +#: ../..//data/fcitx-configtool.desktop.in.h:1 +msgid "Fcitx Config Tool" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-ipc.conf.in.h:1 +msgid "Fcitx DBus Frontend" +msgstr "" + +#: ../..//data/fcitx-configtool.desktop.in.h:2 +msgid "Fcitx GUI Config Tool" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-lua.conf.in.h:1 +msgid "Fcitx Lua Support" +msgstr "" + +#: ../..//src/ui/classic/fcitx-skin-installer.desktop.in.h:1 +msgid "Fcitx Skin Installer" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-xim.conf.in.h:1 +msgid "Fcitx XIM Frontend" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:104 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:196 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:248 +msgid "Fill Background Horizontal rule" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:96 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:188 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:240 +msgid "Fill Background Vertical rule" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:40 +msgid "First Candidate Color" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:161 +msgid "First Candidate Display as Preedit" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:139 +msgid "Fix misstype gn/ng" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:17 +msgid "Fix preedit cursor at head" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/fcitx-classic-ui.desc:14 +msgid "Font" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/fcitx-classic-ui.desc:24 +msgid "Font Locale to display" +msgstr "" + +#: unknown +msgid "Frontend" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-ipc.conf.in.h:2 +msgid "Frontend Used by IM Modules" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/frontend.c:416 +msgid "Frontend: bad frontend" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/frontend.c:404 +#, c-format +msgid "Frontend: open %s fail %s" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:116 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:181 +msgid "Full width Character" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:141 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:485 +msgid "Full width punct" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:52 +msgid "Fullwidth" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-fullwidth-char.conf.in.h:1 +msgid "Fullwidth Character" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:84 +msgid "Fuzzy an and ang" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:114 +msgid "Fuzzy c and ch" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:89 +msgid "Fuzzy en and eng" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:119 +msgid "Fuzzy f and h" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:94 +msgid "Fuzzy ian and iang" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:99 +msgid "Fuzzy in and ing" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:124 +msgid "Fuzzy l and n" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:104 +msgid "Fuzzy ou and u" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:129 +msgid "Fuzzy s and sh" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:109 +msgid "Fuzzy uan and uang" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:134 +msgid "Fuzzy z and zh" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:155 +msgid "Give the tips of Phrase" +msgstr "" + +#: /home/saber/Develop/fcitx/src/module/imselector/fcitx-imselector.desc:9 +msgid "Global Input Method SelectKey" +msgstr "" + +#: unknown +msgid "Grave" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:53 +msgid "Greek" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:116 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:181 +msgid "Half width Character" +msgstr "" + +#: unknown +msgid "Hide" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:59 +msgid "Hiragana" +msgstr "" + +# unknown +msgid "Hotkey" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:37 +msgid "Hotkey of Adding Frequent Word" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:47 +msgid "Hotkey of Delete User Phrase" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:42 +msgid "Hotkey of Deleting Frequent Word" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:52 +msgid "Hotkey of Inputing Word From Phrase" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:289 +#, c-format +msgid "IM: bad im %s" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:275 +#, c-format +msgid "IM: open %s fail %s" +msgstr "" + +# unknown +msgid "IMSelector" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:11 +msgid "Icon Name" +msgstr "" + +#: /home/saber/Develop/fcitx/data/inputmethod.desc:11 +msgid "IconName" +msgstr "" + +#: /home/saber/Develop/fcitx/src/module/xkb/fcitx-xkb.desc:9 +msgid "Ignore Input Method Layout Request" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:181 +msgid "Ignore Punctuation" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:29 +msgid "Inactivate Input Method" +msgstr "" + +#: unknown +msgid "Inactive" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:60 +msgid "Inactive Menu Item Character Color" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:122 +msgid "Inactive Text Icon Color" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:208 +msgid "Inctive Tray Icon" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:55 +msgid "Index" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:19 +msgid "Input Font Size" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:32 +msgid "Input Message Color" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1363 +#: ../..//data/fcitx.desktop.in.h:2 +msgid "Input Method" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:306 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:311 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:371 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:376 +msgid "Input Method Disabled" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1432 +msgid "Input Speed: " +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-imselector.conf.in.h:1 +msgid "Input method selector" +msgstr "" + +# unknown +#: unknown +msgid "InputMethod" +msgstr "" + +#: ../..//src/ui/classic/fcitx-skin-installer.desktop.in.h:2 +msgid "Installer Script for Fcitx Skin" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:54 +msgid "Interval of Two Key Input" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:871 +#, c-format +msgid "Invalid Entry: line %d missing '='" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:60 +msgid "Katakana" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:87 +msgid "" +"Keep current buffer when there is no match item and input length is equal " +"code length" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:261 +msgid "Key Color On Virutal Keyboard" +msgstr "" + +# unknown +msgid "Keyboard" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/keyboard/keyboard.c:375 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/keyboard/keyboard.c:409 +#, c-format +msgid "Keyboard - %s" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/keyboard/keyboard.c:398 +#, c-format +msgid "Keyboard - %s - %s" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-keyboard.conf.in.h:1 +msgid "Keyboard Input Method" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:141 +msgid "Keyboard Layout to be used" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-kimpanel-ui.conf.in.h:1 +msgid "Kimpanel" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-kimpanel-ui.conf.in.h:2 +msgid "Kimpanel Support for Fcitx" +msgstr "" + +#: unknown +msgid "L_CTRL" +msgstr "" + +#: unknown +msgid "L_SHIFT" +msgstr "" + +#: /home/saber/Develop/fcitx/data/inputmethod.desc:19 +msgid "LangCode" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:126 +msgid "Language Code for this table" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:51 +msgid "Latin" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:141 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:485 +msgid "Latin punct" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:156 +msgid "Left-down position of Input" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:160 +msgid "Left-down position of Output" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:432 +msgid "" +"Left/Right to choose selected character, Press Enter to confirm, Press " +"Escape to Cancel" +msgstr "" + +#: /home/saber/Develop/fcitx/data/addon.desc:31 +msgid "Library" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/addon.c:100 +#, c-format +msgid "Load Addon Config File:%s" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:243 +msgid "Load Autophrase OK" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:155 +#, c-format +msgid "Load Table Config File:%s" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:176 +msgid "Load Table Dict OK" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:37 +#, c-format +msgid "Load Table Dict from %s" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:376 +#, c-format +msgid "Load extra dict: %s" +msgstr "" + +#. 读取上次保存的自动词组信息 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:203 +msgid "Loading Autophrase." +msgstr "" + +#. 读入码表 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:34 +msgid "Loading Table Dict" +msgstr "" + +#: /home/saber/Develop/fcitx/src/module/imselector/fcitx-imselector.desc:4 +msgid "Local Input Method SelectKey" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:68 +msgid "Logo Icon" +msgstr "" + +#: unknown +msgid "MS" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/fcitx-classic-ui.desc:38 +msgid "Main Window Hide Mode" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/fcitx-classic-ui.desc:2 +msgid "Main Window Position X" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/fcitx-classic-ui.desc:7 +msgid "Main Window Position Y" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:73 +msgid "Matching Key" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:56 +msgid "Math" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/fcitx-classic-ui.desc:19 +msgid "Menu Font" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:23 +msgid "Menu Font Size" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:2306 +msgid "Migrate the old file path to the new one" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:19 +msgid "Minimum Length to trigger word hint" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:53 +msgid "" +"Minimum length trigger auto send candidate when there will be no candidate" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:48 +msgid "Minimum length trigger auto send candidate word when only one candidate" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:387 +msgid "Missing type, take it as string" +msgstr "" + +#: unknown +msgid "Module" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/module.c:76 +msgid "Module: bad module" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/module.c:64 +#, c-format +msgid "Module: open %s fail %s" +msgstr "" + +#: unknown +msgid "Myspell" +msgstr "" + +#: /home/saber/Develop/fcitx/data/inputmethod.desc:7 +#: /home/saber/Develop/fcitx/data/addon.desc:3 +msgid "Name" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/dbus/dbusstuff.c:126 +#, c-format +msgid "Name Error (%s)" +msgstr "" + +#: /home/saber/Develop/fcitx/data/addon.desc:7 +msgid "Name that can be display in UI" +msgstr "" + +#: unknown +msgid "Native" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:84 +msgid "Next Page" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:168 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:176 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:184 +msgid "Next Page Icon" +msgstr "" + +#: unknown +msgid "No" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:494 +msgid "No available Input Method" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/frontend.c:437 +msgid "No available frontend" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:359 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:360 +msgid "No input window" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/imselector/imselector.c:216 +msgid "No local input method" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:160 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:321 +msgid "No remind" +msgstr "" + +#: unknown +msgid "Nothing" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:57 +msgid "Number" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:413 +msgid "Online Help" +msgstr "オンラインヘルプ" + +#: unknown +msgid "OpenCC" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:238 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:340 +msgid "OpenCC error" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:230 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:332 +msgid "OpenCC initialization error" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1064 +#, c-format +msgid "Option %s is Invalid, Use Default Value %s" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1074 +#, c-format +msgid "Option %s is Invalid." +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:28 +msgid "Order of Code Table" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:52 +msgid "Other Color" +msgstr "" + +# unknown +msgid "Output" +msgstr "" + +#: /home/saber/Develop/fcitx/data/inputmethod.desc:23 +msgid "Parent" +msgstr "" + +#: unknown +msgid "PerProgram" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:1154 +msgid "Phrase is already in Dict " +msgstr "" + +# unknown +#: /home/saber/Develop/fcitx/build/po/tmp/pinyin.conf.in.h:1 +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-pinyin.conf.in.h:1 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:111 +msgid "Pinyin" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:426 +msgid "Pinyin Index Magic Number Doesn't match" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:38 +msgid "Pinyin Key" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:458 +msgid "Pinyin: " +msgstr "" + +#: unknown +msgid "PinyinJiaJia" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:168 +msgid "Please set XMODIFIERS." +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:38 +msgid "Preferred Enchant Provider (Need Restart)" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:801 +#, c-format +msgid "Press 1 to delete %s in frequent list (ESC for cancel)" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:803 +#, c-format +msgid "Press 1-%d to delete %s in frequent list (ESC for cancel)" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/autoeng/AutoEng.c:311 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:309 +msgid "Press Enter to input text" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:49 +msgid "Press Switch Key twice to Change Mode" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:763 +msgid "Press index to delete user phrase (ESC for cancel)" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:774 +msgid "Press number to make word in frequent list" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:79 +msgid "Prev Page" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:164 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:172 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:180 +msgid "Prev Page Icon" +msgstr "" + +#: /home/saber/Develop/fcitx/data/inputmethod.desc:15 +msgid "Priority" +msgstr "" + +#: /home/saber/Develop/fcitx/data/addon.desc:48 +msgid "Priority of addon" +msgstr "" + +# unknown +msgid "Profile" +msgstr "" + +# unknown +msgid "Program" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:107 +msgid "Prompt Table Code" +msgstr "" + +#: /home/saber/Develop/fcitx/data/profile.desc:12 +msgid "Prompt the phrases after input" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-dbus.conf.in.h:2 +msgid "Provides DBus Support (Used by other Addon)" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-fullwidth-char.conf.in.h:2 +msgid "Provides Fullwidth Character Input Support" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-xim.conf.in.h:2 +msgid "Provides XIM support" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-punc.conf.in.h:2 +msgid "Punctuation Conversion Support" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-punc.conf.in.h:1 +msgid "Punctuation Support" +msgstr "" + +#: unknown +msgid "Quick Phrase List" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:244 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:333 +msgid "Quick Phrase: " +msgstr "" + +# unknown +msgid "QuickPhrase" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-quickphrase.conf.in.h:1 +msgid "Quickphrase" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/qw.conf.in.h:1 +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-qw.conf.in.h:1 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/qw/qw.c:68 +msgid "Quwei" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-qw.conf.in.h:2 +msgid "Quwei Input Method for Fcitx" +msgstr "" + +#: unknown +msgid "R_CTRL" +msgstr "" + +#: unknown +msgid "R_SHIFT" +msgstr "" + +#: /home/saber/Develop/fcitx/data/addon.desc:58 +msgid "Register IM" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:1050 +msgid "Remind:" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:2173 +msgid "Remind: " +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-remote-module.conf.in.h:1 +msgid "Remote" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:330 +msgid "Rename OK" +msgstr "" + +#: unknown +msgid "Resize" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:92 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:148 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:220 +msgid "Resize Margin Bottom" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:80 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:136 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:224 +msgid "Resize Margin Left" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:84 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:140 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:228 +msgid "Resize Margin Right" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:88 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:144 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:216 +msgid "Resize Margin Top" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:70 +msgid "Rule of Candidate Phrase Order" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:61 +msgid "Rule of Candidate Word Order" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:79 +msgid "Rule of Frequent Word Order" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:54 +msgid "Russian" +msgstr "" + +#: unknown +msgid "SHIFT Both" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:32 +msgid "Save Auto Created Phrase" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:102 +msgid "Save Auto Phrase" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:274 +msgid "Save dict error" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:94 +msgid "Saving All Config and Input History" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:44 +msgid "Scroll between Input Method" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:104 +msgid "Seconds sleep before fcitx really start" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/imselector/imselector.c:207 +msgid "Select global input method: " +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/imselector/imselector.c:207 +msgid "Select local input method: " +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-imselector.conf.in.h:2 +msgid "Select specific input method via keyboard" +msgstr "" + +#: unknown +msgid "Self" +msgstr "" + +#: unknown +msgid "Semicolon" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:58 +msgid "Send Raw Preedit" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:145 +msgid "Send typed raw text if Switch to inactive Mode" +msgstr "非活動モードの時入力したテキストをそのままに送信する" + +#: /home/saber/Develop/fcitx/data/config.desc:113 +msgid "Share State Among Window" +msgstr "" + +#: unknown +msgid "SharedLibrary" +msgstr "" + +#: unknown +msgid "Show" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:170 +msgid "Show Input Speed" +msgstr "入力スピードを表示する" + +#: /home/saber/Develop/fcitx/data/config.desc:165 +msgid "Show Input Window After Trigger Input Mode" +msgstr "" + +#: /home/saber/Develop/fcitx/data/profile.desc:29 +msgid "Show Preedit String in Client Window" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:175 +msgid "Show Version" +msgstr "バージョンを表示する" + +#: unknown +msgid "Shuang Pin Schema" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/shuangpin.conf.in.h:1 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:127 +msgid "Shuangpin" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-pinyin.conf.in.h:2 +msgid "Simple Pinyin support for Fcitx" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-chttrans.conf.in.h:1 +msgid "Simplified Chinese To Traditional Chinese" +msgstr "" + +#: unknown /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/skin.c:924 +msgid "Skin" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:11 +msgid "Skin Author" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/fcitx-classic-ui.desc:48 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:3 +msgid "Skin Name" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:7 +msgid "Skin Version" +msgstr "" + +# unknown +msgid "SkinFont" +msgstr "" + +# unknown +msgid "SkinInfo" +msgstr "" + +# unknown +msgid "SkinInputBar" +msgstr "" + +# unknown +msgid "SkinKeyboard" +msgstr "" + +# unknown +msgid "SkinMainBar" +msgstr "" + +# unknown +msgid "SkinMenu" +msgstr "" + +# unknown +msgid "SkinTrayIcon" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:236 +msgid "Space Line Color" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:342 +#, c-format +msgid "Space for %s Enter for %s" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:58 +msgid "Special" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:127 +msgid "Special Icon position" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:247 +#, c-format +msgid "Start XIM error. Another XIM daemon named %s is running?" +msgstr "" + +#: /home/saber/Develop/fcitx/data/addon.desc:53 +msgid "Sub Configuration for Module" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/fcitx-skin-installer.sh:81 +msgid "Successfully Installed skin" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:99 +msgid "Switch Embeded Preedit" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:74 +msgid "Switch Full Width Punc Mode" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:69 +msgid "Switching Full Width Character Mode" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:64 +msgid "Switching Remind Mode" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:59 +msgid "Switching Virtual Keyboard" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:111 unknown +msgid "Symbol" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:116 +msgid "Symbol File" +msgstr "" + +#: unknown /home/saber/Develop/fcitx/build/po/tmp/fcitx-table.conf.in.h:1 +msgid "Table" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:48 +msgid "Table Code Color" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:162 +#, c-format +msgid "Table Config %s is %s" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-table.conf.in.h:2 +msgid "Table Input Method for Fcitx" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:61 +msgid "Table Symbol" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:28 +msgid "Tip Message Color" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:142 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:486 +msgid "Toggle Full Width Punctuation" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:117 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:182 +msgid "Toggle Half/Full width Character" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:161 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:322 +msgid "Toggle Remind" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:129 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:160 +msgid "Toggle Simp/Trad Chinese Conversion" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:158 +msgid "Toggle Virtual Keyboard" +msgstr "" + +#: /home/saber/Develop/fcitx/src/module/chttrans/fcitx-chttrans.desc:17 +msgid "Toggle for enable or disable" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:9 +msgid "Toggle the word hint" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/autoeng/AutoEng.c:263 +msgid "Too long item for AutoEng" +msgstr "" + +#: /home/saber/Develop/fcitx/src/module/chttrans/fcitx-chttrans.desc:6 +msgid "Traditional Chinese Translate Engine" +msgstr "" + +# unknown +msgid "TraditionalChinese" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:4 +msgid "Trigger Input Method" +msgstr "" + +#: /home/saber/Develop/fcitx/src/module/quickphrase/fcitx-quickphrase.desc:7 +msgid "Trigger Key for QuickPhrase" +msgstr "" + +#: /home/saber/Develop/fcitx/data/addon.desc:38 +msgid "Type" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:126 +msgid "Type half width Punc After a Number" +msgstr "" + +#: unknown +msgid "UI" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ui.c:202 +msgid "UI: bad ui" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ui.c:189 +#, c-format +msgid "UI: open %s fail %s" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:491 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-utils/utils.c:471 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-utils/utils.c:487 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-utils/utils.c:502 +msgid "Unable to create process" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:2 +msgid "Unique Name for Table" +msgstr "" + +#: /home/saber/Develop/fcitx/data/inputmethod.desc:3 +msgid "UniqueName" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:383 +#, c-format +msgid "Unknown type, take it as string: %s" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:22 +msgid "Use Complete Pinyin" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:136 +msgid "Use Custom Prompt String defined in table" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:112 +msgid "Use Custom text icon color" +msgstr "" + +#: /home/saber/Develop/fcitx/data/profile.desc:2 +msgid "Use Full Width Character" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-keyboard.conf.in.h:2 +msgid "Use Keyboard Layout as Input Method" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:68 +msgid "Use Matching Key" +msgstr "" + +#: /home/saber/Develop/fcitx/src/frontend/xim/fcitx-xim.desc:4 +msgid "Use On The Spot Style for XIM (Can not change during running)" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:33 +msgid "Use Pinyin" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/fcitx-classic-ui.desc:29 +msgid "Use System Tray Icon" +msgstr "" + +#: /home/saber/Develop/fcitx/data/profile.desc:7 +msgid "Use Wide Punctuation" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:24 +msgid "Use enter to commit the existing string" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:29 +msgid "Use presage to predict if possible." +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:160 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:321 +msgid "Use remind" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-remote-module.conf.in.h:2 +msgid "Used by fcitx-remote to change Fcitx state from console" +msgstr "" + +#: unknown +msgid "User Defined" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:44 +msgid "User Phrase Color" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/fcitx-classic-ui.desc:43 +msgid "Vertical Candidate Word List" +msgstr "" + +#: unknown /home/saber/Develop/fcitx/build/po/tmp/fcitx-vk.conf.in.h:1 +msgid "Virtual Key Board" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-vk.conf.in.h:2 +msgid "Virtual Key Board in order to input special character" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:179 +msgid "Virtual Keyboard" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:256 +msgid "Virtual Keyboard Image" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:158 +msgid "Virtual Keyboard State" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/wanfeng.conf.in.h:1 +msgid "Wanfeng" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/wbx.conf.in.h:1 +msgid "Wubi" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/wbpy.conf.in.h:1 +msgid "WubiPinyin" +msgstr "" + +# unknown +msgid "X Keyboard" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-xkb.conf.in.h:1 +msgid "X Keyboard Integration" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-xkbdbus.conf.in.h:1 +msgid "X Keyboard Integration export with DBus" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/tray.c:164 +#, c-format +msgid "X error %i on opcode send" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-x11.conf.in.h:1 +msgid "X11 Support" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-x11.conf.in.h:2 +msgid "X11 Utilitiy used by other Addon" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:140 +msgid "X11 not initialized" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:164 +msgid "XMODIFIERS Error." +msgstr "" + +# unknown +msgid "Xim" +msgstr "" + +#: unknown +msgid "Zhongwenzhixing" +msgstr "" + +#: unknown +msgid "Ziguang" +msgstr "" + +#: unknown /home/saber/Develop/fcitx/build/po/tmp/zrm.conf.in.h:1 +msgid "Ziranma" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1436 +msgid "min Num of Characters: " +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1138 +#, c-format +msgid "no default option for %s/%s" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/cairostuff/font.c:106 +msgid "no valid font." +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:297 +msgid "pthread mutex init failed" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/cairostuff/font.c:90 +#, c-format +msgid "your current font is: %s" +msgstr "" + +#~ msgid "About Fcitx" +#~ msgstr "Fcitxについて" diff -Nru fcitx-4.2.2/po/POTFILES.in.in fcitx-4.2.4.1/po/POTFILES.in.in --- fcitx-4.2.2/po/POTFILES.in.in 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/po/POTFILES.in.in 2012-06-10 14:34:48.000000000 +0000 @@ -2,191 +2,338 @@ [encoding: UTF-8] ./po/desc.po ./po/conf.po -@REL_SOURCE_ROOT@/data/table/db.conf.in -@REL_SOURCE_ROOT@/data/table/erbi.conf.in -@REL_SOURCE_ROOT@/data/table/qxm.conf.in -@REL_SOURCE_ROOT@/data/table/wanfeng.conf.in -@REL_SOURCE_ROOT@/data/table/wbpy.conf.in -@REL_SOURCE_ROOT@/data/table/wbx.conf.in -@REL_SOURCE_ROOT@/data/table/zrm.conf.in -@REL_SOURCE_ROOT@/data/table/cangjie.conf.in -@REL_SOURCE_ROOT@/src/im/pinyin/fcitx-pinyin.conf.in -@REL_SOURCE_ROOT@/src/im/qw/fcitx-qw.conf.in -@REL_SOURCE_ROOT@/src/im/table/fcitx-table.conf.in -@REL_SOURCE_ROOT@/src/module/chttrans/fcitx-chttrans.conf.in +@REL_SOURCE_ROOT@/src/module/lua/fcitx-lua.conf.in @REL_SOURCE_ROOT@/src/module/punc/fcitx-punc.conf.in -@REL_SOURCE_ROOT@/src/module/quickphrase/fcitx-quickphrase.conf.in -@REL_SOURCE_ROOT@/src/module/vk/fcitx-vk.conf.in -@REL_SOURCE_ROOT@/src/module/x11/fcitx-x11.conf.in @REL_SOURCE_ROOT@/src/module/autoeng/fcitx-autoeng.conf.in +@REL_SOURCE_ROOT@/src/module/remote/fcitx-remote-module.conf.in +@REL_SOURCE_ROOT@/src/module/imselector/fcitx-imselector.conf.in +@REL_SOURCE_ROOT@/src/module/x11/fcitx-x11.conf.in +@REL_SOURCE_ROOT@/src/module/xkbdbus/fcitx-xkbdbus.conf.in +@REL_SOURCE_ROOT@/src/module/vk/fcitx-vk.conf.in +@REL_SOURCE_ROOT@/src/module/xkb/fcitx-xkb.conf.in @REL_SOURCE_ROOT@/src/module/dbus/fcitx-dbus.conf.in +@REL_SOURCE_ROOT@/src/module/chttrans/fcitx-chttrans.conf.in @REL_SOURCE_ROOT@/src/module/fullwidthchar/fcitx-fullwidth-char.conf.in -@REL_SOURCE_ROOT@/src/module/remote/fcitx-remote-module.conf.in +@REL_SOURCE_ROOT@/src/module/quickphrase/fcitx-quickphrase.conf.in @REL_SOURCE_ROOT@/src/ui/classic/fcitx-classic-ui.conf.in @REL_SOURCE_ROOT@/src/ui/kimpanel/fcitx-kimpanel-ui.conf.in -@REL_SOURCE_ROOT@/src/frontend/ipc/fcitx-ipc.conf.in +@REL_SOURCE_ROOT@/src/im/table/fcitx-table.conf.in +@REL_SOURCE_ROOT@/src/im/qw/qw.conf.in +@REL_SOURCE_ROOT@/src/im/qw/fcitx-qw.conf.in +@REL_SOURCE_ROOT@/src/im/pinyin/shuangpin.conf.in +@REL_SOURCE_ROOT@/src/im/pinyin/pinyin.conf.in +@REL_SOURCE_ROOT@/src/im/pinyin/fcitx-pinyin.conf.in +@REL_SOURCE_ROOT@/src/im/keyboard/fcitx-keyboard.conf.in @REL_SOURCE_ROOT@/src/frontend/xim/fcitx-xim.conf.in -@REL_SOURCE_ROOT@/data/fcitx-configtool.desktop.in -@REL_SOURCE_ROOT@/data/fcitx.desktop.in -@REL_SOURCE_ROOT@/src/ui/classic/fcitx-skin-installer.desktop.in -@REL_SOURCE_ROOT@/src/core/fcitx.c -@REL_SOURCE_ROOT@/src/core/errorhandler.c -@REL_SOURCE_ROOT@/src/im/pinyin/PYFA.c -@REL_SOURCE_ROOT@/src/im/pinyin/pyMapTable.c -@REL_SOURCE_ROOT@/src/im/pinyin/pyParser.c -@REL_SOURCE_ROOT@/src/im/pinyin/pyconfig.c -@REL_SOURCE_ROOT@/src/im/pinyin/sp.c -@REL_SOURCE_ROOT@/src/im/pinyin/py.c -@REL_SOURCE_ROOT@/src/im/qw/qw.c -@REL_SOURCE_ROOT@/src/im/table/tableconfig.c -@REL_SOURCE_ROOT@/src/im/table/tabledict.c -@REL_SOURCE_ROOT@/src/im/table/tablepinyinwrapper.c -@REL_SOURCE_ROOT@/src/im/table/table.c -@REL_SOURCE_ROOT@/src/module/chttrans/chttrans.c +@REL_SOURCE_ROOT@/src/frontend/ipc/fcitx-ipc.conf.in +@REL_SOURCE_ROOT@/data/table/qxm.conf.in +@REL_SOURCE_ROOT@/data/table/wbx.conf.in +@REL_SOURCE_ROOT@/data/table/wanfeng.conf.in +@REL_SOURCE_ROOT@/data/table/db.conf.in +@REL_SOURCE_ROOT@/data/table/wbpy.conf.in +@REL_SOURCE_ROOT@/data/table/erbi.conf.in +@REL_SOURCE_ROOT@/data/table/zrm.conf.in +@REL_SOURCE_ROOT@/data/table/cangjie.conf.in +@REL_SOURCE_ROOT@/src/module/lua/lua.c +@REL_SOURCE_ROOT@/src/module/lua/luawrap.c @REL_SOURCE_ROOT@/src/module/punc/punc.c -@REL_SOURCE_ROOT@/src/module/quickphrase/QuickPhrase.c -@REL_SOURCE_ROOT@/src/module/vk/vk.c +@REL_SOURCE_ROOT@/src/module/autoeng/AutoEng.c +@REL_SOURCE_ROOT@/src/module/remote/remote.c +@REL_SOURCE_ROOT@/src/module/imselector/imselector.c @REL_SOURCE_ROOT@/src/module/x11/x11stuff.c @REL_SOURCE_ROOT@/src/module/x11/xerrorhandler.c -@REL_SOURCE_ROOT@/src/module/autoeng/AutoEng.c +@REL_SOURCE_ROOT@/src/module/xkbdbus/xkbdbus.c +@REL_SOURCE_ROOT@/src/module/vk/vk.c +@REL_SOURCE_ROOT@/src/module/xkb/xkbconfig.c +@REL_SOURCE_ROOT@/src/module/xkb/xkb.c +@REL_SOURCE_ROOT@/src/module/xkb/rules.c @REL_SOURCE_ROOT@/src/module/dbus/dbusstuff.c +@REL_SOURCE_ROOT@/src/module/chttrans/chttrans.c @REL_SOURCE_ROOT@/src/module/fullwidthchar/fullwidthchar.c -@REL_SOURCE_ROOT@/src/module/remote/remote.c -@REL_SOURCE_ROOT@/src/ui/classic/AboutWindow.c +@REL_SOURCE_ROOT@/src/module/quickphrase/QuickPhrase.c @REL_SOURCE_ROOT@/src/ui/classic/MessageWindow.c -@REL_SOURCE_ROOT@/src/ui/classic/TrayWindow.c @REL_SOURCE_ROOT@/src/ui/classic/classicuiconfig.c @REL_SOURCE_ROOT@/src/ui/classic/tray.c +@REL_SOURCE_ROOT@/src/ui/classic/skinconfig.c +@REL_SOURCE_ROOT@/src/ui/classic/skin.c @REL_SOURCE_ROOT@/src/ui/classic/InputWindow.c @REL_SOURCE_ROOT@/src/ui/classic/MainWindow.c @REL_SOURCE_ROOT@/src/ui/classic/MenuWindow.c +@REL_SOURCE_ROOT@/src/ui/classic/TrayWindow.c @REL_SOURCE_ROOT@/src/ui/classic/classicui.c -@REL_SOURCE_ROOT@/src/ui/classic/skin.c -@REL_SOURCE_ROOT@/src/ui/classic/skinconfig.c -@REL_SOURCE_ROOT@/src/ui/kimpanel/kimpanel.c -@REL_SOURCE_ROOT@/src/ui/cairostuff/cairostuff.c @REL_SOURCE_ROOT@/src/ui/cairostuff/font.c -@REL_SOURCE_ROOT@/src/lib/fcitx-utils/utf8.c +@REL_SOURCE_ROOT@/src/ui/cairostuff/cairostuff.c +@REL_SOURCE_ROOT@/src/ui/kimpanel/kimpanel.c +@REL_SOURCE_ROOT@/src/core/fcitx.c +@REL_SOURCE_ROOT@/src/core/errorhandler.c +@REL_SOURCE_ROOT@/src/im/table/tableconfig.c +@REL_SOURCE_ROOT@/src/im/table/tablepinyinwrapper.c +@REL_SOURCE_ROOT@/src/im/table/tabledict.c +@REL_SOURCE_ROOT@/src/im/table/table.c +@REL_SOURCE_ROOT@/src/im/qw/qw.c +@REL_SOURCE_ROOT@/src/im/pinyin/pyconfig.c +@REL_SOURCE_ROOT@/src/im/pinyin/PYFA.c +@REL_SOURCE_ROOT@/src/im/pinyin/py.c +@REL_SOURCE_ROOT@/src/im/pinyin/pyParser.c +@REL_SOURCE_ROOT@/src/im/pinyin/pyMapTable.c +@REL_SOURCE_ROOT@/src/im/pinyin/sp.c +@REL_SOURCE_ROOT@/src/im/keyboard/isocodes.c +@REL_SOURCE_ROOT@/src/im/keyboard/keyboard.c +@REL_SOURCE_ROOT@/src/im/keyboard/keyboardconfig.c +@REL_SOURCE_ROOT@/src/frontend/gtk2/fcitximcontext.c +@REL_SOURCE_ROOT@/src/frontend/gtk2/fcitxim.c +@REL_SOURCE_ROOT@/src/frontend/gtk2/client.c +@REL_SOURCE_ROOT@/src/frontend/gtk2/fcitximcontext-gio.c +@REL_SOURCE_ROOT@/src/frontend/xim/ximconfig.c +@REL_SOURCE_ROOT@/src/frontend/xim/IC.c +@REL_SOURCE_ROOT@/src/frontend/xim/ximhandler.c +@REL_SOURCE_ROOT@/src/frontend/xim/lib/i18nPtHdr.c +@REL_SOURCE_ROOT@/src/frontend/xim/lib/IMConn.c +@REL_SOURCE_ROOT@/src/frontend/xim/lib/FrameMgr.c +@REL_SOURCE_ROOT@/src/frontend/xim/lib/IMMethod.c +@REL_SOURCE_ROOT@/src/frontend/xim/lib/i18nAttr.c +@REL_SOURCE_ROOT@/src/frontend/xim/lib/i18nX.c +@REL_SOURCE_ROOT@/src/frontend/xim/lib/i18nUtil.c +@REL_SOURCE_ROOT@/src/frontend/xim/lib/i18nIc.c +@REL_SOURCE_ROOT@/src/frontend/xim/lib/i18nClbk.c +@REL_SOURCE_ROOT@/src/frontend/xim/lib/i18nMethod.c +@REL_SOURCE_ROOT@/src/frontend/xim/lib/IMValues.c +@REL_SOURCE_ROOT@/src/frontend/xim/lib/i18nIMProto.c +@REL_SOURCE_ROOT@/src/frontend/xim/xim.c +@REL_SOURCE_ROOT@/src/frontend/ipc/ipc.c @REL_SOURCE_ROOT@/src/lib/fcitx-utils/qsort_r.c @REL_SOURCE_ROOT@/src/lib/fcitx-utils/log.c +@REL_SOURCE_ROOT@/src/lib/fcitx-utils/utf8.c +@REL_SOURCE_ROOT@/src/lib/fcitx-utils/memory.c @REL_SOURCE_ROOT@/src/lib/fcitx-utils/utils.c -@REL_SOURCE_ROOT@/src/lib/fcitx-config/fcitx-config.c -@REL_SOURCE_ROOT@/src/lib/fcitx-config/sprintf.c -@REL_SOURCE_ROOT@/src/lib/fcitx-config/xdg.c -@REL_SOURCE_ROOT@/src/lib/fcitx-config/hotkey.c -@REL_SOURCE_ROOT@/src/lib/fcitx/addon.c +@REL_SOURCE_ROOT@/src/lib/fcitx-utils/msort_r.c @REL_SOURCE_ROOT@/src/lib/fcitx/candidate.c @REL_SOURCE_ROOT@/src/lib/fcitx/configfile.c -@REL_SOURCE_ROOT@/src/lib/fcitx/frontend.c +@REL_SOURCE_ROOT@/src/lib/fcitx/ime.c @REL_SOURCE_ROOT@/src/lib/fcitx/hook.c -@REL_SOURCE_ROOT@/src/lib/fcitx/module.c @REL_SOURCE_ROOT@/src/lib/fcitx/profile.c -@REL_SOURCE_ROOT@/src/lib/fcitx/ui.c @REL_SOURCE_ROOT@/src/lib/fcitx/instance.c @REL_SOURCE_ROOT@/src/lib/fcitx/keys.c -@REL_SOURCE_ROOT@/src/lib/fcitx/ime.c +@REL_SOURCE_ROOT@/src/lib/fcitx/context.c +@REL_SOURCE_ROOT@/src/lib/fcitx/ui.c +@REL_SOURCE_ROOT@/src/lib/fcitx/frontend.c +@REL_SOURCE_ROOT@/src/lib/fcitx/module.c +@REL_SOURCE_ROOT@/src/lib/fcitx/addon.c +@REL_SOURCE_ROOT@/src/lib/fcitx-gclient/fcitxclient.c +@REL_SOURCE_ROOT@/src/lib/fcitx-gclient/fcitxinputmethod.c +@REL_SOURCE_ROOT@/src/lib/fcitx-config/sprintf.c +@REL_SOURCE_ROOT@/src/lib/fcitx-config/fcitx-config.c +@REL_SOURCE_ROOT@/src/lib/fcitx-config/hotkey.c +@REL_SOURCE_ROOT@/src/lib/fcitx-config/xdg.c +@REL_SOURCE_ROOT@/tools/createPYMB.c +@REL_SOURCE_ROOT@/tools/pyTools.c +@REL_SOURCE_ROOT@/tools/fcitx-remote.c +@REL_SOURCE_ROOT@/tools/scel2org.c +@REL_SOURCE_ROOT@/tools/mb2org.c +@REL_SOURCE_ROOT@/tools/readPYMB.c +@REL_SOURCE_ROOT@/tools/readPYBase.c +@REL_SOURCE_ROOT@/tools/txt2mb.c +@REL_SOURCE_ROOT@/tools/mb2txt.c +@REL_SOURCE_ROOT@/test/testutf8.c +@REL_SOURCE_ROOT@/test/testmessage.c +@REL_SOURCE_ROOT@/test/testconfig.c +@REL_SOURCE_ROOT@/test/testpinyin.c +@REL_SOURCE_ROOT@/test/teststring.c +@REL_SOURCE_ROOT@/src/module/lua/lua.c +@REL_SOURCE_ROOT@/src/module/lua/luawrap.c +@REL_SOURCE_ROOT@/src/module/punc/punc.c +@REL_SOURCE_ROOT@/src/module/autoeng/AutoEng.c +@REL_SOURCE_ROOT@/src/module/remote/remote.c +@REL_SOURCE_ROOT@/src/module/imselector/imselector.c +@REL_SOURCE_ROOT@/src/module/x11/x11stuff.c +@REL_SOURCE_ROOT@/src/module/x11/xerrorhandler.c +@REL_SOURCE_ROOT@/src/module/xkbdbus/xkbdbus.c +@REL_SOURCE_ROOT@/src/module/vk/vk.c +@REL_SOURCE_ROOT@/src/module/xkb/xkbconfig.c +@REL_SOURCE_ROOT@/src/module/xkb/xkb.c +@REL_SOURCE_ROOT@/src/module/xkb/rules.c +@REL_SOURCE_ROOT@/src/module/dbus/dbusstuff.c +@REL_SOURCE_ROOT@/src/module/chttrans/chttrans.c +@REL_SOURCE_ROOT@/src/module/fullwidthchar/fullwidthchar.c +@REL_SOURCE_ROOT@/src/module/quickphrase/QuickPhrase.c +@REL_SOURCE_ROOT@/src/ui/classic/MessageWindow.c +@REL_SOURCE_ROOT@/src/ui/classic/classicuiconfig.c +@REL_SOURCE_ROOT@/src/ui/classic/tray.c +@REL_SOURCE_ROOT@/src/ui/classic/skinconfig.c +@REL_SOURCE_ROOT@/src/ui/classic/skin.c +@REL_SOURCE_ROOT@/src/ui/classic/InputWindow.c +@REL_SOURCE_ROOT@/src/ui/classic/MainWindow.c +@REL_SOURCE_ROOT@/src/ui/classic/MenuWindow.c +@REL_SOURCE_ROOT@/src/ui/classic/TrayWindow.c +@REL_SOURCE_ROOT@/src/ui/classic/classicui.c +@REL_SOURCE_ROOT@/src/ui/cairostuff/font.c +@REL_SOURCE_ROOT@/src/ui/cairostuff/cairostuff.c +@REL_SOURCE_ROOT@/src/ui/kimpanel/kimpanel.c +@REL_SOURCE_ROOT@/src/core/fcitx.c +@REL_SOURCE_ROOT@/src/core/errorhandler.c +@REL_SOURCE_ROOT@/src/im/table/tableconfig.c +@REL_SOURCE_ROOT@/src/im/table/tablepinyinwrapper.c +@REL_SOURCE_ROOT@/src/im/table/tabledict.c +@REL_SOURCE_ROOT@/src/im/table/table.c +@REL_SOURCE_ROOT@/src/im/qw/qw.c +@REL_SOURCE_ROOT@/src/im/pinyin/pyconfig.c +@REL_SOURCE_ROOT@/src/im/pinyin/PYFA.c +@REL_SOURCE_ROOT@/src/im/pinyin/py.c +@REL_SOURCE_ROOT@/src/im/pinyin/pyParser.c +@REL_SOURCE_ROOT@/src/im/pinyin/pyMapTable.c +@REL_SOURCE_ROOT@/src/im/pinyin/sp.c +@REL_SOURCE_ROOT@/src/im/keyboard/isocodes.c +@REL_SOURCE_ROOT@/src/im/keyboard/keyboard.c +@REL_SOURCE_ROOT@/src/im/keyboard/keyboardconfig.c +@REL_SOURCE_ROOT@/src/frontend/gtk2/fcitximcontext.c @REL_SOURCE_ROOT@/src/frontend/gtk2/fcitxim.c @REL_SOURCE_ROOT@/src/frontend/gtk2/client.c -@REL_SOURCE_ROOT@/src/frontend/gtk2/fcitximcontext.c -@REL_SOURCE_ROOT@/src/frontend/ipc/ipc.c -@REL_SOURCE_ROOT@/src/frontend/xim/lib/FrameMgr.c +@REL_SOURCE_ROOT@/src/frontend/gtk2/fcitximcontext-gio.c +@REL_SOURCE_ROOT@/src/frontend/xim/ximconfig.c +@REL_SOURCE_ROOT@/src/frontend/xim/IC.c +@REL_SOURCE_ROOT@/src/frontend/xim/ximhandler.c +@REL_SOURCE_ROOT@/src/frontend/xim/lib/i18nPtHdr.c @REL_SOURCE_ROOT@/src/frontend/xim/lib/IMConn.c +@REL_SOURCE_ROOT@/src/frontend/xim/lib/FrameMgr.c @REL_SOURCE_ROOT@/src/frontend/xim/lib/IMMethod.c -@REL_SOURCE_ROOT@/src/frontend/xim/lib/IMValues.c @REL_SOURCE_ROOT@/src/frontend/xim/lib/i18nAttr.c -@REL_SOURCE_ROOT@/src/frontend/xim/lib/i18nClbk.c -@REL_SOURCE_ROOT@/src/frontend/xim/lib/i18nIMProto.c +@REL_SOURCE_ROOT@/src/frontend/xim/lib/i18nX.c +@REL_SOURCE_ROOT@/src/frontend/xim/lib/i18nUtil.c @REL_SOURCE_ROOT@/src/frontend/xim/lib/i18nIc.c +@REL_SOURCE_ROOT@/src/frontend/xim/lib/i18nClbk.c @REL_SOURCE_ROOT@/src/frontend/xim/lib/i18nMethod.c -@REL_SOURCE_ROOT@/src/frontend/xim/lib/i18nPtHdr.c -@REL_SOURCE_ROOT@/src/frontend/xim/lib/i18nUtil.c -@REL_SOURCE_ROOT@/src/frontend/xim/lib/i18nX.c -@REL_SOURCE_ROOT@/src/frontend/xim/IC.c -@REL_SOURCE_ROOT@/src/frontend/xim/ximhandler.c +@REL_SOURCE_ROOT@/src/frontend/xim/lib/IMValues.c +@REL_SOURCE_ROOT@/src/frontend/xim/lib/i18nIMProto.c @REL_SOURCE_ROOT@/src/frontend/xim/xim.c -@REL_SOURCE_ROOT@/src/frontend/xim/ximconfig.c +@REL_SOURCE_ROOT@/src/frontend/ipc/ipc.c +@REL_SOURCE_ROOT@/src/lib/fcitx-utils/qsort_r.c +@REL_SOURCE_ROOT@/src/lib/fcitx-utils/log.c +@REL_SOURCE_ROOT@/src/lib/fcitx-utils/utf8.c +@REL_SOURCE_ROOT@/src/lib/fcitx-utils/memory.c +@REL_SOURCE_ROOT@/src/lib/fcitx-utils/utils.c +@REL_SOURCE_ROOT@/src/lib/fcitx-utils/msort_r.c +@REL_SOURCE_ROOT@/src/lib/fcitx/candidate.c +@REL_SOURCE_ROOT@/src/lib/fcitx/configfile.c +@REL_SOURCE_ROOT@/src/lib/fcitx/ime.c +@REL_SOURCE_ROOT@/src/lib/fcitx/hook.c +@REL_SOURCE_ROOT@/src/lib/fcitx/profile.c +@REL_SOURCE_ROOT@/src/lib/fcitx/instance.c +@REL_SOURCE_ROOT@/src/lib/fcitx/keys.c +@REL_SOURCE_ROOT@/src/lib/fcitx/context.c +@REL_SOURCE_ROOT@/src/lib/fcitx/ui.c +@REL_SOURCE_ROOT@/src/lib/fcitx/frontend.c +@REL_SOURCE_ROOT@/src/lib/fcitx/module.c +@REL_SOURCE_ROOT@/src/lib/fcitx/addon.c +@REL_SOURCE_ROOT@/src/lib/fcitx-gclient/fcitxclient.c +@REL_SOURCE_ROOT@/src/lib/fcitx-gclient/fcitxinputmethod.c +@REL_SOURCE_ROOT@/src/lib/fcitx-config/sprintf.c +@REL_SOURCE_ROOT@/src/lib/fcitx-config/fcitx-config.c +@REL_SOURCE_ROOT@/src/lib/fcitx-config/hotkey.c +@REL_SOURCE_ROOT@/src/lib/fcitx-config/xdg.c @REL_SOURCE_ROOT@/tools/createPYMB.c -@REL_SOURCE_ROOT@/tools/mb2org.c -@REL_SOURCE_ROOT@/tools/mb2txt.c @REL_SOURCE_ROOT@/tools/pyTools.c -@REL_SOURCE_ROOT@/tools/readPYBase.c -@REL_SOURCE_ROOT@/tools/readPYMB.c +@REL_SOURCE_ROOT@/tools/fcitx-remote.c @REL_SOURCE_ROOT@/tools/scel2org.c +@REL_SOURCE_ROOT@/tools/mb2org.c +@REL_SOURCE_ROOT@/tools/readPYMB.c +@REL_SOURCE_ROOT@/tools/readPYBase.c @REL_SOURCE_ROOT@/tools/txt2mb.c -@REL_SOURCE_ROOT@/tools/fcitx-remote.c -@REL_SOURCE_ROOT@/src/core/errorhandler.h -@REL_SOURCE_ROOT@/src/im/pinyin/PYFA.h -@REL_SOURCE_ROOT@/src/im/pinyin/py.h -@REL_SOURCE_ROOT@/src/im/pinyin/pyMapTable.h -@REL_SOURCE_ROOT@/src/im/pinyin/pyParser.h -@REL_SOURCE_ROOT@/src/im/pinyin/pyconfig.h -@REL_SOURCE_ROOT@/src/im/pinyin/pydef.h -@REL_SOURCE_ROOT@/src/im/pinyin/sp.h -@REL_SOURCE_ROOT@/src/im/pinyin/spdata.h -@REL_SOURCE_ROOT@/src/im/table/tabledict.h -@REL_SOURCE_ROOT@/src/im/table/tablepinyinwrapper.h -@REL_SOURCE_ROOT@/src/im/table/utf8_in_gb18030.h -@REL_SOURCE_ROOT@/src/im/table/table.h +@REL_SOURCE_ROOT@/tools/mb2txt.c +@REL_SOURCE_ROOT@/src/frontend/qt/fcitx-input-context.cpp +@REL_SOURCE_ROOT@/src/frontend/qt/fcitx-plugin.cpp +@REL_SOURCE_ROOT@/src/frontend/qt/fcitx-formatted-preedit.cpp +@REL_SOURCE_ROOT@/src/module/lua/luawrap.h +@REL_SOURCE_ROOT@/src/module/lua/luamod.h @REL_SOURCE_ROOT@/src/module/punc/punc.h -@REL_SOURCE_ROOT@/src/module/quickphrase/QuickPhrase.h -@REL_SOURCE_ROOT@/src/module/x11/x11stuff.h -@REL_SOURCE_ROOT@/src/module/x11/xerrorhandler.h @REL_SOURCE_ROOT@/src/module/autoeng/AutoEng.h +@REL_SOURCE_ROOT@/src/module/x11/xerrorhandler.h +@REL_SOURCE_ROOT@/src/module/x11/x11stuff.h +@REL_SOURCE_ROOT@/src/module/xkb/rules.h +@REL_SOURCE_ROOT@/src/module/xkb/xkb.h @REL_SOURCE_ROOT@/src/module/dbus/dbusstuff.h -@REL_SOURCE_ROOT@/src/ui/classic/AboutWindow.h -@REL_SOURCE_ROOT@/src/ui/classic/InputWindow.h -@REL_SOURCE_ROOT@/src/ui/classic/MainWindow.h -@REL_SOURCE_ROOT@/src/ui/classic/MenuWindow.h +@REL_SOURCE_ROOT@/src/module/chttrans/chttrans.h +@REL_SOURCE_ROOT@/src/module/quickphrase/QuickPhrase.h @REL_SOURCE_ROOT@/src/ui/classic/MessageWindow.h -@REL_SOURCE_ROOT@/src/ui/classic/TrayWindow.h -@REL_SOURCE_ROOT@/src/ui/classic/classicuiinterface.h +@REL_SOURCE_ROOT@/src/ui/classic/MainWindow.h @REL_SOURCE_ROOT@/src/ui/classic/tray.h -@REL_SOURCE_ROOT@/src/ui/classic/classicui.h +@REL_SOURCE_ROOT@/src/ui/classic/TrayWindow.h @REL_SOURCE_ROOT@/src/ui/classic/skin.h +@REL_SOURCE_ROOT@/src/ui/classic/InputWindow.h +@REL_SOURCE_ROOT@/src/ui/classic/classicui.h +@REL_SOURCE_ROOT@/src/ui/classic/MenuWindow.h +@REL_SOURCE_ROOT@/src/ui/classic/classicuiinterface.h @REL_SOURCE_ROOT@/src/ui/cairostuff/cairostuff.h @REL_SOURCE_ROOT@/src/ui/cairostuff/font.h -@REL_SOURCE_ROOT@/src/lib/fcitx-utils/log.h +@REL_SOURCE_ROOT@/src/core/errorhandler.h +@REL_SOURCE_ROOT@/src/im/table/tabledict.h +@REL_SOURCE_ROOT@/src/im/table/tablepinyinwrapper.h +@REL_SOURCE_ROOT@/src/im/table/table.h +@REL_SOURCE_ROOT@/src/im/table/utf8_in_gb18030.h +@REL_SOURCE_ROOT@/src/im/pinyin/PYFA.h +@REL_SOURCE_ROOT@/src/im/pinyin/pyconfig.h +@REL_SOURCE_ROOT@/src/im/pinyin/py.h +@REL_SOURCE_ROOT@/src/im/pinyin/pysplitdata.h +@REL_SOURCE_ROOT@/src/im/pinyin/pyParser.h +@REL_SOURCE_ROOT@/src/im/pinyin/spdata.h +@REL_SOURCE_ROOT@/src/im/pinyin/pyMapTable.h +@REL_SOURCE_ROOT@/src/im/pinyin/sp.h +@REL_SOURCE_ROOT@/src/im/pinyin/pydef.h +@REL_SOURCE_ROOT@/src/im/keyboard/isocodes.h +@REL_SOURCE_ROOT@/src/im/keyboard/fcitx-compose-data.h +@REL_SOURCE_ROOT@/src/im/keyboard/keyboard.h +@REL_SOURCE_ROOT@/src/frontend/gtk2/client.h +@REL_SOURCE_ROOT@/src/frontend/gtk2/fcitximcontext-gio.h +@REL_SOURCE_ROOT@/src/frontend/gtk2/fcitximcontext.h +@REL_SOURCE_ROOT@/src/frontend/qt/fcitx-formatted-preedit.h +@REL_SOURCE_ROOT@/src/frontend/qt/keyserver_x11.h +@REL_SOURCE_ROOT@/src/frontend/qt/fcitx-input-context.h +@REL_SOURCE_ROOT@/src/frontend/xim/IC.h +@REL_SOURCE_ROOT@/src/frontend/xim/ximhandler.h +@REL_SOURCE_ROOT@/src/frontend/xim/lib/IMdkit.h +@REL_SOURCE_ROOT@/src/frontend/xim/lib/Xi18nX.h +@REL_SOURCE_ROOT@/src/frontend/xim/lib/Xi18n.h +@REL_SOURCE_ROOT@/src/frontend/xim/lib/FrameMgr.h +@REL_SOURCE_ROOT@/src/frontend/xim/lib/Xi18nTr.h +@REL_SOURCE_ROOT@/src/frontend/xim/lib/XimFunc.h +@REL_SOURCE_ROOT@/src/frontend/xim/lib/XimProto.h +@REL_SOURCE_ROOT@/src/frontend/xim/xim.h +@REL_SOURCE_ROOT@/src/frontend/ipc/ipc.h @REL_SOURCE_ROOT@/src/lib/fcitx-utils/utarray.h -@REL_SOURCE_ROOT@/src/lib/fcitx-utils/utf8.h @REL_SOURCE_ROOT@/src/lib/fcitx-utils/uthash.h +@REL_SOURCE_ROOT@/src/lib/fcitx-utils/log.h +@REL_SOURCE_ROOT@/src/lib/fcitx-utils/utf8.h @REL_SOURCE_ROOT@/src/lib/fcitx-utils/utils.h -@REL_SOURCE_ROOT@/src/lib/fcitx-config/fcitx-config.h -@REL_SOURCE_ROOT@/src/lib/fcitx-config/sprintf.h -@REL_SOURCE_ROOT@/src/lib/fcitx-config/xdg.h -@REL_SOURCE_ROOT@/src/lib/fcitx-config/hotkey.h -@REL_SOURCE_ROOT@/src/lib/fcitx/addon.h +@REL_SOURCE_ROOT@/src/lib/fcitx-utils/memory.h +@REL_SOURCE_ROOT@/src/lib/fcitx/frontend.h +@REL_SOURCE_ROOT@/src/lib/fcitx/ime.h @REL_SOURCE_ROOT@/src/lib/fcitx/candidate.h -@REL_SOURCE_ROOT@/src/lib/fcitx/configfile.h @REL_SOURCE_ROOT@/src/lib/fcitx/fcitx.h -@REL_SOURCE_ROOT@/src/lib/fcitx/frontend.h +@REL_SOURCE_ROOT@/src/lib/fcitx/fcitx-internal.h +@REL_SOURCE_ROOT@/src/lib/fcitx/keys.h +@REL_SOURCE_ROOT@/src/lib/fcitx/ui-internal.h +@REL_SOURCE_ROOT@/src/lib/fcitx/addon.h +@REL_SOURCE_ROOT@/src/lib/fcitx/instance-internal.h +@REL_SOURCE_ROOT@/src/lib/fcitx/module-internal.h +@REL_SOURCE_ROOT@/src/lib/fcitx/ui.h +@REL_SOURCE_ROOT@/src/lib/fcitx/context.h @REL_SOURCE_ROOT@/src/lib/fcitx/hook-internal.h -@REL_SOURCE_ROOT@/src/lib/fcitx/hook.h +@REL_SOURCE_ROOT@/src/lib/fcitx/context-internal.h +@REL_SOURCE_ROOT@/src/lib/fcitx/addon-internal.h @REL_SOURCE_ROOT@/src/lib/fcitx/ime-internal.h -@REL_SOURCE_ROOT@/src/lib/fcitx/ime.h +@REL_SOURCE_ROOT@/src/lib/fcitx/profile.h +@REL_SOURCE_ROOT@/src/lib/fcitx/configfile.h @REL_SOURCE_ROOT@/src/lib/fcitx/instance.h -@REL_SOURCE_ROOT@/src/lib/fcitx/keys.h @REL_SOURCE_ROOT@/src/lib/fcitx/module.h -@REL_SOURCE_ROOT@/src/lib/fcitx/profile.h -@REL_SOURCE_ROOT@/src/lib/fcitx/ui.h -@REL_SOURCE_ROOT@/src/lib/fcitx/fcitx-internal.h -@REL_SOURCE_ROOT@/src/lib/fcitx/instance-internal.h -@REL_SOURCE_ROOT@/src/lib/fcitx/ui-internal.h -@REL_SOURCE_ROOT@/src/lib/fcitx/addon-internal.h -@REL_SOURCE_ROOT@/src/frontend/gtk2/fcitximcontext.h -@REL_SOURCE_ROOT@/src/frontend/gtk2/client.h -@REL_SOURCE_ROOT@/src/frontend/ipc/ipc.h -@REL_SOURCE_ROOT@/src/frontend/qt/fcitx-compose-data.h -@REL_SOURCE_ROOT@/src/frontend/qt/fcitx-input-context.h -@REL_SOURCE_ROOT@/src/frontend/qt/keyserver_x11.h -@REL_SOURCE_ROOT@/src/frontend/xim/lib/FrameMgr.h -@REL_SOURCE_ROOT@/src/frontend/xim/lib/IMdkit.h -@REL_SOURCE_ROOT@/src/frontend/xim/lib/Xi18n.h -@REL_SOURCE_ROOT@/src/frontend/xim/lib/Xi18nTr.h -@REL_SOURCE_ROOT@/src/frontend/xim/lib/Xi18nX.h -@REL_SOURCE_ROOT@/src/frontend/xim/lib/XimFunc.h -@REL_SOURCE_ROOT@/src/frontend/xim/lib/XimProto.h -@REL_SOURCE_ROOT@/src/frontend/xim/IC.h -@REL_SOURCE_ROOT@/src/frontend/xim/xim.h -@REL_SOURCE_ROOT@/src/frontend/xim/ximhandler.h +@REL_SOURCE_ROOT@/src/lib/fcitx/hook.h +@REL_SOURCE_ROOT@/src/lib/fcitx-gclient/fcitxinputmethod.h +@REL_SOURCE_ROOT@/src/lib/fcitx-gclient/fcitxclient.h +@REL_SOURCE_ROOT@/src/lib/fcitx-config/hotkey.h +@REL_SOURCE_ROOT@/src/lib/fcitx-config/fcitx-config.h +@REL_SOURCE_ROOT@/src/lib/fcitx-config/keydata.h +@REL_SOURCE_ROOT@/src/lib/fcitx-config/sprintf.h +@REL_SOURCE_ROOT@/src/lib/fcitx-config/xdg.h @REL_SOURCE_ROOT@/tools/pyTools.h -@REL_SOURCE_ROOT@/src/ui/classic/fcitx-skin-installer.sh \ No newline at end of file +@REL_SOURCE_ROOT@/data/fcitx-configtool.desktop.in +@REL_SOURCE_ROOT@/data/fcitx.desktop.in +@REL_SOURCE_ROOT@/src/ui/classic/fcitx-skin-installer.desktop.in +@REL_SOURCE_ROOT@/src/ui/classic/fcitx-skin-installer.sh diff -Nru fcitx-4.2.2/po/zh_CN.po fcitx-4.2.4.1/po/zh_CN.po --- fcitx-4.2.2/po/zh_CN.po 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/po/zh_CN.po 2012-06-10 14:34:48.000000000 +0000 @@ -7,9 +7,9 @@ msgstr "" "Project-Id-Version: fcitx\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-04-07 13:19+0800\n" -"PO-Revision-Date: 2012-04-07 13:23+0800\n" -"Last-Translator: Weng Xuetian \n" +"POT-Creation-Date: 2012-05-26 20:27+0800\n" +"PO-Revision-Date: 2012-05-28 07:43+0800\n" +"Last-Translator: Xuetian Weng \n" "Language-Team: Chinese Simplified \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" @@ -18,11 +18,16 @@ "Plural-Forms: nplurals=1; plural=0\n" "X-Generator: Lokalize 1.4\n" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:1102 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:1159 msgid " Ctrl+Delete To Delete" msgstr " Ctrl+Delete 删除" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1228 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/xkbdbus/xkbdbus.c:159 +#, c-format +msgid "%s" +msgstr "%s" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1434 msgid "/min Time Used: " msgstr "/分 经过时间: " @@ -38,19 +43,27 @@ msgid "ALT_R_SHIFT" msgstr "Alt+右Shift" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:145 -msgid "About Fcitx" -msgstr "关于Fcitx" +#: unknown +msgid "ALT_SHIFT" +msgstr "Alt+Shift" -#: /home/saber/Develop/fcitx/data/config.desc:46 +#: unknown +msgid "ALT_SUPER" +msgstr "Alt+Super" + +#: /home/saber/Develop/fcitx/data/config.desc:135 msgid "Action after press enter" msgstr "回车键操作" +#: /home/saber/Develop/fcitx/data/config.desc:24 +msgid "Activate input method" +msgstr "激活输入法" + #: unknown msgid "Active" msgstr "激活" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:217 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:232 msgid "Active Menu Color" msgstr "活动菜单项颜色" @@ -58,19 +71,35 @@ msgid "Active Menu Item Character Color" msgstr "活动菜单项颜色" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:189 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:76 +msgid "Active Mode Icon" +msgstr "激活状态输入法图标" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:117 +msgid "Active Text Icon Color" +msgstr "活动的文本图标颜色" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:204 msgid "Active Tray Icon" msgstr "活动输入法图标" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/dbus/dbusstuff.c:104 +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-lua.conf.in.h:2 +msgid "Add Lua script support for Fcitx" +msgstr "为 Fcitx 增加 Lua 支持" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/dbus/dbusstuff.c:106 msgid "Add Watch Function Error" msgstr "增加监听函数错误" +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:43 +msgid "Add current input buffer to user dictionary" +msgstr "当前输入内容加入用户词典" + # unknown msgid "Addon" msgstr "附加组件" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/addon.c:107 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/addon.c:108 #, c-format msgid "Addon Config %s is %s" msgstr "Addon Config %s is %s" @@ -95,6 +124,19 @@ msgid "All" msgstr "所有" +#: /home/saber/Develop/fcitx/src/module/xkb/fcitx-xkb.desc:4 +msgid "Allow to Override System XKB Settings" +msgstr "允许覆盖系统的 XKB 设置" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:156 +msgid "Alternative Next Page Key" +msgstr "替代下一页快捷键" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:146 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:151 +msgid "Alternative Prev Page Key" +msgstr "替代上一页快捷键" + # unknown msgid "Appearance" msgstr "外观" @@ -104,18 +146,22 @@ msgstr "注册输入法的参数" #: unknown +msgid "Aspell" +msgstr "Aspell" + +#: unknown msgid "Auto" msgstr "自动" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-autoeng.conf.in.h:1 +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-autoeng.conf.in.h:2 msgid "Auto Change to English Mode while Input Specific String" msgstr "在输入特定字符串时切换到英文模式" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:22 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:27 msgid "Auto Create Phrase" msgstr "自动组词" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-autoeng.conf.in.h:2 +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-autoeng.conf.in.h:1 msgid "Auto English Mode" msgstr "自动英文模式" @@ -123,34 +169,30 @@ msgid "Auto English Trigger Word" msgstr "自动英文模式触发词" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:72 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:82 msgid "Auto Phrase" msgstr "自动词组" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:77 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:92 msgid "Auto Phrase Length" msgstr "自动词组长度" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:82 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:97 msgid "Auto Phrase Phrase" msgstr "词组参与自动造词" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:48 -msgid "Auto Send Candidate Word if no match in Code Table" -msgstr "空码自动上屏" - #: /home/saber/Develop/fcitx/src/im/table/table.desc:43 -msgid "Auto Send Candidate Word to Client" +msgid "Auto Send Candidate Word" msgstr "自动上屏" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1136 -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1145 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1117 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1126 msgid "Available Value:" msgstr "可选值:" #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:64 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:117 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:197 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:132 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:212 msgid "Background Image" msgstr "背景图片" @@ -158,24 +200,36 @@ msgid "Bingchan" msgstr "冰蟾全息" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:359 +#: unknown +msgid "CTRL Both" +msgstr "两侧 Ctrl" + +#: unknown +msgid "CTRL_SHIFT" +msgstr "Ctrl+Shift" + +#: unknown +msgid "CTRL_SUPER" +msgstr "Ctrl+Super" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:360 msgid "Can not find System Database of Pinyin!" msgstr "无法找到系统的拼音词库" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/skin.c:138 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/skin.c:139 msgid "Can not load default skin, is installion correct?" msgstr "无法加载默认皮肤,安装是否正确?" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/skin.c:143 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/skin.c:144 #, c-format msgid "Can not load skin %s, return to default" msgstr "无法加载皮肤%s,回到默认皮肤" -#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:146 +#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:153 msgid "Can't Create imWindow" msgstr "无法创建输入法窗口" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:312 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:360 msgid "Can't open punc file." msgstr "无法打开标点文件" @@ -188,7 +242,7 @@ msgid "Candidate Index Color" msgstr "候选词索引颜色" -#: /home/saber/Develop/fcitx/data/config.desc:61 +#: /home/saber/Develop/fcitx/data/config.desc:150 msgid "Candidate Word Number" msgstr "候选词个数" @@ -196,22 +250,22 @@ msgid "Cangjie" msgstr "仓颉" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:1837 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:1842 #, c-format msgid "Cannot Save Frequent word: %s" msgstr "无法保存词频: %s" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:1910 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:1915 #, c-format msgid "Cannot Save Pinyin Index: %s" msgstr "无法保存拼音索引: %s" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:1773 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:1778 #, c-format msgid "Cannot Save User Pinyin Database: %s" msgstr "无法保存用户拼音词库: %s" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:428 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:460 msgid "Cannot found Pinyin" msgstr "无法找到拼音" @@ -219,23 +273,19 @@ msgid "Category" msgstr "种类" -#: ../..//data/fcitx.desktop.in.h:1 -msgid "Chinese Input Method" -msgstr "中文输入法" - -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:76 -msgid "Chinese Mode Icon" -msgstr "中文模式图标" - -#: /home/saber/Develop/fcitx/src/im/table/table.desc:106 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:121 msgid "Choose" msgstr "选择键" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:483 +#: /home/saber/Develop/fcitx/data/config.desc:89 +msgid "Choose Second and Third Candidate Word" +msgstr "选择第二第三候选词" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:515 msgid "Choose the phrase to be deleted, Press Escape to Cancel" msgstr "选择要删除的词组,按Escape 取消" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:475 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:507 msgid "Choose the phrase to be put in the front, Press Escape to Cancel" msgstr "选择放在前面的词组,按Escape 取消" @@ -255,9 +305,13 @@ msgid "Clean" msgstr "清除" -#: unknown -msgid "Close" -msgstr "关闭" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/imselector/imselector.c:227 +msgid "Clear local input method" +msgstr "清除局部输入法" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:212 +msgid "Close virtual keyboard" +msgstr "关闭虚拟键盘" #: /home/saber/Develop/fcitx/src/im/table/table.desc:15 msgid "Code Table File" @@ -267,7 +321,7 @@ msgid "Code Table Name" msgstr "码表名称" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:1100 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:1157 msgid "Code is " msgstr "编码为 " @@ -275,7 +329,7 @@ msgid "CodeTable" msgstr "码表" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:137 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:152 msgid "Color of Cursor" msgstr "光标颜色" @@ -287,15 +341,35 @@ msgid "Commit" msgstr "提交输入" +#: /home/saber/Develop/fcitx/src/im/table/table.desc:166 +msgid "Commit and pass when invalid key of this table pressed" +msgstr "当输入码表中非法的按键时提交输入并且发送这个按键" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:171 +msgid "Commit key for select first candidate" +msgstr "第一个候选词的提交键" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:176 +msgid "Commit string when there is no match" +msgstr "当无匹配时提交输入" + +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:4 +msgid "Commit with extra space when choose candidate word" +msgstr "选择候选词时输入额外空格" + #: unknown msgid "ConfigFile" msgstr "配置文件" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:160 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:477 msgid "Configure" msgstr "配置" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:860 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:476 +msgid "Configure Current Input Method" +msgstr "配置当前输入法" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:841 #, c-format msgid "Configure group name error: line %d" msgstr "配置组名错误: 行%d" @@ -305,14 +379,25 @@ msgid "Connection Error (%s)" msgstr "连接错误 (%s)" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-quickphrase.conf.in.h:1 +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-quickphrase.conf.in.h:2 msgid "Conveniently Input English or User-Defined Simple Table" msgstr "方便地输入英文或用户定义的码表" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-chttrans.conf.in.h:1 +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-chttrans.conf.in.h:2 msgid "Convert Simplified Chinese To Traditional Chinese" msgstr "简体中文转换为繁体中文" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:128 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:159 +msgid "Convert to Simplified Chinese" +msgstr "转换为简体中文" + +# unknown +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:128 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:159 +msgid "Convert to Traditional Chinese" +msgstr "转换为繁体中文" + #: unknown msgid "Copy" msgstr "复制" @@ -325,6 +410,11 @@ msgid "Current Input Method Name" msgstr "当前输入法名称" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/imselector/imselector.c:212 +#, c-format +msgid "Current local input method is %s" +msgstr "当前局部输入法为 %s" + #: unknown msgid "DBus" msgstr "DBus" @@ -337,15 +427,19 @@ msgid "DISPLAY InputWindow" msgstr "DISPLAY InputWindow" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/MainWindow.c:137 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/MainWindow.c:135 msgid "DISPLAY MainWindow" msgstr "DISPLAY MainWindow" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/MainWindow.c:152 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/MainWindow.c:145 msgid "DRAW MainWindow" msgstr "DRAW MainWindow" -#: /home/saber/Develop/fcitx/data/config.desc:22 +#: unknown +msgid "Default" +msgstr "默认" + +#: /home/saber/Develop/fcitx/data/config.desc:121 msgid "Default Input Method State" msgstr "默认输入法状态" @@ -365,55 +459,62 @@ msgid "Dianbaoma" msgstr "电报码" -#: /home/saber/Develop/fcitx/data/config.desc:51 +#: /home/saber/Develop/fcitx/data/config.desc:140 msgid "Disable Paging in Remind Mode" msgstr "联想模式禁用翻页" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/addon.c:197 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/addon.c:207 #, c-format msgid "Disable addon %s, dependency %s can not be satisfied." msgstr "禁用插件 %s,依赖 %s 无法满足。" #: unknown -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:289 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:294 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:348 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:353 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:704 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:305 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:310 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:370 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:375 msgid "Disabled" msgstr "禁用" -#: /home/saber/Develop/fcitx/data/config.desc:71 +#: /home/saber/Develop/fcitx/data/config.desc:160 msgid "Do not commit preedit text when unfocus a window" msgstr "窗口失去焦点时不提交预编辑文本" -#: /home/saber/Develop/fcitx/data/config.desc:101 +#: /home/saber/Develop/fcitx/data/addon.desc:77 +msgid "Do not show in GUI" +msgstr "不在图形界面显示" + +#: /home/saber/Develop/fcitx/data/config.desc:185 msgid "" -"Do not show input window if there is one one candidate (Hide when only " +"Do not show input window if there is only one candidate (Hide when only " "preedit string must be selected)" msgstr "只有一个候选词时不显示输入窗口(只有预编辑字符串时不显示窗口必须选中)" -#: /home/saber/Develop/fcitx/data/config.desc:96 +#: /home/saber/Develop/fcitx/data/config.desc:180 msgid "Do not show input window if there is only preedit string" msgstr "只有预编辑字符串时不显示输入窗口" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:872 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:853 #, c-format msgid "Duplicate group name, merge with the previous: %s :line %d" msgstr "组名重复,和之前的组合并: %s :行 %d" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:936 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:917 #, c-format msgid "Duplicate option, overwrite: line %d" msgstr "重复的配置项,覆盖: 行%d" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:116 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:131 msgid "Enable" msgstr "启用" -#: /home/saber/Develop/fcitx/data/config.desc:111 -msgid "Enable Left Ctrl + Left Shift to Switch Between Input Method" -msgstr "启用左Ctrl + 左Shift 在输入法间切换" +#: /home/saber/Develop/fcitx/data/config.desc:34 +msgid "Enable Hotkey to scroll Between Input Method" +msgstr "启用输入法间切换" + +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:14 +msgid "Enable word hint if available" +msgstr "如果可用则使用单词提示" #: /home/saber/Develop/fcitx/data/addon.desc:27 msgid "Enabled" @@ -423,10 +524,15 @@ msgid "Enabled in input" msgstr "输入中启用" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:53 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:63 msgid "End Key" msgstr "中止键" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/xkbdbus/xkbdbus.c:184 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/keyboard/keyboard.c:410 +msgid "English (US)" +msgstr "英语 (美国)" + #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:72 msgid "English Mode Icon" msgstr "英文模式图标" @@ -470,7 +576,7 @@ msgid "Error: skin file should only contain one directory." msgstr "错误:皮肤文件应只包括一个目录" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:68 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:78 msgid "Exact Match" msgstr "精确匹配" @@ -478,10 +584,14 @@ msgid "Exec" msgstr "Exec" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:161 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:478 msgid "Exit" msgstr "退出" +#: /home/saber/Develop/fcitx/data/config.desc:19 +msgid "Extra key for trigger input method" +msgstr "额外的激活输入法快捷键" + #: /home/saber/Develop/fcitx/build/po/../..//src/core/errorhandler.c:59 #, c-format msgid "FCITX -- Get Signal No.: %d" @@ -491,23 +601,28 @@ msgid "Fallback UI Addon" msgstr "备选界面附加组件" -#: ../..//data/fcitx.desktop.in.h:2 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:276 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:292 +#: ../..//data/fcitx.desktop.in.h:1 msgid "Fcitx" msgstr "Fcitx" +#. kate: indent-mode cstyle; space-indent on; indent-width 4; #: ../..//data/fcitx-configtool.desktop.in.h:1 msgid "Fcitx Config Tool" msgstr "Fcitx配置工具" #: /home/saber/Develop/fcitx/build/po/tmp/fcitx-ipc.conf.in.h:1 -msgid "Fcitx DBus Frontend " +msgid "Fcitx DBus Frontend" msgstr "Fcitx DBus 前端" #: ../..//data/fcitx-configtool.desktop.in.h:2 msgid "Fcitx GUI Config Tool" msgstr "Fcitx图形化配置工具" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-lua.conf.in.h:1 +msgid "Fcitx Lua Support" +msgstr "Fcitx 的 Lua 支持" + #: ../..//src/ui/classic/fcitx-skin-installer.desktop.in.h:1 msgid "Fcitx Skin Installer" msgstr "Fcitx 皮肤安装器" @@ -517,14 +632,14 @@ msgstr "Fcitx XIM 前端" #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:104 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:181 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:233 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:196 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:248 msgid "Fill Background Horizontal rule" msgstr "横向填充规则" #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:96 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:173 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:225 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:188 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:240 msgid "Fill Background Vertical rule" msgstr "纵向填充规则" @@ -532,10 +647,18 @@ msgid "First Candidate Color" msgstr "第一候选词颜色" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:134 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:161 +msgid "First Candidate Display as Preedit" +msgstr "将第一个候选词显示为预编辑文本" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:139 msgid "Fix misstype gn/ng" msgstr "修复拼音中ng和gn的输入错误" +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:17 +msgid "Fix preedit cursor at head" +msgstr "将光标固定在预输入文本开头" + #: /home/saber/Develop/fcitx/src/ui/classic/fcitx-classic-ui.desc:14 msgid "Font" msgstr "字体" @@ -552,157 +675,140 @@ msgid "Frontend Used by IM Modules" msgstr "输入法模块使用的前端" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/frontend.c:316 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/frontend.c:416 msgid "Frontend: bad frontend" msgstr "前端: 有问题的前端" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/frontend.c:304 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/frontend.c:404 #, c-format msgid "Frontend: open %s fail %s" msgstr "前端: 打开 %s 失败 %s" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:114 -msgid "Full Width Character" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:116 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:181 +msgid "Full width Character" msgstr "全角字符" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:134 -msgid "Full Width Punctuation" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:141 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:485 +msgid "Full width punct" msgstr "全角标点" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:52 +msgid "Fullwidth" +msgstr "全角字符" + #: /home/saber/Develop/fcitx/build/po/tmp/fcitx-fullwidth-char.conf.in.h:1 msgid "Fullwidth Character" msgstr "全角字符" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:79 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:84 msgid "Fuzzy an and ang" msgstr "模糊an和ang" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:109 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:114 msgid "Fuzzy c and ch" msgstr "模糊c和ch" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:84 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:89 msgid "Fuzzy en and eng" msgstr "模糊en和eng" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:114 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:119 msgid "Fuzzy f and h" msgstr "模糊f和h" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:89 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:94 msgid "Fuzzy ian and iang" msgstr "模糊ian和iang" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:94 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:99 msgid "Fuzzy in and ing" msgstr "模糊in和ing" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:119 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:124 msgid "Fuzzy l and n" msgstr "模糊l和n" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:99 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:104 msgid "Fuzzy ou and u" msgstr "模糊ou和u" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:124 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:129 msgid "Fuzzy s and sh" msgstr "模糊s和sh" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:104 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:109 msgid "Fuzzy uan and uang" msgstr "模糊uan和uang" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:129 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:134 msgid "Fuzzy z and zh" msgstr "模糊z和zh" -#: /home/saber/Develop/fcitx/data/config.desc:66 +#: /home/saber/Develop/fcitx/data/config.desc:155 msgid "Give the tips of Phrase" msgstr "提示词库中词组" +#: /home/saber/Develop/fcitx/src/module/imselector/fcitx-imselector.desc:9 +msgid "Global Input Method SelectKey" +msgstr "全局输入法选择" + #: unknown msgid "Grave" msgstr "反引号" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:53 +msgid "Greek" +msgstr "希腊字母" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:116 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:181 +msgid "Half width Character" +msgstr "半角字符" + #: unknown msgid "Hide" msgstr "隐藏" -#: /home/saber/Develop/fcitx/data/config.desc:106 -msgid "Hot key of Triggering Input Method" -msgstr "快捷键: 切换输入法" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:59 +msgid "Hiragana" +msgstr "平假名" # unknown msgid "Hotkey" msgstr "快捷键" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:32 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:37 msgid "Hotkey of Adding Frequent Word" msgstr "快捷键: 添加常用字" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:42 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:47 msgid "Hotkey of Delete User Phrase" msgstr "快捷键: 删除用户词组" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:37 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:42 msgid "Hotkey of Deleting Frequent Word" msgstr "快捷键: 删除常用字" -#: /home/saber/Develop/fcitx/data/config.desc:164 -msgid "Hotkey of Going Next Page" -msgstr "快捷键: 后一页" - -#: /home/saber/Develop/fcitx/data/config.desc:159 -msgid "Hotkey of Going Prev Page" -msgstr "快捷键: 前一页" - -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:47 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:52 msgid "Hotkey of Inputing Word From Phrase" msgstr "快捷键: 以词定字" -#: /home/saber/Develop/fcitx/data/config.desc:174 -msgid "Hotkey of Saving All Config and Input History" -msgstr "快捷键: 保存配置及输入历史" - -#: /home/saber/Develop/fcitx/data/config.desc:179 -msgid "Hotkey of Switch Embeded Preedit" -msgstr "快捷键: 切换嵌入预编辑字符串" - -#: /home/saber/Develop/fcitx/data/config.desc:154 -msgid "Hotkey of Switch Full Width Punc Mode" -msgstr "切换全角标点的快捷键" - -#: /home/saber/Develop/fcitx/data/config.desc:124 -msgid "Hotkey of Switching Active and Inactive Mode" -msgstr "快捷键: 切换激活/非激活状态" - -#: /home/saber/Develop/fcitx/data/config.desc:149 -msgid "Hotkey of Switching Full Width Character Mode" -msgstr "快捷键: 切换全角" - -#: /home/saber/Develop/fcitx/data/config.desc:144 -msgid "Hotkey of Switching Remind Mode" -msgstr "快捷键: 切换联想模式" - -#: /home/saber/Develop/fcitx/data/config.desc:139 -msgid "Hotkey of Switching Virtual Keyboard" -msgstr "快捷键: 切换虚拟键盘" - -#: /home/saber/Develop/fcitx/data/config.desc:169 -msgid "Hotkey to Choose Second and Third Candidate Word" -msgstr "快捷键: 选择第二第三候选词" - -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:218 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:289 #, c-format msgid "IM: bad im %s" msgstr "输入法: 有问题的输入法 %s" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:204 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:275 #, c-format msgid "IM: open %s fail %s" msgstr "输入法: 打开%s 失败 %s" +# unknown +msgid "IMSelector" +msgstr "输入法选择器" + #: /home/saber/Develop/fcitx/src/im/table/table.desc:11 msgid "Icon Name" msgstr "图标名称" @@ -711,15 +817,17 @@ msgid "IconName" msgstr "图标名称" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:193 -msgid "" -"If you use login manager like gdm or kdm, put those lines in your ~/." -"xprofile." -msgstr "如果您使用登录管理器,比如 gdm 或 kdm,请将这些行加入到 ~/.xprofile 中。" - -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:194 -msgid "If you use ~/.xinitrc and startx, put those lines in ~/.xinitrc." -msgstr "如果您使用 ~/.xinitrc 和 startx,请将这些行加入到 ~/.xinitrc 中。" +#: /home/saber/Develop/fcitx/src/module/xkb/fcitx-xkb.desc:9 +msgid "Ignore Input Method Layout Request" +msgstr "忽略输入法的键盘布局请求" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:181 +msgid "Ignore Punctuation" +msgstr "忽略标点" + +#: /home/saber/Develop/fcitx/data/config.desc:29 +msgid "Inactivate Input Method" +msgstr "取消激活输入法" #: unknown msgid "Inactive" @@ -729,10 +837,18 @@ msgid "Inactive Menu Item Character Color" msgstr "非活动菜单项颜色" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:193 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:122 +msgid "Inactive Text Icon Color" +msgstr "非活动的文本图标颜色" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:208 msgid "Inctive Tray Icon" msgstr "非活动输入法图标" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:55 +msgid "Index" +msgstr "索引" + #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:19 msgid "Input Font Size" msgstr "输入字体大小" @@ -741,22 +857,26 @@ msgid "Input Message Color" msgstr "输入信息颜色" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1161 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1363 +#: ../..//data/fcitx.desktop.in.h:2 msgid "Input Method" msgstr "输入法" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:290 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:295 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:349 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:354 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:704 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:306 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:311 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:371 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:376 msgid "Input Method Disabled" msgstr "输入法被禁用" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1226 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1432 msgid "Input Speed: " msgstr "输入速度: " +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-imselector.conf.in.h:1 +msgid "Input method selector" +msgstr "输入法选择器" + # unknown #: unknown msgid "InputMethod" @@ -766,24 +886,51 @@ msgid "Installer Script for Fcitx Skin" msgstr "Fcitx 皮肤的安装器" -#: /home/saber/Develop/fcitx/data/config.desc:134 +#: /home/saber/Develop/fcitx/data/config.desc:54 msgid "Interval of Two Key Input" msgstr "输入间隔" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:890 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:871 #, c-format msgid "Invalid Entry: line %d missing '='" msgstr "配置项不合法: 行%d 缺少'='" -#: /home/saber/Develop/fcitx/data/config.desc:27 -msgid "It's the first time Fcitx Start." -msgstr "这是 Fcitx 首次启动" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:60 +msgid "Katakana" +msgstr "片假名" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:87 +msgid "" +"Keep current buffer when there is no match item and input length is equal " +"code length" +msgstr "当目前没有匹配项并且输入长度等于码长时保持当前的输入缓冲区" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:246 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:261 msgid "Key Color On Virutal Keyboard" msgstr "软键盘按键文字颜色" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:126 +# unknown +msgid "Keyboard" +msgstr "键盘" + +# unknown +#: /home/saber/Develop/fcitx/build/po/../..//src/im/keyboard/keyboard.c:375 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/keyboard/keyboard.c:409 +#, c-format +msgid "Keyboard - %s" +msgstr "键盘 - %s" + +# unknown +#: /home/saber/Develop/fcitx/build/po/../..//src/im/keyboard/keyboard.c:398 +#, c-format +msgid "Keyboard - %s - %s" +msgstr "键盘 - %s - %s" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-keyboard.conf.in.h:1 +msgid "Keyboard Input Method" +msgstr "键盘输入法" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:141 msgid "Keyboard Layout to be used" msgstr "键盘布局" @@ -807,19 +954,28 @@ msgid "LangCode" msgstr "语言代码" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:111 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:126 msgid "Language Code for this table" msgstr "这个码表的语言代码" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:141 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:51 +msgid "Latin" +msgstr "拉丁字母" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:141 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:485 +msgid "Latin punct" +msgstr "英文标点" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:156 msgid "Left-down position of Input" msgstr "输入文字左下角" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:145 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:160 msgid "Left-down position of Output" msgstr "输出文字左下角" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:400 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:432 msgid "" "Left/Right to choose selected character, Press Enter to confirm, Press " "Escape to Cancel" @@ -829,21 +985,21 @@ msgid "Library" msgstr "库" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/addon.c:99 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/addon.c:100 #, c-format msgid "Load Addon Config File:%s" msgstr "加载附加组件配置文件: %s" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:236 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:243 msgid "Load Autophrase OK" msgstr "加载自动组词信息完成" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:152 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:155 #, c-format msgid "Load Table Config File:%s" msgstr "加载码表文件: %s" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:169 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:176 msgid "Load Table Dict OK" msgstr "加载码表文件成功" @@ -852,13 +1008,13 @@ msgid "Load Table Dict from %s" msgstr "加载码表%s" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:375 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:376 #, c-format msgid "Load extra dict: %s" msgstr "加载额外码表:%s" #. 读取上次保存的自动词组信息 -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:196 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:203 msgid "Loading Autophrase." msgstr "加载自动组词信息中" @@ -867,6 +1023,10 @@ msgid "Loading Table Dict" msgstr "加载码表词典" +#: /home/saber/Develop/fcitx/src/module/imselector/fcitx-imselector.desc:4 +msgid "Local Input Method SelectKey" +msgstr "局部输入法选择" + #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:68 msgid "Logo Icon" msgstr "Logo图标" @@ -887,10 +1047,14 @@ msgid "Main Window Position Y" msgstr "主窗口Y位置" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:63 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:73 msgid "Matching Key" msgstr "模糊键" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:56 +msgid "Math" +msgstr "数学符号" + #: /home/saber/Develop/fcitx/src/ui/classic/fcitx-classic-ui.desc:19 msgid "Menu Font" msgstr "菜单字体" @@ -899,10 +1063,23 @@ msgid "Menu Font Size" msgstr "菜单字体大小" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:2301 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:2306 msgid "Migrate the old file path to the new one" msgstr "迁移老文件路径到新文件路径" +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:19 +msgid "Minimum Length to trigger word hint" +msgstr "最小触发单词提示长度" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:53 +msgid "" +"Minimum length trigger auto send candidate when there will be no candidate" +msgstr "将要无候选词时触发自动上屏的最短输入长度" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:48 +msgid "Minimum length trigger auto send candidate word when only one candidate" +msgstr "在只有一个候选词时触发自动上屏的最短输入长度" + #: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:387 msgid "Missing type, take it as string" msgstr "类型缺失,作为字符串处理" @@ -911,21 +1088,25 @@ msgid "Module" msgstr "模块" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/module.c:77 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/module.c:76 msgid "Module: bad module" msgstr "模块: 有问题的模块" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/module.c:65 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/module.c:64 #, c-format msgid "Module: open %s fail %s" msgstr "模块: 打开%s 失败 %s" +#: unknown +msgid "Myspell" +msgstr "Myspell" + #: /home/saber/Develop/fcitx/data/inputmethod.desc:7 #: /home/saber/Develop/fcitx/data/addon.desc:3 msgid "Name" msgstr "名称" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/dbus/dbusstuff.c:124 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/dbus/dbusstuff.c:126 #, c-format msgid "Name Error (%s)" msgstr "名称错误 (%s)" @@ -938,9 +1119,13 @@ msgid "Native" msgstr "原生" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:153 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:161 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:169 +#: /home/saber/Develop/fcitx/data/config.desc:84 +msgid "Next Page" +msgstr "下一页" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:168 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:176 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:184 msgid "Next Page Icon" msgstr "下一页图标" @@ -948,19 +1133,37 @@ msgid "No" msgstr "否" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:381 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:494 msgid "No available Input Method" msgstr "无用输入法" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/frontend.c:337 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/frontend.c:437 msgid "No available frontend" msgstr "无可用前端" +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:359 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:360 +msgid "No input window" +msgstr "无输入窗口" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/imselector/imselector.c:216 +msgid "No local input method" +msgstr "无局部输入法" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:160 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:321 +msgid "No remind" +msgstr "无联想" + #: unknown msgid "Nothing" msgstr "无操作" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:146 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:57 +msgid "Number" +msgstr "数字" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:413 msgid "Online Help" msgstr "在线帮助" @@ -968,36 +1171,26 @@ msgid "OpenCC" msgstr "OpenCC" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:230 -#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:332 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:238 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:340 msgid "OpenCC error" msgstr "OpenCC 错误" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:222 -#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:324 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:230 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:332 msgid "OpenCC initialization error" msgstr "OpenCC 初始化失败" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1083 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1064 #, c-format msgid "Option %s is Invalid, Use Default Value %s" msgstr "配置项%s不合法,使用默认值%s" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1093 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1074 #, c-format msgid "Option %s is Invalid." msgstr "配置项%s不合法" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:189 -msgid "Or (Depends on you install im module or not)" -msgstr "或者(取决于您是否安装了im module)" - -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:185 -msgid "" -"Or You may need to set environment varibles below to make fcitx work " -"correctly." -msgstr "或者你需要设置以下环境变量从而让Fcitx正常工作。" - #: /home/saber/Develop/fcitx/src/im/table/table.desc:28 msgid "Order of Code Table" msgstr "码表顺序" @@ -1018,17 +1211,18 @@ msgid "PerProgram" msgstr "按程序" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:1097 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:1154 msgid "Phrase is already in Dict " msgstr "词组已在码表中" # unknown +#: /home/saber/Develop/fcitx/build/po/tmp/pinyin.conf.in.h:1 #: /home/saber/Develop/fcitx/build/po/tmp/fcitx-pinyin.conf.in.h:1 -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:110 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:111 msgid "Pinyin" msgstr "拼音" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:425 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:426 msgid "Pinyin Index Magic Number Doesn't match" msgstr "拼音索引的Magic Number不匹配" @@ -1036,7 +1230,7 @@ msgid "Pinyin Key" msgstr "拼音键" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:426 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:458 msgid "Pinyin: " msgstr "拼音:" @@ -1044,44 +1238,48 @@ msgid "PinyinJiaJia" msgstr "拼音加加" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:183 -msgid "Please check your environment varibles." -msgstr "请检查你的环境变量的设置" - -#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:161 +#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:168 msgid "Please set XMODIFIERS." msgstr "请设置环境变量XMODIFIERS" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:803 +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:38 +msgid "Preferred Enchant Provider (Need Restart)" +msgstr "首选的Enchant后端 (需要重启)" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:801 #, c-format msgid "Press 1 to delete %s in frequent list (ESC for cancel)" msgstr "按下 1 删除常用字表中的 %s (ESC 取消)" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:805 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:803 #, c-format msgid "Press 1-%d to delete %s in frequent list (ESC for cancel)" msgstr "按下 1-%d 来删除常用字表中的 %s (ESC 取消)" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:307 #: /home/saber/Develop/fcitx/build/po/../..//src/module/autoeng/AutoEng.c:311 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:309 msgid "Press Enter to input text" msgstr "按下回车输入文本" -#: /home/saber/Develop/fcitx/data/config.desc:129 +#: /home/saber/Develop/fcitx/data/config.desc:49 msgid "Press Switch Key twice to Change Mode" msgstr "双击切换键时切换" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:765 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:763 msgid "Press index to delete user phrase (ESC for cancel)" msgstr "按下索引来删除用户词组 (ESC 取消)" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:776 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:774 msgid "Press number to make word in frequent list" msgstr "按下数字加入常用字表" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:149 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:157 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:165 +#: /home/saber/Develop/fcitx/data/config.desc:79 +msgid "Prev Page" +msgstr "上一页" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:164 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:172 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:180 msgid "Prev Page Icon" msgstr "上一页图标" @@ -1101,7 +1299,7 @@ msgid "Program" msgstr "程序" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:92 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:107 msgid "Prompt Table Code" msgstr "提示码表编码" @@ -1121,11 +1319,11 @@ msgid "Provides XIM support" msgstr "提供 XIM 支持" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-punc.conf.in.h:1 +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-punc.conf.in.h:2 msgid "Punctuation Conversion Support" msgstr "标点转换支持" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-punc.conf.in.h:2 +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-punc.conf.in.h:1 msgid "Punctuation Support" msgstr "标点支持" @@ -1133,8 +1331,8 @@ msgid "Quick Phrase List" msgstr "快速输入列表" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:242 -#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:331 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:244 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:333 msgid "Quick Phrase: " msgstr "快速输入: " @@ -1142,10 +1340,11 @@ msgid "QuickPhrase" msgstr "快速输入" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-quickphrase.conf.in.h:2 +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-quickphrase.conf.in.h:1 msgid "Quickphrase" msgstr "快速输入" +#: /home/saber/Develop/fcitx/build/po/tmp/qw.conf.in.h:1 #: /home/saber/Develop/fcitx/build/po/tmp/fcitx-qw.conf.in.h:1 #: /home/saber/Develop/fcitx/build/po/../..//src/im/qw/qw.c:68 msgid "Quwei" @@ -1167,15 +1366,11 @@ msgid "Register IM" msgstr "注册输入法方法" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:156 -msgid "Remind" -msgstr "联想" - -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:993 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:1050 msgid "Remind:" msgstr "联想:" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:2168 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:2173 msgid "Remind: " msgstr "联想:" @@ -1183,7 +1378,7 @@ msgid "Remote" msgstr "远程调用" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:323 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:330 msgid "Rename OK" msgstr "重命名成功" @@ -1192,57 +1387,85 @@ msgstr "变形规则" #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:92 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:133 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:205 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:148 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:220 msgid "Resize Margin Bottom" msgstr "下边距" #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:80 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:121 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:209 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:136 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:224 msgid "Resize Margin Left" msgstr "左边距" #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:84 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:125 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:213 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:140 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:228 msgid "Resize Margin Right" msgstr "右边距" #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:88 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:129 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:201 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:144 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:216 msgid "Resize Margin Top" msgstr "上边距" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:65 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:70 msgid "Rule of Candidate Phrase Order" msgstr "候选词顺序" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:56 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:61 msgid "Rule of Candidate Word Order" msgstr "候选字顺序" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:74 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:79 msgid "Rule of Frequent Word Order" msgstr "常用字顺序" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:27 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:54 +msgid "Russian" +msgstr "俄文字符" + +#: unknown +msgid "SHIFT Both" +msgstr "两侧 Shift" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:32 msgid "Save Auto Created Phrase" msgstr "保存自动词组" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:87 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:102 msgid "Save Auto Phrase" msgstr "保存自动词组" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:267 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:274 msgid "Save dict error" msgstr "保存码表出错" -#: /home/saber/Develop/fcitx/data/config.desc:4 +#: /home/saber/Develop/fcitx/data/config.desc:94 +msgid "Saving All Config and Input History" +msgstr "保存配置及输入历史" + +#: /home/saber/Develop/fcitx/data/config.desc:44 +msgid "Scroll between Input Method" +msgstr "输入法切换键" + +#: /home/saber/Develop/fcitx/data/config.desc:104 msgid "Seconds sleep before fcitx really start" msgstr "Fcitx真正启动前延迟的秒数" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/imselector/imselector.c:207 +msgid "Select global input method: " +msgstr "选择全局输入法:" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/imselector/imselector.c:207 +msgid "Select local input method: " +msgstr "选择局部输入法:" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-imselector.conf.in.h:2 +msgid "Select specific input method via keyboard" +msgstr "通过键盘选择特定的输入法" + #: unknown msgid "Self" msgstr "自提供" @@ -1251,15 +1474,15 @@ msgid "Semicolon" msgstr "分号" -#: /home/saber/Develop/fcitx/data/config.desc:56 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:58 +msgid "Send Raw Preedit" +msgstr "发送原始输入按键" + +#: /home/saber/Develop/fcitx/data/config.desc:145 msgid "Send typed raw text if Switch to inactive Mode" msgstr "切换到非激活模式时当前输入的原始文本上屏" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:196 -msgid "Setting Hint" -msgstr "设置提示" - -#: /home/saber/Develop/fcitx/data/config.desc:13 +#: /home/saber/Develop/fcitx/data/config.desc:113 msgid "Share State Among Window" msgstr "在窗口间共享状态" @@ -1271,23 +1494,19 @@ msgid "Show" msgstr "显示" -#: /home/saber/Develop/fcitx/data/config.desc:86 +#: /home/saber/Develop/fcitx/data/config.desc:170 msgid "Show Input Speed" msgstr "显示输入速度" -#: /home/saber/Develop/fcitx/data/config.desc:76 +#: /home/saber/Develop/fcitx/data/config.desc:165 msgid "Show Input Window After Trigger Input Mode" msgstr "切换输入时显示输入条" -#: /home/saber/Develop/fcitx/data/config.desc:81 -msgid "Show Point After Index" -msgstr "序号后加点" - #: /home/saber/Develop/fcitx/data/profile.desc:29 msgid "Show Preedit String in Client Window" msgstr "在客户端窗口中显示预编辑字符串" -#: /home/saber/Develop/fcitx/data/config.desc:91 +#: /home/saber/Develop/fcitx/data/config.desc:175 msgid "Show Version" msgstr "显示版本" @@ -1295,7 +1514,8 @@ msgid "Shuang Pin Schema" msgstr "默认双拼方案" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:126 +#: /home/saber/Develop/fcitx/build/po/tmp/shuangpin.conf.in.h:1 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:127 msgid "Shuangpin" msgstr "双拼" @@ -1303,11 +1523,11 @@ msgid "Simple Pinyin support for Fcitx" msgstr "Fcitx 简单的拼音支持" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-chttrans.conf.in.h:2 +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-chttrans.conf.in.h:1 msgid "Simplified Chinese To Traditional Chinese" msgstr "简繁转换" -#: unknown /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/skin.c:853 +#: unknown /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/skin.c:924 msgid "Skin" msgstr "皮肤" @@ -1352,20 +1572,24 @@ msgid "SkinTrayIcon" msgstr "皮肤托盘图标设置" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:221 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:236 msgid "Space Line Color" msgstr "分隔线颜色" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:340 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:342 #, c-format msgid "Space for %s Enter for %s" msgstr "空格输入 %s 回车输入 %s" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:112 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:58 +msgid "Special" +msgstr "特殊符号" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:127 msgid "Special Icon position" msgstr "特殊图标位置" -#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:239 +#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:247 #, c-format msgid "Start XIM error. Another XIM daemon named %s is running?" msgstr "XIM启动错误。是否有另一个名为%s的XIM守护程序正在运行?" @@ -1378,11 +1602,31 @@ msgid "Successfully Installed skin" msgstr "成功安装皮肤" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:96 unknown +#: /home/saber/Develop/fcitx/data/config.desc:99 +msgid "Switch Embeded Preedit" +msgstr "切换嵌入预编辑字符串" + +#: /home/saber/Develop/fcitx/data/config.desc:74 +msgid "Switch Full Width Punc Mode" +msgstr "切换全角标点" + +#: /home/saber/Develop/fcitx/data/config.desc:69 +msgid "Switching Full Width Character Mode" +msgstr "切换全角" + +#: /home/saber/Develop/fcitx/data/config.desc:64 +msgid "Switching Remind Mode" +msgstr "切换联想模式" + +#: /home/saber/Develop/fcitx/data/config.desc:59 +msgid "Switching Virtual Keyboard" +msgstr "切换虚拟键盘" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:111 unknown msgid "Symbol" msgstr "符号" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:101 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:116 msgid "Symbol File" msgstr "符号文件" @@ -1394,7 +1638,7 @@ msgid "Table Code Color" msgstr "码表提示颜色" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:159 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:162 #, c-format msgid "Table Config %s is %s" msgstr "Table Config %s is %s" @@ -1403,22 +1647,50 @@ msgid "Table Input Method for Fcitx" msgstr "Fcitx 的码表输入法" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:61 +msgid "Table Symbol" +msgstr "制表符" + #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:28 msgid "Tip Message Color" msgstr "提示信息颜色" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:142 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:486 +msgid "Toggle Full Width Punctuation" +msgstr "切换全角标点" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:117 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:182 +msgid "Toggle Half/Full width Character" +msgstr "切换半/全角字符" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:161 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:322 +msgid "Toggle Remind" +msgstr "切换联想" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:129 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:160 +msgid "Toggle Simp/Trad Chinese Conversion" +msgstr "切换简繁转换" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:158 +msgid "Toggle Virtual Keyboard" +msgstr "切换虚拟键盘" + #: /home/saber/Develop/fcitx/src/module/chttrans/fcitx-chttrans.desc:17 msgid "Toggle for enable or disable" msgstr "切换来禁用或启用" +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:9 +msgid "Toggle the word hint" +msgstr "切换单词提示" + #: /home/saber/Develop/fcitx/build/po/../..//src/module/autoeng/AutoEng.c:263 msgid "Too long item for AutoEng" msgstr "自动英文条目过长" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:127 -msgid "Traditional Chinese Translate" -msgstr "简繁转换" - #: /home/saber/Develop/fcitx/src/module/chttrans/fcitx-chttrans.desc:6 msgid "Traditional Chinese Translate Engine" msgstr "简繁转换引擎" @@ -1427,6 +1699,10 @@ msgid "TraditionalChinese" msgstr "繁体中文" +#: /home/saber/Develop/fcitx/data/config.desc:4 +msgid "Trigger Input Method" +msgstr "切换激活/非激活输入法" + #: /home/saber/Develop/fcitx/src/module/quickphrase/fcitx-quickphrase.desc:7 msgid "Trigger Key for QuickPhrase" msgstr "快速输入的触发键" @@ -1435,7 +1711,7 @@ msgid "Type" msgstr "类型" -#: /home/saber/Develop/fcitx/data/config.desc:37 +#: /home/saber/Develop/fcitx/data/config.desc:126 msgid "Type half width Punc After a Number" msgstr "数字后跟半角符号" @@ -1443,18 +1719,19 @@ msgid "UI" msgstr "界面" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ui.c:216 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ui.c:202 msgid "UI: bad ui" msgstr "界面: 有问题的界面" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ui.c:203 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ui.c:189 #, c-format msgid "UI: open %s fail %s" msgstr "界面: 打开 %s 失败 %s" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:435 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:445 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:781 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:491 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-utils/utils.c:471 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-utils/utils.c:487 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-utils/utils.c:502 msgid "Unable to create process" msgstr "无法创建进程" @@ -1471,19 +1748,27 @@ msgid "Unknown type, take it as string: %s" msgstr "未知类型,作为字符串处理: %s" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:17 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:22 msgid "Use Complete Pinyin" msgstr "使用完整拼音" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:121 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:136 msgid "Use Custom Prompt String defined in table" msgstr "使用码表中自定义的提示文本" +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:112 +msgid "Use Custom text icon color" +msgstr "使用自定的文本图标颜色" + #: /home/saber/Develop/fcitx/data/profile.desc:2 msgid "Use Full Width Character" msgstr "使用全角字符" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:58 +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-keyboard.conf.in.h:2 +msgid "Use Keyboard Layout as Input Method" +msgstr "将键盘布局作为输入法" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:68 msgid "Use Matching Key" msgstr "使用模糊键" @@ -1503,9 +1788,18 @@ msgid "Use Wide Punctuation" msgstr "使用全角标点" -#: /home/saber/Develop/fcitx/data/config.desc:32 -msgid "Use first input method as inactive state" -msgstr "使用第一个输入法作为非激活状态" +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:24 +msgid "Use enter to commit the existing string" +msgstr "使用回车确认已输入字符串" + +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:29 +msgid "Use presage to predict if possible." +msgstr "如果可以则使用 presage 增强单词提示功能" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:160 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:321 +msgid "Use remind" +msgstr "联想" #: /home/saber/Develop/fcitx/build/po/tmp/fcitx-remote-module.conf.in.h:2 msgid "Used by fcitx-remote to change Fcitx state from console" @@ -1531,16 +1825,15 @@ msgid "Virtual Key Board in order to input special character" msgstr "用于输入特殊字符的虚拟键盘" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:148 -#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:169 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:179 msgid "Virtual Keyboard" msgstr "虚拟键盘" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:241 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:256 msgid "Virtual Keyboard Image" msgstr "虚拟键盘图片" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:148 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:158 msgid "Virtual Keyboard State" msgstr "虚拟键盘状态" @@ -1556,6 +1849,19 @@ msgid "WubiPinyin" msgstr "五笔拼音" +# unknown +msgid "X Keyboard" +msgstr "X 键盘" + +# unknown +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-xkb.conf.in.h:1 +msgid "X Keyboard Integration" +msgstr "X 键盘集成" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-xkbdbus.conf.in.h:1 +msgid "X Keyboard Integration export with DBus" +msgstr "通过 DBus 导出的 X 键盘集成接口" + #: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/tray.c:164 #, c-format msgid "X error %i on opcode send" @@ -1569,11 +1875,11 @@ msgid "X11 Utilitiy used by other Addon" msgstr "由其他插件使用的 X11 工具函数" -#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:135 +#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:140 msgid "X11 not initialized" msgstr "X11 未初始化" -#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:157 +#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:164 msgid "XMODIFIERS Error." msgstr "XMODIFIERS Error." @@ -1581,10 +1887,6 @@ msgid "Xim" msgstr "Xim" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:184 -msgid "You can use tools provided by your distribution." -msgstr "您可以使用您发行版提供的工具。" - #: unknown msgid "Zhongwenzhixing" msgstr "中文之星" @@ -1597,11 +1899,11 @@ msgid "Ziranma" msgstr "自然码" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1230 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1436 msgid "min Num of Characters: " msgstr "分 字符数: " -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1157 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1138 #, c-format msgid "no default option for %s/%s" msgstr "选项%s/%s没有默认选项" @@ -1610,7 +1912,7 @@ msgid "no valid font." msgstr "无可用字体" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:313 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:297 msgid "pthread mutex init failed" msgstr "pthread mutex init failed" @@ -1619,3 +1921,73 @@ msgid "your current font is: %s" msgstr "当前字体为: %s" +#~ msgid "About Fcitx" +#~ msgstr "关于Fcitx" + +#~ msgid "Auto Send Candidate Word if no match in Code Table" +#~ msgstr "空码自动上屏" + +#~ msgid "Chinese Mode Icon" +#~ msgstr "中文模式图标" + +#~ msgid "Clear local state" +#~ msgstr "清除局部状态" + +#~ msgid "Close" +#~ msgstr "关闭" + +#~ msgid "Current is %s" +#~ msgstr "当前为: %s" + +#~ msgid "Full Width Character" +#~ msgstr "全角字符" + +#~ msgid "Hotkey of Going Next Page" +#~ msgstr "快捷键: 后一页" + +#~ msgid "Hotkey of Going Prev Page" +#~ msgstr "快捷键: 前一页" + +#~ msgid "" +#~ "If you use login manager like gdm or kdm, put those lines in your ~/." +#~ "xprofile." +#~ msgstr "" +#~ "如果您使用登录管理器,比如 gdm 或 kdm,请将这些行加入到 ~/.xprofile 中。" + +#~ msgid "If you use ~/.xinitrc and startx, put those lines in ~/.xinitrc." +#~ msgstr "如果您使用 ~/.xinitrc 和 startx,请将这些行加入到 ~/.xinitrc 中。" + +#~ msgid "It's the first time Fcitx Start." +#~ msgstr "这是 Fcitx 首次启动" + +#~ msgid "Or (Depends on you install im module or not)" +#~ msgstr "或者(取决于您是否安装了im module)" + +#~ msgid "" +#~ "Or You may need to set environment varibles below to make fcitx work " +#~ "correctly." +#~ msgstr "或者你需要设置以下环境变量从而让Fcitx正常工作。" + +#~ msgid "Please check your environment varibles." +#~ msgstr "请检查你的环境变量的设置" + +#~ msgid "Setting Hint" +#~ msgstr "设置提示" + +#~ msgid "Show Point After Index" +#~ msgstr "序号后加点" + +#~ msgid "Simp/Trad Chinese Conversion" +#~ msgstr "简繁中文转换" + +#~ msgid "Switching Active and Inactive Mode" +#~ msgstr "切换激活/非激活状态" + +#~ msgid "Traditional Chinese Translate" +#~ msgstr "简繁转换" + +#~ msgid "Use first input method as inactive state" +#~ msgstr "使用第一个输入法作为非激活状态" + +#~ msgid "You can use tools provided by your distribution." +#~ msgstr "您可以使用您发行版提供的工具。" diff -Nru fcitx-4.2.2/po/zh_TW.po fcitx-4.2.4.1/po/zh_TW.po --- fcitx-4.2.2/po/zh_TW.po 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/po/zh_TW.po 2012-06-10 14:34:48.000000000 +0000 @@ -1,29 +1,35 @@ -# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Alisha , 2012. +# Weng Xuetian , 2012. msgid "" msgstr "" "Project-Id-Version: fcitx\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-04-07 13:19+0800\n" -"PO-Revision-Date: 2012-04-01 07:53+0000\n" -"Last-Translator: Alisha \n" -"Language-Team: Chinese (Taiwan) (http://www.transifex.net/projects/p/fcitx/" -"language/zh_TW/)\n" +"POT-Creation-Date: 2012-05-26 20:27+0800\n" +"PO-Revision-Date: 2012-05-19 00:46+0800\n" +"Last-Translator: Weng Xuetian \n" +"Language-Team: Chinese Simplified \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"language/zh_TW/)\n" "Plural-Forms: nplurals=1; plural=0\n" +"X-Generator: Lokalize 1.4\n" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:1102 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:1159 msgid " Ctrl+Delete To Delete" msgstr " 用 Ctrl+Delete 刪除" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1228 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/xkbdbus/xkbdbus.c:159 +#, c-format +msgid "%s" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1434 msgid "/min Time Used: " msgstr "/分 經過時間:" @@ -39,19 +45,28 @@ msgid "ALT_R_SHIFT" msgstr "Alt+右Shift" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:145 -msgid "About Fcitx" -msgstr "關於 Fcitx" +#: unknown +msgid "ALT_SHIFT" +msgstr "Alt+Shift" -#: /home/saber/Develop/fcitx/data/config.desc:46 +#: unknown +msgid "ALT_SUPER" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:135 msgid "Action after press enter" msgstr "按下 enter 鍵後動作" +#: /home/saber/Develop/fcitx/data/config.desc:24 +#, fuzzy +msgid "Activate input method" +msgstr "無可用輸入法" + #: unknown msgid "Active" msgstr "作用" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:217 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:232 msgid "Active Menu Color" msgstr "" @@ -59,19 +74,36 @@ msgid "Active Menu Item Character Color" msgstr "" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:189 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:76 +msgid "Active Mode Icon" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:117 +msgid "Active Text Icon Color" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:204 msgid "Active Tray Icon" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/dbus/dbusstuff.c:104 +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-lua.conf.in.h:2 +#, fuzzy +msgid "Add Lua script support for Fcitx" +msgstr "Fcitx 的 Kimpanel 支援" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/dbus/dbusstuff.c:106 msgid "Add Watch Function Error" msgstr "" +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:43 +msgid "Add current input buffer to user dictionary" +msgstr "" + # unknown msgid "Addon" msgstr "附加元件" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/addon.c:107 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/addon.c:108 #, c-format msgid "Addon Config %s is %s" msgstr "" @@ -96,6 +128,19 @@ msgid "All" msgstr "所有" +#: /home/saber/Develop/fcitx/src/module/xkb/fcitx-xkb.desc:4 +msgid "Allow to Override System XKB Settings" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:156 +msgid "Alternative Next Page Key" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:146 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:151 +msgid "Alternative Prev Page Key" +msgstr "" + # unknown msgid "Appearance" msgstr "外觀" @@ -105,18 +150,22 @@ msgstr "" #: unknown +msgid "Aspell" +msgstr "" + +#: unknown msgid "Auto" msgstr "自動" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-autoeng.conf.in.h:1 +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-autoeng.conf.in.h:2 msgid "Auto Change to English Mode while Input Specific String" msgstr "在輸入特定字串時自動切換到英文模式" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:22 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:27 msgid "Auto Create Phrase" msgstr "" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-autoeng.conf.in.h:2 +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-autoeng.conf.in.h:1 msgid "Auto English Mode" msgstr "自動英文模式" @@ -124,34 +173,31 @@ msgid "Auto English Trigger Word" msgstr "自動觸發英文模式字詞" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:72 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:82 msgid "Auto Phrase" msgstr "自動字詞" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:77 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:92 msgid "Auto Phrase Length" msgstr "自動字詞長度" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:82 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:97 msgid "Auto Phrase Phrase" msgstr "" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:48 -msgid "Auto Send Candidate Word if no match in Code Table" -msgstr "" - #: /home/saber/Develop/fcitx/src/im/table/table.desc:43 -msgid "Auto Send Candidate Word to Client" -msgstr "" +#, fuzzy +msgid "Auto Send Candidate Word" +msgstr "選擇第二第三候選詞" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1136 -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1145 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1117 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1126 msgid "Available Value:" msgstr "" #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:64 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:117 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:197 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:132 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:212 msgid "Background Image" msgstr "" @@ -159,24 +205,36 @@ msgid "Bingchan" msgstr "冰蟾全息" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:359 +#: unknown +msgid "CTRL Both" +msgstr "" + +#: unknown +msgid "CTRL_SHIFT" +msgstr "Ctrl+Shift" + +#: unknown +msgid "CTRL_SUPER" +msgstr "Ctrl+Super" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:360 msgid "Can not find System Database of Pinyin!" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/skin.c:138 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/skin.c:139 msgid "Can not load default skin, is installion correct?" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/skin.c:143 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/skin.c:144 #, c-format msgid "Can not load skin %s, return to default" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:146 +#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:153 msgid "Can't Create imWindow" msgstr "無法建立輸入法視窗" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:312 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:360 msgid "Can't open punc file." msgstr "" @@ -189,7 +247,7 @@ msgid "Candidate Index Color" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:61 +#: /home/saber/Develop/fcitx/data/config.desc:150 msgid "Candidate Word Number" msgstr "候選字數" @@ -197,22 +255,22 @@ msgid "Cangjie" msgstr "倉頡" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:1837 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:1842 #, c-format msgid "Cannot Save Frequent word: %s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:1910 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:1915 #, c-format msgid "Cannot Save Pinyin Index: %s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:1773 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:1778 #, c-format msgid "Cannot Save User Pinyin Database: %s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:428 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:460 msgid "Cannot found Pinyin" msgstr "" @@ -220,23 +278,19 @@ msgid "Category" msgstr "類別" -#: ../..//data/fcitx.desktop.in.h:1 -msgid "Chinese Input Method" -msgstr "中文輸入法" - -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:76 -msgid "Chinese Mode Icon" -msgstr "" - -#: /home/saber/Develop/fcitx/src/im/table/table.desc:106 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:121 msgid "Choose" msgstr "選擇鍵" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:483 +#: /home/saber/Develop/fcitx/data/config.desc:89 +msgid "Choose Second and Third Candidate Word" +msgstr "選擇第二第三候選詞" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:515 msgid "Choose the phrase to be deleted, Press Escape to Cancel" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:475 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:507 msgid "Choose the phrase to be put in the front, Press Escape to Cancel" msgstr "" @@ -256,9 +310,14 @@ msgid "Clean" msgstr "清除" -#: unknown -msgid "Close" -msgstr "關閉" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/imselector/imselector.c:227 +#, fuzzy +msgid "Clear local input method" +msgstr "無可用輸入法" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:212 +msgid "Close virtual keyboard" +msgstr "關閉虛擬鍵盤" #: /home/saber/Develop/fcitx/src/im/table/table.desc:15 msgid "Code Table File" @@ -268,7 +327,7 @@ msgid "Code Table Name" msgstr "碼表名稱" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:1100 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:1157 msgid "Code is " msgstr "編碼為 " @@ -276,7 +335,7 @@ msgid "CodeTable" msgstr "碼表" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:137 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:152 msgid "Color of Cursor" msgstr "" @@ -288,15 +347,36 @@ msgid "Commit" msgstr "提交輸入" +#: /home/saber/Develop/fcitx/src/im/table/table.desc:166 +msgid "Commit and pass when invalid key of this table pressed" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:171 +msgid "Commit key for select first candidate" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:176 +msgid "Commit string when there is no match" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:4 +msgid "Commit with extra space when choose candidate word" +msgstr "" + #: unknown msgid "ConfigFile" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:160 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:477 msgid "Configure" msgstr "設定" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:860 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:476 +#, fuzzy +msgid "Configure Current Input Method" +msgstr "中文輸入法" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:841 #, c-format msgid "Configure group name error: line %d" msgstr "" @@ -306,14 +386,27 @@ msgid "Connection Error (%s)" msgstr "連接錯誤(%s)" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-quickphrase.conf.in.h:1 +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-quickphrase.conf.in.h:2 msgid "Conveniently Input English or User-Defined Simple Table" msgstr "方便地輸入英文或使用者定義的碼表" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-chttrans.conf.in.h:1 +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-chttrans.conf.in.h:2 msgid "Convert Simplified Chinese To Traditional Chinese" msgstr "轉換簡體中文為正體中文" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:128 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:159 +#, fuzzy +msgid "Convert to Simplified Chinese" +msgstr "轉換簡體中文為正體中文" + +# unknown +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:128 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:159 +#, fuzzy +msgid "Convert to Traditional Chinese" +msgstr "正體中文" + #: unknown msgid "Copy" msgstr "複製" @@ -326,6 +419,11 @@ msgid "Current Input Method Name" msgstr "目前輸入法名稱" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/imselector/imselector.c:212 +#, fuzzy, c-format +msgid "Current local input method is %s" +msgstr "無可用輸入法" + #: unknown msgid "DBus" msgstr "DBus" @@ -338,15 +436,19 @@ msgid "DISPLAY InputWindow" msgstr "DISPLAY InputWindow" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/MainWindow.c:137 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/MainWindow.c:135 msgid "DISPLAY MainWindow" msgstr "DISPLAY MainWindow" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/MainWindow.c:152 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/MainWindow.c:145 msgid "DRAW MainWindow" msgstr "DRAW MainWindow" -#: /home/saber/Develop/fcitx/data/config.desc:22 +#: unknown +msgid "Default" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:121 msgid "Default Input Method State" msgstr "預設輸入法狀態" @@ -366,55 +468,63 @@ msgid "Dianbaoma" msgstr "電報碼" -#: /home/saber/Develop/fcitx/data/config.desc:51 +#: /home/saber/Develop/fcitx/data/config.desc:140 msgid "Disable Paging in Remind Mode" msgstr "聯想模式停用翻頁" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/addon.c:197 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/addon.c:207 #, c-format msgid "Disable addon %s, dependency %s can not be satisfied." msgstr "" #: unknown -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:289 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:294 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:348 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:353 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:704 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:305 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:310 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:370 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:375 msgid "Disabled" msgstr "停用" -#: /home/saber/Develop/fcitx/data/config.desc:71 +#: /home/saber/Develop/fcitx/data/config.desc:160 msgid "Do not commit preedit text when unfocus a window" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:101 +#: /home/saber/Develop/fcitx/data/addon.desc:77 +msgid "Do not show in GUI" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:185 msgid "" -"Do not show input window if there is one one candidate (Hide when only " +"Do not show input window if there is only one candidate (Hide when only " "preedit string must be selected)" msgstr "只有一個候選字時不顯示輸入視窗(必須勾選只有預編輯字串時不顯示視窗)" -#: /home/saber/Develop/fcitx/data/config.desc:96 +#: /home/saber/Develop/fcitx/data/config.desc:180 msgid "Do not show input window if there is only preedit string" msgstr "只有預編輯字串時不顯示輸入視窗" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:872 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:853 #, c-format msgid "Duplicate group name, merge with the previous: %s :line %d" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:936 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:917 #, c-format msgid "Duplicate option, overwrite: line %d" msgstr "" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:116 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:131 msgid "Enable" msgstr "啟用" -#: /home/saber/Develop/fcitx/data/config.desc:111 -msgid "Enable Left Ctrl + Left Shift to Switch Between Input Method" -msgstr "啟用左Ctrl + 左Shift 切換輸入法" +#: /home/saber/Develop/fcitx/data/config.desc:34 +#, fuzzy +msgid "Enable Hotkey to scroll Between Input Method" +msgstr "啟用在輸入法之間切換的快捷鍵" + +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:14 +msgid "Enable word hint if available" +msgstr "" #: /home/saber/Develop/fcitx/data/addon.desc:27 msgid "Enabled" @@ -424,10 +534,15 @@ msgid "Enabled in input" msgstr "輸入中啟用" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:53 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:63 msgid "End Key" msgstr "中止鍵" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/xkbdbus/xkbdbus.c:184 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/keyboard/keyboard.c:410 +msgid "English (US)" +msgstr "" + #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:72 msgid "English Mode Icon" msgstr "" @@ -471,7 +586,7 @@ msgid "Error: skin file should only contain one directory." msgstr "" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:68 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:78 msgid "Exact Match" msgstr "精確相符" @@ -479,10 +594,14 @@ msgid "Exec" msgstr "Exec" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:161 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:478 msgid "Exit" msgstr "離開" +#: /home/saber/Develop/fcitx/data/config.desc:19 +msgid "Extra key for trigger input method" +msgstr "" + #: /home/saber/Develop/fcitx/build/po/../..//src/core/errorhandler.c:59 #, c-format msgid "FCITX -- Get Signal No.: %d" @@ -492,23 +611,30 @@ msgid "Fallback UI Addon" msgstr "" -#: ../..//data/fcitx.desktop.in.h:2 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:276 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:292 +#: ../..//data/fcitx.desktop.in.h:1 msgid "Fcitx" msgstr "Fcitx" +#. kate: indent-mode cstyle; space-indent on; indent-width 4; #: ../..//data/fcitx-configtool.desktop.in.h:1 msgid "Fcitx Config Tool" msgstr "Fcitx 設定工具" #: /home/saber/Develop/fcitx/build/po/tmp/fcitx-ipc.conf.in.h:1 -msgid "Fcitx DBus Frontend " +#, fuzzy +msgid "Fcitx DBus Frontend" msgstr "Fcitx DBus 前端 " #: ../..//data/fcitx-configtool.desktop.in.h:2 msgid "Fcitx GUI Config Tool" msgstr "Fcitx GUI 設定工具" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-lua.conf.in.h:1 +#, fuzzy +msgid "Fcitx Lua Support" +msgstr "標點支援" + #: ../..//src/ui/classic/fcitx-skin-installer.desktop.in.h:1 msgid "Fcitx Skin Installer" msgstr "" @@ -518,14 +644,14 @@ msgstr "Fcitx XIM 前端" #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:104 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:181 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:233 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:196 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:248 msgid "Fill Background Horizontal rule" msgstr "" #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:96 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:173 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:225 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:188 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:240 msgid "Fill Background Vertical rule" msgstr "" @@ -533,10 +659,18 @@ msgid "First Candidate Color" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:134 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:161 +msgid "First Candidate Display as Preedit" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:139 msgid "Fix misstype gn/ng" msgstr "" +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:17 +msgid "Fix preedit cursor at head" +msgstr "" + #: /home/saber/Develop/fcitx/src/ui/classic/fcitx-classic-ui.desc:14 msgid "Font" msgstr "字型" @@ -553,157 +687,145 @@ msgid "Frontend Used by IM Modules" msgstr "輸入法模組使用的前端" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/frontend.c:316 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/frontend.c:416 msgid "Frontend: bad frontend" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/frontend.c:304 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/frontend.c:404 #, c-format msgid "Frontend: open %s fail %s" msgstr "前端:開啟 %s 失敗 %s" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:114 -msgid "Full Width Character" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:116 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:181 +#, fuzzy +msgid "Full width Character" msgstr "全形字元" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:134 -msgid "Full Width Punctuation" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:141 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:485 +#, fuzzy +msgid "Full width punct" msgstr "全形標點符號" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:52 +#, fuzzy +msgid "Fullwidth" +msgstr "全形字元" + #: /home/saber/Develop/fcitx/build/po/tmp/fcitx-fullwidth-char.conf.in.h:1 msgid "Fullwidth Character" msgstr "全形字元" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:79 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:84 msgid "Fuzzy an and ang" msgstr "模糊 an 和 ang" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:109 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:114 msgid "Fuzzy c and ch" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:84 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:89 msgid "Fuzzy en and eng" msgstr "模糊 en 和 eng" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:114 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:119 msgid "Fuzzy f and h" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:89 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:94 msgid "Fuzzy ian and iang" msgstr "模糊 ian 和 iang" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:94 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:99 msgid "Fuzzy in and ing" msgstr "模糊 in 和 ing" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:119 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:124 msgid "Fuzzy l and n" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:99 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:104 msgid "Fuzzy ou and u" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:124 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:129 msgid "Fuzzy s and sh" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:104 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:109 msgid "Fuzzy uan and uang" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:129 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:134 msgid "Fuzzy z and zh" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:66 +#: /home/saber/Develop/fcitx/data/config.desc:155 msgid "Give the tips of Phrase" msgstr "提示詞庫中字詞" +#: /home/saber/Develop/fcitx/src/module/imselector/fcitx-imselector.desc:9 +#, fuzzy +msgid "Global Input Method SelectKey" +msgstr "預設輸入法狀態" + #: unknown msgid "Grave" msgstr "" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:53 +msgid "Greek" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:116 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:181 +#, fuzzy +msgid "Half width Character" +msgstr "全形字元" + #: unknown msgid "Hide" msgstr "隱藏" -#: /home/saber/Develop/fcitx/data/config.desc:106 -msgid "Hot key of Triggering Input Method" -msgstr "快捷鍵:切換輸入法" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:59 +msgid "Hiragana" +msgstr "" # unknown msgid "Hotkey" msgstr "快捷鍵" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:32 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:37 msgid "Hotkey of Adding Frequent Word" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:42 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:47 msgid "Hotkey of Delete User Phrase" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:37 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:42 msgid "Hotkey of Deleting Frequent Word" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:164 -msgid "Hotkey of Going Next Page" -msgstr "快捷鍵:下一頁" - -#: /home/saber/Develop/fcitx/data/config.desc:159 -msgid "Hotkey of Going Prev Page" -msgstr "快捷鍵:前一頁" - -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:47 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:52 msgid "Hotkey of Inputing Word From Phrase" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:174 -msgid "Hotkey of Saving All Config and Input History" -msgstr "快捷鍵:保存所有設定及輸入歷史" - -#: /home/saber/Develop/fcitx/data/config.desc:179 -msgid "Hotkey of Switch Embeded Preedit" -msgstr "快捷鍵:切換嵌入預編輯字串" - -#: /home/saber/Develop/fcitx/data/config.desc:154 -msgid "Hotkey of Switch Full Width Punc Mode" -msgstr "快捷鍵:切換全形標點符號" - -#: /home/saber/Develop/fcitx/data/config.desc:124 -msgid "Hotkey of Switching Active and Inactive Mode" -msgstr "快速鍵: 切換作用/非作用狀態" - -#: /home/saber/Develop/fcitx/data/config.desc:149 -msgid "Hotkey of Switching Full Width Character Mode" -msgstr "快捷鍵:切換全形字元模式" - -#: /home/saber/Develop/fcitx/data/config.desc:144 -msgid "Hotkey of Switching Remind Mode" -msgstr "快捷鍵:切換聯想模式" - -#: /home/saber/Develop/fcitx/data/config.desc:139 -msgid "Hotkey of Switching Virtual Keyboard" -msgstr "快捷鍵:切換虛擬鍵盤" - -#: /home/saber/Develop/fcitx/data/config.desc:169 -msgid "Hotkey to Choose Second and Third Candidate Word" -msgstr "快捷鍵:選擇第二第三候選詞" - -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:218 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:289 #, c-format msgid "IM: bad im %s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:204 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:275 #, c-format msgid "IM: open %s fail %s" msgstr "輸入法:開啟 %s 失敗 %s" +# unknown +msgid "IMSelector" +msgstr "" + #: /home/saber/Develop/fcitx/src/im/table/table.desc:11 msgid "Icon Name" msgstr "圖示名稱" @@ -712,16 +834,19 @@ msgid "IconName" msgstr "圖示名稱" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:193 -msgid "" -"If you use login manager like gdm or kdm, put those lines in your ~/." -"xprofile." -msgstr "" -"如果您使用登錄管理器,比如 gdm 或 kdm,請將這幾行加入到 ~/.xprofile 中。" +#: /home/saber/Develop/fcitx/src/module/xkb/fcitx-xkb.desc:9 +#, fuzzy +msgid "Ignore Input Method Layout Request" +msgstr "目前輸入法名稱" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:194 -msgid "If you use ~/.xinitrc and startx, put those lines in ~/.xinitrc." -msgstr "如果您使用 ~/.xinitrc 和 startx,請將這幾行加入到 ~/.xinitrc 中。" +#: /home/saber/Develop/fcitx/src/im/table/table.desc:181 +msgid "Ignore Punctuation" +msgstr "忽略標點" + +#: /home/saber/Develop/fcitx/data/config.desc:29 +#, fuzzy +msgid "Inactivate Input Method" +msgstr "無可用輸入法" #: unknown msgid "Inactive" @@ -731,10 +856,18 @@ msgid "Inactive Menu Item Character Color" msgstr "" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:193 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:122 +msgid "Inactive Text Icon Color" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:208 msgid "Inctive Tray Icon" msgstr "" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:55 +msgid "Index" +msgstr "" + #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:19 msgid "Input Font Size" msgstr "" @@ -743,22 +876,27 @@ msgid "Input Message Color" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1161 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1363 +#: ../..//data/fcitx.desktop.in.h:2 msgid "Input Method" msgstr "輸入法" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:290 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:295 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:349 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:354 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:704 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:306 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:311 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:371 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:376 msgid "Input Method Disabled" msgstr "停用輸入法" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1226 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1432 msgid "Input Speed: " msgstr "輸入速度:" +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-imselector.conf.in.h:1 +#, fuzzy +msgid "Input method selector" +msgstr "停用輸入法" + # unknown #: unknown msgid "InputMethod" @@ -768,24 +906,49 @@ msgid "Installer Script for Fcitx Skin" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:134 +#: /home/saber/Develop/fcitx/data/config.desc:54 msgid "Interval of Two Key Input" msgstr "輸入間隔" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:890 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:871 #, c-format msgid "Invalid Entry: line %d missing '='" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:27 -msgid "It's the first time Fcitx Start." -msgstr "這是 Fcitx 第一次啟動。" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:60 +msgid "Katakana" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:87 +msgid "" +"Keep current buffer when there is no match item and input length is equal " +"code length" +msgstr "" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:246 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:261 msgid "Key Color On Virutal Keyboard" msgstr "" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:126 +msgid "Keyboard" +msgstr "鍵盤" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/keyboard/keyboard.c:375 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/keyboard/keyboard.c:409 +#, fuzzy, c-format +msgid "Keyboard - %s" +msgstr "虛擬鍵盤" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/keyboard/keyboard.c:398 +#, fuzzy, c-format +msgid "Keyboard - %s - %s" +msgstr "虛擬鍵盤" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-keyboard.conf.in.h:1 +#, fuzzy +msgid "Keyboard Input Method" +msgstr "切換輸入法" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:141 msgid "Keyboard Layout to be used" msgstr "鍵盤配置" @@ -809,19 +972,28 @@ msgid "LangCode" msgstr "語言代碼" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:111 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:126 msgid "Language Code for this table" msgstr "這個碼表的語言代碼" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:141 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:51 +msgid "Latin" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:141 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:485 +msgid "Latin punct" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:156 msgid "Left-down position of Input" msgstr "" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:145 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:160 msgid "Left-down position of Output" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:400 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:432 msgid "" "Left/Right to choose selected character, Press Enter to confirm, Press " "Escape to Cancel" @@ -831,21 +1003,21 @@ msgid "Library" msgstr "程式庫" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/addon.c:99 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/addon.c:100 #, c-format msgid "Load Addon Config File:%s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:236 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:243 msgid "Load Autophrase OK" msgstr "載入自動字詞成功" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:152 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:155 #, c-format msgid "Load Table Config File:%s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:169 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:176 msgid "Load Table Dict OK" msgstr "載入碼表字典成功" @@ -854,13 +1026,13 @@ msgid "Load Table Dict from %s" msgstr "從 %s 載入碼表字典" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:375 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:376 #, c-format msgid "Load extra dict: %s" msgstr "" #. 读取上次保存的自动词组信息 -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:196 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:203 msgid "Loading Autophrase." msgstr "載入自動字詞中" @@ -869,6 +1041,11 @@ msgid "Loading Table Dict" msgstr "載入碼表字典" +#: /home/saber/Develop/fcitx/src/module/imselector/fcitx-imselector.desc:4 +#, fuzzy +msgid "Local Input Method SelectKey" +msgstr "預設輸入法狀態" + #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:68 msgid "Logo Icon" msgstr "" @@ -889,10 +1066,14 @@ msgid "Main Window Position Y" msgstr "" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:63 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:73 msgid "Matching Key" msgstr "模糊鍵" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:56 +msgid "Math" +msgstr "" + #: /home/saber/Develop/fcitx/src/ui/classic/fcitx-classic-ui.desc:19 msgid "Menu Font" msgstr "選單字型" @@ -901,10 +1082,23 @@ msgid "Menu Font Size" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:2301 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:2306 msgid "Migrate the old file path to the new one" msgstr "" +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:19 +msgid "Minimum Length to trigger word hint" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:53 +msgid "" +"Minimum length trigger auto send candidate when there will be no candidate" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:48 +msgid "Minimum length trigger auto send candidate word when only one candidate" +msgstr "" + #: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:387 msgid "Missing type, take it as string" msgstr "" @@ -913,21 +1107,25 @@ msgid "Module" msgstr "模組" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/module.c:77 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/module.c:76 msgid "Module: bad module" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/module.c:65 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/module.c:64 #, c-format msgid "Module: open %s fail %s" msgstr "模組:開啟 %s 失敗 %s" +#: unknown +msgid "Myspell" +msgstr "" + #: /home/saber/Develop/fcitx/data/inputmethod.desc:7 #: /home/saber/Develop/fcitx/data/addon.desc:3 msgid "Name" msgstr "名稱" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/dbus/dbusstuff.c:124 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/dbus/dbusstuff.c:126 #, c-format msgid "Name Error (%s)" msgstr "名稱錯誤(%s)" @@ -940,9 +1138,13 @@ msgid "Native" msgstr "原生" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:153 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:161 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:169 +#: /home/saber/Develop/fcitx/data/config.desc:84 +msgid "Next Page" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:168 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:176 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:184 msgid "Next Page Icon" msgstr "" @@ -950,19 +1152,39 @@ msgid "No" msgstr "否" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:381 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:494 msgid "No available Input Method" msgstr "無可用輸入法" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/frontend.c:337 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/frontend.c:437 msgid "No available frontend" msgstr "無可用前端" +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:359 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:360 +msgid "No input window" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/imselector/imselector.c:216 +#, fuzzy +msgid "No local input method" +msgstr "無可用輸入法" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:160 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:321 +#, fuzzy +msgid "No remind" +msgstr "聯想" + #: unknown msgid "Nothing" msgstr "不動作" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:146 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:57 +msgid "Number" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:413 msgid "Online Help" msgstr "線上說明" @@ -970,36 +1192,26 @@ msgid "OpenCC" msgstr "OpenCC" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:230 -#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:332 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:238 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:340 msgid "OpenCC error" msgstr "OpenCC 錯誤" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:222 -#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:324 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:230 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:332 msgid "OpenCC initialization error" msgstr "OpenCC 初始化錯誤" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1083 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1064 #, c-format msgid "Option %s is Invalid, Use Default Value %s" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1093 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1074 #, c-format msgid "Option %s is Invalid." msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:189 -msgid "Or (Depends on you install im module or not)" -msgstr "或者(取決於您是否安裝了im module)" - -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:185 -msgid "" -"Or You may need to set environment varibles below to make fcitx work " -"correctly." -msgstr "或者您需要設定以下環境變數讓 Fcitx 正常運作。" - #: /home/saber/Develop/fcitx/src/im/table/table.desc:28 msgid "Order of Code Table" msgstr "碼表順序" @@ -1020,17 +1232,18 @@ msgid "PerProgram" msgstr "按程式" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:1097 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:1154 msgid "Phrase is already in Dict " msgstr "字詞已在碼表中" # unknown +#: /home/saber/Develop/fcitx/build/po/tmp/pinyin.conf.in.h:1 #: /home/saber/Develop/fcitx/build/po/tmp/fcitx-pinyin.conf.in.h:1 -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:110 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:111 msgid "Pinyin" msgstr "拼音" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:425 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:426 msgid "Pinyin Index Magic Number Doesn't match" msgstr "" @@ -1038,7 +1251,7 @@ msgid "Pinyin Key" msgstr "拼音鍵" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:426 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:458 msgid "Pinyin: " msgstr "拼音:" @@ -1046,44 +1259,48 @@ msgid "PinyinJiaJia" msgstr "拼音加加" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:183 -msgid "Please check your environment varibles." -msgstr "請檢查您的環境變數設定。" - -#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:161 +#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:168 msgid "Please set XMODIFIERS." msgstr "請設定環境變數 XMOIFIERS。" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:803 +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:38 +msgid "Preferred Enchant Provider (Need Restart)" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:801 #, c-format msgid "Press 1 to delete %s in frequent list (ESC for cancel)" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:805 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:803 #, c-format msgid "Press 1-%d to delete %s in frequent list (ESC for cancel)" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:307 #: /home/saber/Develop/fcitx/build/po/../..//src/module/autoeng/AutoEng.c:311 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:309 msgid "Press Enter to input text" msgstr "按下 Enter 輸入文字" -#: /home/saber/Develop/fcitx/data/config.desc:129 +#: /home/saber/Develop/fcitx/data/config.desc:49 msgid "Press Switch Key twice to Change Mode" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:765 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:763 msgid "Press index to delete user phrase (ESC for cancel)" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:776 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:774 msgid "Press number to make word in frequent list" msgstr "" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:149 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:157 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:165 +#: /home/saber/Develop/fcitx/data/config.desc:79 +msgid "Prev Page" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:164 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:172 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:180 msgid "Prev Page Icon" msgstr "" @@ -1103,7 +1320,7 @@ msgid "Program" msgstr "程式" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:92 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:107 msgid "Prompt Table Code" msgstr "提示碼表編碼" @@ -1123,11 +1340,11 @@ msgid "Provides XIM support" msgstr "提供 XIM 支援" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-punc.conf.in.h:1 +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-punc.conf.in.h:2 msgid "Punctuation Conversion Support" msgstr "標點符號轉換支援" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-punc.conf.in.h:2 +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-punc.conf.in.h:1 msgid "Punctuation Support" msgstr "標點支援" @@ -1135,8 +1352,8 @@ msgid "Quick Phrase List" msgstr "快速字詞清單" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:242 -#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:331 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:244 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:333 msgid "Quick Phrase: " msgstr "快速字詞:" @@ -1144,10 +1361,11 @@ msgid "QuickPhrase" msgstr "快速字詞" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-quickphrase.conf.in.h:2 +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-quickphrase.conf.in.h:1 msgid "Quickphrase" msgstr "快速字詞" +#: /home/saber/Develop/fcitx/build/po/tmp/qw.conf.in.h:1 #: /home/saber/Develop/fcitx/build/po/tmp/fcitx-qw.conf.in.h:1 #: /home/saber/Develop/fcitx/build/po/../..//src/im/qw/qw.c:68 msgid "Quwei" @@ -1169,15 +1387,11 @@ msgid "Register IM" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:156 -msgid "Remind" -msgstr "聯想" - -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:993 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:1050 msgid "Remind:" msgstr "聯想:" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:2168 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:2173 msgid "Remind: " msgstr "聯想:" @@ -1185,7 +1399,7 @@ msgid "Remote" msgstr "遠端操作" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:323 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:330 msgid "Rename OK" msgstr "重新命名成功" @@ -1194,57 +1408,88 @@ msgstr "" #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:92 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:133 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:205 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:148 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:220 msgid "Resize Margin Bottom" msgstr "" #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:80 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:121 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:209 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:136 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:224 msgid "Resize Margin Left" msgstr "" #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:84 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:125 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:213 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:140 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:228 msgid "Resize Margin Right" msgstr "" #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:88 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:129 -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:201 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:144 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:216 msgid "Resize Margin Top" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:65 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:70 msgid "Rule of Candidate Phrase Order" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:56 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:61 msgid "Rule of Candidate Word Order" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:74 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:79 msgid "Rule of Frequent Word Order" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:27 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:54 +msgid "Russian" +msgstr "" + +#: unknown +msgid "SHIFT Both" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:32 msgid "Save Auto Created Phrase" msgstr "" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:87 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:102 msgid "Save Auto Phrase" msgstr "儲存自動字詞" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:267 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/tabledict.c:274 msgid "Save dict error" msgstr "" -#: /home/saber/Develop/fcitx/data/config.desc:4 +#: /home/saber/Develop/fcitx/data/config.desc:94 +msgid "Saving All Config and Input History" +msgstr "保存所有設定及輸入歷史" + +#: /home/saber/Develop/fcitx/data/config.desc:44 +#, fuzzy +msgid "Scroll between Input Method" +msgstr "在輸入法之間切換的快捷鍵" + +#: /home/saber/Develop/fcitx/data/config.desc:104 msgid "Seconds sleep before fcitx really start" msgstr "Fcitx 真正啟動前延遲的秒數" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/imselector/imselector.c:207 +#, fuzzy +msgid "Select global input method: " +msgstr "無可用輸入法" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/imselector/imselector.c:207 +#, fuzzy +msgid "Select local input method: " +msgstr "無可用輸入法" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-imselector.conf.in.h:2 +msgid "Select specific input method via keyboard" +msgstr "" + #: unknown msgid "Self" msgstr "" @@ -1253,15 +1498,15 @@ msgid "Semicolon" msgstr "分號" -#: /home/saber/Develop/fcitx/data/config.desc:56 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:58 +msgid "Send Raw Preedit" +msgstr "" + +#: /home/saber/Develop/fcitx/data/config.desc:145 msgid "Send typed raw text if Switch to inactive Mode" msgstr "切換到非作用模式時直接送出輸入文字" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:196 -msgid "Setting Hint" -msgstr "設定提示" - -#: /home/saber/Develop/fcitx/data/config.desc:13 +#: /home/saber/Develop/fcitx/data/config.desc:113 msgid "Share State Among Window" msgstr "在視窗間共享狀態" @@ -1273,23 +1518,19 @@ msgid "Show" msgstr "顯示" -#: /home/saber/Develop/fcitx/data/config.desc:86 +#: /home/saber/Develop/fcitx/data/config.desc:170 msgid "Show Input Speed" msgstr "顯示輸入速度" -#: /home/saber/Develop/fcitx/data/config.desc:76 +#: /home/saber/Develop/fcitx/data/config.desc:165 msgid "Show Input Window After Trigger Input Mode" msgstr "切換輸入模式時顯示輸入視窗" -#: /home/saber/Develop/fcitx/data/config.desc:81 -msgid "Show Point After Index" -msgstr "序號後顯示一點" - #: /home/saber/Develop/fcitx/data/profile.desc:29 msgid "Show Preedit String in Client Window" msgstr "在用戶端視窗中顯示預編輯字串" -#: /home/saber/Develop/fcitx/data/config.desc:91 +#: /home/saber/Develop/fcitx/data/config.desc:175 msgid "Show Version" msgstr "顯示版本" @@ -1297,7 +1538,8 @@ msgid "Shuang Pin Schema" msgstr "預設雙拼方案" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:126 +#: /home/saber/Develop/fcitx/build/po/tmp/shuangpin.conf.in.h:1 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/pinyin/py.c:127 msgid "Shuangpin" msgstr "雙拼" @@ -1305,11 +1547,11 @@ msgid "Simple Pinyin support for Fcitx" msgstr "Fcitx 簡單的拼音支援" -#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-chttrans.conf.in.h:2 +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-chttrans.conf.in.h:1 msgid "Simplified Chinese To Traditional Chinese" msgstr "繁簡轉換" -#: unknown /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/skin.c:853 +#: unknown /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/skin.c:924 msgid "Skin" msgstr "皮膚" @@ -1354,20 +1596,24 @@ msgid "SkinTrayIcon" msgstr "" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:221 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:236 msgid "Space Line Color" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:340 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/quickphrase/QuickPhrase.c:342 #, c-format msgid "Space for %s Enter for %s" msgstr "" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:112 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:58 +msgid "Special" +msgstr "" + +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:127 msgid "Special Icon position" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:239 +#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:247 #, c-format msgid "Start XIM error. Another XIM daemon named %s is running?" msgstr "啟動 XIM 錯誤。是否有另一個名為 %s 的 XIM 守護程式正在執行?" @@ -1380,11 +1626,31 @@ msgid "Successfully Installed skin" msgstr "" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:96 unknown +#: /home/saber/Develop/fcitx/data/config.desc:99 +msgid "Switch Embeded Preedit" +msgstr "切換嵌入預編輯字串" + +#: /home/saber/Develop/fcitx/data/config.desc:74 +msgid "Switch Full Width Punc Mode" +msgstr "切換全形標點符號" + +#: /home/saber/Develop/fcitx/data/config.desc:69 +msgid "Switching Full Width Character Mode" +msgstr "切換全形字元模式" + +#: /home/saber/Develop/fcitx/data/config.desc:64 +msgid "Switching Remind Mode" +msgstr "切換聯想模式" + +#: /home/saber/Develop/fcitx/data/config.desc:59 +msgid "Switching Virtual Keyboard" +msgstr "切換虛擬鍵盤" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:111 unknown msgid "Symbol" msgstr "符號" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:101 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:116 msgid "Symbol File" msgstr "符號檔案" @@ -1396,7 +1662,7 @@ msgid "Table Code Color" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:159 +#: /home/saber/Develop/fcitx/build/po/../..//src/im/table/table.c:162 #, c-format msgid "Table Config %s is %s" msgstr "" @@ -1405,22 +1671,55 @@ msgid "Table Input Method for Fcitx" msgstr "Fcitx 的碼表輸入法" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:61 +#, fuzzy +msgid "Table Symbol" +msgstr "符號" + #: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:28 msgid "Tip Message Color" msgstr "" +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:142 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/punc/punc.c:486 +#, fuzzy +msgid "Toggle Full Width Punctuation" +msgstr "全形標點符號" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:117 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/fullwidthchar/fullwidthchar.c:182 +#, fuzzy +msgid "Toggle Half/Full width Character" +msgstr "使用全形字元" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:161 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:322 +#, fuzzy +msgid "Toggle Remind" +msgstr "聯想" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:129 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:160 +msgid "Toggle Simp/Trad Chinese Conversion" +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:158 +#, fuzzy +msgid "Toggle Virtual Keyboard" +msgstr "虛擬鍵盤" + #: /home/saber/Develop/fcitx/src/module/chttrans/fcitx-chttrans.desc:17 msgid "Toggle for enable or disable" msgstr "啟用停用切換鍵" +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:9 +msgid "Toggle the word hint" +msgstr "" + #: /home/saber/Develop/fcitx/build/po/../..//src/module/autoeng/AutoEng.c:263 msgid "Too long item for AutoEng" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/chttrans/chttrans.c:127 -msgid "Traditional Chinese Translate" -msgstr "繁簡轉換" - #: /home/saber/Develop/fcitx/src/module/chttrans/fcitx-chttrans.desc:6 msgid "Traditional Chinese Translate Engine" msgstr "繁簡轉換引擎" @@ -1429,6 +1728,11 @@ msgid "TraditionalChinese" msgstr "正體中文" +#: /home/saber/Develop/fcitx/data/config.desc:4 +#, fuzzy +msgid "Trigger Input Method" +msgstr "切換輸入法" + #: /home/saber/Develop/fcitx/src/module/quickphrase/fcitx-quickphrase.desc:7 msgid "Trigger Key for QuickPhrase" msgstr "快速字詞觸發鍵" @@ -1437,7 +1741,7 @@ msgid "Type" msgstr "類型" -#: /home/saber/Develop/fcitx/data/config.desc:37 +#: /home/saber/Develop/fcitx/data/config.desc:126 msgid "Type half width Punc After a Number" msgstr "數字後跟半形標點符號" @@ -1445,18 +1749,19 @@ msgid "UI" msgstr "介面" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ui.c:216 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ui.c:202 msgid "UI: bad ui" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ui.c:203 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ui.c:189 #, c-format msgid "UI: open %s fail %s" msgstr "使用者界面:開啟 %s 失敗 %s" -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:435 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:445 -#: /home/saber/Develop/fcitx/build/po/../..//src/ui/kimpanel/kimpanel.c:781 +#: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/classicui.c:491 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-utils/utils.c:471 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-utils/utils.c:487 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-utils/utils.c:502 msgid "Unable to create process" msgstr "無法建立行程" @@ -1473,19 +1778,28 @@ msgid "Unknown type, take it as string: %s" msgstr "" -#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:17 +#: /home/saber/Develop/fcitx/src/im/pinyin/fcitx-pinyin.desc:22 msgid "Use Complete Pinyin" msgstr "" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:121 +#: /home/saber/Develop/fcitx/src/im/table/table.desc:136 msgid "Use Custom Prompt String defined in table" msgstr "使用碼表中自訂的提示文字" +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:112 +msgid "Use Custom text icon color" +msgstr "" + #: /home/saber/Develop/fcitx/data/profile.desc:2 msgid "Use Full Width Character" msgstr "使用全形字元" -#: /home/saber/Develop/fcitx/src/im/table/table.desc:58 +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-keyboard.conf.in.h:2 +#, fuzzy +msgid "Use Keyboard Layout as Input Method" +msgstr "鍵盤配置" + +#: /home/saber/Develop/fcitx/src/im/table/table.desc:68 msgid "Use Matching Key" msgstr "使用模糊鍵" @@ -1505,9 +1819,19 @@ msgid "Use Wide Punctuation" msgstr "使用全形標點符號" -#: /home/saber/Develop/fcitx/data/config.desc:32 -msgid "Use first input method as inactive state" -msgstr "使用第一個輸入法作為非作用狀態" +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:24 +msgid "Use enter to commit the existing string" +msgstr "" + +#: /home/saber/Develop/fcitx/src/im/keyboard/fcitx-keyboard.desc:29 +msgid "Use presage to predict if possible." +msgstr "" + +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:160 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:321 +#, fuzzy +msgid "Use remind" +msgstr "聯想" #: /home/saber/Develop/fcitx/build/po/tmp/fcitx-remote-module.conf.in.h:2 msgid "Used by fcitx-remote to change Fcitx state from console" @@ -1533,16 +1857,15 @@ msgid "Virtual Key Board in order to input special character" msgstr "用於輸入特殊字元的虛擬鍵盤" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:148 -#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:169 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:179 msgid "Virtual Keyboard" msgstr "虛擬鍵盤" -#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:241 +#: /home/saber/Develop/fcitx/src/ui/classic/skin.desc:256 msgid "Virtual Keyboard Image" msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:148 +#: /home/saber/Develop/fcitx/build/po/../..//src/module/vk/vk.c:158 msgid "Virtual Keyboard State" msgstr "虛擬鍵盤狀態" @@ -1558,6 +1881,19 @@ msgid "WubiPinyin" msgstr "五筆拼音" +#, fuzzy +msgid "X Keyboard" +msgstr "虛擬鍵盤" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-xkb.conf.in.h:1 +#, fuzzy +msgid "X Keyboard Integration" +msgstr "虛擬鍵盤" + +#: /home/saber/Develop/fcitx/build/po/tmp/fcitx-xkbdbus.conf.in.h:1 +msgid "X Keyboard Integration export with DBus" +msgstr "" + #: /home/saber/Develop/fcitx/build/po/../..//src/ui/classic/tray.c:164 #, c-format msgid "X error %i on opcode send" @@ -1571,11 +1907,11 @@ msgid "X11 Utilitiy used by other Addon" msgstr "給其他附加元件使用的 X11 工具" -#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:135 +#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:140 msgid "X11 not initialized" msgstr "X11 無法初始化" -#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:157 +#: /home/saber/Develop/fcitx/build/po/../..//src/frontend/xim/xim.c:164 msgid "XMODIFIERS Error." msgstr "XMODIFIERS 錯誤。" @@ -1583,10 +1919,6 @@ msgid "Xim" msgstr "Xim" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:184 -msgid "You can use tools provided by your distribution." -msgstr "您可以使用發行版提供的工具。" - #: unknown msgid "Zhongwenzhixing" msgstr "中文之星" @@ -1599,11 +1931,11 @@ msgid "Ziranma" msgstr "自然碼" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1230 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/ime.c:1436 msgid "min Num of Characters: " msgstr "分 字元數:" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1157 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx-config/fcitx-config.c:1138 #, c-format msgid "no default option for %s/%s" msgstr "" @@ -1612,7 +1944,7 @@ msgid "no valid font." msgstr "" -#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:313 +#: /home/saber/Develop/fcitx/build/po/../..//src/lib/fcitx/instance.c:297 msgid "pthread mutex init failed" msgstr "" @@ -1620,3 +1952,59 @@ #, c-format msgid "your current font is: %s" msgstr "" + +#~ msgid "About Fcitx" +#~ msgstr "關於 Fcitx" + +#~ msgid "Close" +#~ msgstr "關閉" + +#~ msgid "Full Width Character" +#~ msgstr "全形字元" + +#~ msgid "Hotkey of Going Next Page" +#~ msgstr "快捷鍵:下一頁" + +#~ msgid "Hotkey of Going Prev Page" +#~ msgstr "快捷鍵:前一頁" + +#~ msgid "" +#~ "If you use login manager like gdm or kdm, put those lines in your ~/." +#~ "xprofile." +#~ msgstr "" +#~ "如果您使用登錄管理器,比如 gdm 或 kdm,請將這幾行加入到 ~/.xprofile 中。" + +#~ msgid "If you use ~/.xinitrc and startx, put those lines in ~/.xinitrc." +#~ msgstr "如果您使用 ~/.xinitrc 和 startx,請將這幾行加入到 ~/.xinitrc 中。" + +#~ msgid "It's the first time Fcitx Start." +#~ msgstr "這是 Fcitx 第一次啟動。" + +#~ msgid "Or (Depends on you install im module or not)" +#~ msgstr "或者(取決於您是否安裝了im module)" + +#~ msgid "" +#~ "Or You may need to set environment varibles below to make fcitx work " +#~ "correctly." +#~ msgstr "或者您需要設定以下環境變數讓 Fcitx 正常運作。" + +#~ msgid "Please check your environment varibles." +#~ msgstr "請檢查您的環境變數設定。" + +#~ msgid "Setting Hint" +#~ msgstr "設定提示" + +#~ msgid "Show Point After Index" +#~ msgstr "序號後顯示一點" + +#~ msgid "Switching Active and Inactive Mode" +#~ msgstr "切換作用/非作用狀態" + +#~ msgid "Traditional Chinese Translate" +#~ msgstr "繁簡轉換" + +#~ msgid "Use first input method as inactive state" +#~ msgstr "使用第一個輸入法作為非作用狀態" + +#~ msgid "You can use tools provided by your distribution." +#~ msgstr "您可以使用發行版提供的工具。" diff -Nru fcitx-4.2.2/skin/classic/CMakeLists.txt fcitx-4.2.4.1/skin/classic/CMakeLists.txt --- fcitx-4.2.2/skin/classic/CMakeLists.txt 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/skin/classic/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -set(FCITX_CLASSIC_SKIN_FILES -chttrans_active.png chttrans_inactive.png -fullwidth_active.png fullwidth_inactive.png -punc_active.png punc_inactive.png - active.png bingchan.png erbi.png fcitx_skin.conf - input.png remind_active.png remind_inactive.png quwei.png vk_active.png vk_inactive.png wubi.png wbpy.png ziranma.png - bar.png cangjie.png cn.png en.png inactive.png logo.png - dianbaoma.png shuangpin.png wanfeng.png pinyin.png prev.png next.png menu.png - kbd.png -) - -install(FILES ${FCITX_CLASSIC_SKIN_FILES} DESTINATION ${pkgdatadir}/skin/classic) \ No newline at end of file Binary files /tmp/j7UmvgVdVH/fcitx-4.2.2/skin/classic/en.png and /tmp/BIUTnCZDlO/fcitx-4.2.4.1/skin/classic/en.png differ diff -Nru fcitx-4.2.2/skin/CMakeLists.txt fcitx-4.2.4.1/skin/CMakeLists.txt --- fcitx-4.2.2/skin/CMakeLists.txt 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/skin/CMakeLists.txt 2012-06-10 14:34:48.000000000 +0000 @@ -1,3 +1,10 @@ -add_subdirectory(default) -add_subdirectory(classic) -add_subdirectory(dark) \ No newline at end of file + +foreach(skin default classic dark) + install(DIRECTORY ${skin} DESTINATION ${pkgdatadir}/skin + PATTERN .* EXCLUDE + PATTERN *~ EXCLUDE) +endforeach(skin default classic dark) + +install(DIRECTORY imicon DESTINATION ${pkgdatadir} + PATTERN .* EXCLUDE + PATTERN *~ EXCLUDE) \ No newline at end of file Binary files /tmp/j7UmvgVdVH/fcitx-4.2.2/skin/dark/active.png and /tmp/BIUTnCZDlO/fcitx-4.2.4.1/skin/dark/active.png differ diff -Nru fcitx-4.2.2/skin/dark/CMakeLists.txt fcitx-4.2.4.1/skin/dark/CMakeLists.txt --- fcitx-4.2.2/skin/dark/CMakeLists.txt 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/skin/dark/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -set(FCITX_DARK_SKIN_FILES -active.png bingchan.png erbi.png fcitx_skin.conf -input.png quwei.png wubi.png wbpy.png ziranma.png -bar.png cangjie.png cn.png en.png inactive.png logo.png -dianbaoma.png shuangpin.png wanfeng.png pinyin.png prev.png next.png menu.png keyboard.png -remind_active.png remind_inactive.png vk_active.png vk_inactive.png -punc_active.png punc_inactive.png fullwidth_active.png fullwidth_inactive.png -chttrans_active.png chttrans_inactive.png -kbd.png -) - -install(FILES ${FCITX_DARK_SKIN_FILES} DESTINATION ${pkgdatadir}/skin/dark) \ No newline at end of file Binary files /tmp/j7UmvgVdVH/fcitx-4.2.2/skin/dark/en.png and /tmp/BIUTnCZDlO/fcitx-4.2.4.1/skin/dark/en.png differ Binary files /tmp/j7UmvgVdVH/fcitx-4.2.2/skin/dark/inactive.png and /tmp/BIUTnCZDlO/fcitx-4.2.4.1/skin/dark/inactive.png differ Binary files /tmp/j7UmvgVdVH/fcitx-4.2.2/skin/dark/input.png and /tmp/BIUTnCZDlO/fcitx-4.2.4.1/skin/dark/input.png differ diff -Nru fcitx-4.2.2/skin/default/CMakeLists.txt fcitx-4.2.4.1/skin/default/CMakeLists.txt --- fcitx-4.2.2/skin/default/CMakeLists.txt 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/skin/default/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -set(FCITX_DEFAULT_SKIN_FILES -chttrans_active.png chttrans_inactive.png -fullwidth_active.png fullwidth_inactive.png -punc_active.png punc_inactive.png -active.png bingchan.png erbi.png fcitx_skin.conf -input.png remind_active.png remind_inactive.png quwei.png vk_active.png vk_inactive.png -wubi.png wbpy.png ziranma.png -bar.png cangjie.png cn.png en.png inactive.png logo.png -dianbaoma.png shuangpin.png wanfeng.png pinyin.png prev.png next.png keyboard.png menu.png -kbd.png -) - -install(FILES ${FCITX_DEFAULT_SKIN_FILES} DESTINATION ${pkgdatadir}/skin/default) \ No newline at end of file Binary files /tmp/j7UmvgVdVH/fcitx-4.2.2/skin/default/en.png and /tmp/BIUTnCZDlO/fcitx-4.2.4.1/skin/default/en.png differ Binary files /tmp/j7UmvgVdVH/fcitx-4.2.2/skin/imicon/cangjie.png and /tmp/BIUTnCZDlO/fcitx-4.2.4.1/skin/imicon/cangjie.png differ Binary files /tmp/j7UmvgVdVH/fcitx-4.2.2/skin/imicon/erbi.png and /tmp/BIUTnCZDlO/fcitx-4.2.4.1/skin/imicon/erbi.png differ Binary files /tmp/j7UmvgVdVH/fcitx-4.2.2/skin/imicon/pinyin.png and /tmp/BIUTnCZDlO/fcitx-4.2.4.1/skin/imicon/pinyin.png differ Binary files /tmp/j7UmvgVdVH/fcitx-4.2.2/skin/imicon/shuangpin.png and /tmp/BIUTnCZDlO/fcitx-4.2.4.1/skin/imicon/shuangpin.png differ Binary files /tmp/j7UmvgVdVH/fcitx-4.2.2/skin/imicon/wbpy.png and /tmp/BIUTnCZDlO/fcitx-4.2.4.1/skin/imicon/wbpy.png differ Binary files /tmp/j7UmvgVdVH/fcitx-4.2.2/skin/imicon/wubi.png and /tmp/BIUTnCZDlO/fcitx-4.2.4.1/skin/imicon/wubi.png differ Binary files /tmp/j7UmvgVdVH/fcitx-4.2.2/skin/imicon/ziranma.png and /tmp/BIUTnCZDlO/fcitx-4.2.4.1/skin/imicon/ziranma.png differ diff -Nru fcitx-4.2.2/src/core/errorhandler.c fcitx-4.2.4.1/src/core/errorhandler.c --- fcitx-4.2.2/src/core/errorhandler.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/core/errorhandler.c 2012-06-10 14:34:48.000000000 +0000 @@ -44,7 +44,12 @@ int signo; for (signo = SIGHUP; signo < SIGUNUSED; signo++) { - if (signo != SIGALRM && signo != SIGPIPE) + if (signo != SIGALRM + && signo != SIGPIPE + && signo != SIGUSR1 + && signo != SIGUSR2 + && signo != SIGWINCH + ) signal(signo, OnException); else signal(signo, SIG_IGN); diff -Nru fcitx-4.2.2/src/core/fcitx.c fcitx-4.2.4.1/src/core/fcitx.c --- fcitx-4.2.2/src/core/fcitx.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/core/fcitx.c 2012-06-10 14:34:48.000000000 +0000 @@ -61,15 +61,6 @@ int main(int argc, char* argv[]) { -#ifdef M_TRIM_THRESHOLD -#ifdef HAVE_UNISTD_H - int pagesize = sysconf(_SC_PAGESIZE); -#else - int pagesize = 4 * 1024; -#endif // HAVE_UNISTD_H - mallopt(M_TRIM_THRESHOLD, 5 * pagesize); -#endif // M_TRIM_THRESHOLD - char* localedir = fcitx_utils_get_fcitx_path("localedir"); setlocale(LC_ALL, ""); bindtextdomain("fcitx", localedir); diff -Nru fcitx-4.2.2/src/frontend/CMakeLists.txt fcitx-4.2.4.1/src/frontend/CMakeLists.txt --- fcitx-4.2.2/src/frontend/CMakeLists.txt 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/CMakeLists.txt 2012-06-10 14:34:48.000000000 +0000 @@ -1,16 +1,17 @@ add_subdirectory(xim) if (_ENABLE_DBUS) - #add_subdirectory(fbterm) add_subdirectory(ipc) if (ENABLE_GTK2_IM_MODULE OR ENABLE_GTK3_IM_MODULE) PKG_CHECK_MODULES(GLIB2 REQUIRED "glib-2.0" ) - PKG_CHECK_MODULES(DBUS_GLIB REQUIRED "dbus-glib-1") + PKG_CHECK_MODULES(GIO2 "gio-2.0 >= 2.26") + if (NOT GIO2_FOUND) + PKG_CHECK_MODULES(DBUS_GLIB REQUIRED "dbus-glib-1") + endif (NOT GIO2_FOUND) _pkgconfig_invoke("glib-2.0" GLIB2 GLIB_GENMARSHAL "" "--variable=glib_genmarshal") - FIND_PROGRAM(GLIB_GENMARSHAL ${GLIB2_GLIB_GENMARSHAL}) endif (ENABLE_GTK2_IM_MODULE OR ENABLE_GTK3_IM_MODULE) @@ -18,4 +19,4 @@ add_subdirectory(gtk2) add_subdirectory(gtk3) add_subdirectory(qt) -endif (_ENABLE_DBUS) \ No newline at end of file +endif (_ENABLE_DBUS) diff -Nru fcitx-4.2.2/src/frontend/gtk2/client.c fcitx-4.2.4.1/src/frontend/gtk2/client.c --- fcitx-4.2.2/src/frontend/gtk2/client.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/gtk2/client.c 2012-06-10 14:34:48.000000000 +0000 @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2010~2011 by CSSlayer * + * Copyright (C) 2010~2012 by CSSlayer * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -179,7 +179,8 @@ g_signal_connect(client->proxy, "destroy", G_CALLBACK(_destroy_cb), client); char* appname = fcitx_utils_get_process_name(); - dbus_g_proxy_begin_call(client->proxy, "CreateICv2", FcitxIMClientCreateICCallback, client, NULL, G_TYPE_STRING, appname, G_TYPE_INVALID); + pid_t curpid = getpid(); + dbus_g_proxy_begin_call(client->proxy, "CreateICv3", FcitxIMClientCreateICCallback, client, NULL, G_TYPE_STRING, appname, G_TYPE_INT, curpid, G_TYPE_INVALID); free(appname); } @@ -240,6 +241,10 @@ dbus_g_object_register_marshaller(fcitx_marshall_VOID__UINT_UINT_INT, G_TYPE_NONE, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_INT, G_TYPE_INVALID); dbus_g_proxy_add_signal(client->icproxy, "ForwardKey", G_TYPE_UINT, G_TYPE_UINT, G_TYPE_INT, G_TYPE_INVALID); + + dbus_g_object_register_marshaller(fcitx_marshall_VOID__INT_UINT, G_TYPE_NONE, G_TYPE_INT, G_TYPE_UINT, G_TYPE_INVALID); + + dbus_g_proxy_add_signal(client->icproxy, "DeleteSurroundingText", G_TYPE_INT, G_TYPE_UINT, G_TYPE_INVALID); client->connectcb(client, client->data); } @@ -299,6 +304,13 @@ } } +void FcitxIMClientSetCursorRect(FcitxIMClient* client, int x, int y, int w, int h) +{ + if (client->icproxy) { + dbus_g_proxy_call_no_reply(client->icproxy, "SetCursorRect", G_TYPE_INT, x, G_TYPE_INT, y, G_TYPE_INT, w, G_TYPE_INT, h, G_TYPE_INVALID); + } +} + void FcitxIMClientProcessKey(FcitxIMClient* client, DBusGProxyCallNotify callback, void* user_data, @@ -349,6 +361,7 @@ GCallback forwardKey, GCallback updatePreedit, GCallback updateFormattedPreedit, + GCallback deleteSurroundingText, void* user_data, GClosureNotify freefunc ) @@ -394,8 +407,27 @@ user_data, freefunc ); + + dbus_g_proxy_connect_signal(imclient->icproxy, + "DeleteSurroundingText", + deleteSurroundingText, + user_data, + freefunc + ); } +void FcitxIMClientSetSurroundingText(FcitxIMClient* client, const gchar* text, guint cursorPos, guint anchorPos) +{ + if (client->icproxy) { + dbus_g_proxy_call_no_reply(client->icproxy, "SetSurroundingText", + G_TYPE_STRING, text, + G_TYPE_UINT, cursorPos, + G_TYPE_UINT, anchorPos, + G_TYPE_INVALID); + } +} + + FcitxHotkey* FcitxIMClientGetTriggerKey(FcitxIMClient* client) { return client->triggerkey; diff -Nru fcitx-4.2.2/src/frontend/gtk2/client.h fcitx-4.2.4.1/src/frontend/gtk2/client.h --- fcitx-4.2.2/src/frontend/gtk2/client.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/gtk2/client.h 2012-06-10 14:34:48.000000000 +0000 @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2010~2011 by CSSlayer * + * Copyright (C) 2010~2012 by CSSlayer * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -42,6 +42,7 @@ void FcitxIMClientFocusIn(FcitxIMClient* client); void FcitxIMClientFocusOut(FcitxIMClient* client); void FcitxIMClientSetCursorLocation(FcitxIMClient* client, int x, int y); + void FcitxIMClientSetCursorRect(FcitxIMClient* client, int x, int y, int w, int h); void FcitxIMClientSetCapacity(FcitxIMClient* client, FcitxCapacityFlags flags); void FcitxIMClientReset(FcitxIMClient* client); void FcitxIMClientProcessKey(FcitxIMClient* client, DBusGProxyCallNotify callback, void* user_data, GDestroyNotify notify, uint32_t keyval, uint32_t keycode, uint32_t state, FcitxKeyEventType type, uint32_t t); @@ -54,10 +55,16 @@ GCallback forwardKey, GCallback updatePreedit, GCallback updateFormattedPreedit, + GCallback deleteSurroundingText, void* user_data, GClosureNotify freefunc ); FcitxHotkey* FcitxIMClientGetTriggerKey(FcitxIMClient* client); + void FcitxIMClientSetSurroundingText(FcitxIMClient* imclient, + const gchar* text, + guint cursorPos, + guint anchorPos + ); #ifdef __cplusplus } diff -Nru fcitx-4.2.2/src/frontend/gtk2/CMakeLists.txt fcitx-4.2.4.1/src/frontend/gtk2/CMakeLists.txt --- fcitx-4.2.2/src/frontend/gtk2/CMakeLists.txt 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/gtk2/CMakeLists.txt 2012-06-10 14:34:48.000000000 +0000 @@ -9,19 +9,30 @@ ) include_directories(${GTK2_INCLUDE_DIRS}) -include_directories(${DBUS_GLIB_INCLUDE_DIRS}) include_directories(${CMAKE_CURRENT_BINARY_DIR}) -link_directories(${GTK2_LIBRARY_DIRS} ${DBUS_GLIB_LIBRARY_DIRS}) +link_directories(${GTK2_LIBRARY_DIRS}) add_custom_command(OUTPUT marshall.c COMMAND ${GLIB_GENMARSHAL} --body --prefix=fcitx_marshall ${PROJECT_SOURCE_DIR}/src/frontend/gtk-common/marshall.list > marshall.c - DEPENDS ${PROJECT_SOURCE_DIR}/src/frontend/gtk-common/marshall.list + DEPENDS ${PROJECT_SOURCE_DIR}/src/frontend/gtk-common/marshall.list ) add_custom_command(OUTPUT marshall.h COMMAND ${GLIB_GENMARSHAL} --header --prefix=fcitx_marshall ${PROJECT_SOURCE_DIR}/src/frontend/gtk-common/marshall.list > marshall.h - DEPENDS ${PROJECT_SOURCE_DIR}/src/frontend/gtk-common/marshall.list + DEPENDS ${PROJECT_SOURCE_DIR}/src/frontend/gtk-common/marshall.list ) +if (GIO2_FOUND) +include_directories(${GIO2_INCLUDE_DIRS}) +link_directories(${GIO2_LIBRARY_DIRS}) + +set(FCITX_GTK2_IM_MODULE_SOURCES + fcitxim.c + fcitximcontext-gio.c +) +else (GIO2_FOUND) +include_directories(${DBUS_GLIB_INCLUDE_DIRS}) +link_directories(${DBUS_GLIB_LIBRARY_DIRS}) + set(FCITX_GTK2_IM_MODULE_SOURCES fcitxim.c fcitximcontext.c @@ -29,10 +40,16 @@ ${CMAKE_CURRENT_BINARY_DIR}/marshall.c ${CMAKE_CURRENT_BINARY_DIR}/marshall.h ) +endif (GIO2_FOUND) add_library(im-fcitx MODULE ${FCITX_GTK2_IM_MODULE_SOURCES}) set_target_properties( im-fcitx PROPERTIES PREFIX "" COMPILE_FLAGS "-fvisibility=hidden" LINK_FLAGS "-Wl,--no-undefined") +target_link_libraries( im-fcitx ${GTK2_LIBRARIES} fcitx-utils) +if (GIO2_FOUND) +target_link_libraries( im-fcitx ${GTK2_LIBRARIES} ${GIO2_LIBRARIES} fcitx-gclient fcitx-utils) +else (GIO2_FOUND) target_link_libraries( im-fcitx ${GTK2_LIBRARIES} ${DBUS_GLIB_LIBRARIES} fcitx-utils) +endif (GIO2_FOUND) install(TARGETS im-fcitx DESTINATION ${GTK2_IM_MODULEDIR}) diff -Nru fcitx-4.2.2/src/frontend/gtk2/fcitxim.c fcitx-4.2.4.1/src/frontend/gtk2/fcitxim.c --- fcitx-4.2.2/src/frontend/gtk2/fcitxim.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/gtk2/fcitxim.c 2012-06-10 14:34:48.000000000 +0000 @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2010~2011 by CSSlayer * + * Copyright (C) 2010~2012 by CSSlayer * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * diff -Nru fcitx-4.2.2/src/frontend/gtk2/fcitximcontext.c fcitx-4.2.4.1/src/frontend/gtk2/fcitximcontext.c --- fcitx-4.2.2/src/frontend/gtk2/fcitximcontext.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/gtk2/fcitximcontext.c 2012-06-10 14:34:48.000000000 +0000 @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2010~2011 by CSSlayer * + * Copyright (C) 2010~2012 by CSSlayer * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -35,7 +35,7 @@ #include "fcitximcontext.h" #include "fcitx-config/fcitx-config.h" #include "client.h" -#include +#include "fcitx-utils/log.h" #include #define LOG_LEVEL DEBUG @@ -90,6 +90,11 @@ GdkRectangle *area); static void fcitx_im_context_set_use_preedit(GtkIMContext *context, gboolean use_preedit); +static void +fcitx_im_context_set_surrounding (GtkIMContext *context, + const gchar *text, + gint len, + gint cursor_index); static void fcitx_im_context_get_preedit_string(GtkIMContext *context, gchar **str, PangoAttrList **attrs, @@ -130,6 +135,11 @@ static void _fcitx_im_context_update_preedit_cb(DBusGProxy* proxy, char* str, int cursor_pos, void* user_data); static void +_fcitx_im_context_delete_surrounding_text_cb (DBusGProxy* proxy, + gint offset_from_cursor, + guint nchars, + void* user_data); +static void _fcitx_im_context_connect_cb(FcitxIMClient* client, void* user_data); static void _fcitx_im_context_destroy_cb(FcitxIMClient* client, void* user_data); @@ -149,6 +159,9 @@ static gboolean _key_is_modifier(guint keyval); +static void +_request_surrounding_text (FcitxIMContext *context); + static gint _key_snooper_cb (GtkWidget *widget, GdkEventKey *event, @@ -200,20 +213,6 @@ #endif }; -static -boolean FcitxIsHotKey(FcitxKeySym sym, int state, FcitxHotkey * hotkey); - -static -boolean FcitxIsHotKey(FcitxKeySym sym, int state, FcitxHotkey * hotkey) -{ - state &= FcitxKeyState_Ctrl_Alt_Shift; - if (hotkey[0].sym && sym == hotkey[0].sym && (hotkey[0].state == state)) - return true; - if (hotkey[1].sym && sym == hotkey[1].sym && (hotkey[1].state == state)) - return true; - return false; -} - void fcitx_im_context_register_type(GTypeModule *type_module) { @@ -281,6 +280,7 @@ im_context_class->focus_out = fcitx_im_context_focus_out; im_context_class->set_cursor_location = fcitx_im_context_set_cursor_location; im_context_class->set_use_preedit = fcitx_im_context_set_use_preedit; + im_context_class->set_surrounding = fcitx_im_context_set_surrounding; gobject_class->finalize = fcitx_im_context_finalize; _signal_commit_id = @@ -352,6 +352,7 @@ context->cursor_pos = 0; context->preedit_string = NULL; context->attrlist = NULL; + context->capacity = CAPACITY_SURROUNDING_TEXT; context->slave = gtk_im_context_simple_new(); gtk_im_context_simple_add_table(GTK_IM_CONTEXT_SIMPLE(context->slave), @@ -478,11 +479,7 @@ return gtk_im_context_filter_keypress(fcitxcontext->slave, event); if (IsFcitxIMClientValid(fcitxcontext->client) && fcitxcontext->has_focus) { - - if (!IsFcitxIMClientEnabled(fcitxcontext->client)) { - if (!FcitxIsHotKey(event->keyval, event->state, FcitxIMClientGetTriggerKey(fcitxcontext->client))) - return gtk_im_context_filter_keypress(fcitxcontext->slave, event); - } + _request_surrounding_text (fcitxcontext); fcitxcontext->time = event->time; @@ -735,6 +732,8 @@ g_object_ref(fcitxcontext), (GDestroyNotify) g_object_unref); + _request_surrounding_text (fcitxcontext); + g_object_add_weak_pointer ((GObject *) context, (gpointer *) &_focus_im_context); _focus_im_context = context; @@ -763,13 +762,13 @@ FcitxIMClientFocusOut(fcitxcontext->client); } - - if (fcitxcontext->preedit_string != NULL) - g_free(fcitxcontext->preedit_string); - fcitxcontext->preedit_string = NULL; fcitxcontext->cursor_pos = 0; - g_signal_emit(fcitxcontext, _signal_preedit_changed_id, 0); - g_signal_emit(fcitxcontext, _signal_preedit_end_id, 0); + if (fcitxcontext->preedit_string != NULL) { + g_free(fcitxcontext->preedit_string); + fcitxcontext->preedit_string = NULL; + g_signal_emit(fcitxcontext, _signal_preedit_changed_id, 0); + g_signal_emit(fcitxcontext, _signal_preedit_end_id, 0); + } gtk_im_context_focus_out(fcitxcontext->slave); @@ -836,7 +835,7 @@ } #endif - FcitxIMClientSetCursorLocation(fcitxcontext->client, area.x, area.y + area.height); + FcitxIMClientSetCursorRect(fcitxcontext->client, area.x, area.y, area.width, area.height); return FALSE; } @@ -854,11 +853,111 @@ gtk_im_context_set_use_preedit(fcitxcontext->slave, use_preedit); } + +static guint +get_selection_anchor_point (FcitxIMContext *fcitxcontext, + guint cursor_pos, + guint surrounding_text_len) +{ + GtkWidget *widget; + if (fcitxcontext->client_window == NULL) { + return cursor_pos; + } + gdk_window_get_user_data (fcitxcontext->client_window, (gpointer *)&widget); + + if (!GTK_IS_TEXT_VIEW (widget)){ + return cursor_pos; + } + + GtkTextView *text_view = GTK_TEXT_VIEW (widget); + GtkTextBuffer *buffer = gtk_text_view_get_buffer (text_view); + + if (!gtk_text_buffer_get_has_selection (buffer)) { + return cursor_pos; + } + + GtkTextIter start_iter, end_iter, cursor_iter; + if (!gtk_text_buffer_get_selection_bounds (buffer, &start_iter, &end_iter)) { + return cursor_pos; + } + + gtk_text_buffer_get_iter_at_mark (buffer, + &cursor_iter, + gtk_text_buffer_get_insert (buffer)); + + guint start_index = gtk_text_iter_get_offset (&start_iter); + guint end_index = gtk_text_iter_get_offset (&end_iter); + guint cursor_index = gtk_text_iter_get_offset (&cursor_iter); + + guint anchor; + + if (start_index == cursor_index) { + anchor = end_index; + } else if (end_index == cursor_index) { + anchor = start_index; + } else { + return cursor_pos; + } + + // Change absolute index to relative position. + guint relative_origin = cursor_index - cursor_pos; + + if (anchor < relative_origin) { + return cursor_pos; + } + anchor -= relative_origin; + + if (anchor > surrounding_text_len) { + return cursor_pos; + } + + return anchor; +} + + +static void +fcitx_im_context_set_surrounding (GtkIMContext *context, + const gchar *text, + gint len, + gint cursor_index) +{ + g_return_if_fail (context != NULL); + g_return_if_fail (FCITX_IS_IM_CONTEXT (context)); + g_return_if_fail (text != NULL); + g_return_if_fail (strlen (text) >= len); + g_return_if_fail (0 <= cursor_index && cursor_index <= len); + + FcitxIMContext *fcitxcontext = FCITX_IM_CONTEXT (context); + + if (IsFcitxIMClientValid(fcitxcontext->client) && !(fcitxcontext->capacity & CAPACITY_PASSWORD)) { + guint cursor_pos; + guint utf8_len; + gchar *p; + + p = g_strndup (text, len); + cursor_pos = g_utf8_strlen (p, cursor_index); + utf8_len = g_utf8_strlen(p, len); + + guint anchor_pos = get_selection_anchor_point (fcitxcontext, + cursor_pos, + utf8_len); + FcitxIMClientSetSurroundingText (fcitxcontext->client, + p, + cursor_pos, + anchor_pos); + g_free (p); + } + gtk_im_context_set_surrounding (fcitxcontext->slave, + text, + len, + cursor_index); +} + void _fcitx_im_context_set_capacity(FcitxIMContext* fcitxcontext, gboolean force) { if (IsFcitxIMClientValid(fcitxcontext->client)) { - FcitxCapacityFlags flags = CAPACITY_NONE; + FcitxCapacityFlags flags = fcitxcontext->capacity & ~(CAPACITY_PREEDIT | CAPACITY_FORMATTED_PREEDIT | CAPACITY_PASSWORD); if (fcitxcontext->use_preedit) flags |= CAPACITY_PREEDIT | CAPACITY_FORMATTED_PREEDIT; @@ -905,7 +1004,7 @@ FcitxLog(LOG_LEVEL, "fcitx_im_context_get_preedit_string"); FcitxIMContext *fcitxcontext = FCITX_IM_CONTEXT(context); - if (IsFcitxIMClientValid(fcitxcontext->client) && IsFcitxIMClientEnabled(fcitxcontext->client)) { + if (IsFcitxIMClientValid(fcitxcontext->client)) { if (str) { if (fcitxcontext->preedit_string) *str = strdup(fcitxcontext->preedit_string); @@ -948,7 +1047,7 @@ _slave_preedit_changed_cb(GtkIMContext *slave, FcitxIMContext *context) { - if (context->client && IsFcitxIMClientEnabled(context->client)) { + if (context->client) { return; } @@ -958,7 +1057,7 @@ _slave_preedit_start_cb(GtkIMContext *slave, FcitxIMContext *context) { - if (context->client && IsFcitxIMClientEnabled(context->client)) { + if (context->client) { return; } @@ -969,7 +1068,7 @@ _slave_preedit_end_cb(GtkIMContext *slave, FcitxIMContext *context) { - if (context->client && IsFcitxIMClientEnabled(context->client)) { + if (context->client) { return; } g_signal_emit(context, _signal_preedit_end_id, 0); @@ -981,7 +1080,7 @@ { gboolean return_value; - if (context->client && IsFcitxIMClientEnabled(context->client)) { + if (context->client) { return FALSE; } g_signal_emit(context, _signal_retrieve_surrounding_id, 0, @@ -997,7 +1096,7 @@ { gboolean return_value; - if (context->client && IsFcitxIMClientEnabled(context->client)) { + if (context->client) { return FALSE; } g_signal_emit(context, _signal_delete_surrounding_id, 0, offset_from_cursor, nchars, &return_value); @@ -1043,6 +1142,17 @@ gdk_event_free((GdkEvent *)event); } +static void +_fcitx_im_context_delete_surrounding_text_cb (DBusGProxy* proxy, + gint offset_from_cursor, + guint nchars, + void* user_data) +{ + FcitxIMContext* context = FCITX_IM_CONTEXT(user_data); + gboolean return_value; + g_signal_emit (context, _signal_delete_surrounding_id, 0, offset_from_cursor, nchars, &return_value); +} + /* Copy from gdk */ static GdkEventKey * _create_gdk_event(FcitxIMContext *fcitxcontext, @@ -1243,6 +1353,7 @@ G_CALLBACK(_fcitx_im_context_forward_key_cb), G_CALLBACK(_fcitx_im_context_update_preedit_cb), G_CALLBACK(_fcitx_im_context_update_formatted_preedit_cb), + G_CALLBACK(_fcitx_im_context_delete_surrounding_text_cb), context, NULL); _fcitx_im_context_set_capacity(context, TRUE); @@ -1255,6 +1366,28 @@ FcitxIMClientSetEnabled(client, false); } +static void +_request_surrounding_text (FcitxIMContext *context) +{ + if (context && + IsFcitxIMClientValid(context->client)) { + gboolean return_value; + FcitxLog(LOG_LEVEL, "requesting surrounding text"); + g_signal_emit (context, _signal_retrieve_surrounding_id, 0, + &return_value); + if (return_value) { + context->capacity |= CAPACITY_SURROUNDING_TEXT; + _fcitx_im_context_set_capacity (context, + FALSE); + } + else { + context->capacity &= ~CAPACITY_SURROUNDING_TEXT; + _fcitx_im_context_set_capacity (context, + FALSE); + } + } +} + static gint _key_snooper_cb (GtkWidget *widget, @@ -1278,10 +1411,8 @@ if (!IsFcitxIMClientValid(fcitxcontext->client)) { break; } - if (!IsFcitxIMClientEnabled(fcitxcontext->client)) { - if (!FcitxIsHotKey(event->keyval, event->state, FcitxIMClientGetTriggerKey(fcitxcontext->client))) - break; - } + + _request_surrounding_text (fcitxcontext); fcitxcontext->time = event->time; if (_use_sync_mode) { diff -Nru fcitx-4.2.2/src/frontend/gtk2/fcitximcontext-gio.c fcitx-4.2.4.1/src/frontend/gtk2/fcitximcontext-gio.c --- fcitx-4.2.2/src/frontend/gtk2/fcitximcontext-gio.c 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/gtk2/fcitximcontext-gio.c 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,1415 @@ +/*************************************************************************** + * Copyright (C) 2010~2012 by CSSlayer * + * * + * This program is free software; you can 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +/** + * @file fcitximcontext.c + * + * This is a gtk im module for fcitx, using DBus as a protocol. + * This is compromise to gtk and firefox, users are being sucked by them + * again and again. + */ + +#include "config.h" + +#include +#include +#include +#include + +#include "fcitx/fcitx.h" +#include "fcitx-utils/log.h" +#include "fcitx/frontend.h" + +#include "fcitximcontext.h" +#include "fcitx-gclient/fcitxclient.h" + +#define LOG_LEVEL DEBUG + +#if !GTK_CHECK_VERSION (2, 91, 0) +# define DEPRECATED_GDK_KEYSYMS 1 +#endif + +#if GTK_CHECK_VERSION (2, 24, 0) +# define NEW_GDK_WINDOW_GET_DISPLAY +#endif + +struct _FcitxIMContext { + GtkIMContext parent; + + GdkWindow *client_window; + GdkRectangle area; + FcitxClient* client; + GtkIMContext* slave; + int has_focus; + guint32 time; + gboolean use_preedit; + gboolean is_inpreedit; + char* preedit_string; + int cursor_pos; + FcitxCapacityFlags capacity; + PangoAttrList* attrlist; +}; + +typedef struct _ProcessKeyStruct { + FcitxIMContext* context; + GdkEventKey* event; +} ProcessKeyStruct; + +struct _FcitxIMContextClass { + GtkIMContextClass parent; + /* klass members */ +}; + +/* functions prototype */ +static void fcitx_im_context_class_init(FcitxIMContextClass *klass); +static void fcitx_im_context_init(FcitxIMContext *im_context); +static void fcitx_im_context_finalize(GObject *obj); +static void fcitx_im_context_set_client_window(GtkIMContext *context, + GdkWindow *client_window); +static gboolean fcitx_im_context_filter_keypress(GtkIMContext *context, + GdkEventKey *key); +static void fcitx_im_context_reset(GtkIMContext *context); +static void fcitx_im_context_focus_in(GtkIMContext *context); +static void fcitx_im_context_focus_out(GtkIMContext *context); +static void fcitx_im_context_set_cursor_location(GtkIMContext *context, + GdkRectangle *area); +static void fcitx_im_context_set_use_preedit(GtkIMContext *context, + gboolean use_preedit); +static void +fcitx_im_context_set_surrounding (GtkIMContext *context, + const gchar *text, + gint len, + gint cursor_index); +static void fcitx_im_context_get_preedit_string(GtkIMContext *context, + gchar **str, + PangoAttrList **attrs, + gint *cursor_pos); + + +static gboolean +_set_cursor_location_internal(FcitxIMContext *fcitxcontext); +static void +_slave_commit_cb(GtkIMContext *slave, + gchar *string, + FcitxIMContext *context); +static void +_slave_preedit_changed_cb(GtkIMContext *slave, + FcitxIMContext *context); +static void +_slave_preedit_start_cb(GtkIMContext *slave, + FcitxIMContext *context); +static void +_slave_preedit_end_cb(GtkIMContext *slave, + FcitxIMContext *context); +static gboolean +_slave_retrieve_surrounding_cb(GtkIMContext *slave, + FcitxIMContext *context); +static gboolean +_slave_delete_surrounding_cb(GtkIMContext *slave, + gint offset_from_cursor, + guint nchars, + FcitxIMContext *context); +static void +_fcitx_im_context_enable_im_cb(FcitxClient* client, void* user_data); +static void +_fcitx_im_context_close_im_cb(FcitxClient* client, void* user_data); +static void +_fcitx_im_context_commit_string_cb(FcitxClient* client, char* str, void* user_data); +static void +_fcitx_im_context_forward_key_cb(FcitxClient* client, guint keyval, guint state, gint type, void* user_data); +static void +_fcitx_im_context_delete_surrounding_text_cb (FcitxClient* client, gint offset_from_cursor, guint nchars, void* user_data); +static void +_fcitx_im_context_connect_cb(FcitxClient* client, void* user_data); +static void +_fcitx_im_context_update_formatted_preedit_cb(FcitxClient* im, GPtrArray* array, int cursor_pos, void* user_data); +static void +_fcitx_im_context_process_key_cb(GObject* source_object, GAsyncResult* res, gpointer user_data); +static void +_fcitx_im_context_set_capacity(FcitxIMContext* fcitxcontext, gboolean force); + +static GdkEventKey * +_create_gdk_event(FcitxIMContext *fcitxcontext, + guint keyval, + guint state, + FcitxKeyEventType type + ); + + +static gboolean +_key_is_modifier(guint keyval); + +static void +_request_surrounding_text (FcitxIMContext *context); + +static gint +_key_snooper_cb (GtkWidget *widget, + GdkEventKey *event, + gpointer user_data); + +static gboolean +_get_boolean_env(const gchar *name, + gboolean defval); + +static GType _fcitx_type_im_context = 0; + +static guint _signal_commit_id = 0; +static guint _signal_preedit_changed_id = 0; +static guint _signal_preedit_start_id = 0; +static guint _signal_preedit_end_id = 0; +static guint _signal_delete_surrounding_id = 0; +static guint _signal_retrieve_surrounding_id = 0; +static gboolean _use_sync_mode = 0; + +static GtkIMContext *_focus_im_context = NULL; +static const gchar *_no_snooper_apps = NO_SNOOPER_APPS; +static gboolean _use_key_snooper = _ENABLE_SNOOPER; +static guint _key_snooper_id = 0; + +/* Copied from gtk+2.0-2.20.1/modules/input/imcedilla.c to fix crosbug.com/11421. +* Overwrite the original Gtk+'s compose table in gtk+-2.x.y/gtk/gtkimcontextsimple.c. */ + +/* The difference between this and the default input method is the handling +* of C+acute - this method produces C WITH CEDILLA rather than C WITH ACUTE. +* For languages that use CCedilla and not acute, this is the preferred mapping, +* and is particularly important for pt_BR, where the us-intl keyboard is +* used extensively. +*/ +static guint16 cedilla_compose_seqs[] = { +#ifdef DEPRECATED_GDK_KEYSYMS + GDK_dead_acute, GDK_C, 0, 0, 0, 0x00C7, /* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */ + GDK_dead_acute, GDK_c, 0, 0, 0, 0x00E7, /* LATIN_SMALL_LETTER_C_WITH_CEDILLA */ + GDK_Multi_key, GDK_apostrophe, GDK_C, 0, 0, 0x00C7, /* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */ + GDK_Multi_key, GDK_apostrophe, GDK_c, 0, 0, 0x00E7, /* LATIN_SMALL_LETTER_C_WITH_CEDILLA */ + GDK_Multi_key, GDK_C, GDK_apostrophe, 0, 0, 0x00C7, /* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */ + GDK_Multi_key, GDK_c, GDK_apostrophe, 0, 0, 0x00E7, /* LATIN_SMALL_LETTER_C_WITH_CEDILLA */ +#else + GDK_KEY_dead_acute, GDK_KEY_C, 0, 0, 0, 0x00C7, /* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */ + GDK_KEY_dead_acute, GDK_KEY_c, 0, 0, 0, 0x00E7, /* LATIN_SMALL_LETTER_C_WITH_CEDILLA */ + GDK_KEY_Multi_key, GDK_KEY_apostrophe, GDK_KEY_C, 0, 0, 0x00C7, /* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */ + GDK_KEY_Multi_key, GDK_KEY_apostrophe, GDK_KEY_c, 0, 0, 0x00E7, /* LATIN_SMALL_LETTER_C_WITH_CEDILLA */ + GDK_KEY_Multi_key, GDK_KEY_C, GDK_KEY_apostrophe, 0, 0, 0x00C7, /* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */ + GDK_KEY_Multi_key, GDK_KEY_c, GDK_KEY_apostrophe, 0, 0, 0x00E7, /* LATIN_SMALL_LETTER_C_WITH_CEDILLA */ +#endif +}; + +void +fcitx_im_context_register_type(GTypeModule *type_module) +{ + static const GTypeInfo fcitx_im_context_info = { + sizeof(FcitxIMContextClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) fcitx_im_context_class_init, + (GClassFinalizeFunc) NULL, + NULL, /* klass data */ + sizeof(FcitxIMContext), + 0, + (GInstanceInitFunc) fcitx_im_context_init, + 0 + }; + + if (!_fcitx_type_im_context) { + if (type_module) { + _fcitx_type_im_context = + g_type_module_register_type(type_module, + GTK_TYPE_IM_CONTEXT, + "FcitxIMContext", + &fcitx_im_context_info, + (GTypeFlags)0); + } else { + _fcitx_type_im_context = + g_type_register_static(GTK_TYPE_IM_CONTEXT, + "FcitxIMContext", + &fcitx_im_context_info, + (GTypeFlags)0); + } + } +} + +GType +fcitx_im_context_get_type(void) +{ + if (_fcitx_type_im_context == 0) { + fcitx_im_context_register_type(NULL); + } + + g_assert(_fcitx_type_im_context != 0); + return _fcitx_type_im_context; +} + +FcitxIMContext * +fcitx_im_context_new(void) +{ + GObject *obj = g_object_new(FCITX_TYPE_IM_CONTEXT, NULL); + return FCITX_IM_CONTEXT(obj); +} + +/// +static void +fcitx_im_context_class_init(FcitxIMContextClass *klass) +{ + GtkIMContextClass *im_context_class = GTK_IM_CONTEXT_CLASS(klass); + GObjectClass *gobject_class = G_OBJECT_CLASS(klass); + + im_context_class->set_client_window = fcitx_im_context_set_client_window; + im_context_class->filter_keypress = fcitx_im_context_filter_keypress; + im_context_class->reset = fcitx_im_context_reset; + im_context_class->get_preedit_string = fcitx_im_context_get_preedit_string; + im_context_class->focus_in = fcitx_im_context_focus_in; + im_context_class->focus_out = fcitx_im_context_focus_out; + im_context_class->set_cursor_location = fcitx_im_context_set_cursor_location; + im_context_class->set_use_preedit = fcitx_im_context_set_use_preedit; + im_context_class->set_surrounding = fcitx_im_context_set_surrounding; + gobject_class->finalize = fcitx_im_context_finalize; + + _signal_commit_id = + g_signal_lookup("commit", G_TYPE_FROM_CLASS(klass)); + g_assert(_signal_commit_id != 0); + + _signal_preedit_changed_id = + g_signal_lookup("preedit-changed", G_TYPE_FROM_CLASS(klass)); + g_assert(_signal_preedit_changed_id != 0); + + _signal_preedit_start_id = + g_signal_lookup("preedit-start", G_TYPE_FROM_CLASS(klass)); + g_assert(_signal_preedit_start_id != 0); + + _signal_preedit_end_id = + g_signal_lookup("preedit-end", G_TYPE_FROM_CLASS(klass)); + g_assert(_signal_preedit_end_id != 0); + + _signal_delete_surrounding_id = + g_signal_lookup("delete-surrounding", G_TYPE_FROM_CLASS(klass)); + g_assert(_signal_delete_surrounding_id != 0); + + _signal_retrieve_surrounding_id = + g_signal_lookup("retrieve-surrounding", G_TYPE_FROM_CLASS(klass)); + g_assert(_signal_retrieve_surrounding_id != 0); + + _use_key_snooper = !_get_boolean_env ("IBUS_DISABLE_SNOOPER", !(_ENABLE_SNOOPER)) + && !_get_boolean_env("FCITX_DISABLE_SNOOPER", !(_ENABLE_SNOOPER)); + /* env IBUS_DISABLE_SNOOPER does not exist */ + if (_use_key_snooper) { + /* disable snooper if app is in _no_snooper_apps */ + const gchar * prgname = g_get_prgname (); + if (g_getenv ("IBUS_NO_SNOOPER_APPS")) { + _no_snooper_apps = g_getenv ("IBUS_NO_SNOOPER_APPS"); + } + if (g_getenv ("FCITX_NO_SNOOPER_APPS")) { + _no_snooper_apps = g_getenv ("FCITX_NO_SNOOPER_APPS"); + } + gchar **p; + gchar ** apps = g_strsplit (_no_snooper_apps, ",", 0); + for (p = apps; *p != NULL; p++) { + if (g_regex_match_simple (*p, prgname, 0, 0)) { + _use_key_snooper = FALSE; + break; + } + } + g_strfreev (apps); + } + + /* make ibus fix benefits us */ + _use_sync_mode = _get_boolean_env("IBUS_ENABLE_SYNC_MODE", FALSE) + || _get_boolean_env("FCITX_ENABLE_SYNC_MODE", FALSE); + /* always install snooper */ + if (_key_snooper_id == 0) + _key_snooper_id = gtk_key_snooper_install (_key_snooper_cb, NULL); +} + + +static void +fcitx_im_context_init(FcitxIMContext *context) +{ + FcitxLog(LOG_LEVEL, "fcitx_im_context_init"); + context->client = NULL; + context->area.x = -1; + context->area.y = -1; + context->area.width = 0; + context->area.height = 0; + context->use_preedit = TRUE; + context->cursor_pos = 0; + context->preedit_string = NULL; + context->attrlist = NULL; + context->capacity = CAPACITY_SURROUNDING_TEXT; + + context->slave = gtk_im_context_simple_new(); + gtk_im_context_simple_add_table(GTK_IM_CONTEXT_SIMPLE(context->slave), + cedilla_compose_seqs, + 4, + G_N_ELEMENTS(cedilla_compose_seqs) / (4 + 2)); + + g_signal_connect(context->slave, + "commit", + G_CALLBACK(_slave_commit_cb), + context); + g_signal_connect(context->slave, + "preedit-start", + G_CALLBACK(_slave_preedit_start_cb), + context); + g_signal_connect(context->slave, + "preedit-end", + G_CALLBACK(_slave_preedit_end_cb), + context); + g_signal_connect(context->slave, + "preedit-changed", + G_CALLBACK(_slave_preedit_changed_cb), + context); + g_signal_connect(context->slave, + "retrieve-surrounding", + G_CALLBACK(_slave_retrieve_surrounding_cb), + context); + g_signal_connect(context->slave, + "delete-surrounding", + G_CALLBACK(_slave_delete_surrounding_cb), + context); + + context->time = GDK_CURRENT_TIME; + + context->client = fcitx_client_new(); + g_signal_connect(context->client, "connected", G_CALLBACK(_fcitx_im_context_connect_cb), context); + g_signal_connect(context->client, "enable-im", G_CALLBACK(_fcitx_im_context_enable_im_cb), context); + g_signal_connect(context->client, "close-im", G_CALLBACK(_fcitx_im_context_close_im_cb), context); + g_signal_connect(context->client, "forward-key", G_CALLBACK(_fcitx_im_context_forward_key_cb), context); + g_signal_connect(context->client, "commit-string", G_CALLBACK(_fcitx_im_context_commit_string_cb), context); + g_signal_connect(context->client, "delete-surrounding-text", G_CALLBACK(_fcitx_im_context_delete_surrounding_text_cb), context); + g_signal_connect(context->client, "update-formatted-preedit", G_CALLBACK(_fcitx_im_context_update_formatted_preedit_cb), context); +} + +static void +fcitx_im_context_finalize(GObject *obj) +{ + FcitxLog(LOG_LEVEL, "fcitx_im_context_finalize"); + FcitxIMContext *context = FCITX_IM_CONTEXT(obj); + + g_object_unref(context->client); + context->client = NULL; + + if (context->slave) { + g_object_unref(context->slave); + context->slave = NULL; + } + + if (context->preedit_string) + g_free(context->preedit_string); + context->preedit_string = NULL; + + if (context->attrlist) + pango_attr_list_unref(context->attrlist); + context->attrlist = NULL; + + if (_key_snooper_id != 0) { + gtk_key_snooper_remove (_key_snooper_id); + _key_snooper_id = 0; + } +} + + +static void +set_ic_client_window(FcitxIMContext *context, + GdkWindow *client_window) +{ + if (!client_window) + return; + + if (context->client_window) { + g_object_unref(context->client_window); + context->client_window = NULL; + } + + if (client_window != NULL) + context->client_window = g_object_ref(client_window); + + if (context->slave) + gtk_im_context_set_client_window(context->slave, client_window); +} + + +/// +static void +fcitx_im_context_set_client_window(GtkIMContext *context, + GdkWindow *client_window) +{ + FcitxLog(LOG_LEVEL, "fcitx_im_context_set_client_window"); + FcitxIMContext *fcitxcontext = FCITX_IM_CONTEXT(context); + set_ic_client_window(fcitxcontext, client_window); +} + +/// +static gboolean +fcitx_im_context_filter_keypress(GtkIMContext *context, + GdkEventKey *event) +{ + FcitxLog(LOG_LEVEL, "fcitx_im_context_filter_keypress"); + FcitxIMContext *fcitxcontext = FCITX_IM_CONTEXT(context); + + /* check this first, since we use key snooper, most key will be handled. */ + if (fcitx_client_is_valid(fcitxcontext->client) ) { + /* XXX it is a workaround for some applications do not set client window. */ + if (fcitxcontext->client_window == NULL && event->window != NULL) { + gtk_im_context_set_client_window((GtkIMContext *)fcitxcontext, event->window); + + /* set_cursor_location_internal() will get origin from X server, + * it blocks UI. So delay it to idle callback. */ + g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, + (GSourceFunc) _set_cursor_location_internal, + g_object_ref(fcitxcontext), + (GDestroyNotify) g_object_unref); + } + } + + if (G_UNLIKELY(event->state & FcitxKeyState_HandledMask)) + return TRUE; + + if (G_UNLIKELY(event->state & FcitxKeyState_IgnoredMask)) + return gtk_im_context_filter_keypress(fcitxcontext->slave, event); + + if (fcitx_client_is_valid(fcitxcontext->client) && fcitxcontext->has_focus) { + _request_surrounding_text (fcitxcontext); + + fcitxcontext->time = event->time; + + if (_use_sync_mode) { + int ret = fcitx_client_process_key_sync(fcitxcontext->client, + event->keyval, + event->hardware_keycode, + event->state, + (event->type == GDK_KEY_PRESS) ? (FCITX_PRESS_KEY) : (FCITX_RELEASE_KEY), + event->time); + if (ret <= 0) { + event->state |= FcitxKeyState_IgnoredMask; + return gtk_im_context_filter_keypress(fcitxcontext->slave, event); + } else { + event->state |= FcitxKeyState_HandledMask; + return TRUE; + } + } else { + ProcessKeyStruct* pks = g_malloc0(sizeof(ProcessKeyStruct)); + pks->context = fcitxcontext; + pks->event = (GdkEventKey *) gdk_event_copy((GdkEvent *) event); + + fcitx_client_process_key(fcitxcontext->client, + _fcitx_im_context_process_key_cb, + pks, + event->keyval, + event->hardware_keycode, + event->state, + (event->type == GDK_KEY_PRESS) ? (FCITX_PRESS_KEY) : (FCITX_RELEASE_KEY), + event->time); + event->state |= FcitxKeyState_HandledMask; + return TRUE; + } + } else { + return gtk_im_context_filter_keypress(fcitxcontext->slave, event); + } + return FALSE; +} + +static void +_fcitx_im_context_process_key_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + ProcessKeyStruct* pks = user_data; + GdkEventKey* event = pks->event; + GError* error = NULL; + int ret = -1; + GVariant* result = g_dbus_proxy_call_finish(G_DBUS_PROXY(source_object), res, &error); + if (error) { + g_error_free(error); + } + else if (result) { + g_variant_get(result, "(i)", &ret); + } + if (ret <= 0) { + event->state |= FcitxKeyState_IgnoredMask; + gdk_event_put((GdkEvent *)event); + } + gdk_event_free((GdkEvent *)event); + g_free(pks); +} + +static void +_fcitx_im_context_update_formatted_preedit_cb(FcitxClient* im, GPtrArray* array, int cursor_pos, void* user_data) +{ + FcitxLog(LOG_LEVEL, "_fcitx_im_context_commit_string_cb"); + FcitxIMContext* context = FCITX_IM_CONTEXT(user_data); + + gboolean visible = false; + + if (context->preedit_string != NULL) { + if (strlen(context->preedit_string) != 0) + visible = true; + g_free(context->preedit_string); + context->preedit_string = NULL; + } + + if (context->attrlist != NULL) { + pango_attr_list_unref(context->attrlist); + } + + context->attrlist = pango_attr_list_new(); + + GString* gstr = g_string_new(NULL); + + int i = 0; + for (i = 0; i < array->len; i++) { + size_t bytelen = strlen(gstr->str); + FcitxPreeditItem* preedit = g_ptr_array_index(array, i); + const gchar* s = preedit->string; + gint type = preedit->type; + + PangoAttribute *pango_attr = NULL; + if ((type & MSG_NOUNDERLINE) == 0) { + pango_attr = pango_attr_underline_new(PANGO_UNDERLINE_SINGLE); + pango_attr->start_index = bytelen; + pango_attr->end_index = bytelen + strlen(s); + pango_attr_list_insert(context->attrlist, pango_attr); + } + + if (type & MSG_HIGHLIGHT) { + gboolean hasColor; + GdkColor fg; + GdkColor bg; + + if (context->client_window) { + GtkWidget *widget; + gdk_window_get_user_data (context->client_window, + (gpointer *)&widget); + if (GTK_IS_WIDGET(widget)) { + hasColor = true; + GtkStyle* style = gtk_widget_get_style(widget); + fg = style->text[GTK_STATE_SELECTED]; + bg = style->bg[GTK_STATE_SELECTED]; + } + } + + if (!hasColor) { + fg.red = 0xffff; + fg.green = 0xffff; + fg.blue = 0xffff; + bg.red = 0x43ff; + bg.green = 0xacff; + bg.blue = 0xe8ff; + } + + pango_attr = pango_attr_foreground_new(fg.red, fg.green, fg.blue); + pango_attr->start_index = bytelen; + pango_attr->end_index = bytelen + strlen(s); + pango_attr_list_insert(context->attrlist, pango_attr); + pango_attr = pango_attr_background_new(bg.red, bg.green, bg.blue); + pango_attr->start_index = bytelen; + pango_attr->end_index = bytelen + strlen(s); + pango_attr_list_insert(context->attrlist, pango_attr); + } + gstr = g_string_append(gstr, s); + } + + gchar* str = g_string_free(gstr, FALSE); + + context->preedit_string = g_strdup(str); + char* tempstr = g_strndup(str, cursor_pos); + context->cursor_pos = fcitx_utf8_strlen(tempstr); + g_free(tempstr); + + gboolean new_visible = false; + + if (context->preedit_string != NULL) { + if (strlen(context->preedit_string) != 0) + new_visible = true; + } + gboolean flag = new_visible != visible; + + if (new_visible) { + if (flag) { + /* invisible => visible */ + g_signal_emit(context, _signal_preedit_start_id, 0); + } + g_signal_emit(context, _signal_preedit_changed_id, 0); + } else { + if (flag) { + /* visible => invisible */ + g_signal_emit(context, _signal_preedit_changed_id, 0); + g_signal_emit(context, _signal_preedit_end_id, 0); + } else { + /* still invisible */ + /* do nothing */ + } + } + + g_signal_emit(context, _signal_preedit_changed_id, 0); +} + +/// +static void +fcitx_im_context_focus_in(GtkIMContext *context) +{ + FcitxLog(LOG_LEVEL, "fcitx_im_context_focus_in"); + FcitxIMContext *fcitxcontext = FCITX_IM_CONTEXT(context); + + if (fcitxcontext->has_focus) + return; + + _fcitx_im_context_set_capacity(fcitxcontext, FALSE); + + fcitxcontext->has_focus = true; + + if (_focus_im_context != NULL) { + g_assert (_focus_im_context != context); + gtk_im_context_focus_out (_focus_im_context); + g_assert (_focus_im_context == NULL); + } + + if (fcitx_client_is_valid(fcitxcontext->client)) { + fcitx_client_focus_in(fcitxcontext->client); + } + + gtk_im_context_focus_in(fcitxcontext->slave); + + /* set_cursor_location_internal() will get origin from X server, + * it blocks UI. So delay it to idle callback. */ + g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, + (GSourceFunc) _set_cursor_location_internal, + g_object_ref(fcitxcontext), + (GDestroyNotify) g_object_unref); + + _request_surrounding_text (fcitxcontext); + + g_object_add_weak_pointer ((GObject *) context, + (gpointer *) &_focus_im_context); + _focus_im_context = context; + + return; +} + +static void +fcitx_im_context_focus_out(GtkIMContext *context) +{ + FcitxLog(LOG_LEVEL, "fcitx_im_context_focus_out"); + FcitxIMContext *fcitxcontext = FCITX_IM_CONTEXT(context); + + if (!fcitxcontext->has_focus) { + return; + } + + g_assert (context == _focus_im_context); + g_object_remove_weak_pointer ((GObject *) context, + (gpointer *) &_focus_im_context); + _focus_im_context = NULL; + + fcitxcontext->has_focus = false; + + if (fcitx_client_is_valid(fcitxcontext->client)) { + fcitx_client_focus_out(fcitxcontext->client); + } + + fcitxcontext->cursor_pos = 0; + if (fcitxcontext->preedit_string != NULL) { + g_free(fcitxcontext->preedit_string); + fcitxcontext->preedit_string = NULL; + g_signal_emit(fcitxcontext, _signal_preedit_changed_id, 0); + g_signal_emit(fcitxcontext, _signal_preedit_end_id, 0); + } + + gtk_im_context_focus_out(fcitxcontext->slave); + + return; +} + +/// +static void +fcitx_im_context_set_cursor_location(GtkIMContext *context, + GdkRectangle *area) +{ + FcitxLog(LOG_LEVEL, "fcitx_im_context_set_cursor_location %d %d %d %d", area->x, area->y, area->height, area->width); + FcitxIMContext *fcitxcontext = FCITX_IM_CONTEXT(context); + + if (fcitxcontext->area.x == area->x && + fcitxcontext->area.y == area->y && + fcitxcontext->area.width == area->width && + fcitxcontext->area.height == area->height) { + return; + } + fcitxcontext->area = *area; + + if (fcitx_client_is_valid(fcitxcontext->client)) { + _set_cursor_location_internal(fcitxcontext); + } + gtk_im_context_set_cursor_location(fcitxcontext->slave, area); + + return; +} + +static gboolean +_set_cursor_location_internal(FcitxIMContext *fcitxcontext) +{ + GdkRectangle area; + + if (fcitxcontext->client_window == NULL || + !fcitx_client_is_valid(fcitxcontext->client)) { + return FALSE; + } + + area = fcitxcontext->area; + if (area.x == -1 && area.y == -1 && area.width == 0 && area.height == 0) { +#if GTK_CHECK_VERSION (2, 91, 0) + area.x = 0; + area.y += gdk_window_get_height(fcitxcontext->client_window); +#else + gint w, h; + gdk_drawable_get_size(fcitxcontext->client_window, &w, &h); + area.y += h; + area.x = 0; +#endif + } + +#if GTK_CHECK_VERSION (2, 18, 0) + gdk_window_get_root_coords(fcitxcontext->client_window, + area.x, area.y, + &area.x, &area.y); +#else + { + int rootx, rooty; + gdk_window_get_origin(fcitxcontext->client_window, &rootx, &rooty); + area.x = rootx + area.x; + area.y = rooty + area.y; + } +#endif + + fcitx_client_set_cusor_rect(fcitxcontext->client, area.x, area.y, area.width, area.height); + return FALSE; +} + +/// +static void +fcitx_im_context_set_use_preedit(GtkIMContext *context, + gboolean use_preedit) +{ + FcitxLog(LOG_LEVEL, "fcitx_im_context_set_use_preedit"); + FcitxIMContext *fcitxcontext = FCITX_IM_CONTEXT(context); + + fcitxcontext->use_preedit = use_preedit; + _fcitx_im_context_set_capacity(fcitxcontext, FALSE); + + gtk_im_context_set_use_preedit(fcitxcontext->slave, use_preedit); +} + + +static guint +get_selection_anchor_point (FcitxIMContext *fcitxcontext, + guint cursor_pos, + guint surrounding_text_len) +{ + GtkWidget *widget; + if (fcitxcontext->client_window == NULL) { + return cursor_pos; + } + gdk_window_get_user_data (fcitxcontext->client_window, (gpointer *)&widget); + + if (!GTK_IS_TEXT_VIEW (widget)) { + return cursor_pos; + } + + GtkTextView *text_view = GTK_TEXT_VIEW (widget); + GtkTextBuffer *buffer = gtk_text_view_get_buffer (text_view); + + if (!gtk_text_buffer_get_has_selection (buffer)) { + return cursor_pos; + } + + GtkTextIter start_iter, end_iter, cursor_iter; + if (!gtk_text_buffer_get_selection_bounds (buffer, &start_iter, &end_iter)) { + return cursor_pos; + } + + gtk_text_buffer_get_iter_at_mark (buffer, + &cursor_iter, + gtk_text_buffer_get_insert (buffer)); + + guint start_index = gtk_text_iter_get_offset (&start_iter); + guint end_index = gtk_text_iter_get_offset (&end_iter); + guint cursor_index = gtk_text_iter_get_offset (&cursor_iter); + + guint anchor; + + if (start_index == cursor_index) { + anchor = end_index; + } else if (end_index == cursor_index) { + anchor = start_index; + } else { + return cursor_pos; + } + + // Change absolute index to relative position. + guint relative_origin = cursor_index - cursor_pos; + + if (anchor < relative_origin) { + return cursor_pos; + } + anchor -= relative_origin; + + if (anchor > surrounding_text_len) { + return cursor_pos; + } + + return anchor; +} + + +static void +fcitx_im_context_set_surrounding (GtkIMContext *context, + const gchar *text, + gint len, + gint cursor_index) +{ + g_return_if_fail (context != NULL); + g_return_if_fail (FCITX_IS_IM_CONTEXT (context)); + g_return_if_fail (text != NULL); + g_return_if_fail (strlen (text) >= len); + g_return_if_fail (0 <= cursor_index && cursor_index <= len); + + FcitxIMContext *fcitxcontext = FCITX_IM_CONTEXT (context); + + if (fcitx_client_is_valid(fcitxcontext->client) && !(fcitxcontext->capacity & CAPACITY_PASSWORD)) { + guint cursor_pos; + guint utf8_len; + gchar *p; + + p = g_strndup (text, len); + cursor_pos = g_utf8_strlen (p, cursor_index); + utf8_len = g_utf8_strlen(p, len); + + guint anchor_pos = get_selection_anchor_point (fcitxcontext, + cursor_pos, + utf8_len); + fcitx_client_set_surrounding_text (fcitxcontext->client, + p, + cursor_pos, + anchor_pos); + g_free (p); + } + gtk_im_context_set_surrounding (fcitxcontext->slave, + text, + len, + cursor_index); +} + +void +_fcitx_im_context_set_capacity(FcitxIMContext* fcitxcontext, gboolean force) +{ + if (fcitx_client_is_valid(fcitxcontext->client)) { + FcitxCapacityFlags flags = fcitxcontext->capacity & ~(CAPACITY_PREEDIT | CAPACITY_FORMATTED_PREEDIT | CAPACITY_PASSWORD); + if (fcitxcontext->use_preedit) + flags |= CAPACITY_PREEDIT | CAPACITY_FORMATTED_PREEDIT; + + if (fcitxcontext->client_window != NULL) { + GtkWidget *widget; + gdk_window_get_user_data (fcitxcontext->client_window, + (gpointer *)&widget); + if (GTK_IS_ENTRY (widget) && + !gtk_entry_get_visibility (GTK_ENTRY (widget))) { + flags |= CAPACITY_PASSWORD; + } + } + + gboolean update = FALSE; + if (G_UNLIKELY(fcitxcontext->capacity != flags)) { + fcitxcontext->capacity = flags; + update = TRUE; + } + if (G_UNLIKELY(update || force)) + fcitx_client_set_capacity(fcitxcontext->client, fcitxcontext->capacity); + } +} + +/// +static void +fcitx_im_context_reset(GtkIMContext *context) +{ + FcitxLog(LOG_LEVEL, "fcitx_im_context_reset"); + FcitxIMContext *fcitxcontext = FCITX_IM_CONTEXT(context); + + if (fcitx_client_is_valid(fcitxcontext->client)) { + fcitx_client_reset(fcitxcontext->client); + } + + gtk_im_context_reset(fcitxcontext->slave); +} + +static void +fcitx_im_context_get_preedit_string(GtkIMContext *context, + gchar **str, + PangoAttrList **attrs, + gint *cursor_pos) +{ + FcitxLog(LOG_LEVEL, "fcitx_im_context_get_preedit_string"); + FcitxIMContext *fcitxcontext = FCITX_IM_CONTEXT(context); + + if (fcitx_client_is_valid(fcitxcontext->client)) { + if (str) { + if (fcitxcontext->preedit_string) + *str = strdup(fcitxcontext->preedit_string); + else + *str = strdup(""); + } + if (attrs) { + if (fcitxcontext->attrlist == NULL) { + *attrs = pango_attr_list_new(); + + if (str) { + PangoAttribute *pango_attr; + pango_attr = pango_attr_underline_new(PANGO_UNDERLINE_SINGLE); + pango_attr->start_index = 0; + pango_attr->end_index = strlen(*str); + pango_attr_list_insert(*attrs, pango_attr); + } + } + else { + *attrs = pango_attr_list_ref (fcitxcontext->attrlist); + } + } + if (cursor_pos) + *cursor_pos = fcitxcontext->cursor_pos; + + } else + gtk_im_context_get_preedit_string(fcitxcontext->slave, str, attrs, cursor_pos); + return ; +} + +/* Callback functions for slave context */ +static void +_slave_commit_cb(GtkIMContext *slave, + gchar *string, + FcitxIMContext *context) +{ + g_signal_emit(context, _signal_commit_id, 0, string); +} +static void +_slave_preedit_changed_cb(GtkIMContext *slave, + FcitxIMContext *context) +{ + if (context->client) { + return; + } + + g_signal_emit(context, _signal_preedit_changed_id, 0); +} +static void +_slave_preedit_start_cb(GtkIMContext *slave, + FcitxIMContext *context) +{ + if (context->client) { + return; + } + + g_signal_emit(context, _signal_preedit_start_id, 0); +} + +static void +_slave_preedit_end_cb(GtkIMContext *slave, + FcitxIMContext *context) +{ + if (context->client) { + return; + } + g_signal_emit(context, _signal_preedit_end_id, 0); +} + +static gboolean +_slave_retrieve_surrounding_cb(GtkIMContext *slave, + FcitxIMContext *context) +{ + gboolean return_value; + + if (context->client) { + return FALSE; + } + g_signal_emit(context, _signal_retrieve_surrounding_id, 0, + &return_value); + return return_value; +} + +static gboolean +_slave_delete_surrounding_cb(GtkIMContext *slave, + gint offset_from_cursor, + guint nchars, + FcitxIMContext *context) +{ + gboolean return_value; + + if (context->client) { + return FALSE; + } + g_signal_emit(context, _signal_delete_surrounding_id, 0, offset_from_cursor, nchars, &return_value); + return return_value; +} + +void _fcitx_im_context_enable_im_cb(FcitxClient* im, void* user_data) +{ +} + +void _fcitx_im_context_close_im_cb(FcitxClient* im, void* user_data) +{ + FcitxLog(LOG_LEVEL, "_fcitx_im_context_close_im_cb"); + FcitxIMContext* context = FCITX_IM_CONTEXT(user_data); + + if (context->preedit_string != NULL) + g_free(context->preedit_string); + context->preedit_string = NULL; + context->cursor_pos = 0; + g_signal_emit(context, _signal_preedit_changed_id, 0); + g_signal_emit(context, _signal_preedit_end_id, 0); +} + +void _fcitx_im_context_commit_string_cb(FcitxClient* im, char* str, void* user_data) +{ + FcitxLog(LOG_LEVEL, "_fcitx_im_context_commit_string_cb"); + FcitxIMContext* context = FCITX_IM_CONTEXT(user_data); + g_signal_emit(context, _signal_commit_id, 0, str); +} + +void _fcitx_im_context_forward_key_cb(FcitxClient* im, guint keyval, guint state, gint type, void* user_data) +{ + FcitxLog(LOG_LEVEL, "_fcitx_im_context_forward_key_cb"); + FcitxIMContext* context = FCITX_IM_CONTEXT(user_data); + FcitxKeyEventType tp = (FcitxKeyEventType) type; + GdkEventKey* event = _create_gdk_event(context, keyval, state, tp); + event->state |= FcitxKeyState_IgnoredMask; + gdk_event_put((GdkEvent *)event); + gdk_event_free((GdkEvent *)event); +} + +static void +_fcitx_im_context_delete_surrounding_text_cb (FcitxClient* im, + gint offset_from_cursor, + guint nchars, + void* user_data) +{ + FcitxIMContext* context = FCITX_IM_CONTEXT(user_data); + gboolean return_value; + g_signal_emit (context, _signal_delete_surrounding_id, 0, offset_from_cursor, nchars, &return_value); +} + +/* Copy from gdk */ +static GdkEventKey * +_create_gdk_event(FcitxIMContext *fcitxcontext, + guint keyval, + guint state, + FcitxKeyEventType type + ) +{ + gunichar c = 0; + gchar buf[8]; + + GdkEventKey *event = (GdkEventKey *)gdk_event_new((type == FCITX_RELEASE_KEY) ? GDK_KEY_RELEASE : GDK_KEY_PRESS); + + if (fcitxcontext && fcitxcontext->client_window) + event->window = g_object_ref(fcitxcontext->client_window); + + /* The time is copied the latest value from the previous + * GdkKeyEvent in filter_keypress(). + * + * We understand the best way would be to pass the all time value + * to Fcitx functions process_key_event() and Fcitx DBus functions + * ProcessKeyEvent() in IM clients and IM engines so that the + * _create_gdk_event() could get the correct time values. + * However it would causes to change many functions and the time value + * would not provide the useful meanings for each Fcitx engines but just + * pass the original value to ForwardKeyEvent(). + * We use the saved value at the moment. + * + * Another idea might be to have the time implementation in X servers + * but some Xorg uses clock_gettime() and others use gettimeofday() + * and the values would be different in each implementation and + * locale/remote X server. So probably that idea would not work. */ + if (fcitxcontext) { + event->time = fcitxcontext->time; + } else { + event->time = GDK_CURRENT_TIME; + } + + event->send_event = FALSE; + event->state = state; + event->keyval = keyval; + event->string = NULL; + event->length = 0; + event->hardware_keycode = 0; + if (event->window) { +#ifndef NEW_GDK_WINDOW_GET_DISPLAY + GdkDisplay *display = gdk_display_get_default(); +#else + GdkDisplay *display = gdk_window_get_display(event->window); +#endif + GdkKeymap *keymap = gdk_keymap_get_for_display(display); + GdkKeymapKey *keys; + gint n_keys = 0; + + if (gdk_keymap_get_entries_for_keyval(keymap, keyval, &keys, &n_keys)) { + if (n_keys) + event->hardware_keycode = keys[0].keycode; + g_free(keys); + } + } + + event->group = 0; + event->is_modifier = _key_is_modifier(keyval); + +#ifdef DEPRECATED_GDK_KEYSYMS + if (keyval != GDK_VoidSymbol) +#else + if (keyval != GDK_KEY_VoidSymbol) +#endif + c = gdk_keyval_to_unicode(keyval); + + if (c) { + gsize bytes_written; + gint len; + + /* Apply the control key - Taken from Xlib + */ + if (event->state & GDK_CONTROL_MASK) { + if ((c >= '@' && c < '\177') || c == ' ') c &= 0x1F; + else if (c == '2') { + event->string = g_memdup("\0\0", 2); + event->length = 1; + buf[0] = '\0'; + goto out; + } else if (c >= '3' && c <= '7') c -= ('3' - '\033'); + else if (c == '8') c = '\177'; + else if (c == '/') c = '_' & 0x1F; + } + + len = g_unichar_to_utf8(c, buf); + buf[len] = '\0'; + + event->string = g_locale_from_utf8(buf, len, + NULL, &bytes_written, + NULL); + if (event->string) + event->length = bytes_written; +#ifdef DEPRECATED_GDK_KEYSYMS + } else if (keyval == GDK_Escape) { +#else + } else if (keyval == GDK_KEY_Escape) { +#endif + event->length = 1; + event->string = g_strdup("\033"); + } +#ifdef DEPRECATED_GDK_KEYSYMS + else if (keyval == GDK_Return || + keyval == GDK_KP_Enter) { +#else + else if (keyval == GDK_KEY_Return || + keyval == GDK_KEY_KP_Enter) { +#endif + event->length = 1; + event->string = g_strdup("\r"); + } + + if (!event->string) { + event->length = 0; + event->string = g_strdup(""); + } +out: + return event; +} + + +static gboolean +_key_is_modifier(guint keyval) +{ + /* See gdkkeys-x11.c:_gdk_keymap_key_is_modifier() for how this + * really should be implemented */ + + switch (keyval) { +#ifdef DEPRECATED_GDK_KEYSYMS + case GDK_Shift_L: + case GDK_Shift_R: + case GDK_Control_L: + case GDK_Control_R: + case GDK_Caps_Lock: + case GDK_Shift_Lock: + case GDK_Meta_L: + case GDK_Meta_R: + case GDK_Alt_L: + case GDK_Alt_R: + case GDK_Super_L: + case GDK_Super_R: + case GDK_Hyper_L: + case GDK_Hyper_R: + case GDK_ISO_Lock: + case GDK_ISO_Level2_Latch: + case GDK_ISO_Level3_Shift: + case GDK_ISO_Level3_Latch: + case GDK_ISO_Level3_Lock: + case GDK_ISO_Group_Shift: + case GDK_ISO_Group_Latch: + case GDK_ISO_Group_Lock: + return TRUE; +#else + case GDK_KEY_Shift_L: + case GDK_KEY_Shift_R: + case GDK_KEY_Control_L: + case GDK_KEY_Control_R: + case GDK_KEY_Caps_Lock: + case GDK_KEY_Shift_Lock: + case GDK_KEY_Meta_L: + case GDK_KEY_Meta_R: + case GDK_KEY_Alt_L: + case GDK_KEY_Alt_R: + case GDK_KEY_Super_L: + case GDK_KEY_Super_R: + case GDK_KEY_Hyper_L: + case GDK_KEY_Hyper_R: + case GDK_KEY_ISO_Lock: + case GDK_KEY_ISO_Level2_Latch: + case GDK_KEY_ISO_Level3_Shift: + case GDK_KEY_ISO_Level3_Latch: + case GDK_KEY_ISO_Level3_Lock: + case GDK_KEY_ISO_Level5_Shift: + case GDK_KEY_ISO_Level5_Latch: + case GDK_KEY_ISO_Level5_Lock: + case GDK_KEY_ISO_Group_Shift: + case GDK_KEY_ISO_Group_Latch: + case GDK_KEY_ISO_Group_Lock: + return TRUE; +#endif + default: + return FALSE; + } +} + +void _fcitx_im_context_connect_cb(FcitxClient* im, void* user_data) +{ + FcitxIMContext* context = FCITX_IM_CONTEXT(user_data); + _fcitx_im_context_set_capacity(context, TRUE); + +} + + +static void +_request_surrounding_text (FcitxIMContext *context) +{ + if (context && + fcitx_client_is_valid(context->client)) { + gboolean return_value; + FcitxLog(LOG_LEVEL, "requesting surrounding text"); + g_signal_emit (context, _signal_retrieve_surrounding_id, 0, + &return_value); + if (return_value) { + context->capacity |= CAPACITY_SURROUNDING_TEXT; + _fcitx_im_context_set_capacity (context, + FALSE); + } + else { + context->capacity &= ~CAPACITY_SURROUNDING_TEXT; + _fcitx_im_context_set_capacity (context, + FALSE); + } + } +} + + +static gint +_key_snooper_cb (GtkWidget *widget, + GdkEventKey *event, + gpointer user_data) +{ + gboolean retval = FALSE; + + FcitxIMContext *fcitxcontext = (FcitxIMContext *) _focus_im_context; + + if (fcitxcontext == NULL || !fcitxcontext->has_focus) + return FALSE; + + if (G_UNLIKELY (event->state & FcitxKeyState_HandledMask)) + return TRUE; + + if (G_UNLIKELY (event->state & FcitxKeyState_IgnoredMask)) + return FALSE; + + do { + if (!fcitx_client_is_valid(fcitxcontext->client)) { + break; + } + + _request_surrounding_text (fcitxcontext); + fcitxcontext->time = event->time; + + if (_use_sync_mode) { + + int ret = fcitx_client_process_key_sync(fcitxcontext->client, + event->keyval, + event->hardware_keycode, + event->state, + (event->type == GDK_KEY_PRESS) ? (FCITX_PRESS_KEY) : (FCITX_RELEASE_KEY), + event->time); + if (ret <= 0) + retval = FALSE; + else + retval = TRUE; + } else { + ProcessKeyStruct* pks = g_malloc0(sizeof(ProcessKeyStruct)); + pks->context = fcitxcontext; + pks->event = (GdkEventKey *) gdk_event_copy((GdkEvent *) event); + + fcitx_client_process_key(fcitxcontext->client, + _fcitx_im_context_process_key_cb, + pks, + event->keyval, + event->hardware_keycode, + event->state, + (event->type == GDK_KEY_PRESS) ? (FCITX_PRESS_KEY) : (FCITX_RELEASE_KEY), + event->time); + retval = TRUE; + } + } while(0); + + if (!retval) { + event->state |= FcitxKeyState_IgnoredMask; + return FALSE; + } else { + event->state |= FcitxKeyState_HandledMask; + return TRUE; + } + + return retval; +} + +static gboolean +_get_boolean_env(const gchar *name, + gboolean defval) +{ + const char *value = getenv(name); + + if (value == NULL) + return defval; + + if (strcmp(value, "") == 0 || + strcmp(value, "0") == 0 || + strcmp(value, "false") == 0 || + strcmp(value, "False") == 0 || + strcmp(value, "FALSE") == 0) + return FALSE; + + return TRUE; +} + +// kate: indent-mode cstyle; replace-tabs on; diff -Nru fcitx-4.2.2/src/frontend/gtk2/fcitximcontext-gio.h fcitx-4.2.4.1/src/frontend/gtk2/fcitximcontext-gio.h --- fcitx-4.2.2/src/frontend/gtk2/fcitximcontext-gio.h 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/gtk2/fcitximcontext-gio.h 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,52 @@ +/*************************************************************************** + * Copyright (C) 2010~2012 by CSSlayer * + * * + * This program is free software; you can 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#ifndef __FCITX_IM_CONTEXT_H_ +#define __FCITX_IM_CONTEXT_H_ + +#include + +/* +* Type macros. +*/ +#define FCITX_TYPE_IM_CONTEXT \ + (fcitx_im_context_get_type ()) +#define FCITX_IM_CONTEXT(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), FCITX_TYPE_IM_CONTEXT, FcitxIMContext)) +#define FCITX_IM_CONTEXT_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), FCITX_TYPE_IM_CONTEXT, FcitxIMContextClass)) +#define FCITX_IS_IM_CONTEXT(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FCITX_TYPE_IM_CONTEXT)) +#define FCITX_IS_IM_CONTEXT_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), FCITX_TYPE_IM_CONTEXT)) +#define FCITX_IM_CONTEXT_GET_CLASS(obj) \ + (G_TYPE_CHECK_GET_CLASS ((obj), FCITX_TYPE_IM_CONTEXT, FcitxIMContextClass)) + +G_BEGIN_DECLS +typedef struct _FcitxIMContext FcitxIMContext; +typedef struct _FcitxIMContextClass FcitxIMContextClass; + +GType fcitx_im_context_get_type(void); +FcitxIMContext +*fcitx_im_context_new(void); +void fcitx_im_context_register_type +(GTypeModule *type_module); +G_END_DECLS +#endif +// kate: indent-mode cstyle; space-indent on; indent-width 0; diff -Nru fcitx-4.2.2/src/frontend/gtk2/fcitximcontext.h fcitx-4.2.4.1/src/frontend/gtk2/fcitximcontext.h --- fcitx-4.2.2/src/frontend/gtk2/fcitximcontext.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/gtk2/fcitximcontext.h 2012-06-10 14:34:48.000000000 +0000 @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2010~2011 by CSSlayer * + * Copyright (C) 2010~2012 by CSSlayer * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * diff -Nru fcitx-4.2.2/src/frontend/gtk3/CMakeLists.txt fcitx-4.2.4.1/src/frontend/gtk3/CMakeLists.txt --- fcitx-4.2.2/src/frontend/gtk3/CMakeLists.txt 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/gtk3/CMakeLists.txt 2012-06-10 14:34:48.000000000 +0000 @@ -9,17 +9,28 @@ ) include_directories(${GTK3_INCLUDE_DIRS}) -include_directories(${DBUS_GLIB_INCLUDE_DIRS}) include_directories(${CMAKE_CURRENT_BINARY_DIR}) -link_directories(${GTK3_LIBRARY_DIRS} ${DBUS_GLIB_LIBRARY_DIRS}) +link_directories(${GTK3_LIBRARY_DIRS}) + +if (GIO2_FOUND) +include_directories(${GIO2_INCLUDE_DIRS}) +link_directories(${GIO2_LIBRARY_DIRS}) + +set(FCITX_GTK3_IM_MODULE_SOURCES + ../gtk2/fcitxim.c + ../gtk2/fcitximcontext-gio.c +) +else (GIO2_FOUND) +include_directories(${DBUS_GLIB_INCLUDE_DIRS}) +link_directories(${DBUS_GLIB_LIBRARY_DIRS}) add_custom_command(OUTPUT marshall.c COMMAND ${GLIB_GENMARSHAL} --body --prefix=fcitx_marshall ${PROJECT_SOURCE_DIR}/src/frontend/gtk-common/marshall.list > marshall.c - DEPENDS ${PROJECT_SOURCE_DIR}/src/frontend/gtk-common/marshall.list + DEPENDS ${PROJECT_SOURCE_DIR}/src/frontend/gtk-common/marshall.list ) add_custom_command(OUTPUT marshall.h COMMAND ${GLIB_GENMARSHAL} --header --prefix=fcitx_marshall ${PROJECT_SOURCE_DIR}/src/frontend/gtk-common/marshall.list > marshall.h - DEPENDS ${PROJECT_SOURCE_DIR}/src/frontend/gtk-common/marshall.list + DEPENDS ${PROJECT_SOURCE_DIR}/src/frontend/gtk-common/marshall.list ) set(FCITX_GTK3_IM_MODULE_SOURCES @@ -30,10 +41,16 @@ ${CMAKE_CURRENT_BINARY_DIR}/marshall.h ) +endif (GIO2_FOUND) + add_library(im-fcitx-gtk3 MODULE ${FCITX_GTK3_IM_MODULE_SOURCES}) set_target_properties( im-fcitx-gtk3 PROPERTIES PREFIX "" COMPILE_FLAGS "-fvisibility=hidden" OUTPUT_NAME "im-fcitx" LINK_FLAGS "-Wl,--no-undefined") +if (GIO2_FOUND) +target_link_libraries( im-fcitx-gtk3 ${GTK3_LIBRARIES} ${GIO2_LIBRARIES} fcitx-gclient fcitx-utils) +else (GIO2_FOUND) target_link_libraries( im-fcitx-gtk3 ${GTK3_LIBRARIES} ${DBUS_GLIB_LIBRARIES} fcitx-utils) +endif (GIO2_FOUND) install(TARGETS im-fcitx-gtk3 DESTINATION ${GTK3_IM_MODULEDIR}) diff -Nru fcitx-4.2.2/src/frontend/gtk-common/marshall.list fcitx-4.2.4.1/src/frontend/gtk-common/marshall.list --- fcitx-4.2.2/src/frontend/gtk-common/marshall.list 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/gtk-common/marshall.list 2012-06-10 14:34:48.000000000 +0000 @@ -2,3 +2,4 @@ VOID:STRING,STRING,STRING VOID:STRING,INT VOID:BOXED,INT +VOID:INT,UINT diff -Nru fcitx-4.2.2/src/frontend/ipc/fcitx-ipc.conf.in fcitx-4.2.4.1/src/frontend/ipc/fcitx-ipc.conf.in --- fcitx-4.2.2/src/frontend/ipc/fcitx-ipc.conf.in 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/ipc/fcitx-ipc.conf.in 2012-06-10 14:34:48.000000000 +0000 @@ -1,9 +1,10 @@ [Addon] Name=fcitx-ipc -_GeneralName=Fcitx DBus Frontend +_GeneralName=Fcitx DBus Frontend _Comment=Frontend Used by IM Modules Category=Frontend Enabled=True Library=fcitx-ipc.so Type=SharedLibrary -Dependency=fcitx-dbus \ No newline at end of file +Dependency=fcitx-dbus +Advance=True diff -Nru fcitx-4.2.2/src/frontend/ipc/ipc.c fcitx-4.2.4.1/src/frontend/ipc/ipc.c --- fcitx-4.2.2/src/frontend/ipc/ipc.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/ipc/ipc.c 2012-06-10 14:34:48.000000000 +0000 @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2010~2011 by CSSlayer * + * Copyright (C) 2010~2012 by CSSlayer * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -37,6 +37,12 @@ int id; char path[32]; char* appname; + int width; + int height; + pid_t pid; + char* surroundingText; + unsigned int anchor; + unsigned int cursor; } FcitxIPCIC; typedef struct _FcitxIPCFrontend { @@ -69,20 +75,24 @@ static void IPCCommitString(void* arg, FcitxInputContext* ic, const char* str); static void IPCForwardKey(void* arg, FcitxInputContext* ic, FcitxKeyEventType event, FcitxKeySym sym, unsigned int state); static void IPCSetWindowOffset(void* arg, FcitxInputContext* ic, int x, int y); -static void IPCGetWindowPosition(void* arg, FcitxInputContext* ic, int* x, int* y); +static void IPCGetWindowRect(void* arg, FcitxInputContext* ic, int* x, int* y, int* w, int* h); static void IPCUpdatePreedit(void* arg, FcitxInputContext* ic); +static void IPCDeleteSurroundingText(void* arg, FcitxInputContext* ic, int offset, unsigned int size); +static boolean IPCGetSurroundingText(void* arg, FcitxInputContext* ic, char** str, unsigned int* cursor, unsigned int* anchor); static void IPCUpdateClientSideUI(void* arg, FcitxInputContext* ic); static DBusHandlerResult IPCDBusEventHandler(DBusConnection *connection, DBusMessage *message, void *user_data); static DBusHandlerResult IPCICDBusEventHandler(DBusConnection *connection, DBusMessage *msg, void *user_data); static void IPCICFocusIn(FcitxIPCFrontend* ipc, FcitxInputContext* ic); static void IPCICFocusOut(FcitxIPCFrontend* ipc, FcitxInputContext* ic); static void IPCICReset(FcitxIPCFrontend* ipc, FcitxInputContext* ic); -static void IPCICSetCursorLocation(FcitxIPCFrontend* ipc, FcitxInputContext* ic, int x, int y); +static void IPCICCommitPreedit(FcitxIPCFrontend* ipc, FcitxInputContext* ic); +static void IPCICSetCursorRect(FcitxIPCFrontend* ipc, FcitxInputContext* ic, int x, int y, int w, int h); static int IPCProcessKey(FcitxIPCFrontend* ipc, FcitxInputContext* callic, const uint32_t originsym, const uint32_t keycode, const uint32_t originstate, uint32_t t, FcitxKeyEventType type); static boolean IPCCheckICFromSameApplication(void* arg, FcitxInputContext* icToCheck, FcitxInputContext* ic); static void IPCGetPropertyIMList(void* arg, DBusMessageIter* iter); static void IPCSetPropertyIMList(void* arg, DBusMessageIter* iter); static void IPCUpdateIMList(void* arg); +static pid_t IPCGetPid(void* arg, FcitxInputContext* ic); static void FcitxDBusPropertyGet(FcitxIPCFrontend* ipc, DBusMessage* message); static void FcitxDBusPropertySet(FcitxIPCFrontend* ipc, DBusMessage* message); @@ -132,7 +142,17 @@ " \n" " \n" " \n" - " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" " \n" " \n" " \n" @@ -142,6 +162,25 @@ " \n" " \n" " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" " \n" " " " \n" @@ -168,13 +207,29 @@ " \n" " \n" " \n" + " \n" + " \n" + " \n" + " \n" + " \n" " \n" " \n" " \n" " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" " \n" " \n" " \n" + " \n" + " \n" + " \n" + " \n" + " \n" " \n" " \n" " \n" @@ -196,6 +251,10 @@ " \n" " \n" " \n" + " \n" + " \n" + " \n" + " \n" " \n" " \n" " \n" @@ -228,12 +287,14 @@ IPCCommitString, IPCForwardKey, IPCSetWindowOffset, - IPCGetWindowPosition, + IPCGetWindowRect, IPCUpdatePreedit, IPCUpdateClientSideUI, NULL, IPCCheckICFromSameApplication, - NULL + IPCGetPid, + IPCDeleteSurroundingText, + IPCGetSurroundingText }; FCITX_EXPORT_API @@ -335,6 +396,36 @@ DBUS_TYPE_UINT32, &arg3, DBUS_TYPE_UINT32, &arg4, DBUS_TYPE_INVALID); + } else if (dbus_message_is_method_call(message, FCITX_IM_DBUS_INTERFACE, "CreateICv3")) { + + DBusError error; + dbus_error_init(&error); + char* appname; + int icpid; + if (!dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &appname, DBUS_TYPE_INT32, &icpid, DBUS_TYPE_INVALID)) + ipcic->appname = NULL; + else { + if (strlen(appname) == 0) + ipcic->appname = NULL; + else + ipcic->appname = strdup(appname); + } + ipcic->pid = icpid; + + if (config->shareState == ShareState_PerProgram) + FcitxInstanceSetICStateFromSameApplication(ipc->owner, ipc->frontendid, context); + + boolean arg0 = context->state != IS_CLOSED; + + dbus_error_free(&error); + dbus_message_append_args(reply, + DBUS_TYPE_INT32, &ipcic->id, + DBUS_TYPE_BOOLEAN, &arg0, + DBUS_TYPE_UINT32, &arg1, + DBUS_TYPE_UINT32, &arg2, + DBUS_TYPE_UINT32, &arg3, + DBUS_TYPE_UINT32, &arg4, + DBUS_TYPE_INVALID); } dbus_connection_send(ipc->conn, reply, NULL); dbus_message_unref(reply); @@ -364,6 +455,8 @@ dbus_connection_unregister_object_path(ipc->conn, GetIPCIC(context)->path); if (ipcic->appname) free(ipcic->appname); + if (ipcic->surroundingText) + free(ipcic->surroundingText); free(context->privateic); context->privateic = NULL; } @@ -441,21 +534,24 @@ ic->offset_y = y; } -void IPCGetWindowPosition(void* arg, FcitxInputContext* ic, int* x, int* y) +void IPCGetWindowRect(void* arg, FcitxInputContext* ic, int* x, int* y, int* w, int* h) { *x = ic->offset_x; *y = ic->offset_y; + *w = GetIPCIC(ic)->width; + *h = GetIPCIC(ic)->height; } static DBusHandlerResult IPCDBusEventHandler(DBusConnection *connection, DBusMessage *msg, void *user_data) { FcitxIPCFrontend* ipc = (FcitxIPCFrontend*) user_data; + FcitxInstance* instance = ipc->owner; if (dbus_message_is_method_call(msg, DBUS_INTERFACE_INTROSPECTABLE, "Introspect")) { DBusMessage *reply = dbus_message_new_method_return(msg); dbus_message_append_args(reply, DBUS_TYPE_STRING, &im_introspection_xml, DBUS_TYPE_INVALID); - dbus_connection_send(ipc->conn, reply, NULL); + dbus_connection_send(connection, reply, NULL); dbus_message_unref(reply); return DBUS_HANDLER_RESULT_HANDLED; } else if (dbus_message_is_method_call(msg, DBUS_INTERFACE_PROPERTIES, "Get")) { @@ -473,13 +569,89 @@ } else if (dbus_message_is_method_call(msg, FCITX_IM_DBUS_INTERFACE, "CreateICv2")) { FcitxInstanceCreateIC(ipc->owner, ipc->frontendid, msg); return DBUS_HANDLER_RESULT_HANDLED; + } else if (dbus_message_is_method_call(msg, FCITX_IM_DBUS_INTERFACE, "CreateICv3")) { + FcitxInstanceCreateIC(ipc->owner, ipc->frontendid, msg); + return DBUS_HANDLER_RESULT_HANDLED; } else if (dbus_message_is_method_call(msg, FCITX_IM_DBUS_INTERFACE, "Exit")) { DBusMessage *reply = dbus_message_new_method_return(msg); - dbus_connection_send(ipc->conn, reply, NULL); + dbus_connection_send(connection, reply, NULL); dbus_message_unref(reply); - dbus_connection_flush(ipc->conn); + dbus_connection_flush(connection); FcitxInstanceEnd(ipc->owner); return DBUS_HANDLER_RESULT_HANDLED; + } else if (dbus_message_is_method_call(msg, FCITX_IM_DBUS_INTERFACE, "GetCurrentIM")) { + DBusMessage *reply = dbus_message_new_method_return(msg); + FcitxIM* im = FcitxInstanceGetCurrentIM(ipc->owner); + const char* name = ""; + if (im) { + name = im->uniqueName; + } + dbus_message_append_args(reply, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID); + dbus_connection_send(connection, reply, NULL); + dbus_message_unref(reply); + return DBUS_HANDLER_RESULT_HANDLED; + } else if (dbus_message_is_method_call(msg, FCITX_IM_DBUS_INTERFACE, "SetCurrentIM")) { + DBusError error; + dbus_error_init(&error); + char* imname = NULL; + if (dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &imname, DBUS_TYPE_INVALID)) { + FcitxInstanceSwitchIMByName(instance, imname); + DBusMessage *reply = dbus_message_new_method_return(msg); + dbus_connection_send(connection, reply, NULL); + dbus_message_unref(reply); + } + dbus_error_free(&error); + return DBUS_HANDLER_RESULT_HANDLED; + } else if (dbus_message_is_method_call(msg, FCITX_IM_DBUS_INTERFACE, "GetIMAddon")) { + DBusError error; + dbus_error_init(&error); + char* imname = NULL; + if (dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &imname, DBUS_TYPE_INVALID)) { + FcitxIM* im = FcitxInstanceGetIMFromIMList(instance, IMAS_Enable, imname); + const char* name = ""; + if (im) + name = im->owner->name; + DBusMessage *reply = dbus_message_new_method_return(msg); + dbus_message_append_args(reply, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID); + dbus_connection_send(connection, reply, NULL); + dbus_message_unref(reply); + } + dbus_error_free(&error); + return DBUS_HANDLER_RESULT_HANDLED; + } else if (dbus_message_is_method_call(msg, FCITX_IM_DBUS_INTERFACE, "Configure")) { + DBusMessage *reply = dbus_message_new_method_return(msg); + dbus_connection_send(connection, reply, NULL); + dbus_message_unref(reply); + fcitx_utils_launch_configure_tool(); + return DBUS_HANDLER_RESULT_HANDLED; + } else if (dbus_message_is_method_call(msg, FCITX_IM_DBUS_INTERFACE, "ConfigureAddon")) { + DBusError error; + dbus_error_init(&error); + char* addonname = NULL; + if (dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &addonname, DBUS_TYPE_INVALID)) { + DBusMessage *reply = dbus_message_new_method_return(msg); + dbus_connection_send(connection, reply, NULL); + dbus_message_unref(reply); + if (addonname) { + fcitx_utils_launch_configure_tool_for_addon(addonname); + } + } + dbus_error_free(&error); + return DBUS_HANDLER_RESULT_HANDLED; + } else if (dbus_message_is_method_call(msg, FCITX_IM_DBUS_INTERFACE, "ReloadConfig")) { + DBusMessage *reply = dbus_message_new_method_return(msg); + dbus_connection_send(connection, reply, NULL); + dbus_message_unref(reply); + dbus_connection_flush(connection); + FcitxInstanceReloadConfig(instance); + return DBUS_HANDLER_RESULT_HANDLED; + } else if (dbus_message_is_method_call(msg, FCITX_IM_DBUS_INTERFACE, "Restart")) { + DBusMessage *reply = dbus_message_new_method_return(msg); + dbus_connection_send(connection, reply, NULL); + dbus_message_unref(reply); + dbus_connection_flush(connection); + fcitx_utils_launch_restart(); + return DBUS_HANDLER_RESULT_HANDLED; } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } @@ -497,50 +669,74 @@ DBusMessage *reply = dbus_message_new_method_return(msg); dbus_message_append_args(reply, DBUS_TYPE_STRING, &ic_introspection_xml, DBUS_TYPE_INVALID); - dbus_connection_send(ipc->conn, reply, NULL); + dbus_connection_send(connection, reply, NULL); dbus_message_unref(reply); result = DBUS_HANDLER_RESULT_HANDLED; } + /* ic is not NULL */ if (result == DBUS_HANDLER_RESULT_NOT_YET_HANDLED && ic) { DBusError error; dbus_error_init(&error); if (dbus_message_is_method_call(msg, FCITX_IC_DBUS_INTERFACE, "EnableIC")) { FcitxInstanceEnableIM(ipc->owner, ic, false); DBusMessage *reply = dbus_message_new_method_return(msg); - dbus_connection_send(ipc->conn, reply, NULL); + dbus_connection_send(connection, reply, NULL); dbus_message_unref(reply); result = DBUS_HANDLER_RESULT_HANDLED; } else if (dbus_message_is_method_call(msg, FCITX_IC_DBUS_INTERFACE, "CloseIC")) { FcitxInstanceCloseIM(ipc->owner, ic); DBusMessage *reply = dbus_message_new_method_return(msg); - dbus_connection_send(ipc->conn, reply, NULL); + dbus_connection_send(connection, reply, NULL); dbus_message_unref(reply); result = DBUS_HANDLER_RESULT_HANDLED; } else if (dbus_message_is_method_call(msg, FCITX_IC_DBUS_INTERFACE, "FocusIn")) { IPCICFocusIn(ipc, ic); DBusMessage *reply = dbus_message_new_method_return(msg); - dbus_connection_send(ipc->conn, reply, NULL); + dbus_connection_send(connection, reply, NULL); dbus_message_unref(reply); result = DBUS_HANDLER_RESULT_HANDLED; } else if (dbus_message_is_method_call(msg, FCITX_IC_DBUS_INTERFACE, "FocusOut")) { IPCICFocusOut(ipc, ic); DBusMessage *reply = dbus_message_new_method_return(msg); - dbus_connection_send(ipc->conn, reply, NULL); + dbus_connection_send(connection, reply, NULL); dbus_message_unref(reply); result = DBUS_HANDLER_RESULT_HANDLED; } else if (dbus_message_is_method_call(msg, FCITX_IC_DBUS_INTERFACE, "Reset")) { IPCICReset(ipc, ic); DBusMessage *reply = dbus_message_new_method_return(msg); - dbus_connection_send(ipc->conn, reply, NULL); + dbus_connection_send(connection, reply, NULL); + dbus_message_unref(reply); + result = DBUS_HANDLER_RESULT_HANDLED; + } else if (dbus_message_is_method_call(msg, FCITX_IC_DBUS_INTERFACE, "CommitPreedit")) { + IPCICCommitPreedit(ipc, ic); + DBusMessage *reply = dbus_message_new_method_return(msg); + dbus_connection_send(connection, reply, NULL); + dbus_message_unref(reply); + result = DBUS_HANDLER_RESULT_HANDLED; + } else if (dbus_message_is_method_call(msg, FCITX_IC_DBUS_INTERFACE, "MouseEvent")) { + DBusMessage *reply = dbus_message_new_method_return(msg); + dbus_connection_send(connection, reply, NULL); dbus_message_unref(reply); result = DBUS_HANDLER_RESULT_HANDLED; } else if (dbus_message_is_method_call(msg, FCITX_IC_DBUS_INTERFACE, "SetCursorLocation")) { int x, y; if (dbus_message_get_args(msg, &error, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y, DBUS_TYPE_INVALID)) { - IPCICSetCursorLocation(ipc, ic, x, y); + IPCICSetCursorRect(ipc, ic, x, y, 0, 0); DBusMessage *reply = dbus_message_new_method_return(msg); - dbus_connection_send(ipc->conn, reply, NULL); + dbus_connection_send(connection, reply, NULL); + dbus_message_unref(reply); + } + result = DBUS_HANDLER_RESULT_HANDLED; + } else if (dbus_message_is_method_call(msg, FCITX_IC_DBUS_INTERFACE, "SetCursorRect")) { + int x, y, w, h; + if (dbus_message_get_args(msg, &error, + DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y, + DBUS_TYPE_INT32, &w, DBUS_TYPE_INT32, &h, + DBUS_TYPE_INVALID)) { + IPCICSetCursorRect(ipc, ic, x, y, w, h); + DBusMessage *reply = dbus_message_new_method_return(msg); + dbus_connection_send(connection, reply, NULL); dbus_message_unref(reply); } result = DBUS_HANDLER_RESULT_HANDLED; @@ -548,15 +744,40 @@ uint32_t flags; if (dbus_message_get_args(msg, &error, DBUS_TYPE_UINT32, &flags, DBUS_TYPE_INVALID)) { ic->contextCaps = flags; + if (!(ic->contextCaps & CAPACITY_SURROUNDING_TEXT)) { + if (GetIPCIC(ic)->surroundingText) + free(GetIPCIC(ic)->surroundingText); + GetIPCIC(ic)->surroundingText = NULL; + } + DBusMessage *reply = dbus_message_new_method_return(msg); + dbus_connection_send(connection, reply, NULL); + dbus_message_unref(reply); + } + result = DBUS_HANDLER_RESULT_HANDLED; + } else if (dbus_message_is_method_call(msg, FCITX_IC_DBUS_INTERFACE, "SetSurroundingText")) { + char* text; + uint32_t cursor, anchor; + if (dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &text, DBUS_TYPE_UINT32, &cursor, DBUS_TYPE_UINT32, &anchor, DBUS_TYPE_INVALID)) { + FcitxIPCIC* ipcic = GetIPCIC(ic); + if (!ipcic->surroundingText || strcmp(ipcic->surroundingText, text) != 0 || cursor != ipcic->cursor || anchor != ipcic->anchor) + { + if (ipcic->surroundingText) { + free(ipcic->surroundingText); + } + ipcic->surroundingText = strdup(text); + ipcic->cursor = cursor; + ipcic->anchor = anchor; + FcitxInstanceNotifyUpdateSurroundingText(ipc->owner, ic); + } DBusMessage *reply = dbus_message_new_method_return(msg); - dbus_connection_send(ipc->conn, reply, NULL); + dbus_connection_send(connection, reply, NULL); dbus_message_unref(reply); } result = DBUS_HANDLER_RESULT_HANDLED; } else if (dbus_message_is_method_call(msg, FCITX_IC_DBUS_INTERFACE, "DestroyIC")) { FcitxInstanceDestroyIC(ipc->owner, ipc->frontendid, &id); DBusMessage *reply = dbus_message_new_method_return(msg); - dbus_connection_send(ipc->conn, reply, NULL); + dbus_connection_send(connection, reply, NULL); dbus_message_unref(reply); result = DBUS_HANDLER_RESULT_HANDLED; } else if (dbus_message_is_method_call(msg, FCITX_IC_DBUS_INTERFACE, "ProcessKeyEvent")) { @@ -576,9 +797,9 @@ DBusMessage *reply = dbus_message_new_method_return(msg); dbus_message_append_args(reply, DBUS_TYPE_INT32, &ret, DBUS_TYPE_INVALID); - dbus_connection_send(ipc->conn, reply, NULL); + dbus_connection_send(connection, reply, NULL); dbus_message_unref(reply); - dbus_connection_flush(ipc->conn); + dbus_connection_flush(connection); } result = DBUS_HANDLER_RESULT_HANDLED; @@ -596,6 +817,7 @@ if (ic == NULL || ic->frontendid != callic->frontendid || GetIPCIC(ic)->id != GetIPCIC(callic)->id) { FcitxInstanceSetCurrentIC(ipc->owner, callic); + FcitxUIOnInputFocus(ipc->owner); } ic = callic; FcitxKeySym sym; @@ -615,6 +837,9 @@ FcitxInstanceEnableIM(ipc->owner, ic, false); return 1; } + else if (ic->state == IS_CLOSED) { + return 0; + } FcitxInputStateSetKeyCode(input, keycode); FcitxInputStateSetKeySym(input, originsym); @@ -661,9 +886,9 @@ FcitxInputContext* currentic = FcitxInstanceGetCurrentIC(ipc->owner); if (ic && ic == currentic) { FcitxUICommitPreedit(ipc->owner); - FcitxUIOnInputUnFocus(ipc->owner); FcitxUICloseInputWindow(ipc->owner); FcitxInstanceSetCurrentIC(ipc->owner, NULL); + FcitxUIOnInputUnFocus(ipc->owner); } return; @@ -680,10 +905,24 @@ return; } -static void IPCICSetCursorLocation(FcitxIPCFrontend* ipc, FcitxInputContext* ic, int x, int y) +static void IPCICCommitPreedit(FcitxIPCFrontend* ipc, FcitxInputContext* ic) +{ + FcitxInputContext* currentic = FcitxInstanceGetCurrentIC(ipc->owner); + if (ic && ic == currentic) { + FcitxUICommitPreedit(ipc->owner); + FcitxUICloseInputWindow(ipc->owner); + FcitxInstanceResetInput(ipc->owner); + } + + return; +} + +static void IPCICSetCursorRect(FcitxIPCFrontend* ipc, FcitxInputContext* ic, int x, int y, int w, int h) { ic->offset_x = x; ic->offset_y = y; + GetIPCIC(ic)->width = w; + GetIPCIC(ic)->height = h; FcitxUIMoveInputWindow(ipc->owner); return; @@ -758,6 +997,44 @@ } } +void IPCDeleteSurroundingText(void* arg, FcitxInputContext* ic, int offset, unsigned int size) +{ + FcitxIPCFrontend* ipc = (FcitxIPCFrontend*) arg; + dbus_uint32_t serial = 0; // unique number to associate replies with requests + DBusMessage* msg = dbus_message_new_signal(GetIPCIC(ic)->path, // object name of the signal + FCITX_IC_DBUS_INTERFACE, // interface name of the signal + "DeleteSurroundingText"); // name of the signal + + dbus_message_append_args(msg, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32, &size, DBUS_TYPE_INVALID); + + if (!dbus_connection_send(ipc->conn, msg, &serial)) { + FcitxLog(DEBUG, "Out Of Memory!"); + } + dbus_connection_flush(ipc->conn); + dbus_message_unref(msg); +} + + +boolean IPCGetSurroundingText(void* arg, FcitxInputContext* ic, char** str, unsigned int *cursor, unsigned int *anchor) +{ + FcitxIPCIC* ipcic = GetIPCIC(ic); + + if (!ipcic->surroundingText) + return false; + + if (str) + *str = strdup(ipcic->surroundingText); + + if (cursor) + *cursor = ipcic->cursor; + + if (anchor) + *anchor = ipcic->anchor; + + return true; +} + + void IPCUpdateClientSideUI(void* arg, FcitxInputContext* ic) { FcitxIPCFrontend* ipc = (FcitxIPCFrontend*) arg; @@ -1069,6 +1346,9 @@ dbus_message_unref(msg); } - +pid_t IPCGetPid(void* arg, FcitxInputContext* ic) +{ + return GetIPCIC(ic)->pid; +} // kate: indent-mode cstyle; space-indent on; indent-width 0; diff -Nru fcitx-4.2.2/src/frontend/ipc/ipc.h fcitx-4.2.4.1/src/frontend/ipc/ipc.h --- fcitx-4.2.2/src/frontend/ipc/ipc.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/ipc/ipc.h 2012-06-10 14:34:48.000000000 +0000 @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2010~2011 by CSSlayer * + * Copyright (C) 2010~2012 by CSSlayer * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * diff -Nru fcitx-4.2.2/src/frontend/qt/CMakeLists.txt fcitx-4.2.4.1/src/frontend/qt/CMakeLists.txt --- fcitx-4.2.2/src/frontend/qt/CMakeLists.txt 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/qt/CMakeLists.txt 2012-06-10 14:34:48.000000000 +0000 @@ -1,6 +1,5 @@ if (ENABLE_QT_IM_MODULE) find_package(Qt4 4.5 COMPONENTS QtCore QtGui QtDBus REQUIRED) -find_package(ICU REQUIRED) # use newer macro from Qt4Macro.cmake MACRO(FCITX_QT4_ADD_DBUS_INTERFACE _sources _interface _basename) diff -Nru fcitx-4.2.2/src/frontend/qt/fcitx-compose-data.h fcitx-4.2.4.1/src/frontend/qt/fcitx-compose-data.h --- fcitx-4.2.2/src/frontend/qt/fcitx-compose-data.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/qt/fcitx-compose-data.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,4450 +0,0 @@ -/* vim:set noet ts=4: */ -/* - * ibus - The Input Bus - * - * Copyright (c) 2007-2008 Huang Peng - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307 USA - */ -#ifndef __FcitxKey_COMPOSE_DATA_H_ -#define __FcitxKey_COMPOSE_DATA_H_ - -static const quint32 fcitx_compose_seqs_compact[] = { - FcitxKey_dead_stroke, 138, 226, 235, 235, 235, - FcitxKey_Greek_accentdieresis, 235, 239, 239, 239, 239, - FcitxKey_dead_grave, 239, 299, 386, 598, 598, - FcitxKey_dead_acute, 598, 664, 760, 1036, 1036, - FcitxKey_dead_circumflex, 1036, 1176, 1176, 1376, 1376, - FcitxKey_dead_tilde, 1376, 1458, 1521, 1661, 1661, - FcitxKey_dead_macron, 1661, 1707, 1707, 1779, 1779, - FcitxKey_dead_breve, 1779, 1833, 1833, 1857, 1857, - FcitxKey_dead_abovedot, 1857, 1887, 1890, 1922, 1922, - FcitxKey_dead_diaeresis, 1922, 2010, 2019, 2043, 2043, - FcitxKey_dead_abovering, 2043, 2053, 2053, 2053, 2053, - FcitxKey_dead_doubleacute, 2053, 2063, 2063, 2063, 2063, - FcitxKey_dead_caron, 2063, 2089, 2089, 2097, 2097, - FcitxKey_dead_cedilla, 2097, 2111, 2111, 2111, 2111, - FcitxKey_dead_ogonek, 2111, 2121, 2121, 2121, 2121, - FcitxKey_dead_iota, 2121, 2143, 2242, 2674, 3334, - FcitxKey_dead_voiced_sound, 3334, 3380, 3380, 3380, 3380, - FcitxKey_dead_semivoiced_sound, 3380, 3390, 3390, 3390, 3390, - FcitxKey_dead_belowdot, 3390, 3400, 3400, 3416, 3416, - FcitxKey_dead_hook, 3416, 3494, 3494, 3550, 3550, - FcitxKey_dead_psili, 3550, 3578, 3578, 3578, 3578, - FcitxKey_dead_dasia, 3578, 3610, 3610, 3610, 3610, - FcitxKey_Multi_key, 3610, 3610, 9589, 13297, 15157, - FcitxKey_space, 0x002F, - FcitxKey_2, 0x01BB, - FcitxKey_A, 0x023A, - FcitxKey_B, 0x0243, - FcitxKey_C, 0x023B, - FcitxKey_D, 0x0110, - FcitxKey_E, 0x0246, - FcitxKey_G, 0x01E4, - FcitxKey_H, 0x0126, - FcitxKey_I, 0x0197, - FcitxKey_J, 0x0248, - FcitxKey_L, 0x0141, - FcitxKey_O, 0x00D8, - FcitxKey_P, 0x2C63, - FcitxKey_R, 0x024C, - FcitxKey_T, 0x0166, - FcitxKey_U, 0x0244, - FcitxKey_Y, 0x024E, - FcitxKey_Z, 0x01B5, - FcitxKey_a, 0x2C65, - FcitxKey_b, 0x0180, - FcitxKey_c, 0x023C, - FcitxKey_d, 0x0111, - FcitxKey_e, 0x0247, - FcitxKey_g, 0x01E5, - FcitxKey_h, 0x0127, - FcitxKey_i, 0x0268, - FcitxKey_j, 0x0249, - FcitxKey_l, 0x0142, - FcitxKey_o, 0x00F8, - FcitxKey_p, 0x1D7D, - FcitxKey_r, 0x024D, - FcitxKey_t, 0x0167, - FcitxKey_u, 0x0289, - FcitxKey_y, 0x024F, - FcitxKey_z, 0x01B6, - FcitxKey_nobreakspace, 0x0338, - FcitxKey_Oacute, 0x01FE, - FcitxKey_oacute, 0x01FF, - 0x0237, 0x025F, - 0x0269, 0x1D7C, - FcitxKey_dead_stroke, 0x002F, - FcitxKey_lessthanequal, 0x2270, - FcitxKey_greaterthanequal, 0x2271, - FcitxKey_dead_acute, FcitxKey_O, 0x01FE, - FcitxKey_dead_acute, FcitxKey_o, 0x01FF, - FcitxKey_dead_abovedot, FcitxKey_j, 0x025F, - FcitxKey_Greek_iota, 0x0390, - FcitxKey_Greek_upsilon, 0x03B0, - FcitxKey_space, 0x0060, - FcitxKey_V, 0x01DB, - FcitxKey_v, 0x01DC, - FcitxKey_Abreve, 0x1EB0, - FcitxKey_abreve, 0x1EB1, - FcitxKey_Emacron, 0x1E14, - FcitxKey_emacron, 0x1E15, - FcitxKey_Omacron, 0x1E50, - FcitxKey_omacron, 0x1E51, - FcitxKey_Cyrillic_ie, 0x0450, - FcitxKey_Cyrillic_i, 0x045D, - FcitxKey_Cyrillic_IE, 0x0400, - FcitxKey_Cyrillic_I, 0x040D, - FcitxKey_Greek_iotadieresis, 0x1FD2, - FcitxKey_Greek_upsilondieresis, 0x1FE2, - FcitxKey_Greek_ALPHA, 0x1FBA, - FcitxKey_Greek_EPSILON, 0x1FC8, - FcitxKey_Greek_ETA, 0x1FCA, - FcitxKey_Greek_IOTA, 0x1FDA, - FcitxKey_Greek_OMICRON, 0x1FF8, - FcitxKey_Greek_UPSILON, 0x1FEA, - FcitxKey_Greek_OMEGA, 0x1FFA, - FcitxKey_Greek_alpha, 0x1F70, - FcitxKey_Greek_epsilon, 0x1F72, - FcitxKey_Greek_eta, 0x1F74, - FcitxKey_Greek_iota, 0x1F76, - FcitxKey_Greek_omicron, 0x1F78, - FcitxKey_Greek_upsilon, 0x1F7A, - FcitxKey_Greek_omega, 0x1F7C, - FcitxKey_dead_grave, 0x0060, - FcitxKey_dead_diaeresis, FcitxKey_Greek_iota, 0x1FD2, - FcitxKey_dead_diaeresis, FcitxKey_Greek_upsilon, 0x1FE2, - FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F0A, - FcitxKey_dead_psili, FcitxKey_Greek_EPSILON, 0x1F1A, - FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F2A, - FcitxKey_dead_psili, FcitxKey_Greek_IOTA, 0x1F3A, - FcitxKey_dead_psili, FcitxKey_Greek_OMICRON, 0x1F4A, - FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1F6A, - FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F02, - FcitxKey_dead_psili, FcitxKey_Greek_epsilon, 0x1F12, - FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F22, - FcitxKey_dead_psili, FcitxKey_Greek_iota, 0x1F32, - FcitxKey_dead_psili, FcitxKey_Greek_omicron, 0x1F42, - FcitxKey_dead_psili, FcitxKey_Greek_upsilon, 0x1F52, - FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1F62, - FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F0B, - FcitxKey_dead_dasia, FcitxKey_Greek_EPSILON, 0x1F1B, - FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F2B, - FcitxKey_dead_dasia, FcitxKey_Greek_IOTA, 0x1F3B, - FcitxKey_dead_dasia, FcitxKey_Greek_OMICRON, 0x1F4B, - FcitxKey_dead_dasia, FcitxKey_Greek_UPSILON, 0x1F5B, - FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1F6B, - FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F03, - FcitxKey_dead_dasia, FcitxKey_Greek_epsilon, 0x1F13, - FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F23, - FcitxKey_dead_dasia, FcitxKey_Greek_iota, 0x1F33, - FcitxKey_dead_dasia, FcitxKey_Greek_omicron, 0x1F43, - FcitxKey_dead_dasia, FcitxKey_Greek_upsilon, 0x1F53, - FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1F63, - FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_U, 0x01DB, - FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_u, 0x01DC, - FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_Greek_iota, 0x1FD2, - FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_Greek_upsilon, 0x1FE2, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F0B, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_EPSILON, 0x1F1B, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F2B, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_IOTA, 0x1F3B, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_OMICRON, 0x1F4B, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_UPSILON, 0x1F5B, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1F6B, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F03, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_epsilon, 0x1F13, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F23, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_iota, 0x1F33, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_omicron, 0x1F43, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_upsilon, 0x1F53, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1F63, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F0A, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_EPSILON, 0x1F1A, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F2A, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_IOTA, 0x1F3A, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_OMICRON, 0x1F4A, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1F6A, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F02, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_epsilon, 0x1F12, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F22, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_iota, 0x1F32, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_omicron, 0x1F42, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_upsilon, 0x1F52, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1F62, - FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_O, 0x1EDC, - FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_U, 0x1EEA, - FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_o, 0x1EDD, - FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_u, 0x1EEB, - FcitxKey_Multi_key, FcitxKey_U, FcitxKey_A, 0x1EB0, - FcitxKey_Multi_key, FcitxKey_U, FcitxKey_a, 0x1EB1, - FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_A, 0x1EA6, - FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_E, 0x1EC0, - FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_O, 0x1ED2, - FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_a, 0x1EA7, - FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_e, 0x1EC1, - FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_o, 0x1ED3, - FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_E, 0x1E14, - FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_O, 0x1E50, - FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_e, 0x1E15, - FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_o, 0x1E51, - FcitxKey_Multi_key, FcitxKey_b, FcitxKey_A, 0x1EB0, - FcitxKey_Multi_key, FcitxKey_b, FcitxKey_a, 0x1EB1, - FcitxKey_Multi_key, FcitxKey_macron, FcitxKey_E, 0x1E14, - FcitxKey_Multi_key, FcitxKey_macron, FcitxKey_O, 0x1E50, - FcitxKey_Multi_key, FcitxKey_macron, FcitxKey_e, 0x1E15, - FcitxKey_Multi_key, FcitxKey_macron, FcitxKey_o, 0x1E51, - FcitxKey_space, 0x0027, - FcitxKey_V, 0x01D7, - FcitxKey_v, 0x01D8, - FcitxKey_Abreve, 0x1EAE, - FcitxKey_abreve, 0x1EAF, - FcitxKey_Emacron, 0x1E16, - FcitxKey_emacron, 0x1E17, - FcitxKey_Utilde, 0x1E78, - FcitxKey_omacron, 0x1E53, - FcitxKey_utilde, 0x1E79, - FcitxKey_Cyrillic_ghe, 0x0453, - FcitxKey_Cyrillic_ka, 0x045C, - FcitxKey_Cyrillic_GHE, 0x0403, - FcitxKey_Cyrillic_KA, 0x040C, - FcitxKey_Greek_iotadieresis, 0x0390, - FcitxKey_Greek_upsilondieresis, 0x03B0, - FcitxKey_Greek_ALPHA, 0x0386, - FcitxKey_Greek_EPSILON, 0x0388, - FcitxKey_Greek_ETA, 0x0389, - FcitxKey_Greek_IOTA, 0x038A, - FcitxKey_Greek_OMICRON, 0x038C, - FcitxKey_Greek_UPSILON, 0x038E, - FcitxKey_Greek_OMEGA, 0x038F, - FcitxKey_Greek_alpha, 0x03AC, - FcitxKey_Greek_epsilon, 0x03AD, - FcitxKey_Greek_eta, 0x03AE, - FcitxKey_Greek_iota, 0x03AF, - FcitxKey_Greek_omicron, 0x03CC, - FcitxKey_Greek_upsilon, 0x03CD, - FcitxKey_Greek_omega, 0x03CE, - FcitxKey_Sabovedot, 0x1E64, - FcitxKey_sabovedot, 0x1E65, - FcitxKey_dead_acute, 0x00B4, - FcitxKey_dead_stroke, FcitxKey_O, 0x01FE, - FcitxKey_dead_stroke, FcitxKey_o, 0x01FF, - FcitxKey_dead_diaeresis, FcitxKey_space, 0x0385, - FcitxKey_dead_diaeresis, FcitxKey_Greek_iota, 0x0390, - FcitxKey_dead_diaeresis, FcitxKey_Greek_upsilon, 0x03B0, - FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F0C, - FcitxKey_dead_psili, FcitxKey_Greek_EPSILON, 0x1F1C, - FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F2C, - FcitxKey_dead_psili, FcitxKey_Greek_IOTA, 0x1F3C, - FcitxKey_dead_psili, FcitxKey_Greek_OMICRON, 0x1F4C, - FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1F6C, - FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F04, - FcitxKey_dead_psili, FcitxKey_Greek_epsilon, 0x1F14, - FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F24, - FcitxKey_dead_psili, FcitxKey_Greek_iota, 0x1F34, - FcitxKey_dead_psili, FcitxKey_Greek_omicron, 0x1F44, - FcitxKey_dead_psili, FcitxKey_Greek_upsilon, 0x1F54, - FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1F64, - FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F0D, - FcitxKey_dead_dasia, FcitxKey_Greek_EPSILON, 0x1F1D, - FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F2D, - FcitxKey_dead_dasia, FcitxKey_Greek_IOTA, 0x1F3D, - FcitxKey_dead_dasia, FcitxKey_Greek_OMICRON, 0x1F4D, - FcitxKey_dead_dasia, FcitxKey_Greek_UPSILON, 0x1F5D, - FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1F6D, - FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F05, - FcitxKey_dead_dasia, FcitxKey_Greek_epsilon, 0x1F15, - FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F25, - FcitxKey_dead_dasia, FcitxKey_Greek_iota, 0x1F35, - FcitxKey_dead_dasia, FcitxKey_Greek_omicron, 0x1F45, - FcitxKey_dead_dasia, FcitxKey_Greek_upsilon, 0x1F55, - FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1F65, - FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_I, 0x1E2E, - FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_U, 0x01D7, - FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_i, 0x1E2F, - FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_u, 0x01D8, - FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_Greek_iota, 0x0390, - FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_Greek_upsilon, 0x03B0, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F0D, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_EPSILON, 0x1F1D, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F2D, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_IOTA, 0x1F3D, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_OMICRON, 0x1F4D, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_UPSILON, 0x1F5D, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1F6D, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F05, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_epsilon, 0x1F15, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F25, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_iota, 0x1F35, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_omicron, 0x1F45, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_upsilon, 0x1F55, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1F65, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F0C, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_EPSILON, 0x1F1C, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F2C, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_IOTA, 0x1F3C, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_OMICRON, 0x1F4C, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1F6C, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F04, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_epsilon, 0x1F14, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F24, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_iota, 0x1F34, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_omicron, 0x1F44, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_upsilon, 0x1F54, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1F64, - FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_O, 0x1EDA, - FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_U, 0x1EE8, - FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_o, 0x1EDB, - FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_u, 0x1EE9, - FcitxKey_Multi_key, FcitxKey_comma, FcitxKey_C, 0x1E08, - FcitxKey_Multi_key, FcitxKey_comma, FcitxKey_c, 0x1E09, - FcitxKey_Multi_key, FcitxKey_slash, FcitxKey_O, 0x01FE, - FcitxKey_Multi_key, FcitxKey_slash, FcitxKey_o, 0x01FF, - FcitxKey_Multi_key, FcitxKey_U, FcitxKey_A, 0x1EAE, - FcitxKey_Multi_key, FcitxKey_U, FcitxKey_a, 0x1EAF, - FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_A, 0x1EA4, - FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_E, 0x1EBE, - FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_O, 0x1ED0, - FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_a, 0x1EA5, - FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_e, 0x1EBF, - FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_o, 0x1ED1, - FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_E, 0x1E16, - FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_O, 0x1E52, - FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_e, 0x1E17, - FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_o, 0x1E53, - FcitxKey_Multi_key, FcitxKey_b, FcitxKey_A, 0x1EAE, - FcitxKey_Multi_key, FcitxKey_b, FcitxKey_a, 0x1EAF, - FcitxKey_Multi_key, FcitxKey_o, FcitxKey_A, 0x01FA, - FcitxKey_Multi_key, FcitxKey_o, FcitxKey_a, 0x01FB, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_O, 0x1E4C, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_U, 0x1E78, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_o, 0x1E4D, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_u, 0x1E79, - FcitxKey_Multi_key, FcitxKey_macron, FcitxKey_E, 0x1E16, - FcitxKey_Multi_key, FcitxKey_macron, FcitxKey_O, 0x1E52, - FcitxKey_Multi_key, FcitxKey_macron, FcitxKey_e, 0x1E17, - FcitxKey_Multi_key, FcitxKey_macron, FcitxKey_o, 0x1E53, - FcitxKey_Multi_key, FcitxKey_cedilla, FcitxKey_C, 0x1E08, - FcitxKey_Multi_key, FcitxKey_cedilla, FcitxKey_c, 0x1E09, - FcitxKey_Multi_key, FcitxKey_KP_Divide, FcitxKey_O, 0x01FE, - FcitxKey_Multi_key, FcitxKey_KP_Divide, FcitxKey_o, 0x01FF, - FcitxKey_space, 0x005E, - FcitxKey_parenleft, 0x207D, - FcitxKey_parenright, 0x207E, - FcitxKey_plus, 0x207A, - FcitxKey_minus, 0x207B, - FcitxKey_0, 0x2070, - FcitxKey_1, 0x00B9, - FcitxKey_2, 0x00B2, - FcitxKey_3, 0x00B3, - FcitxKey_4, 0x2074, - FcitxKey_5, 0x2075, - FcitxKey_6, 0x2076, - FcitxKey_7, 0x2077, - FcitxKey_8, 0x2078, - FcitxKey_9, 0x2079, - FcitxKey_equal, 0x207C, - FcitxKey_nobreakspace, 0x0302, - FcitxKey_Agrave, 0x1EA6, - FcitxKey_Aacute, 0x1EA4, - FcitxKey_Atilde, 0x1EAA, - FcitxKey_Egrave, 0x1EC0, - FcitxKey_Eacute, 0x1EBE, - FcitxKey_Ograve, 0x1ED2, - FcitxKey_Oacute, 0x1ED0, - FcitxKey_Otilde, 0x1ED6, - FcitxKey_agrave, 0x1EA7, - FcitxKey_aacute, 0x1EA5, - FcitxKey_atilde, 0x1EAB, - FcitxKey_egrave, 0x1EC1, - FcitxKey_eacute, 0x1EBF, - FcitxKey_ograve, 0x1ED3, - FcitxKey_oacute, 0x1ED1, - FcitxKey_otilde, 0x1ED7, - FcitxKey_Ahook, 0x1EA8, - FcitxKey_ahook, 0x1EA9, - FcitxKey_Ehook, 0x1EC2, - FcitxKey_ehook, 0x1EC3, - FcitxKey_Etilde, 0x1EC4, - FcitxKey_etilde, 0x1EC5, - FcitxKey_Ohook, 0x1ED4, - FcitxKey_ohook, 0x1ED5, - 0x2212, 0x207B, - 0x4E00, 0x3192, - 0x4E01, 0x319C, - 0x4E09, 0x3194, - 0x4E0A, 0x3196, - 0x4E0B, 0x3198, - 0x4E19, 0x319B, - 0x4E2D, 0x3197, - 0x4E59, 0x319A, - 0x4E8C, 0x3193, - 0x4EBA, 0x319F, - 0x56DB, 0x3195, - 0x5730, 0x319E, - 0x5929, 0x319D, - 0x7532, 0x3199, - FcitxKey_dead_circumflex, 0x005E, - FcitxKey_KP_Space, 0x00B2, - FcitxKey_KP_Add, 0x207A, - FcitxKey_KP_0, 0x2070, - FcitxKey_KP_1, 0x00B9, - FcitxKey_KP_2, 0x00B2, - FcitxKey_KP_3, 0x00B3, - FcitxKey_KP_4, 0x2074, - FcitxKey_KP_5, 0x2075, - FcitxKey_KP_6, 0x2076, - FcitxKey_KP_7, 0x2077, - FcitxKey_KP_8, 0x2078, - FcitxKey_KP_9, 0x2079, - FcitxKey_KP_Equal, 0x207C, - FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_A, 0x1EAC, - FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_E, 0x1EC6, - FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_O, 0x1ED8, - FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_a, 0x1EAD, - FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_e, 0x1EC7, - FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_o, 0x1ED9, - FcitxKey_Multi_key, FcitxKey_S, FcitxKey_M, 0x2120, - FcitxKey_Multi_key, FcitxKey_S, FcitxKey_m, 0x2120, - FcitxKey_Multi_key, FcitxKey_T, FcitxKey_M, 0x2122, - FcitxKey_Multi_key, FcitxKey_T, FcitxKey_m, 0x2122, - FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_a, 0x00AA, - FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_h, 0x02B0, - FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_i, 0x2071, - FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_j, 0x02B2, - FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_l, 0x02E1, - FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_n, 0x207F, - FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_o, 0x00BA, - FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_r, 0x02B3, - FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_s, 0x02E2, - FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_w, 0x02B7, - FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_x, 0x02E3, - FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_y, 0x02B8, - FcitxKey_Multi_key, FcitxKey_underscore, 0x0263, 0x02E0, - FcitxKey_Multi_key, FcitxKey_underscore, 0x0266, 0x02B1, - FcitxKey_Multi_key, FcitxKey_underscore, 0x0279, 0x02B4, - FcitxKey_Multi_key, FcitxKey_underscore, 0x027B, 0x02B5, - FcitxKey_Multi_key, FcitxKey_underscore, 0x0281, 0x02B6, - FcitxKey_Multi_key, FcitxKey_underscore, 0x0295, 0x02E4, - FcitxKey_Multi_key, FcitxKey_s, FcitxKey_M, 0x2120, - FcitxKey_Multi_key, FcitxKey_s, FcitxKey_m, 0x2120, - FcitxKey_Multi_key, FcitxKey_t, FcitxKey_M, 0x2122, - FcitxKey_Multi_key, FcitxKey_t, FcitxKey_m, 0x2122, - FcitxKey_Multi_key, FcitxKey_underbar, FcitxKey_a, 0x00AA, - FcitxKey_Multi_key, FcitxKey_underbar, FcitxKey_h, 0x02B0, - FcitxKey_Multi_key, FcitxKey_underbar, FcitxKey_i, 0x2071, - FcitxKey_Multi_key, FcitxKey_underbar, FcitxKey_j, 0x02B2, - FcitxKey_Multi_key, FcitxKey_underbar, FcitxKey_l, 0x02E1, - FcitxKey_Multi_key, FcitxKey_underbar, FcitxKey_n, 0x207F, - FcitxKey_Multi_key, FcitxKey_underbar, FcitxKey_o, 0x00BA, - FcitxKey_Multi_key, FcitxKey_underbar, FcitxKey_r, 0x02B3, - FcitxKey_Multi_key, FcitxKey_underbar, FcitxKey_s, 0x02E2, - FcitxKey_Multi_key, FcitxKey_underbar, FcitxKey_w, 0x02B7, - FcitxKey_Multi_key, FcitxKey_underbar, FcitxKey_x, 0x02E3, - FcitxKey_Multi_key, FcitxKey_underbar, FcitxKey_y, 0x02B8, - FcitxKey_Multi_key, FcitxKey_underbar, 0x0263, 0x02E0, - FcitxKey_Multi_key, FcitxKey_underbar, 0x0266, 0x02B1, - FcitxKey_Multi_key, FcitxKey_underbar, 0x0279, 0x02B4, - FcitxKey_Multi_key, FcitxKey_underbar, 0x027B, 0x02B5, - FcitxKey_Multi_key, FcitxKey_underbar, 0x0281, 0x02B6, - FcitxKey_Multi_key, FcitxKey_underbar, 0x0295, 0x02E4, - FcitxKey_space, 0x007E, - FcitxKey_less, 0x2272, - FcitxKey_equal, 0x2243, - FcitxKey_greater, 0x2273, - FcitxKey_Oacute, 0x1E4C, - FcitxKey_Odiaeresis, 0x1E4E, - FcitxKey_Uacute, 0x1E78, - FcitxKey_oacute, 0x1E4D, - FcitxKey_odiaeresis, 0x1E4F, - FcitxKey_uacute, 0x1E79, - FcitxKey_Abreve, 0x1EB4, - FcitxKey_abreve, 0x1EB5, - FcitxKey_Omacron, 0x022C, - FcitxKey_omacron, 0x022D, - FcitxKey_Greek_iotadieresis, 0x1FD7, - FcitxKey_Greek_upsilondieresis, 0x1FE7, - FcitxKey_Greek_alpha, 0x1FB6, - FcitxKey_Greek_eta, 0x1FC6, - FcitxKey_Greek_iota, 0x1FD6, - FcitxKey_Greek_upsilon, 0x1FE6, - FcitxKey_Greek_omega, 0x1FF6, - 0x1F00, 0x1F06, - 0x1F01, 0x1F07, - 0x1F08, 0x1F0E, - 0x1F09, 0x1F0F, - 0x1F20, 0x1F26, - 0x1F21, 0x1F27, - 0x1F28, 0x1F2E, - 0x1F29, 0x1F2F, - 0x1F30, 0x1F36, - 0x1F31, 0x1F37, - 0x1F38, 0x1F3E, - 0x1F39, 0x1F3F, - 0x1F50, 0x1F56, - 0x1F51, 0x1F57, - 0x1F59, 0x1F5F, - 0x1F60, 0x1F66, - 0x1F61, 0x1F67, - 0x1F68, 0x1F6E, - 0x1F69, 0x1F6F, - FcitxKey_dead_tilde, 0x007E, - FcitxKey_dead_diaeresis, FcitxKey_Greek_iota, 0x1FD7, - FcitxKey_dead_diaeresis, FcitxKey_Greek_upsilon, 0x1FE7, - FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F0E, - FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F2E, - FcitxKey_dead_psili, FcitxKey_Greek_IOTA, 0x1F3E, - FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1F6E, - FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F06, - FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F26, - FcitxKey_dead_psili, FcitxKey_Greek_iota, 0x1F36, - FcitxKey_dead_psili, FcitxKey_Greek_upsilon, 0x1F56, - FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1F66, - FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F0F, - FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F2F, - FcitxKey_dead_dasia, FcitxKey_Greek_IOTA, 0x1F3F, - FcitxKey_dead_dasia, FcitxKey_Greek_UPSILON, 0x1F5F, - FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1F6F, - FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F07, - FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F27, - FcitxKey_dead_dasia, FcitxKey_Greek_iota, 0x1F37, - FcitxKey_dead_dasia, FcitxKey_Greek_upsilon, 0x1F57, - FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1F67, - FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_Greek_iota, 0x1FD7, - FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_Greek_upsilon, 0x1FE7, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F0F, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F2F, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_IOTA, 0x1F3F, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_UPSILON, 0x1F5F, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1F6F, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F07, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F27, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_iota, 0x1F37, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_upsilon, 0x1F57, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1F67, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F0E, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F2E, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_IOTA, 0x1F3E, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1F6E, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F06, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F26, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_iota, 0x1F36, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_upsilon, 0x1F56, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1F66, - FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_O, 0x1EE0, - FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_U, 0x1EEE, - FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_o, 0x1EE1, - FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_u, 0x1EEF, - FcitxKey_Multi_key, FcitxKey_U, FcitxKey_A, 0x1EB4, - FcitxKey_Multi_key, FcitxKey_U, FcitxKey_a, 0x1EB5, - FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_A, 0x1EAA, - FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_E, 0x1EC4, - FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_O, 0x1ED6, - FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_a, 0x1EAB, - FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_e, 0x1EC5, - FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_o, 0x1ED7, - FcitxKey_Multi_key, FcitxKey_b, FcitxKey_A, 0x1EB4, - FcitxKey_Multi_key, FcitxKey_b, FcitxKey_a, 0x1EB5, - FcitxKey_space, 0x00AF, - FcitxKey_V, 0x01D5, - FcitxKey_v, 0x01D6, - FcitxKey_nobreakspace, 0x0304, - FcitxKey_Egrave, 0x1E14, - FcitxKey_Eacute, 0x1E16, - FcitxKey_Ograve, 0x1E50, - FcitxKey_Oacute, 0x1E52, - FcitxKey_egrave, 0x1E15, - FcitxKey_eacute, 0x1E17, - FcitxKey_ograve, 0x1E51, - FcitxKey_oacute, 0x1E53, - FcitxKey_Cyrillic_i, 0x04E3, - FcitxKey_Cyrillic_u, 0x04EF, - FcitxKey_Cyrillic_I, 0x04E2, - FcitxKey_Cyrillic_U, 0x04EE, - FcitxKey_Greek_ALPHA, 0x1FB9, - FcitxKey_Greek_IOTA, 0x1FD9, - FcitxKey_Greek_UPSILON, 0x1FE9, - FcitxKey_Greek_alpha, 0x1FB1, - FcitxKey_Greek_iota, 0x1FD1, - FcitxKey_Greek_upsilon, 0x1FE1, - FcitxKey_dead_macron, 0x00AF, - FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_L, 0x1E38, - FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_R, 0x1E5C, - FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_l, 0x1E39, - FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_r, 0x1E5D, - FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_A, 0x01DE, - FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_O, 0x022A, - FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_U, 0x01D5, - FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_a, 0x01DF, - FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_o, 0x022B, - FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_u, 0x01D6, - FcitxKey_Multi_key, FcitxKey_period, FcitxKey_A, 0x01E0, - FcitxKey_Multi_key, FcitxKey_period, FcitxKey_O, 0x0230, - FcitxKey_Multi_key, FcitxKey_period, FcitxKey_a, 0x01E1, - FcitxKey_Multi_key, FcitxKey_period, FcitxKey_o, 0x0231, - FcitxKey_Multi_key, FcitxKey_semicolon, FcitxKey_O, 0x01EC, - FcitxKey_Multi_key, FcitxKey_semicolon, FcitxKey_o, 0x01ED, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_O, 0x022C, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_o, 0x022D, - FcitxKey_space, 0x02D8, - FcitxKey_nobreakspace, 0x0306, - FcitxKey_Agrave, 0x1EB0, - FcitxKey_Aacute, 0x1EAE, - FcitxKey_Atilde, 0x1EB4, - FcitxKey_agrave, 0x1EB1, - FcitxKey_aacute, 0x1EAF, - FcitxKey_atilde, 0x1EB5, - FcitxKey_Cyrillic_a, 0x04D1, - FcitxKey_Cyrillic_ie, 0x04D7, - FcitxKey_Cyrillic_i, 0x0439, - FcitxKey_Cyrillic_u, 0x045E, - FcitxKey_Cyrillic_zhe, 0x04C2, - FcitxKey_Cyrillic_A, 0x04D0, - FcitxKey_Cyrillic_IE, 0x04D6, - FcitxKey_Cyrillic_I, 0x0419, - FcitxKey_Cyrillic_U, 0x040E, - FcitxKey_Cyrillic_ZHE, 0x04C1, - FcitxKey_Greek_ALPHA, 0x1FB8, - FcitxKey_Greek_IOTA, 0x1FD8, - FcitxKey_Greek_UPSILON, 0x1FE8, - FcitxKey_Greek_alpha, 0x1FB0, - FcitxKey_Greek_iota, 0x1FD0, - FcitxKey_Greek_upsilon, 0x1FE0, - FcitxKey_Ahook, 0x1EB2, - FcitxKey_ahook, 0x1EB3, - FcitxKey_dead_breve, 0x02D8, - FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_A, 0x1EB6, - FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_a, 0x1EB7, - FcitxKey_Multi_key, FcitxKey_comma, FcitxKey_E, 0x1E1C, - FcitxKey_Multi_key, FcitxKey_comma, FcitxKey_e, 0x1E1D, - FcitxKey_Multi_key, FcitxKey_cedilla, FcitxKey_E, 0x1E1C, - FcitxKey_Multi_key, FcitxKey_cedilla, FcitxKey_e, 0x1E1D, - FcitxKey_space, 0x02D9, - FcitxKey_L, 0x013F, - FcitxKey_i, 0x0131, - FcitxKey_j, 0x0237, - FcitxKey_l, 0x0140, - FcitxKey_nobreakspace, 0x0307, - FcitxKey_Sacute, 0x1E64, - FcitxKey_Scaron, 0x1E66, - FcitxKey_sacute, 0x1E65, - FcitxKey_scaron, 0x1E67, - FcitxKey_Amacron, 0x01E0, - FcitxKey_Omacron, 0x0230, - FcitxKey_amacron, 0x01E1, - FcitxKey_omacron, 0x0231, - FcitxKey_dead_abovedot, 0x02D9, - FcitxKey_dead_stroke, FcitxKey_j, 0x025F, - FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_S, 0x1E68, - FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_s, 0x1E69, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_S, 0x1E64, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_s, 0x1E65, - FcitxKey_Multi_key, FcitxKey_c, FcitxKey_S, 0x1E66, - FcitxKey_Multi_key, FcitxKey_c, FcitxKey_s, 0x1E67, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_S, 0x1E64, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_s, 0x1E65, - FcitxKey_space, 0x0022, - FcitxKey_apostrophe, 0x0344, - FcitxKey_nobreakspace, 0x0308, - FcitxKey_acute, 0x0344, - FcitxKey_Iacute, 0x1E2E, - FcitxKey_Ugrave, 0x01DB, - FcitxKey_Uacute, 0x01D7, - FcitxKey_iacute, 0x1E2F, - FcitxKey_ugrave, 0x01DC, - FcitxKey_uacute, 0x01D8, - 0x01D3, 0x01D9, - 0x01D4, 0x01DA, - FcitxKey_Amacron, 0x01DE, - FcitxKey_Umacron, 0x1E7A, - FcitxKey_amacron, 0x01DF, - FcitxKey_omacron, 0x022B, - FcitxKey_umacron, 0x1E7B, - FcitxKey_Ukrainian_i, 0x0457, - FcitxKey_Ukrainian_I, 0x0407, - FcitxKey_Cyrillic_a, 0x04D3, - FcitxKey_Cyrillic_ie, 0x0451, - FcitxKey_Cyrillic_i, 0x04E5, - FcitxKey_Cyrillic_o, 0x04E7, - FcitxKey_Cyrillic_u, 0x04F1, - FcitxKey_Cyrillic_zhe, 0x04DD, - FcitxKey_Cyrillic_yeru, 0x04F9, - FcitxKey_Cyrillic_ze, 0x04DF, - FcitxKey_Cyrillic_e, 0x04ED, - FcitxKey_Cyrillic_che, 0x04F5, - FcitxKey_Cyrillic_A, 0x04D2, - FcitxKey_Cyrillic_IE, 0x0401, - FcitxKey_Cyrillic_I, 0x04E4, - FcitxKey_Cyrillic_O, 0x04E6, - FcitxKey_Cyrillic_U, 0x04F0, - FcitxKey_Cyrillic_ZHE, 0x04DC, - FcitxKey_Cyrillic_YERU, 0x04F8, - FcitxKey_Cyrillic_ZE, 0x04DE, - FcitxKey_Cyrillic_E, 0x04EC, - FcitxKey_Cyrillic_CHE, 0x04F4, - FcitxKey_Greek_IOTA, 0x03AA, - FcitxKey_Greek_UPSILON, 0x03AB, - FcitxKey_Greek_iota, 0x03CA, - FcitxKey_Greek_upsilon, 0x03CB, - FcitxKey_dead_diaeresis, 0x00A8, - FcitxKey_dead_acute, FcitxKey_space, 0x0385, - FcitxKey_dead_acute, FcitxKey_Greek_iota, 0x0390, - FcitxKey_dead_acute, FcitxKey_Greek_upsilon, 0x03B0, - FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_U, 0x1E7A, - FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_u, 0x1E7B, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_O, 0x1E4E, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_o, 0x1E4F, - FcitxKey_Multi_key, FcitxKey_macron, FcitxKey_U, 0x1E7A, - FcitxKey_Multi_key, FcitxKey_macron, FcitxKey_u, 0x1E7B, - FcitxKey_space, 0x00B0, - FcitxKey_nobreakspace, 0x030A, - FcitxKey_Aacute, 0x01FA, - FcitxKey_aacute, 0x01FB, - FcitxKey_dead_abovering, 0x00B0, - FcitxKey_space, 0x02DD, - FcitxKey_nobreakspace, 0x030B, - FcitxKey_Cyrillic_u, 0x04F3, - FcitxKey_Cyrillic_U, 0x04F2, - FcitxKey_dead_doubleacute, 0x02DD, - FcitxKey_space, 0x02C7, - FcitxKey_parenleft, 0x208D, - FcitxKey_parenright, 0x208E, - FcitxKey_plus, 0x208A, - FcitxKey_minus, 0x208B, - FcitxKey_equal, 0x208C, - FcitxKey_V, 0x01D9, - FcitxKey_v, 0x01DA, - FcitxKey_nobreakspace, 0x030C, - 0x01F2, 0x01C5, - FcitxKey_Sabovedot, 0x1E66, - FcitxKey_sabovedot, 0x1E67, - FcitxKey_dead_caron, 0x02C7, - FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_U, 0x01D9, - FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_u, 0x01DA, - FcitxKey_space, 0x00B8, - FcitxKey_nobreakspace, 0x0327, - FcitxKey_cent, 0x20B5, - FcitxKey_Cacute, 0x1E08, - FcitxKey_cacute, 0x1E09, - FcitxKey_ColonSign, 0x20B5, - FcitxKey_dead_cedilla, 0x00B8, - FcitxKey_space, 0x02DB, - FcitxKey_nobreakspace, 0x0328, - FcitxKey_Omacron, 0x01EC, - FcitxKey_omacron, 0x01ED, - FcitxKey_dead_ogonek, 0x02DB, - FcitxKey_space, 0x037A, - FcitxKey_Greek_alphaaccent, 0x1FB4, - FcitxKey_Greek_etaaccent, 0x1FC4, - FcitxKey_Greek_omegaaccent, 0x1FF4, - FcitxKey_Greek_ALPHA, 0x1FBC, - FcitxKey_Greek_ETA, 0x1FCC, - FcitxKey_Greek_OMEGA, 0x1FFC, - FcitxKey_Greek_alpha, 0x1FB3, - FcitxKey_Greek_eta, 0x1FC3, - FcitxKey_Greek_omega, 0x1FF3, - FcitxKey_dead_iota, 0x037A, - FcitxKey_dead_grave, FcitxKey_Greek_alpha, 0x1FB2, - FcitxKey_dead_grave, FcitxKey_Greek_eta, 0x1FC2, - FcitxKey_dead_grave, FcitxKey_Greek_omega, 0x1FF2, - FcitxKey_dead_acute, FcitxKey_Greek_alpha, 0x1FB4, - FcitxKey_dead_acute, FcitxKey_Greek_eta, 0x1FC4, - FcitxKey_dead_acute, FcitxKey_Greek_omega, 0x1FF4, - FcitxKey_dead_tilde, FcitxKey_Greek_alpha, 0x1FB7, - FcitxKey_dead_tilde, FcitxKey_Greek_eta, 0x1FC7, - FcitxKey_dead_tilde, FcitxKey_Greek_omega, 0x1FF7, - FcitxKey_dead_tilde, 0x1F00, 0x1F86, - FcitxKey_dead_tilde, 0x1F01, 0x1F87, - FcitxKey_dead_tilde, 0x1F08, 0x1F8E, - FcitxKey_dead_tilde, 0x1F09, 0x1F8F, - FcitxKey_dead_tilde, 0x1F20, 0x1F96, - FcitxKey_dead_tilde, 0x1F21, 0x1F97, - FcitxKey_dead_tilde, 0x1F28, 0x1F9E, - FcitxKey_dead_tilde, 0x1F29, 0x1F9F, - FcitxKey_dead_tilde, 0x1F60, 0x1FA6, - FcitxKey_dead_tilde, 0x1F61, 0x1FA7, - FcitxKey_dead_tilde, 0x1F68, 0x1FAE, - FcitxKey_dead_tilde, 0x1F69, 0x1FAF, - FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F88, - FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F98, - FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FA8, - FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F80, - FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F90, - FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA0, - FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F89, - FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F99, - FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FA9, - FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F81, - FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F91, - FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA1, - FcitxKey_dead_grave, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8A, - FcitxKey_dead_grave, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9A, - FcitxKey_dead_grave, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAA, - FcitxKey_dead_grave, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F82, - FcitxKey_dead_grave, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F92, - FcitxKey_dead_grave, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA2, - FcitxKey_dead_grave, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8B, - FcitxKey_dead_grave, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9B, - FcitxKey_dead_grave, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAB, - FcitxKey_dead_grave, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F83, - FcitxKey_dead_grave, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F93, - FcitxKey_dead_grave, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA3, - FcitxKey_dead_acute, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8C, - FcitxKey_dead_acute, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9C, - FcitxKey_dead_acute, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAC, - FcitxKey_dead_acute, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F84, - FcitxKey_dead_acute, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F94, - FcitxKey_dead_acute, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA4, - FcitxKey_dead_acute, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8D, - FcitxKey_dead_acute, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9D, - FcitxKey_dead_acute, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAD, - FcitxKey_dead_acute, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F85, - FcitxKey_dead_acute, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F95, - FcitxKey_dead_acute, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA5, - FcitxKey_dead_tilde, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8E, - FcitxKey_dead_tilde, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9E, - FcitxKey_dead_tilde, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAE, - FcitxKey_dead_tilde, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F86, - FcitxKey_dead_tilde, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F96, - FcitxKey_dead_tilde, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA6, - FcitxKey_dead_tilde, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8F, - FcitxKey_dead_tilde, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9F, - FcitxKey_dead_tilde, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAF, - FcitxKey_dead_tilde, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F87, - FcitxKey_dead_tilde, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F97, - FcitxKey_dead_tilde, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA7, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_Greek_alpha, 0x1FB4, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_Greek_eta, 0x1FC4, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_Greek_omega, 0x1FF4, - FcitxKey_Multi_key, FcitxKey_apostrophe, 0x1F00, 0x1F84, - FcitxKey_Multi_key, FcitxKey_apostrophe, 0x1F01, 0x1F85, - FcitxKey_Multi_key, FcitxKey_apostrophe, 0x1F08, 0x1F8C, - FcitxKey_Multi_key, FcitxKey_apostrophe, 0x1F09, 0x1F8D, - FcitxKey_Multi_key, FcitxKey_apostrophe, 0x1F20, 0x1F94, - FcitxKey_Multi_key, FcitxKey_apostrophe, 0x1F21, 0x1F95, - FcitxKey_Multi_key, FcitxKey_apostrophe, 0x1F28, 0x1F9C, - FcitxKey_Multi_key, FcitxKey_apostrophe, 0x1F29, 0x1F9D, - FcitxKey_Multi_key, FcitxKey_apostrophe, 0x1F60, 0x1FA4, - FcitxKey_Multi_key, FcitxKey_apostrophe, 0x1F61, 0x1FA5, - FcitxKey_Multi_key, FcitxKey_apostrophe, 0x1F68, 0x1FAC, - FcitxKey_Multi_key, FcitxKey_apostrophe, 0x1F69, 0x1FAD, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F89, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F99, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FA9, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F81, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F91, - FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA1, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F88, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F98, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FA8, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F80, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F90, - FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA0, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_Greek_alpha, 0x1FB2, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_Greek_eta, 0x1FC2, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_Greek_omega, 0x1FF2, - FcitxKey_Multi_key, FcitxKey_grave, 0x1F00, 0x1F82, - FcitxKey_Multi_key, FcitxKey_grave, 0x1F01, 0x1F83, - FcitxKey_Multi_key, FcitxKey_grave, 0x1F08, 0x1F8A, - FcitxKey_Multi_key, FcitxKey_grave, 0x1F09, 0x1F8B, - FcitxKey_Multi_key, FcitxKey_grave, 0x1F20, 0x1F92, - FcitxKey_Multi_key, FcitxKey_grave, 0x1F21, 0x1F93, - FcitxKey_Multi_key, FcitxKey_grave, 0x1F28, 0x1F9A, - FcitxKey_Multi_key, FcitxKey_grave, 0x1F29, 0x1F9B, - FcitxKey_Multi_key, FcitxKey_grave, 0x1F60, 0x1FA2, - FcitxKey_Multi_key, FcitxKey_grave, 0x1F61, 0x1FA3, - FcitxKey_Multi_key, FcitxKey_grave, 0x1F68, 0x1FAA, - FcitxKey_Multi_key, FcitxKey_grave, 0x1F69, 0x1FAB, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_Greek_alpha, 0x1FB7, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_Greek_eta, 0x1FC7, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_Greek_omega, 0x1FF7, - FcitxKey_Multi_key, FcitxKey_asciitilde, 0x1F00, 0x1F86, - FcitxKey_Multi_key, FcitxKey_asciitilde, 0x1F01, 0x1F87, - FcitxKey_Multi_key, FcitxKey_asciitilde, 0x1F08, 0x1F8E, - FcitxKey_Multi_key, FcitxKey_asciitilde, 0x1F09, 0x1F8F, - FcitxKey_Multi_key, FcitxKey_asciitilde, 0x1F20, 0x1F96, - FcitxKey_Multi_key, FcitxKey_asciitilde, 0x1F21, 0x1F97, - FcitxKey_Multi_key, FcitxKey_asciitilde, 0x1F28, 0x1F9E, - FcitxKey_Multi_key, FcitxKey_asciitilde, 0x1F29, 0x1F9F, - FcitxKey_Multi_key, FcitxKey_asciitilde, 0x1F60, 0x1FA6, - FcitxKey_Multi_key, FcitxKey_asciitilde, 0x1F61, 0x1FA7, - FcitxKey_Multi_key, FcitxKey_asciitilde, 0x1F68, 0x1FAE, - FcitxKey_Multi_key, FcitxKey_asciitilde, 0x1F69, 0x1FAF, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_Greek_alpha, 0x1FB4, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_Greek_eta, 0x1FC4, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_Greek_omega, 0x1FF4, - FcitxKey_Multi_key, FcitxKey_acute, 0x1F00, 0x1F84, - FcitxKey_Multi_key, FcitxKey_acute, 0x1F01, 0x1F85, - FcitxKey_Multi_key, FcitxKey_acute, 0x1F08, 0x1F8C, - FcitxKey_Multi_key, FcitxKey_acute, 0x1F09, 0x1F8D, - FcitxKey_Multi_key, FcitxKey_acute, 0x1F20, 0x1F94, - FcitxKey_Multi_key, FcitxKey_acute, 0x1F21, 0x1F95, - FcitxKey_Multi_key, FcitxKey_acute, 0x1F28, 0x1F9C, - FcitxKey_Multi_key, FcitxKey_acute, 0x1F29, 0x1F9D, - FcitxKey_Multi_key, FcitxKey_acute, 0x1F60, 0x1FA4, - FcitxKey_Multi_key, FcitxKey_acute, 0x1F61, 0x1FA5, - FcitxKey_Multi_key, FcitxKey_acute, 0x1F68, 0x1FAC, - FcitxKey_Multi_key, FcitxKey_acute, 0x1F69, 0x1FAD, - FcitxKey_dead_grave, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8B, - FcitxKey_dead_grave, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9B, - FcitxKey_dead_grave, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAB, - FcitxKey_dead_grave, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F83, - FcitxKey_dead_grave, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F93, - FcitxKey_dead_grave, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA3, - FcitxKey_dead_grave, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8A, - FcitxKey_dead_grave, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9A, - FcitxKey_dead_grave, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAA, - FcitxKey_dead_grave, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F82, - FcitxKey_dead_grave, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F92, - FcitxKey_dead_grave, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA2, - FcitxKey_dead_acute, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8D, - FcitxKey_dead_acute, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9D, - FcitxKey_dead_acute, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAD, - FcitxKey_dead_acute, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F85, - FcitxKey_dead_acute, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F95, - FcitxKey_dead_acute, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA5, - FcitxKey_dead_acute, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8C, - FcitxKey_dead_acute, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9C, - FcitxKey_dead_acute, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAC, - FcitxKey_dead_acute, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F84, - FcitxKey_dead_acute, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F94, - FcitxKey_dead_acute, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA4, - FcitxKey_dead_tilde, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8F, - FcitxKey_dead_tilde, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9F, - FcitxKey_dead_tilde, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAF, - FcitxKey_dead_tilde, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F87, - FcitxKey_dead_tilde, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F97, - FcitxKey_dead_tilde, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA7, - FcitxKey_dead_tilde, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8E, - FcitxKey_dead_tilde, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9E, - FcitxKey_dead_tilde, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAE, - FcitxKey_dead_tilde, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F86, - FcitxKey_dead_tilde, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F96, - FcitxKey_dead_tilde, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA6, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8D, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9D, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAD, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F85, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F95, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA5, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8C, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9C, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAC, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F84, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F94, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA4, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8C, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9C, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAC, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F84, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F94, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA4, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8D, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9D, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAD, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F85, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F95, - FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA5, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8B, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9B, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAB, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F83, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F93, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA3, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8A, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9A, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAA, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F82, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F92, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA2, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8A, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9A, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAA, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F82, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F92, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA2, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8B, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9B, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAB, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F83, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F93, - FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA3, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8F, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9F, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAF, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F87, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F97, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA7, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8E, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9E, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAE, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F86, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F96, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA6, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8E, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9E, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAE, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F86, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F96, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA6, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8F, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9F, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAF, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F87, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F97, - FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA7, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8D, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9D, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAD, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F85, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F95, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA5, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8C, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9C, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAC, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F84, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F94, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA4, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8C, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9C, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAC, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F84, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F94, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA4, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8D, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9D, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAD, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F85, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F95, - FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA5, - FcitxKey_kana_WO, 0x30FA, - FcitxKey_kana_U, 0x30F4, - FcitxKey_kana_KA, 0x30AC, - FcitxKey_kana_KI, 0x30AE, - FcitxKey_kana_KU, 0x30B0, - FcitxKey_kana_KE, 0x30B2, - FcitxKey_kana_KO, 0x30B4, - FcitxKey_kana_SA, 0x30B6, - FcitxKey_kana_SHI, 0x30B8, - FcitxKey_kana_SU, 0x30BA, - FcitxKey_kana_SE, 0x30BC, - FcitxKey_kana_SO, 0x30BE, - FcitxKey_kana_TA, 0x30C0, - FcitxKey_kana_CHI, 0x30C2, - FcitxKey_kana_TSU, 0x30C5, - FcitxKey_kana_TE, 0x30C7, - FcitxKey_kana_TO, 0x30C9, - FcitxKey_kana_HA, 0x30D0, - FcitxKey_kana_HI, 0x30D3, - FcitxKey_kana_FU, 0x30D6, - FcitxKey_kana_HE, 0x30D9, - FcitxKey_kana_HO, 0x30DC, - FcitxKey_kana_WA, 0x30F7, - FcitxKey_kana_HA, 0x30D1, - FcitxKey_kana_HI, 0x30D4, - FcitxKey_kana_FU, 0x30D7, - FcitxKey_kana_HE, 0x30DA, - FcitxKey_kana_HO, 0x30DD, - FcitxKey_plus, 0x2A25, - FcitxKey_minus, 0x2A2A, - FcitxKey_equal, 0x2A66, - FcitxKey_Abreve, 0x1EB6, - FcitxKey_abreve, 0x1EB7, - FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_O, 0x1EE2, - FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_U, 0x1EF0, - FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_o, 0x1EE3, - FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_u, 0x1EF1, - FcitxKey_space, 0x0309, - FcitxKey_B, 0x0181, - FcitxKey_C, 0x0187, - FcitxKey_D, 0x018A, - FcitxKey_F, 0x0191, - FcitxKey_G, 0x0193, - FcitxKey_K, 0x0198, - FcitxKey_M, 0x2C6E, - FcitxKey_N, 0x019D, - FcitxKey_P, 0x01A4, - FcitxKey_T, 0x01AC, - FcitxKey_V, 0x01B2, - FcitxKey_W, 0x2C72, - FcitxKey_Z, 0x0224, - FcitxKey_b, 0x0253, - FcitxKey_c, 0x0188, - FcitxKey_d, 0x0257, - FcitxKey_f, 0x0192, - FcitxKey_g, 0x0260, - FcitxKey_h, 0x0266, - FcitxKey_k, 0x0199, - FcitxKey_m, 0x0271, - FcitxKey_n, 0x0272, - FcitxKey_p, 0x01A5, - FcitxKey_q, 0x02A0, - FcitxKey_s, 0x0282, - FcitxKey_t, 0x01AD, - FcitxKey_v, 0x028B, - FcitxKey_w, 0x2C73, - FcitxKey_z, 0x0225, - FcitxKey_nobreakspace, 0x0309, - FcitxKey_Abreve, 0x1EB2, - FcitxKey_abreve, 0x1EB3, - 0x0256, 0x1D91, - FcitxKey_schwa, 0x025A, - 0x025C, 0x025D, - 0x025F, 0x0284, - 0x0279, 0x027B, - FcitxKey_dead_hook, 0x0309, - FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_O, 0x1EDE, - FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_U, 0x1EEC, - FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_o, 0x1EDF, - FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_u, 0x1EED, - FcitxKey_Multi_key, FcitxKey_U, FcitxKey_A, 0x1EB2, - FcitxKey_Multi_key, FcitxKey_U, FcitxKey_a, 0x1EB3, - FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_A, 0x1EA8, - FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_E, 0x1EC2, - FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_O, 0x1ED4, - FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_a, 0x1EA9, - FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_e, 0x1EC3, - FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_o, 0x1ED5, - FcitxKey_Multi_key, FcitxKey_b, FcitxKey_A, 0x1EB2, - FcitxKey_Multi_key, FcitxKey_b, FcitxKey_a, 0x1EB3, - FcitxKey_Greek_ALPHA, 0x1F08, - FcitxKey_Greek_EPSILON, 0x1F18, - FcitxKey_Greek_ETA, 0x1F28, - FcitxKey_Greek_IOTA, 0x1F38, - FcitxKey_Greek_OMICRON, 0x1F48, - FcitxKey_Greek_OMEGA, 0x1F68, - FcitxKey_Greek_alpha, 0x1F00, - FcitxKey_Greek_epsilon, 0x1F10, - FcitxKey_Greek_eta, 0x1F20, - FcitxKey_Greek_iota, 0x1F30, - FcitxKey_Greek_omicron, 0x1F40, - FcitxKey_Greek_rho, 0x1FE4, - FcitxKey_Greek_upsilon, 0x1F50, - FcitxKey_Greek_omega, 0x1F60, - FcitxKey_Greek_ALPHA, 0x1F09, - FcitxKey_Greek_EPSILON, 0x1F19, - FcitxKey_Greek_ETA, 0x1F29, - FcitxKey_Greek_IOTA, 0x1F39, - FcitxKey_Greek_OMICRON, 0x1F49, - FcitxKey_Greek_RHO, 0x1FEC, - FcitxKey_Greek_UPSILON, 0x1F59, - FcitxKey_Greek_OMEGA, 0x1F69, - FcitxKey_Greek_alpha, 0x1F01, - FcitxKey_Greek_epsilon, 0x1F11, - FcitxKey_Greek_eta, 0x1F21, - FcitxKey_Greek_iota, 0x1F31, - FcitxKey_Greek_omicron, 0x1F41, - FcitxKey_Greek_rho, 0x1FE5, - FcitxKey_Greek_upsilon, 0x1F51, - FcitxKey_Greek_omega, 0x1F61, - FcitxKey_space, FcitxKey_space, 0x00A0, - FcitxKey_space, FcitxKey_apostrophe, 0x0027, - FcitxKey_space, FcitxKey_parenleft, 0x02D8, - FcitxKey_space, FcitxKey_comma, 0x00B8, - FcitxKey_space, FcitxKey_minus, 0x007E, - FcitxKey_space, FcitxKey_period, 0x2008, - FcitxKey_space, FcitxKey_less, 0x02C7, - FcitxKey_space, FcitxKey_greater, 0x005E, - FcitxKey_space, FcitxKey_asciicircum, 0x005E, - FcitxKey_space, FcitxKey_grave, 0x0060, - FcitxKey_space, FcitxKey_asciitilde, 0x007E, - FcitxKey_exclam, FcitxKey_exclam, 0x00A1, - FcitxKey_exclam, FcitxKey_question, 0x203D, - FcitxKey_exclam, FcitxKey_A, 0x1EA0, - FcitxKey_exclam, FcitxKey_B, 0x1E04, - FcitxKey_exclam, FcitxKey_D, 0x1E0C, - FcitxKey_exclam, FcitxKey_E, 0x1EB8, - FcitxKey_exclam, FcitxKey_H, 0x1E24, - FcitxKey_exclam, FcitxKey_I, 0x1ECA, - FcitxKey_exclam, FcitxKey_K, 0x1E32, - FcitxKey_exclam, FcitxKey_L, 0x1E36, - FcitxKey_exclam, FcitxKey_M, 0x1E42, - FcitxKey_exclam, FcitxKey_N, 0x1E46, - FcitxKey_exclam, FcitxKey_O, 0x1ECC, - FcitxKey_exclam, FcitxKey_P, 0x00B6, - FcitxKey_exclam, FcitxKey_R, 0x1E5A, - FcitxKey_exclam, FcitxKey_S, 0x00A7, - FcitxKey_exclam, FcitxKey_T, 0x1E6C, - FcitxKey_exclam, FcitxKey_U, 0x1EE4, - FcitxKey_exclam, FcitxKey_V, 0x1E7E, - FcitxKey_exclam, FcitxKey_W, 0x1E88, - FcitxKey_exclam, FcitxKey_Y, 0x1EF4, - FcitxKey_exclam, FcitxKey_Z, 0x1E92, - FcitxKey_exclam, FcitxKey_asciicircum, 0x00A6, - FcitxKey_exclam, FcitxKey_a, 0x1EA1, - FcitxKey_exclam, FcitxKey_b, 0x1E05, - FcitxKey_exclam, FcitxKey_d, 0x1E0D, - FcitxKey_exclam, FcitxKey_e, 0x1EB9, - FcitxKey_exclam, FcitxKey_h, 0x1E25, - FcitxKey_exclam, FcitxKey_i, 0x1ECB, - FcitxKey_exclam, FcitxKey_k, 0x1E33, - FcitxKey_exclam, FcitxKey_l, 0x1E37, - FcitxKey_exclam, FcitxKey_m, 0x1E43, - FcitxKey_exclam, FcitxKey_n, 0x1E47, - FcitxKey_exclam, FcitxKey_o, 0x1ECD, - FcitxKey_exclam, FcitxKey_p, 0x00B6, - FcitxKey_exclam, FcitxKey_r, 0x1E5B, - FcitxKey_exclam, FcitxKey_s, 0x00A7, - FcitxKey_exclam, FcitxKey_t, 0x1E6D, - FcitxKey_exclam, FcitxKey_u, 0x1EE5, - FcitxKey_exclam, FcitxKey_v, 0x1E7F, - FcitxKey_exclam, FcitxKey_w, 0x1E89, - FcitxKey_exclam, FcitxKey_y, 0x1EF5, - FcitxKey_exclam, FcitxKey_z, 0x1E93, - FcitxKey_exclam, FcitxKey_Ohorn, 0x1EE2, - FcitxKey_exclam, FcitxKey_ohorn, 0x1EE3, - FcitxKey_exclam, FcitxKey_Uhorn, 0x1EF0, - FcitxKey_exclam, FcitxKey_uhorn, 0x1EF1, - FcitxKey_quotedbl, FcitxKey_quotedbl, 0x00A8, - FcitxKey_quotedbl, FcitxKey_apostrophe, 0x0344, - FcitxKey_quotedbl, FcitxKey_comma, 0x201E, - FcitxKey_quotedbl, FcitxKey_slash, 0x301E, - FcitxKey_quotedbl, FcitxKey_less, 0x201C, - FcitxKey_quotedbl, FcitxKey_greater, 0x201D, - FcitxKey_quotedbl, FcitxKey_A, 0x00C4, - FcitxKey_quotedbl, FcitxKey_E, 0x00CB, - FcitxKey_quotedbl, FcitxKey_H, 0x1E26, - FcitxKey_quotedbl, FcitxKey_I, 0x00CF, - FcitxKey_quotedbl, FcitxKey_O, 0x00D6, - FcitxKey_quotedbl, FcitxKey_U, 0x00DC, - FcitxKey_quotedbl, FcitxKey_W, 0x1E84, - FcitxKey_quotedbl, FcitxKey_X, 0x1E8C, - FcitxKey_quotedbl, FcitxKey_Y, 0x0178, - FcitxKey_quotedbl, FcitxKey_backslash, 0x301D, - FcitxKey_quotedbl, FcitxKey_a, 0x00E4, - FcitxKey_quotedbl, FcitxKey_e, 0x00EB, - FcitxKey_quotedbl, FcitxKey_h, 0x1E27, - FcitxKey_quotedbl, FcitxKey_i, 0x00EF, - FcitxKey_quotedbl, FcitxKey_o, 0x00F6, - FcitxKey_quotedbl, FcitxKey_t, 0x1E97, - FcitxKey_quotedbl, FcitxKey_u, 0x00FC, - FcitxKey_quotedbl, FcitxKey_w, 0x1E85, - FcitxKey_quotedbl, FcitxKey_x, 0x1E8D, - FcitxKey_quotedbl, FcitxKey_y, 0x00FF, - FcitxKey_quotedbl, FcitxKey_acute, 0x0344, - FcitxKey_quotedbl, FcitxKey_Otilde, 0x1E4E, - FcitxKey_quotedbl, FcitxKey_otilde, 0x1E4F, - FcitxKey_quotedbl, 0x03D2, 0x03D4, - FcitxKey_quotedbl, FcitxKey_Umacron, 0x1E7A, - FcitxKey_quotedbl, FcitxKey_umacron, 0x1E7B, - FcitxKey_quotedbl, 0x04D8, 0x04DA, - FcitxKey_quotedbl, 0x04D9, 0x04DB, - FcitxKey_quotedbl, 0x04E8, 0x04EA, - FcitxKey_quotedbl, 0x04E9, 0x04EB, - FcitxKey_quotedbl, FcitxKey_Ukrainian_i, 0x0457, - FcitxKey_quotedbl, FcitxKey_Ukrainian_I, 0x0407, - FcitxKey_quotedbl, FcitxKey_Cyrillic_a, 0x04D3, - FcitxKey_quotedbl, FcitxKey_Cyrillic_ie, 0x0451, - FcitxKey_quotedbl, FcitxKey_Cyrillic_i, 0x04E5, - FcitxKey_quotedbl, FcitxKey_Cyrillic_o, 0x04E7, - FcitxKey_quotedbl, FcitxKey_Cyrillic_u, 0x04F1, - FcitxKey_quotedbl, FcitxKey_Cyrillic_zhe, 0x04DD, - FcitxKey_quotedbl, FcitxKey_Cyrillic_yeru, 0x04F9, - FcitxKey_quotedbl, FcitxKey_Cyrillic_ze, 0x04DF, - FcitxKey_quotedbl, FcitxKey_Cyrillic_e, 0x04ED, - FcitxKey_quotedbl, FcitxKey_Cyrillic_che, 0x04F5, - FcitxKey_quotedbl, FcitxKey_Cyrillic_A, 0x04D2, - FcitxKey_quotedbl, FcitxKey_Cyrillic_IE, 0x0401, - FcitxKey_quotedbl, FcitxKey_Cyrillic_I, 0x04E4, - FcitxKey_quotedbl, FcitxKey_Cyrillic_O, 0x04E6, - FcitxKey_quotedbl, FcitxKey_Cyrillic_U, 0x04F0, - FcitxKey_quotedbl, FcitxKey_Cyrillic_ZHE, 0x04DC, - FcitxKey_quotedbl, FcitxKey_Cyrillic_YERU, 0x04F8, - FcitxKey_quotedbl, FcitxKey_Cyrillic_ZE, 0x04DE, - FcitxKey_quotedbl, FcitxKey_Cyrillic_E, 0x04EC, - FcitxKey_quotedbl, FcitxKey_Cyrillic_CHE, 0x04F4, - FcitxKey_quotedbl, FcitxKey_Greek_IOTA, 0x03AA, - FcitxKey_quotedbl, FcitxKey_Greek_UPSILON, 0x03AB, - FcitxKey_quotedbl, FcitxKey_Greek_iota, 0x03CA, - FcitxKey_quotedbl, FcitxKey_Greek_upsilon, 0x03CB, - FcitxKey_quotedbl, FcitxKey_dead_acute, 0x0344, - FcitxKey_numbersign, FcitxKey_numbersign, 0x266F, - FcitxKey_numbersign, FcitxKey_b, 0x266D, - FcitxKey_numbersign, FcitxKey_f, 0x266E, - FcitxKey_percent, FcitxKey_o, 0x2030, - FcitxKey_apostrophe, FcitxKey_space, 0x0027, - FcitxKey_apostrophe, FcitxKey_apostrophe, 0x00B4, - FcitxKey_apostrophe, FcitxKey_comma, 0x201A, - FcitxKey_apostrophe, FcitxKey_less, 0x2018, - FcitxKey_apostrophe, FcitxKey_greater, 0x2019, - FcitxKey_apostrophe, FcitxKey_A, 0x00C1, - FcitxKey_apostrophe, FcitxKey_C, 0x0106, - FcitxKey_apostrophe, FcitxKey_E, 0x00C9, - FcitxKey_apostrophe, FcitxKey_G, 0x01F4, - FcitxKey_apostrophe, FcitxKey_I, 0x00CD, - FcitxKey_apostrophe, FcitxKey_K, 0x1E30, - FcitxKey_apostrophe, FcitxKey_L, 0x0139, - FcitxKey_apostrophe, FcitxKey_M, 0x1E3E, - FcitxKey_apostrophe, FcitxKey_N, 0x0143, - FcitxKey_apostrophe, FcitxKey_O, 0x00D3, - FcitxKey_apostrophe, FcitxKey_P, 0x1E54, - FcitxKey_apostrophe, FcitxKey_R, 0x0154, - FcitxKey_apostrophe, FcitxKey_S, 0x015A, - FcitxKey_apostrophe, FcitxKey_U, 0x00DA, - FcitxKey_apostrophe, FcitxKey_W, 0x1E82, - FcitxKey_apostrophe, FcitxKey_Y, 0x00DD, - FcitxKey_apostrophe, FcitxKey_Z, 0x0179, - FcitxKey_apostrophe, FcitxKey_a, 0x00E1, - FcitxKey_apostrophe, FcitxKey_c, 0x0107, - FcitxKey_apostrophe, FcitxKey_e, 0x00E9, - FcitxKey_apostrophe, FcitxKey_g, 0x01F5, - FcitxKey_apostrophe, FcitxKey_i, 0x00ED, - FcitxKey_apostrophe, FcitxKey_k, 0x1E31, - FcitxKey_apostrophe, FcitxKey_l, 0x013A, - FcitxKey_apostrophe, FcitxKey_m, 0x1E3F, - FcitxKey_apostrophe, FcitxKey_n, 0x0144, - FcitxKey_apostrophe, FcitxKey_o, 0x00F3, - FcitxKey_apostrophe, FcitxKey_p, 0x1E55, - FcitxKey_apostrophe, FcitxKey_r, 0x0155, - FcitxKey_apostrophe, FcitxKey_s, 0x015B, - FcitxKey_apostrophe, FcitxKey_u, 0x00FA, - FcitxKey_apostrophe, FcitxKey_w, 0x1E83, - FcitxKey_apostrophe, FcitxKey_y, 0x00FD, - FcitxKey_apostrophe, FcitxKey_z, 0x017A, - FcitxKey_apostrophe, FcitxKey_Acircumflex, 0x1EA4, - FcitxKey_apostrophe, FcitxKey_Aring, 0x01FA, - FcitxKey_apostrophe, FcitxKey_AE, 0x01FC, - FcitxKey_apostrophe, FcitxKey_Ccedilla, 0x1E08, - FcitxKey_apostrophe, FcitxKey_Ecircumflex, 0x1EBE, - FcitxKey_apostrophe, FcitxKey_Idiaeresis, 0x1E2E, - FcitxKey_apostrophe, FcitxKey_Ocircumflex, 0x1ED0, - FcitxKey_apostrophe, FcitxKey_Otilde, 0x1E4C, - FcitxKey_apostrophe, FcitxKey_Ooblique, 0x01FE, - FcitxKey_apostrophe, 0x00DC, 0x01D7, - FcitxKey_apostrophe, FcitxKey_acircumflex, 0x1EA5, - FcitxKey_apostrophe, FcitxKey_aring, 0x01FB, - FcitxKey_apostrophe, FcitxKey_ae, 0x01FD, - FcitxKey_apostrophe, FcitxKey_ccedilla, 0x1E09, - FcitxKey_apostrophe, FcitxKey_ecircumflex, 0x1EBF, - FcitxKey_apostrophe, FcitxKey_idiaeresis, 0x1E2F, - FcitxKey_apostrophe, FcitxKey_ocircumflex, 0x1ED1, - FcitxKey_apostrophe, FcitxKey_otilde, 0x1E4D, - FcitxKey_apostrophe, FcitxKey_oslash, 0x01FF, - FcitxKey_apostrophe, FcitxKey_udiaeresis, 0x01D8, - FcitxKey_apostrophe, FcitxKey_Ohorn, 0x1EDA, - FcitxKey_apostrophe, FcitxKey_ohorn, 0x1EDB, - FcitxKey_apostrophe, FcitxKey_Uhorn, 0x1EE8, - FcitxKey_apostrophe, FcitxKey_uhorn, 0x1EE9, - FcitxKey_apostrophe, FcitxKey_Abreve, 0x1EAE, - FcitxKey_apostrophe, FcitxKey_abreve, 0x1EAF, - FcitxKey_apostrophe, FcitxKey_Emacron, 0x1E16, - FcitxKey_apostrophe, FcitxKey_emacron, 0x1E17, - FcitxKey_apostrophe, FcitxKey_Omacron, 0x1E52, - FcitxKey_apostrophe, FcitxKey_Utilde, 0x1E78, - FcitxKey_apostrophe, FcitxKey_omacron, 0x1E53, - FcitxKey_apostrophe, FcitxKey_utilde, 0x1E79, - FcitxKey_apostrophe, FcitxKey_Cyrillic_ghe, 0x0453, - FcitxKey_apostrophe, FcitxKey_Cyrillic_ka, 0x045C, - FcitxKey_apostrophe, FcitxKey_Cyrillic_GHE, 0x0403, - FcitxKey_apostrophe, FcitxKey_Cyrillic_KA, 0x040C, - FcitxKey_apostrophe, FcitxKey_Greek_iotadieresis, 0x0390, - FcitxKey_apostrophe, FcitxKey_Greek_upsilondieresis, 0x03B0, - FcitxKey_apostrophe, FcitxKey_Greek_ALPHA, 0x0386, - FcitxKey_apostrophe, FcitxKey_Greek_EPSILON, 0x0388, - FcitxKey_apostrophe, FcitxKey_Greek_ETA, 0x0389, - FcitxKey_apostrophe, FcitxKey_Greek_IOTA, 0x038A, - FcitxKey_apostrophe, FcitxKey_Greek_OMICRON, 0x038C, - FcitxKey_apostrophe, FcitxKey_Greek_UPSILON, 0x038E, - FcitxKey_apostrophe, FcitxKey_Greek_OMEGA, 0x038F, - FcitxKey_apostrophe, FcitxKey_Greek_alpha, 0x03AC, - FcitxKey_apostrophe, FcitxKey_Greek_epsilon, 0x03AD, - FcitxKey_apostrophe, FcitxKey_Greek_eta, 0x03AE, - FcitxKey_apostrophe, FcitxKey_Greek_iota, 0x03AF, - FcitxKey_apostrophe, FcitxKey_Greek_omicron, 0x03CC, - FcitxKey_apostrophe, FcitxKey_Greek_upsilon, 0x03CD, - FcitxKey_apostrophe, FcitxKey_Greek_omega, 0x03CE, - FcitxKey_apostrophe, 0x1F00, 0x1F04, - FcitxKey_apostrophe, 0x1F01, 0x1F05, - FcitxKey_apostrophe, 0x1F08, 0x1F0C, - FcitxKey_apostrophe, 0x1F09, 0x1F0D, - FcitxKey_apostrophe, 0x1F10, 0x1F14, - FcitxKey_apostrophe, 0x1F11, 0x1F15, - FcitxKey_apostrophe, 0x1F18, 0x1F1C, - FcitxKey_apostrophe, 0x1F19, 0x1F1D, - FcitxKey_apostrophe, 0x1F20, 0x1F24, - FcitxKey_apostrophe, 0x1F21, 0x1F25, - FcitxKey_apostrophe, 0x1F28, 0x1F2C, - FcitxKey_apostrophe, 0x1F29, 0x1F2D, - FcitxKey_apostrophe, 0x1F30, 0x1F34, - FcitxKey_apostrophe, 0x1F31, 0x1F35, - FcitxKey_apostrophe, 0x1F38, 0x1F3C, - FcitxKey_apostrophe, 0x1F39, 0x1F3D, - FcitxKey_apostrophe, 0x1F40, 0x1F44, - FcitxKey_apostrophe, 0x1F41, 0x1F45, - FcitxKey_apostrophe, 0x1F48, 0x1F4C, - FcitxKey_apostrophe, 0x1F49, 0x1F4D, - FcitxKey_apostrophe, 0x1F50, 0x1F54, - FcitxKey_apostrophe, 0x1F51, 0x1F55, - FcitxKey_apostrophe, 0x1F59, 0x1F5D, - FcitxKey_apostrophe, 0x1F60, 0x1F64, - FcitxKey_apostrophe, 0x1F61, 0x1F65, - FcitxKey_apostrophe, 0x1F68, 0x1F6C, - FcitxKey_apostrophe, 0x1F69, 0x1F6D, - FcitxKey_parenleft, FcitxKey_space, 0x02D8, - FcitxKey_parenleft, FcitxKey_parenleft, 0x005B, - FcitxKey_parenleft, FcitxKey_minus, 0x007B, - FcitxKey_parenleft, FcitxKey_A, 0x0102, - FcitxKey_parenleft, FcitxKey_G, 0x011E, - FcitxKey_parenleft, FcitxKey_a, 0x0103, - FcitxKey_parenleft, FcitxKey_c, 0x00A9, - FcitxKey_parenleft, FcitxKey_g, 0x011F, - FcitxKey_parenleft, FcitxKey_r, 0x00AE, - FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F09, - FcitxKey_parenleft, FcitxKey_Greek_EPSILON, 0x1F19, - FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F29, - FcitxKey_parenleft, FcitxKey_Greek_IOTA, 0x1F39, - FcitxKey_parenleft, FcitxKey_Greek_OMICRON, 0x1F49, - FcitxKey_parenleft, FcitxKey_Greek_RHO, 0x1FEC, - FcitxKey_parenleft, FcitxKey_Greek_UPSILON, 0x1F59, - FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1F69, - FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F01, - FcitxKey_parenleft, FcitxKey_Greek_epsilon, 0x1F11, - FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F21, - FcitxKey_parenleft, FcitxKey_Greek_iota, 0x1F31, - FcitxKey_parenleft, FcitxKey_Greek_omicron, 0x1F41, - FcitxKey_parenleft, FcitxKey_Greek_rho, 0x1FE5, - FcitxKey_parenleft, FcitxKey_Greek_upsilon, 0x1F51, - FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1F61, - FcitxKey_parenright, FcitxKey_parenright, 0x005D, - FcitxKey_parenright, FcitxKey_minus, 0x007D, - FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F08, - FcitxKey_parenright, FcitxKey_Greek_EPSILON, 0x1F18, - FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F28, - FcitxKey_parenright, FcitxKey_Greek_IOTA, 0x1F38, - FcitxKey_parenright, FcitxKey_Greek_OMICRON, 0x1F48, - FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1F68, - FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F00, - FcitxKey_parenright, FcitxKey_Greek_epsilon, 0x1F10, - FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F20, - FcitxKey_parenright, FcitxKey_Greek_iota, 0x1F30, - FcitxKey_parenright, FcitxKey_Greek_omicron, 0x1F40, - FcitxKey_parenright, FcitxKey_Greek_rho, 0x1FE4, - FcitxKey_parenright, FcitxKey_Greek_upsilon, 0x1F50, - FcitxKey_parenright, FcitxKey_Greek_omega, 0x1F60, - FcitxKey_asterisk, FcitxKey_0, 0x00B0, - FcitxKey_asterisk, FcitxKey_A, 0x00C5, - FcitxKey_asterisk, FcitxKey_U, 0x016E, - FcitxKey_asterisk, FcitxKey_a, 0x00E5, - FcitxKey_asterisk, FcitxKey_u, 0x016F, - FcitxKey_plus, FcitxKey_plus, 0x0023, - FcitxKey_plus, FcitxKey_minus, 0x00B1, - FcitxKey_plus, FcitxKey_O, 0x01A0, - FcitxKey_plus, FcitxKey_U, 0x01AF, - FcitxKey_plus, FcitxKey_o, 0x01A1, - FcitxKey_plus, FcitxKey_u, 0x01B0, - FcitxKey_comma, FcitxKey_space, 0x00B8, - FcitxKey_comma, FcitxKey_quotedbl, 0x201E, - FcitxKey_comma, FcitxKey_apostrophe, 0x201A, - FcitxKey_comma, FcitxKey_comma, 0x00B8, - FcitxKey_comma, FcitxKey_minus, 0x00AC, - FcitxKey_comma, FcitxKey_A, 0x0104, - FcitxKey_comma, FcitxKey_C, 0x00C7, - FcitxKey_comma, FcitxKey_D, 0x1E10, - FcitxKey_comma, FcitxKey_E, 0x0118, - FcitxKey_comma, FcitxKey_G, 0x0122, - FcitxKey_comma, FcitxKey_H, 0x1E28, - FcitxKey_comma, FcitxKey_I, 0x012E, - FcitxKey_comma, FcitxKey_K, 0x0136, - FcitxKey_comma, FcitxKey_L, 0x013B, - FcitxKey_comma, FcitxKey_N, 0x0145, - FcitxKey_comma, FcitxKey_R, 0x0156, - FcitxKey_comma, FcitxKey_S, 0x015E, - FcitxKey_comma, FcitxKey_T, 0x0162, - FcitxKey_comma, FcitxKey_U, 0x0172, - FcitxKey_comma, FcitxKey_a, 0x0105, - FcitxKey_comma, FcitxKey_c, 0x00E7, - FcitxKey_comma, FcitxKey_d, 0x1E11, - FcitxKey_comma, FcitxKey_e, 0x0119, - FcitxKey_comma, FcitxKey_g, 0x0123, - FcitxKey_comma, FcitxKey_h, 0x1E29, - FcitxKey_comma, FcitxKey_i, 0x012F, - FcitxKey_comma, FcitxKey_k, 0x0137, - FcitxKey_comma, FcitxKey_l, 0x013C, - FcitxKey_comma, FcitxKey_n, 0x0146, - FcitxKey_comma, FcitxKey_r, 0x0157, - FcitxKey_comma, FcitxKey_s, 0x015F, - FcitxKey_comma, FcitxKey_t, 0x0163, - FcitxKey_comma, FcitxKey_u, 0x0173, - FcitxKey_minus, FcitxKey_space, 0x007E, - FcitxKey_minus, FcitxKey_parenleft, 0x007B, - FcitxKey_minus, FcitxKey_parenright, 0x007D, - FcitxKey_minus, FcitxKey_plus, 0x00B1, - FcitxKey_minus, FcitxKey_comma, 0x00AC, - FcitxKey_minus, FcitxKey_colon, 0x00F7, - FcitxKey_minus, FcitxKey_A, 0x00C3, - FcitxKey_minus, FcitxKey_D, 0x0110, - FcitxKey_minus, FcitxKey_E, 0x0112, - FcitxKey_minus, FcitxKey_I, 0x012A, - FcitxKey_minus, FcitxKey_L, 0x00A3, - FcitxKey_minus, FcitxKey_N, 0x00D1, - FcitxKey_minus, FcitxKey_O, 0x00D5, - FcitxKey_minus, FcitxKey_U, 0x016A, - FcitxKey_minus, FcitxKey_Y, 0x00A5, - FcitxKey_minus, FcitxKey_asciicircum, 0x00AF, - FcitxKey_minus, FcitxKey_a, 0x00E3, - FcitxKey_minus, FcitxKey_d, 0x0111, - FcitxKey_minus, FcitxKey_e, 0x0113, - FcitxKey_minus, FcitxKey_i, 0x012B, - FcitxKey_minus, FcitxKey_l, 0x00A3, - FcitxKey_minus, FcitxKey_n, 0x00F1, - FcitxKey_minus, FcitxKey_o, 0x00F5, - FcitxKey_minus, FcitxKey_u, 0x016B, - FcitxKey_minus, FcitxKey_y, 0x00A5, - FcitxKey_period, FcitxKey_minus, 0x00B7, - FcitxKey_period, FcitxKey_period, 0x02D9, - FcitxKey_period, FcitxKey_less, 0x2039, - FcitxKey_period, FcitxKey_equal, 0x2022, - FcitxKey_period, FcitxKey_greater, 0x203A, - FcitxKey_period, FcitxKey_A, 0x0226, - FcitxKey_period, FcitxKey_B, 0x1E02, - FcitxKey_period, FcitxKey_C, 0x010A, - FcitxKey_period, FcitxKey_D, 0x1E0A, - FcitxKey_period, FcitxKey_E, 0x0116, - FcitxKey_period, FcitxKey_F, 0x1E1E, - FcitxKey_period, FcitxKey_G, 0x0120, - FcitxKey_period, FcitxKey_H, 0x1E22, - FcitxKey_period, FcitxKey_I, 0x0130, - FcitxKey_period, FcitxKey_M, 0x1E40, - FcitxKey_period, FcitxKey_N, 0x1E44, - FcitxKey_period, FcitxKey_O, 0x022E, - FcitxKey_period, FcitxKey_P, 0x1E56, - FcitxKey_period, FcitxKey_R, 0x1E58, - FcitxKey_period, FcitxKey_S, 0x1E60, - FcitxKey_period, FcitxKey_T, 0x1E6A, - FcitxKey_period, FcitxKey_W, 0x1E86, - FcitxKey_period, FcitxKey_X, 0x1E8A, - FcitxKey_period, FcitxKey_Y, 0x1E8E, - FcitxKey_period, FcitxKey_Z, 0x017B, - FcitxKey_period, FcitxKey_asciicircum, 0x00B7, - FcitxKey_period, FcitxKey_a, 0x0227, - FcitxKey_period, FcitxKey_b, 0x1E03, - FcitxKey_period, FcitxKey_c, 0x010B, - FcitxKey_period, FcitxKey_d, 0x1E0B, - FcitxKey_period, FcitxKey_e, 0x0117, - FcitxKey_period, FcitxKey_f, 0x1E1F, - FcitxKey_period, FcitxKey_g, 0x0121, - FcitxKey_period, FcitxKey_h, 0x1E23, - FcitxKey_period, FcitxKey_i, 0x0131, - FcitxKey_period, FcitxKey_m, 0x1E41, - FcitxKey_period, FcitxKey_n, 0x1E45, - FcitxKey_period, FcitxKey_o, 0x022F, - FcitxKey_period, FcitxKey_p, 0x1E57, - FcitxKey_period, FcitxKey_r, 0x1E59, - FcitxKey_period, FcitxKey_s, 0x1E61, - FcitxKey_period, FcitxKey_t, 0x1E6B, - FcitxKey_period, FcitxKey_w, 0x1E87, - FcitxKey_period, FcitxKey_x, 0x1E8B, - FcitxKey_period, FcitxKey_y, 0x1E8F, - FcitxKey_period, FcitxKey_z, 0x017C, - FcitxKey_period, 0x017F, 0x1E9B, - FcitxKey_period, FcitxKey_Sacute, 0x1E64, - FcitxKey_period, FcitxKey_Scaron, 0x1E66, - FcitxKey_period, FcitxKey_sacute, 0x1E65, - FcitxKey_period, FcitxKey_scaron, 0x1E67, - FcitxKey_period, 0x1E62, 0x1E68, - FcitxKey_period, 0x1E63, 0x1E69, - FcitxKey_slash, FcitxKey_slash, 0x005C, - FcitxKey_slash, FcitxKey_less, 0x005C, - FcitxKey_slash, FcitxKey_C, 0x00A2, - FcitxKey_slash, FcitxKey_D, 0x0110, - FcitxKey_slash, FcitxKey_G, 0x01E4, - FcitxKey_slash, FcitxKey_H, 0x0126, - FcitxKey_slash, FcitxKey_I, 0x0197, - FcitxKey_slash, FcitxKey_L, 0x0141, - FcitxKey_slash, FcitxKey_O, 0x00D8, - FcitxKey_slash, FcitxKey_T, 0x0166, - FcitxKey_slash, FcitxKey_U, 0x00B5, - FcitxKey_slash, FcitxKey_Z, 0x01B5, - FcitxKey_slash, FcitxKey_asciicircum, 0x007C, - FcitxKey_slash, FcitxKey_b, 0x0180, - FcitxKey_slash, FcitxKey_c, 0x00A2, - FcitxKey_slash, FcitxKey_d, 0x0111, - FcitxKey_slash, FcitxKey_g, 0x01E5, - FcitxKey_slash, FcitxKey_h, 0x0127, - FcitxKey_slash, FcitxKey_i, 0x0268, - FcitxKey_slash, FcitxKey_l, 0x0142, - FcitxKey_slash, FcitxKey_m, 0x20A5, - FcitxKey_slash, FcitxKey_o, 0x00F8, - FcitxKey_slash, FcitxKey_t, 0x0167, - FcitxKey_slash, FcitxKey_u, 0x00B5, - FcitxKey_slash, FcitxKey_z, 0x01B6, - FcitxKey_slash, 0x0294, 0x02A1, - FcitxKey_slash, 0x04AE, 0x04B0, - FcitxKey_slash, 0x04AF, 0x04B1, - FcitxKey_slash, FcitxKey_Cyrillic_ghe, 0x0493, - FcitxKey_slash, FcitxKey_Cyrillic_ka, 0x049F, - FcitxKey_slash, FcitxKey_Cyrillic_GHE, 0x0492, - FcitxKey_slash, FcitxKey_Cyrillic_KA, 0x049E, - FcitxKey_slash, FcitxKey_leftarrow, 0x219A, - FcitxKey_slash, FcitxKey_rightarrow, 0x219B, - FcitxKey_slash, 0x2194, 0x21AE, - FcitxKey_0, FcitxKey_asterisk, 0x00B0, - FcitxKey_0, FcitxKey_C, 0x00A9, - FcitxKey_0, FcitxKey_S, 0x00A7, - FcitxKey_0, FcitxKey_X, 0x00A4, - FcitxKey_0, FcitxKey_asciicircum, 0x00B0, - FcitxKey_0, FcitxKey_c, 0x00A9, - FcitxKey_0, FcitxKey_s, 0x00A7, - FcitxKey_0, FcitxKey_x, 0x00A4, - FcitxKey_1, FcitxKey_2, 0x00BD, - FcitxKey_1, FcitxKey_3, 0x2153, - FcitxKey_1, FcitxKey_4, 0x00BC, - FcitxKey_1, FcitxKey_5, 0x2155, - FcitxKey_1, FcitxKey_6, 0x2159, - FcitxKey_1, FcitxKey_8, 0x215B, - FcitxKey_1, FcitxKey_S, 0x00B9, - FcitxKey_1, FcitxKey_asciicircum, 0x00B9, - FcitxKey_1, FcitxKey_s, 0x00B9, - FcitxKey_2, FcitxKey_3, 0x2154, - FcitxKey_2, FcitxKey_5, 0x2156, - FcitxKey_2, FcitxKey_S, 0x00B2, - FcitxKey_2, FcitxKey_asciicircum, 0x00B2, - FcitxKey_2, FcitxKey_s, 0x00B2, - FcitxKey_3, FcitxKey_4, 0x00BE, - FcitxKey_3, FcitxKey_5, 0x2157, - FcitxKey_3, FcitxKey_8, 0x215C, - FcitxKey_3, FcitxKey_S, 0x00B3, - FcitxKey_3, FcitxKey_asciicircum, 0x00B3, - FcitxKey_3, FcitxKey_s, 0x00B3, - FcitxKey_4, FcitxKey_5, 0x2158, - FcitxKey_5, FcitxKey_6, 0x215A, - FcitxKey_5, FcitxKey_8, 0x215D, - FcitxKey_7, FcitxKey_8, 0x215E, - FcitxKey_colon, FcitxKey_minus, 0x00F7, - FcitxKey_semicolon, FcitxKey_A, 0x0104, - FcitxKey_semicolon, FcitxKey_E, 0x0118, - FcitxKey_semicolon, FcitxKey_I, 0x012E, - FcitxKey_semicolon, FcitxKey_O, 0x01EA, - FcitxKey_semicolon, FcitxKey_U, 0x0172, - FcitxKey_semicolon, FcitxKey_a, 0x0105, - FcitxKey_semicolon, FcitxKey_e, 0x0119, - FcitxKey_semicolon, FcitxKey_i, 0x012F, - FcitxKey_semicolon, FcitxKey_o, 0x01EB, - FcitxKey_semicolon, FcitxKey_u, 0x0173, - FcitxKey_less, FcitxKey_space, 0x02C7, - FcitxKey_less, FcitxKey_quotedbl, 0x201C, - FcitxKey_less, FcitxKey_apostrophe, 0x2018, - FcitxKey_less, FcitxKey_slash, 0x005C, - FcitxKey_less, FcitxKey_less, 0x00AB, - FcitxKey_less, FcitxKey_C, 0x010C, - FcitxKey_less, FcitxKey_D, 0x010E, - FcitxKey_less, FcitxKey_E, 0x011A, - FcitxKey_less, FcitxKey_L, 0x013D, - FcitxKey_less, FcitxKey_N, 0x0147, - FcitxKey_less, FcitxKey_R, 0x0158, - FcitxKey_less, FcitxKey_S, 0x0160, - FcitxKey_less, FcitxKey_T, 0x0164, - FcitxKey_less, FcitxKey_Z, 0x017D, - FcitxKey_less, FcitxKey_c, 0x010D, - FcitxKey_less, FcitxKey_d, 0x010F, - FcitxKey_less, FcitxKey_e, 0x011B, - FcitxKey_less, FcitxKey_l, 0x013E, - FcitxKey_less, FcitxKey_n, 0x0148, - FcitxKey_less, FcitxKey_r, 0x0159, - FcitxKey_less, FcitxKey_s, 0x0161, - FcitxKey_less, FcitxKey_t, 0x0165, - FcitxKey_less, FcitxKey_z, 0x017E, - FcitxKey_less, 0x0338, 0x226E, - FcitxKey_equal, FcitxKey_C, 0x20AC, - FcitxKey_equal, FcitxKey_E, 0x20AC, - FcitxKey_equal, FcitxKey_L, 0x00A3, - FcitxKey_equal, FcitxKey_N, 0x20A6, - FcitxKey_equal, FcitxKey_O, 0x0150, - FcitxKey_equal, FcitxKey_U, 0x0170, - FcitxKey_equal, FcitxKey_W, 0x20A9, - FcitxKey_equal, FcitxKey_Y, 0x00A5, - FcitxKey_equal, FcitxKey_c, 0x20AC, - FcitxKey_equal, FcitxKey_e, 0x20AC, - FcitxKey_equal, FcitxKey_l, 0x00A3, - FcitxKey_equal, FcitxKey_o, 0x0151, - FcitxKey_equal, FcitxKey_u, 0x0171, - FcitxKey_equal, FcitxKey_y, 0x00A5, - FcitxKey_equal, 0x0338, 0x2260, - FcitxKey_equal, FcitxKey_Cyrillic_u, 0x04F3, - FcitxKey_equal, FcitxKey_Cyrillic_IE, 0x20AC, - FcitxKey_equal, FcitxKey_Cyrillic_ES, 0x20AC, - FcitxKey_equal, FcitxKey_Cyrillic_U, 0x04F2, - FcitxKey_greater, FcitxKey_space, 0x005E, - FcitxKey_greater, FcitxKey_quotedbl, 0x201D, - FcitxKey_greater, FcitxKey_apostrophe, 0x2019, - FcitxKey_greater, FcitxKey_greater, 0x00BB, - FcitxKey_greater, FcitxKey_A, 0x00C2, - FcitxKey_greater, FcitxKey_E, 0x00CA, - FcitxKey_greater, FcitxKey_I, 0x00CE, - FcitxKey_greater, FcitxKey_O, 0x00D4, - FcitxKey_greater, FcitxKey_U, 0x00DB, - FcitxKey_greater, FcitxKey_a, 0x00E2, - FcitxKey_greater, FcitxKey_e, 0x00EA, - FcitxKey_greater, FcitxKey_i, 0x00EE, - FcitxKey_greater, FcitxKey_o, 0x00F4, - FcitxKey_greater, FcitxKey_u, 0x00FB, - FcitxKey_greater, 0x0338, 0x226F, - FcitxKey_question, FcitxKey_exclam, 0x203D, - FcitxKey_question, FcitxKey_question, 0x00BF, - FcitxKey_question, FcitxKey_A, 0x1EA2, - FcitxKey_question, FcitxKey_E, 0x1EBA, - FcitxKey_question, FcitxKey_I, 0x1EC8, - FcitxKey_question, FcitxKey_O, 0x1ECE, - FcitxKey_question, FcitxKey_U, 0x1EE6, - FcitxKey_question, FcitxKey_Y, 0x1EF6, - FcitxKey_question, FcitxKey_a, 0x1EA3, - FcitxKey_question, FcitxKey_e, 0x1EBB, - FcitxKey_question, FcitxKey_i, 0x1EC9, - FcitxKey_question, FcitxKey_o, 0x1ECF, - FcitxKey_question, FcitxKey_u, 0x1EE7, - FcitxKey_question, FcitxKey_y, 0x1EF7, - FcitxKey_question, FcitxKey_Acircumflex, 0x1EA8, - FcitxKey_question, FcitxKey_Ecircumflex, 0x1EC2, - FcitxKey_question, FcitxKey_Ocircumflex, 0x1ED4, - FcitxKey_question, FcitxKey_acircumflex, 0x1EA9, - FcitxKey_question, FcitxKey_ecircumflex, 0x1EC3, - FcitxKey_question, FcitxKey_ocircumflex, 0x1ED5, - FcitxKey_question, FcitxKey_Ohorn, 0x1EDE, - FcitxKey_question, FcitxKey_ohorn, 0x1EDF, - FcitxKey_question, FcitxKey_Uhorn, 0x1EEC, - FcitxKey_question, FcitxKey_uhorn, 0x1EED, - FcitxKey_question, FcitxKey_Abreve, 0x1EB2, - FcitxKey_question, FcitxKey_abreve, 0x1EB3, - FcitxKey_A, FcitxKey_quotedbl, 0x00C4, - FcitxKey_A, FcitxKey_apostrophe, 0x00C1, - FcitxKey_A, FcitxKey_parenleft, 0x0102, - FcitxKey_A, FcitxKey_asterisk, 0x00C5, - FcitxKey_A, FcitxKey_comma, 0x0104, - FcitxKey_A, FcitxKey_minus, 0x00C3, - FcitxKey_A, FcitxKey_greater, 0x00C2, - FcitxKey_A, FcitxKey_A, 0x00C5, - FcitxKey_A, FcitxKey_E, 0x00C6, - FcitxKey_A, FcitxKey_T, 0x0040, - FcitxKey_A, FcitxKey_asciicircum, 0x00C2, - FcitxKey_A, FcitxKey_underscore, 0x00AA, - FcitxKey_A, FcitxKey_grave, 0x00C0, - FcitxKey_A, FcitxKey_asciitilde, 0x00C3, - FcitxKey_A, FcitxKey_diaeresis, 0x00C4, - FcitxKey_A, FcitxKey_acute, 0x00C1, - FcitxKey_B, FcitxKey_period, 0x1E02, - FcitxKey_C, FcitxKey_apostrophe, 0x0106, - FcitxKey_C, FcitxKey_comma, 0x00C7, - FcitxKey_C, FcitxKey_period, 0x010A, - FcitxKey_C, FcitxKey_slash, 0x00A2, - FcitxKey_C, FcitxKey_0, 0x00A9, - FcitxKey_C, FcitxKey_less, 0x010C, - FcitxKey_C, FcitxKey_equal, 0x20AC, - FcitxKey_C, FcitxKey_E, 0x20A0, - FcitxKey_C, FcitxKey_O, 0x00A9, - FcitxKey_C, FcitxKey_o, 0x00A9, - FcitxKey_C, FcitxKey_r, 0x20A2, - FcitxKey_C, FcitxKey_bar, 0x00A2, - FcitxKey_D, FcitxKey_minus, 0x0110, - FcitxKey_D, FcitxKey_period, 0x1E0A, - FcitxKey_D, FcitxKey_less, 0x010E, - FcitxKey_D, FcitxKey_H, 0x00D0, - FcitxKey_E, FcitxKey_quotedbl, 0x00CB, - FcitxKey_E, FcitxKey_apostrophe, 0x00C9, - FcitxKey_E, FcitxKey_comma, 0x0118, - FcitxKey_E, FcitxKey_minus, 0x0112, - FcitxKey_E, FcitxKey_period, 0x0116, - FcitxKey_E, FcitxKey_less, 0x011A, - FcitxKey_E, FcitxKey_equal, 0x20AC, - FcitxKey_E, FcitxKey_greater, 0x00CA, - FcitxKey_E, FcitxKey_asciicircum, 0x00CA, - FcitxKey_E, FcitxKey_underscore, 0x0112, - FcitxKey_E, FcitxKey_grave, 0x00C8, - FcitxKey_E, FcitxKey_diaeresis, 0x00CB, - FcitxKey_E, FcitxKey_acute, 0x00C9, - FcitxKey_F, FcitxKey_period, 0x1E1E, - FcitxKey_F, FcitxKey_r, 0x20A3, - FcitxKey_G, FcitxKey_parenleft, 0x011E, - FcitxKey_G, FcitxKey_comma, 0x0122, - FcitxKey_G, FcitxKey_period, 0x0120, - FcitxKey_G, FcitxKey_U, 0x011E, - FcitxKey_G, FcitxKey_breve, 0x011E, - FcitxKey_I, FcitxKey_quotedbl, 0x00CF, - FcitxKey_I, FcitxKey_apostrophe, 0x00CD, - FcitxKey_I, FcitxKey_comma, 0x012E, - FcitxKey_I, FcitxKey_minus, 0x012A, - FcitxKey_I, FcitxKey_period, 0x0130, - FcitxKey_I, FcitxKey_greater, 0x00CE, - FcitxKey_I, FcitxKey_asciicircum, 0x00CE, - FcitxKey_I, FcitxKey_underscore, 0x012A, - FcitxKey_I, FcitxKey_grave, 0x00CC, - FcitxKey_I, FcitxKey_asciitilde, 0x0128, - FcitxKey_I, FcitxKey_diaeresis, 0x00CF, - FcitxKey_I, FcitxKey_acute, 0x00CD, - FcitxKey_K, FcitxKey_comma, 0x0136, - FcitxKey_L, FcitxKey_apostrophe, 0x0139, - FcitxKey_L, FcitxKey_comma, 0x013B, - FcitxKey_L, FcitxKey_minus, 0x00A3, - FcitxKey_L, FcitxKey_slash, 0x0141, - FcitxKey_L, FcitxKey_less, 0x013D, - FcitxKey_L, FcitxKey_equal, 0x00A3, - FcitxKey_L, FcitxKey_V, 0x007C, - FcitxKey_M, FcitxKey_period, 0x1E40, - FcitxKey_N, FcitxKey_apostrophe, 0x0143, - FcitxKey_N, FcitxKey_comma, 0x0145, - FcitxKey_N, FcitxKey_minus, 0x00D1, - FcitxKey_N, FcitxKey_less, 0x0147, - FcitxKey_N, FcitxKey_equal, 0x20A6, - FcitxKey_N, FcitxKey_G, 0x014A, - FcitxKey_N, FcitxKey_O, 0x2116, - FcitxKey_N, FcitxKey_o, 0x2116, - FcitxKey_N, FcitxKey_asciitilde, 0x00D1, - FcitxKey_O, FcitxKey_quotedbl, 0x00D6, - FcitxKey_O, FcitxKey_apostrophe, 0x00D3, - FcitxKey_O, FcitxKey_minus, 0x00D5, - FcitxKey_O, FcitxKey_slash, 0x00D8, - FcitxKey_O, FcitxKey_greater, 0x00D4, - FcitxKey_O, FcitxKey_C, 0x00A9, - FcitxKey_O, FcitxKey_E, 0x0152, - FcitxKey_O, FcitxKey_R, 0x00AE, - FcitxKey_O, FcitxKey_S, 0x00A7, - FcitxKey_O, FcitxKey_X, 0x00A4, - FcitxKey_O, FcitxKey_asciicircum, 0x00D4, - FcitxKey_O, FcitxKey_underscore, 0x00BA, - FcitxKey_O, FcitxKey_grave, 0x00D2, - FcitxKey_O, FcitxKey_c, 0x00A9, - FcitxKey_O, FcitxKey_r, 0x00AE, - FcitxKey_O, FcitxKey_x, 0x00A4, - FcitxKey_O, FcitxKey_asciitilde, 0x00D5, - FcitxKey_O, FcitxKey_diaeresis, 0x00D6, - FcitxKey_O, FcitxKey_acute, 0x00D3, - FcitxKey_P, FcitxKey_exclam, 0x00B6, - FcitxKey_P, FcitxKey_period, 0x1E56, - FcitxKey_P, FcitxKey_P, 0x00B6, - FcitxKey_P, FcitxKey_t, 0x20A7, - FcitxKey_R, FcitxKey_apostrophe, 0x0154, - FcitxKey_R, FcitxKey_comma, 0x0156, - FcitxKey_R, FcitxKey_less, 0x0158, - FcitxKey_R, FcitxKey_O, 0x00AE, - FcitxKey_R, FcitxKey_s, 0x20A8, - FcitxKey_S, FcitxKey_exclam, 0x00A7, - FcitxKey_S, FcitxKey_apostrophe, 0x015A, - FcitxKey_S, FcitxKey_comma, 0x015E, - FcitxKey_S, FcitxKey_period, 0x1E60, - FcitxKey_S, FcitxKey_0, 0x00A7, - FcitxKey_S, FcitxKey_1, 0x00B9, - FcitxKey_S, FcitxKey_2, 0x00B2, - FcitxKey_S, FcitxKey_3, 0x00B3, - FcitxKey_S, FcitxKey_less, 0x0160, - FcitxKey_S, FcitxKey_M, 0x2120, - FcitxKey_S, FcitxKey_O, 0x00A7, - FcitxKey_S, FcitxKey_m, 0x2120, - FcitxKey_S, FcitxKey_cedilla, 0x015E, - FcitxKey_T, FcitxKey_minus, 0x0166, - FcitxKey_T, FcitxKey_period, 0x1E6A, - FcitxKey_T, FcitxKey_slash, 0x0166, - FcitxKey_T, FcitxKey_less, 0x0164, - FcitxKey_T, FcitxKey_H, 0x00DE, - FcitxKey_T, FcitxKey_M, 0x2122, - FcitxKey_T, FcitxKey_m, 0x2122, - FcitxKey_U, FcitxKey_quotedbl, 0x00DC, - FcitxKey_U, FcitxKey_apostrophe, 0x00DA, - FcitxKey_U, FcitxKey_asterisk, 0x016E, - FcitxKey_U, FcitxKey_comma, 0x0172, - FcitxKey_U, FcitxKey_minus, 0x016A, - FcitxKey_U, FcitxKey_slash, 0x00B5, - FcitxKey_U, FcitxKey_greater, 0x00DB, - FcitxKey_U, FcitxKey_A, 0x0102, - FcitxKey_U, FcitxKey_E, 0x0114, - FcitxKey_U, FcitxKey_G, 0x011E, - FcitxKey_U, FcitxKey_I, 0x012C, - FcitxKey_U, FcitxKey_O, 0x014E, - FcitxKey_U, FcitxKey_U, 0x016C, - FcitxKey_U, FcitxKey_asciicircum, 0x00DB, - FcitxKey_U, FcitxKey_underscore, 0x016A, - FcitxKey_U, FcitxKey_grave, 0x00D9, - FcitxKey_U, FcitxKey_a, 0x0103, - FcitxKey_U, FcitxKey_e, 0x0115, - FcitxKey_U, FcitxKey_g, 0x011F, - FcitxKey_U, FcitxKey_i, 0x012D, - FcitxKey_U, FcitxKey_o, 0x014F, - FcitxKey_U, FcitxKey_u, 0x016D, - FcitxKey_U, FcitxKey_asciitilde, 0x0168, - FcitxKey_U, FcitxKey_diaeresis, 0x00DC, - FcitxKey_U, FcitxKey_acute, 0x00DA, - FcitxKey_U, 0x0228, 0x1E1C, - FcitxKey_U, 0x0229, 0x1E1D, - FcitxKey_U, FcitxKey_Cyrillic_a, 0x04D1, - FcitxKey_U, FcitxKey_Cyrillic_ie, 0x04D7, - FcitxKey_U, FcitxKey_Cyrillic_i, 0x0439, - FcitxKey_U, FcitxKey_Cyrillic_u, 0x045E, - FcitxKey_U, FcitxKey_Cyrillic_zhe, 0x04C2, - FcitxKey_U, FcitxKey_Cyrillic_A, 0x04D0, - FcitxKey_U, FcitxKey_Cyrillic_IE, 0x04D6, - FcitxKey_U, FcitxKey_Cyrillic_I, 0x0419, - FcitxKey_U, FcitxKey_Cyrillic_U, 0x040E, - FcitxKey_U, FcitxKey_Cyrillic_ZHE, 0x04C1, - FcitxKey_U, FcitxKey_Greek_ALPHA, 0x1FB8, - FcitxKey_U, FcitxKey_Greek_IOTA, 0x1FD8, - FcitxKey_U, FcitxKey_Greek_UPSILON, 0x1FE8, - FcitxKey_U, FcitxKey_Greek_alpha, 0x1FB0, - FcitxKey_U, FcitxKey_Greek_iota, 0x1FD0, - FcitxKey_U, FcitxKey_Greek_upsilon, 0x1FE0, - FcitxKey_U, 0x1EA0, 0x1EB6, - FcitxKey_U, 0x1EA1, 0x1EB7, - FcitxKey_V, FcitxKey_L, 0x007C, - FcitxKey_W, FcitxKey_equal, 0x20A9, - FcitxKey_W, FcitxKey_asciicircum, 0x0174, - FcitxKey_X, FcitxKey_0, 0x00A4, - FcitxKey_X, FcitxKey_O, 0x00A4, - FcitxKey_X, FcitxKey_o, 0x00A4, - FcitxKey_Y, FcitxKey_quotedbl, 0x0178, - FcitxKey_Y, FcitxKey_apostrophe, 0x00DD, - FcitxKey_Y, FcitxKey_minus, 0x00A5, - FcitxKey_Y, FcitxKey_equal, 0x00A5, - FcitxKey_Y, FcitxKey_asciicircum, 0x0176, - FcitxKey_Y, FcitxKey_diaeresis, 0x0178, - FcitxKey_Y, FcitxKey_acute, 0x00DD, - FcitxKey_Z, FcitxKey_apostrophe, 0x0179, - FcitxKey_Z, FcitxKey_period, 0x017B, - FcitxKey_Z, FcitxKey_less, 0x017D, - FcitxKey_asciicircum, FcitxKey_space, 0x005E, - FcitxKey_asciicircum, FcitxKey_parenleft, 0x207D, - FcitxKey_asciicircum, FcitxKey_parenright, 0x207E, - FcitxKey_asciicircum, FcitxKey_plus, 0x207A, - FcitxKey_asciicircum, FcitxKey_minus, 0x00AF, - FcitxKey_asciicircum, FcitxKey_period, 0x00B7, - FcitxKey_asciicircum, FcitxKey_slash, 0x007C, - FcitxKey_asciicircum, FcitxKey_0, 0x00B0, - FcitxKey_asciicircum, FcitxKey_1, 0x00B9, - FcitxKey_asciicircum, FcitxKey_2, 0x00B2, - FcitxKey_asciicircum, FcitxKey_3, 0x00B3, - FcitxKey_asciicircum, FcitxKey_4, 0x2074, - FcitxKey_asciicircum, FcitxKey_5, 0x2075, - FcitxKey_asciicircum, FcitxKey_6, 0x2076, - FcitxKey_asciicircum, FcitxKey_7, 0x2077, - FcitxKey_asciicircum, FcitxKey_8, 0x2078, - FcitxKey_asciicircum, FcitxKey_9, 0x2079, - FcitxKey_asciicircum, FcitxKey_equal, 0x207C, - FcitxKey_asciicircum, FcitxKey_A, 0x00C2, - FcitxKey_asciicircum, FcitxKey_C, 0x0108, - FcitxKey_asciicircum, FcitxKey_E, 0x00CA, - FcitxKey_asciicircum, FcitxKey_G, 0x011C, - FcitxKey_asciicircum, FcitxKey_H, 0x0124, - FcitxKey_asciicircum, FcitxKey_I, 0x00CE, - FcitxKey_asciicircum, FcitxKey_J, 0x0134, - FcitxKey_asciicircum, FcitxKey_O, 0x00D4, - FcitxKey_asciicircum, FcitxKey_S, 0x015C, - FcitxKey_asciicircum, FcitxKey_U, 0x00DB, - FcitxKey_asciicircum, FcitxKey_W, 0x0174, - FcitxKey_asciicircum, FcitxKey_Y, 0x0176, - FcitxKey_asciicircum, FcitxKey_Z, 0x1E90, - FcitxKey_asciicircum, FcitxKey_underscore, 0x00AF, - FcitxKey_asciicircum, FcitxKey_a, 0x00E2, - FcitxKey_asciicircum, FcitxKey_c, 0x0109, - FcitxKey_asciicircum, FcitxKey_e, 0x00EA, - FcitxKey_asciicircum, FcitxKey_g, 0x011D, - FcitxKey_asciicircum, FcitxKey_h, 0x0125, - FcitxKey_asciicircum, FcitxKey_i, 0x00EE, - FcitxKey_asciicircum, FcitxKey_j, 0x0135, - FcitxKey_asciicircum, FcitxKey_o, 0x00F4, - FcitxKey_asciicircum, FcitxKey_s, 0x015D, - FcitxKey_asciicircum, FcitxKey_u, 0x00FB, - FcitxKey_asciicircum, FcitxKey_w, 0x0175, - FcitxKey_asciicircum, FcitxKey_y, 0x0177, - FcitxKey_asciicircum, FcitxKey_z, 0x1E91, - FcitxKey_asciicircum, 0x1EA0, 0x1EAC, - FcitxKey_asciicircum, 0x1EA1, 0x1EAD, - FcitxKey_asciicircum, 0x1EB8, 0x1EC6, - FcitxKey_asciicircum, 0x1EB9, 0x1EC7, - FcitxKey_asciicircum, 0x1ECC, 0x1ED8, - FcitxKey_asciicircum, 0x1ECD, 0x1ED9, - FcitxKey_asciicircum, 0x2212, 0x207B, - FcitxKey_asciicircum, 0x4E00, 0x3192, - FcitxKey_asciicircum, 0x4E01, 0x319C, - FcitxKey_asciicircum, 0x4E09, 0x3194, - FcitxKey_asciicircum, 0x4E0A, 0x3196, - FcitxKey_asciicircum, 0x4E0B, 0x3198, - FcitxKey_asciicircum, 0x4E19, 0x319B, - FcitxKey_asciicircum, 0x4E2D, 0x3197, - FcitxKey_asciicircum, 0x4E59, 0x319A, - FcitxKey_asciicircum, 0x4E8C, 0x3193, - FcitxKey_asciicircum, 0x4EBA, 0x319F, - FcitxKey_asciicircum, 0x56DB, 0x3195, - FcitxKey_asciicircum, 0x5730, 0x319E, - FcitxKey_asciicircum, 0x5929, 0x319D, - FcitxKey_asciicircum, 0x7532, 0x3199, - FcitxKey_asciicircum, FcitxKey_KP_Space, 0x00B2, - FcitxKey_asciicircum, FcitxKey_KP_Add, 0x207A, - FcitxKey_asciicircum, FcitxKey_KP_0, 0x2070, - FcitxKey_asciicircum, FcitxKey_KP_1, 0x00B9, - FcitxKey_asciicircum, FcitxKey_KP_2, 0x00B2, - FcitxKey_asciicircum, FcitxKey_KP_3, 0x00B3, - FcitxKey_asciicircum, FcitxKey_KP_4, 0x2074, - FcitxKey_asciicircum, FcitxKey_KP_5, 0x2075, - FcitxKey_asciicircum, FcitxKey_KP_6, 0x2076, - FcitxKey_asciicircum, FcitxKey_KP_7, 0x2077, - FcitxKey_asciicircum, FcitxKey_KP_8, 0x2078, - FcitxKey_asciicircum, FcitxKey_KP_9, 0x2079, - FcitxKey_asciicircum, FcitxKey_KP_Equal, 0x207C, - FcitxKey_underscore, FcitxKey_parenleft, 0x208D, - FcitxKey_underscore, FcitxKey_parenright, 0x208E, - FcitxKey_underscore, FcitxKey_plus, 0x208A, - FcitxKey_underscore, FcitxKey_0, 0x2080, - FcitxKey_underscore, FcitxKey_1, 0x2081, - FcitxKey_underscore, FcitxKey_2, 0x2082, - FcitxKey_underscore, FcitxKey_3, 0x2083, - FcitxKey_underscore, FcitxKey_4, 0x2084, - FcitxKey_underscore, FcitxKey_5, 0x2085, - FcitxKey_underscore, FcitxKey_6, 0x2086, - FcitxKey_underscore, FcitxKey_7, 0x2087, - FcitxKey_underscore, FcitxKey_8, 0x2088, - FcitxKey_underscore, FcitxKey_9, 0x2089, - FcitxKey_underscore, FcitxKey_equal, 0x208C, - FcitxKey_underscore, FcitxKey_A, 0x00AA, - FcitxKey_underscore, FcitxKey_E, 0x0112, - FcitxKey_underscore, FcitxKey_G, 0x1E20, - FcitxKey_underscore, FcitxKey_I, 0x012A, - FcitxKey_underscore, FcitxKey_O, 0x00BA, - FcitxKey_underscore, FcitxKey_U, 0x016A, - FcitxKey_underscore, FcitxKey_Y, 0x0232, - FcitxKey_underscore, FcitxKey_asciicircum, 0x00AF, - FcitxKey_underscore, FcitxKey_underscore, 0x00AF, - FcitxKey_underscore, FcitxKey_a, 0x00AA, - FcitxKey_underscore, FcitxKey_e, 0x0113, - FcitxKey_underscore, FcitxKey_g, 0x1E21, - FcitxKey_underscore, FcitxKey_i, 0x012B, - FcitxKey_underscore, FcitxKey_o, 0x00BA, - FcitxKey_underscore, FcitxKey_u, 0x016B, - FcitxKey_underscore, FcitxKey_y, 0x0233, - FcitxKey_underscore, FcitxKey_Adiaeresis, 0x01DE, - FcitxKey_underscore, FcitxKey_AE, 0x01E2, - FcitxKey_underscore, FcitxKey_Otilde, 0x022C, - FcitxKey_underscore, FcitxKey_Odiaeresis, 0x022A, - FcitxKey_underscore, 0x00DC, 0x01D5, - FcitxKey_underscore, FcitxKey_adiaeresis, 0x01DF, - FcitxKey_underscore, FcitxKey_ae, 0x01E3, - FcitxKey_underscore, FcitxKey_otilde, 0x022D, - FcitxKey_underscore, FcitxKey_odiaeresis, 0x022B, - FcitxKey_underscore, FcitxKey_udiaeresis, 0x01D6, - FcitxKey_underscore, 0x01EA, 0x01EC, - FcitxKey_underscore, 0x01EB, 0x01ED, - FcitxKey_underscore, 0x0226, 0x01E0, - FcitxKey_underscore, 0x0227, 0x01E1, - FcitxKey_underscore, 0x022E, 0x0230, - FcitxKey_underscore, 0x022F, 0x0231, - FcitxKey_underscore, FcitxKey_Cyrillic_i, 0x04E3, - FcitxKey_underscore, FcitxKey_Cyrillic_u, 0x04EF, - FcitxKey_underscore, FcitxKey_Cyrillic_I, 0x04E2, - FcitxKey_underscore, FcitxKey_Cyrillic_U, 0x04EE, - FcitxKey_underscore, FcitxKey_Greek_ALPHA, 0x1FB9, - FcitxKey_underscore, FcitxKey_Greek_IOTA, 0x1FD9, - FcitxKey_underscore, FcitxKey_Greek_UPSILON, 0x1FE9, - FcitxKey_underscore, FcitxKey_Greek_alpha, 0x1FB1, - FcitxKey_underscore, FcitxKey_Greek_iota, 0x1FD1, - FcitxKey_underscore, FcitxKey_Greek_upsilon, 0x1FE1, - FcitxKey_underscore, 0x1E36, 0x1E38, - FcitxKey_underscore, 0x1E37, 0x1E39, - FcitxKey_underscore, 0x1E5A, 0x1E5C, - FcitxKey_underscore, 0x1E5B, 0x1E5D, - FcitxKey_underscore, 0x2212, 0x208B, - FcitxKey_underscore, FcitxKey_KP_Space, 0x2082, - FcitxKey_underscore, FcitxKey_KP_Add, 0x208A, - FcitxKey_underscore, FcitxKey_KP_0, 0x2080, - FcitxKey_underscore, FcitxKey_KP_1, 0x2081, - FcitxKey_underscore, FcitxKey_KP_2, 0x2082, - FcitxKey_underscore, FcitxKey_KP_3, 0x2083, - FcitxKey_underscore, FcitxKey_KP_4, 0x2084, - FcitxKey_underscore, FcitxKey_KP_5, 0x2085, - FcitxKey_underscore, FcitxKey_KP_6, 0x2086, - FcitxKey_underscore, FcitxKey_KP_7, 0x2087, - FcitxKey_underscore, FcitxKey_KP_8, 0x2088, - FcitxKey_underscore, FcitxKey_KP_9, 0x2089, - FcitxKey_underscore, FcitxKey_KP_Equal, 0x208C, - FcitxKey_grave, FcitxKey_space, 0x0060, - FcitxKey_grave, FcitxKey_A, 0x00C0, - FcitxKey_grave, FcitxKey_E, 0x00C8, - FcitxKey_grave, FcitxKey_I, 0x00CC, - FcitxKey_grave, FcitxKey_N, 0x01F8, - FcitxKey_grave, FcitxKey_O, 0x00D2, - FcitxKey_grave, FcitxKey_U, 0x00D9, - FcitxKey_grave, FcitxKey_W, 0x1E80, - FcitxKey_grave, FcitxKey_Y, 0x1EF2, - FcitxKey_grave, FcitxKey_a, 0x00E0, - FcitxKey_grave, FcitxKey_e, 0x00E8, - FcitxKey_grave, FcitxKey_i, 0x00EC, - FcitxKey_grave, FcitxKey_n, 0x01F9, - FcitxKey_grave, FcitxKey_o, 0x00F2, - FcitxKey_grave, FcitxKey_u, 0x00F9, - FcitxKey_grave, FcitxKey_w, 0x1E81, - FcitxKey_grave, FcitxKey_y, 0x1EF3, - FcitxKey_grave, FcitxKey_Acircumflex, 0x1EA6, - FcitxKey_grave, FcitxKey_Ecircumflex, 0x1EC0, - FcitxKey_grave, FcitxKey_Ocircumflex, 0x1ED2, - FcitxKey_grave, 0x00DC, 0x01DB, - FcitxKey_grave, FcitxKey_acircumflex, 0x1EA7, - FcitxKey_grave, FcitxKey_ecircumflex, 0x1EC1, - FcitxKey_grave, FcitxKey_ocircumflex, 0x1ED3, - FcitxKey_grave, FcitxKey_udiaeresis, 0x01DC, - FcitxKey_grave, FcitxKey_Ohorn, 0x1EDC, - FcitxKey_grave, FcitxKey_ohorn, 0x1EDD, - FcitxKey_grave, FcitxKey_Uhorn, 0x1EEA, - FcitxKey_grave, FcitxKey_uhorn, 0x1EEB, - FcitxKey_grave, FcitxKey_Abreve, 0x1EB0, - FcitxKey_grave, FcitxKey_abreve, 0x1EB1, - FcitxKey_grave, FcitxKey_Emacron, 0x1E14, - FcitxKey_grave, FcitxKey_emacron, 0x1E15, - FcitxKey_grave, FcitxKey_Omacron, 0x1E50, - FcitxKey_grave, FcitxKey_omacron, 0x1E51, - FcitxKey_grave, FcitxKey_Cyrillic_ie, 0x0450, - FcitxKey_grave, FcitxKey_Cyrillic_i, 0x045D, - FcitxKey_grave, FcitxKey_Cyrillic_IE, 0x0400, - FcitxKey_grave, FcitxKey_Cyrillic_I, 0x040D, - FcitxKey_grave, FcitxKey_Greek_iotadieresis, 0x1FD2, - FcitxKey_grave, FcitxKey_Greek_upsilondieresis, 0x1FE2, - FcitxKey_grave, FcitxKey_Greek_ALPHA, 0x1FBA, - FcitxKey_grave, FcitxKey_Greek_EPSILON, 0x1FC8, - FcitxKey_grave, FcitxKey_Greek_ETA, 0x1FCA, - FcitxKey_grave, FcitxKey_Greek_IOTA, 0x1FDA, - FcitxKey_grave, FcitxKey_Greek_OMICRON, 0x1FF8, - FcitxKey_grave, FcitxKey_Greek_UPSILON, 0x1FEA, - FcitxKey_grave, FcitxKey_Greek_OMEGA, 0x1FFA, - FcitxKey_grave, FcitxKey_Greek_alpha, 0x1F70, - FcitxKey_grave, FcitxKey_Greek_epsilon, 0x1F72, - FcitxKey_grave, FcitxKey_Greek_eta, 0x1F74, - FcitxKey_grave, FcitxKey_Greek_iota, 0x1F76, - FcitxKey_grave, FcitxKey_Greek_omicron, 0x1F78, - FcitxKey_grave, FcitxKey_Greek_upsilon, 0x1F7A, - FcitxKey_grave, FcitxKey_Greek_omega, 0x1F7C, - FcitxKey_grave, 0x1F00, 0x1F02, - FcitxKey_grave, 0x1F01, 0x1F03, - FcitxKey_grave, 0x1F08, 0x1F0A, - FcitxKey_grave, 0x1F09, 0x1F0B, - FcitxKey_grave, 0x1F10, 0x1F12, - FcitxKey_grave, 0x1F11, 0x1F13, - FcitxKey_grave, 0x1F18, 0x1F1A, - FcitxKey_grave, 0x1F19, 0x1F1B, - FcitxKey_grave, 0x1F20, 0x1F22, - FcitxKey_grave, 0x1F21, 0x1F23, - FcitxKey_grave, 0x1F28, 0x1F2A, - FcitxKey_grave, 0x1F29, 0x1F2B, - FcitxKey_grave, 0x1F30, 0x1F32, - FcitxKey_grave, 0x1F31, 0x1F33, - FcitxKey_grave, 0x1F38, 0x1F3A, - FcitxKey_grave, 0x1F39, 0x1F3B, - FcitxKey_grave, 0x1F40, 0x1F42, - FcitxKey_grave, 0x1F41, 0x1F43, - FcitxKey_grave, 0x1F48, 0x1F4A, - FcitxKey_grave, 0x1F49, 0x1F4B, - FcitxKey_grave, 0x1F50, 0x1F52, - FcitxKey_grave, 0x1F51, 0x1F53, - FcitxKey_grave, 0x1F59, 0x1F5B, - FcitxKey_grave, 0x1F60, 0x1F62, - FcitxKey_grave, 0x1F61, 0x1F63, - FcitxKey_grave, 0x1F68, 0x1F6A, - FcitxKey_grave, 0x1F69, 0x1F6B, - FcitxKey_a, FcitxKey_quotedbl, 0x00E4, - FcitxKey_a, FcitxKey_apostrophe, 0x00E1, - FcitxKey_a, FcitxKey_parenleft, 0x0103, - FcitxKey_a, FcitxKey_asterisk, 0x00E5, - FcitxKey_a, FcitxKey_comma, 0x0105, - FcitxKey_a, FcitxKey_minus, 0x00E3, - FcitxKey_a, FcitxKey_greater, 0x00E2, - FcitxKey_a, FcitxKey_asciicircum, 0x00E2, - FcitxKey_a, FcitxKey_underscore, 0x00AA, - FcitxKey_a, FcitxKey_grave, 0x00E0, - FcitxKey_a, FcitxKey_a, 0x00E5, - FcitxKey_a, FcitxKey_e, 0x00E6, - FcitxKey_a, FcitxKey_asciitilde, 0x00E3, - FcitxKey_a, FcitxKey_diaeresis, 0x00E4, - FcitxKey_a, FcitxKey_acute, 0x00E1, - FcitxKey_b, FcitxKey_period, 0x1E03, - FcitxKey_b, FcitxKey_A, 0x0102, - FcitxKey_b, FcitxKey_E, 0x0114, - FcitxKey_b, FcitxKey_G, 0x011E, - FcitxKey_b, FcitxKey_I, 0x012C, - FcitxKey_b, FcitxKey_O, 0x014E, - FcitxKey_b, FcitxKey_U, 0x016C, - FcitxKey_b, FcitxKey_a, 0x0103, - FcitxKey_b, FcitxKey_e, 0x0115, - FcitxKey_b, FcitxKey_g, 0x011F, - FcitxKey_b, FcitxKey_i, 0x012D, - FcitxKey_b, FcitxKey_o, 0x014F, - FcitxKey_b, FcitxKey_u, 0x016D, - FcitxKey_b, 0x0228, 0x1E1C, - FcitxKey_b, 0x0229, 0x1E1D, - FcitxKey_b, FcitxKey_Cyrillic_a, 0x04D1, - FcitxKey_b, FcitxKey_Cyrillic_ie, 0x04D7, - FcitxKey_b, FcitxKey_Cyrillic_i, 0x0439, - FcitxKey_b, FcitxKey_Cyrillic_u, 0x045E, - FcitxKey_b, FcitxKey_Cyrillic_zhe, 0x04C2, - FcitxKey_b, FcitxKey_Cyrillic_A, 0x04D0, - FcitxKey_b, FcitxKey_Cyrillic_IE, 0x04D6, - FcitxKey_b, FcitxKey_Cyrillic_I, 0x0419, - FcitxKey_b, FcitxKey_Cyrillic_U, 0x040E, - FcitxKey_b, FcitxKey_Cyrillic_ZHE, 0x04C1, - FcitxKey_b, FcitxKey_Greek_ALPHA, 0x1FB8, - FcitxKey_b, FcitxKey_Greek_IOTA, 0x1FD8, - FcitxKey_b, FcitxKey_Greek_UPSILON, 0x1FE8, - FcitxKey_b, FcitxKey_Greek_alpha, 0x1FB0, - FcitxKey_b, FcitxKey_Greek_iota, 0x1FD0, - FcitxKey_b, FcitxKey_Greek_upsilon, 0x1FE0, - FcitxKey_b, 0x1EA0, 0x1EB6, - FcitxKey_b, 0x1EA1, 0x1EB7, - FcitxKey_c, FcitxKey_apostrophe, 0x0107, - FcitxKey_c, FcitxKey_comma, 0x00E7, - FcitxKey_c, FcitxKey_period, 0x010B, - FcitxKey_c, FcitxKey_slash, 0x00A2, - FcitxKey_c, FcitxKey_0, 0x00A9, - FcitxKey_c, FcitxKey_less, 0x010D, - FcitxKey_c, FcitxKey_equal, 0x20AC, - FcitxKey_c, FcitxKey_A, 0x01CD, - FcitxKey_c, FcitxKey_C, 0x010C, - FcitxKey_c, FcitxKey_D, 0x010E, - FcitxKey_c, FcitxKey_E, 0x011A, - FcitxKey_c, FcitxKey_G, 0x01E6, - FcitxKey_c, FcitxKey_H, 0x021E, - FcitxKey_c, FcitxKey_I, 0x01CF, - FcitxKey_c, FcitxKey_K, 0x01E8, - FcitxKey_c, FcitxKey_L, 0x013D, - FcitxKey_c, FcitxKey_N, 0x0147, - FcitxKey_c, FcitxKey_O, 0x00A9, - FcitxKey_c, FcitxKey_R, 0x0158, - FcitxKey_c, FcitxKey_S, 0x0160, - FcitxKey_c, FcitxKey_T, 0x0164, - FcitxKey_c, FcitxKey_U, 0x01D3, - FcitxKey_c, FcitxKey_Z, 0x017D, - FcitxKey_c, FcitxKey_a, 0x01CE, - FcitxKey_c, FcitxKey_c, 0x010D, - FcitxKey_c, FcitxKey_d, 0x010F, - FcitxKey_c, FcitxKey_e, 0x011B, - FcitxKey_c, FcitxKey_g, 0x01E7, - FcitxKey_c, FcitxKey_h, 0x021F, - FcitxKey_c, FcitxKey_i, 0x01D0, - FcitxKey_c, FcitxKey_j, 0x01F0, - FcitxKey_c, FcitxKey_k, 0x01E9, - FcitxKey_c, FcitxKey_l, 0x013E, - FcitxKey_c, FcitxKey_n, 0x0148, - FcitxKey_c, FcitxKey_o, 0x00A9, - FcitxKey_c, FcitxKey_r, 0x0159, - FcitxKey_c, FcitxKey_s, 0x0161, - FcitxKey_c, FcitxKey_t, 0x0165, - FcitxKey_c, FcitxKey_u, 0x01D4, - FcitxKey_c, FcitxKey_z, 0x017E, - FcitxKey_c, FcitxKey_bar, 0x00A2, - FcitxKey_c, 0x00DC, 0x01D9, - FcitxKey_c, FcitxKey_udiaeresis, 0x01DA, - FcitxKey_c, 0x01B7, 0x01EE, - FcitxKey_c, 0x0292, 0x01EF, - FcitxKey_d, FcitxKey_minus, 0x0111, - FcitxKey_d, FcitxKey_period, 0x1E0B, - FcitxKey_d, FcitxKey_less, 0x010F, - FcitxKey_d, FcitxKey_h, 0x00F0, - FcitxKey_e, FcitxKey_quotedbl, 0x00EB, - FcitxKey_e, FcitxKey_apostrophe, 0x00E9, - FcitxKey_e, FcitxKey_comma, 0x0119, - FcitxKey_e, FcitxKey_minus, 0x0113, - FcitxKey_e, FcitxKey_period, 0x0117, - FcitxKey_e, FcitxKey_less, 0x011B, - FcitxKey_e, FcitxKey_equal, 0x20AC, - FcitxKey_e, FcitxKey_greater, 0x00EA, - FcitxKey_e, FcitxKey_asciicircum, 0x00EA, - FcitxKey_e, FcitxKey_underscore, 0x0113, - FcitxKey_e, FcitxKey_grave, 0x00E8, - FcitxKey_e, FcitxKey_e, 0x0259, - FcitxKey_e, FcitxKey_diaeresis, 0x00EB, - FcitxKey_e, FcitxKey_acute, 0x00E9, - FcitxKey_f, FcitxKey_period, 0x1E1F, - FcitxKey_f, FcitxKey_S, 0x017F, - FcitxKey_f, FcitxKey_s, 0x017F, - FcitxKey_g, FcitxKey_parenleft, 0x011F, - FcitxKey_g, FcitxKey_comma, 0x0123, - FcitxKey_g, FcitxKey_period, 0x0121, - FcitxKey_g, FcitxKey_U, 0x011F, - FcitxKey_g, FcitxKey_breve, 0x011F, - FcitxKey_i, FcitxKey_quotedbl, 0x00EF, - FcitxKey_i, FcitxKey_apostrophe, 0x00ED, - FcitxKey_i, FcitxKey_comma, 0x012F, - FcitxKey_i, FcitxKey_minus, 0x012B, - FcitxKey_i, FcitxKey_period, 0x0131, - FcitxKey_i, FcitxKey_greater, 0x00EE, - FcitxKey_i, FcitxKey_asciicircum, 0x00EE, - FcitxKey_i, FcitxKey_underscore, 0x012B, - FcitxKey_i, FcitxKey_grave, 0x00EC, - FcitxKey_i, FcitxKey_asciitilde, 0x0129, - FcitxKey_i, FcitxKey_diaeresis, 0x00EF, - FcitxKey_i, FcitxKey_acute, 0x00ED, - FcitxKey_k, FcitxKey_comma, 0x0137, - FcitxKey_k, FcitxKey_k, 0x0138, - FcitxKey_l, FcitxKey_apostrophe, 0x013A, - FcitxKey_l, FcitxKey_comma, 0x013C, - FcitxKey_l, FcitxKey_minus, 0x00A3, - FcitxKey_l, FcitxKey_slash, 0x0142, - FcitxKey_l, FcitxKey_less, 0x013E, - FcitxKey_l, FcitxKey_equal, 0x00A3, - FcitxKey_l, FcitxKey_v, 0x007C, - FcitxKey_m, FcitxKey_period, 0x1E41, - FcitxKey_m, FcitxKey_slash, 0x20A5, - FcitxKey_m, FcitxKey_u, 0x00B5, - FcitxKey_n, FcitxKey_apostrophe, 0x0144, - FcitxKey_n, FcitxKey_comma, 0x0146, - FcitxKey_n, FcitxKey_minus, 0x00F1, - FcitxKey_n, FcitxKey_less, 0x0148, - FcitxKey_n, FcitxKey_g, 0x014B, - FcitxKey_n, FcitxKey_asciitilde, 0x00F1, - FcitxKey_o, FcitxKey_quotedbl, 0x00F6, - FcitxKey_o, FcitxKey_apostrophe, 0x00F3, - FcitxKey_o, FcitxKey_minus, 0x00F5, - FcitxKey_o, FcitxKey_slash, 0x00F8, - FcitxKey_o, FcitxKey_greater, 0x00F4, - FcitxKey_o, FcitxKey_A, 0x00C5, - FcitxKey_o, FcitxKey_C, 0x00A9, - FcitxKey_o, FcitxKey_R, 0x00AE, - FcitxKey_o, FcitxKey_U, 0x016E, - FcitxKey_o, FcitxKey_X, 0x00A4, - FcitxKey_o, FcitxKey_asciicircum, 0x00F4, - FcitxKey_o, FcitxKey_underscore, 0x00BA, - FcitxKey_o, FcitxKey_grave, 0x00F2, - FcitxKey_o, FcitxKey_a, 0x00E5, - FcitxKey_o, FcitxKey_c, 0x00A9, - FcitxKey_o, FcitxKey_e, 0x0153, - FcitxKey_o, FcitxKey_o, 0x00B0, - FcitxKey_o, FcitxKey_r, 0x00AE, - FcitxKey_o, FcitxKey_s, 0x00A7, - FcitxKey_o, FcitxKey_u, 0x016F, - FcitxKey_o, FcitxKey_w, 0x1E98, - FcitxKey_o, FcitxKey_x, 0x00A4, - FcitxKey_o, FcitxKey_y, 0x1E99, - FcitxKey_o, FcitxKey_asciitilde, 0x00F5, - FcitxKey_o, FcitxKey_diaeresis, 0x00F6, - FcitxKey_o, FcitxKey_acute, 0x00F3, - FcitxKey_p, FcitxKey_exclam, 0x00B6, - FcitxKey_p, FcitxKey_period, 0x1E57, - FcitxKey_r, FcitxKey_apostrophe, 0x0155, - FcitxKey_r, FcitxKey_comma, 0x0157, - FcitxKey_r, FcitxKey_less, 0x0159, - FcitxKey_s, FcitxKey_exclam, 0x00A7, - FcitxKey_s, FcitxKey_apostrophe, 0x015B, - FcitxKey_s, FcitxKey_comma, 0x015F, - FcitxKey_s, FcitxKey_period, 0x1E61, - FcitxKey_s, FcitxKey_0, 0x00A7, - FcitxKey_s, FcitxKey_1, 0x00B9, - FcitxKey_s, FcitxKey_2, 0x00B2, - FcitxKey_s, FcitxKey_3, 0x00B3, - FcitxKey_s, FcitxKey_less, 0x0161, - FcitxKey_s, FcitxKey_M, 0x2120, - FcitxKey_s, FcitxKey_m, 0x2120, - FcitxKey_s, FcitxKey_o, 0x00A7, - FcitxKey_s, FcitxKey_s, 0x00DF, - FcitxKey_s, FcitxKey_cedilla, 0x015F, - FcitxKey_t, FcitxKey_minus, 0x0167, - FcitxKey_t, FcitxKey_period, 0x1E6B, - FcitxKey_t, FcitxKey_slash, 0x0167, - FcitxKey_t, FcitxKey_less, 0x0165, - FcitxKey_t, FcitxKey_M, 0x2122, - FcitxKey_t, FcitxKey_h, 0x00FE, - FcitxKey_t, FcitxKey_m, 0x2122, - FcitxKey_u, FcitxKey_quotedbl, 0x00FC, - FcitxKey_u, FcitxKey_apostrophe, 0x00FA, - FcitxKey_u, FcitxKey_asterisk, 0x016F, - FcitxKey_u, FcitxKey_comma, 0x0173, - FcitxKey_u, FcitxKey_minus, 0x016B, - FcitxKey_u, FcitxKey_slash, 0x00B5, - FcitxKey_u, FcitxKey_greater, 0x00FB, - FcitxKey_u, FcitxKey_asciicircum, 0x00FB, - FcitxKey_u, FcitxKey_underscore, 0x016B, - FcitxKey_u, FcitxKey_grave, 0x00F9, - FcitxKey_u, FcitxKey_u, 0x016D, - FcitxKey_u, FcitxKey_asciitilde, 0x0169, - FcitxKey_u, FcitxKey_diaeresis, 0x00FC, - FcitxKey_u, FcitxKey_acute, 0x00FA, - FcitxKey_v, FcitxKey_Z, 0x017D, - FcitxKey_v, FcitxKey_l, 0x007C, - FcitxKey_v, FcitxKey_z, 0x017E, - FcitxKey_w, FcitxKey_asciicircum, 0x0175, - FcitxKey_x, FcitxKey_0, 0x00A4, - FcitxKey_x, FcitxKey_O, 0x00A4, - FcitxKey_x, FcitxKey_o, 0x00A4, - FcitxKey_x, FcitxKey_x, 0x00D7, - FcitxKey_y, FcitxKey_quotedbl, 0x00FF, - FcitxKey_y, FcitxKey_apostrophe, 0x00FD, - FcitxKey_y, FcitxKey_minus, 0x00A5, - FcitxKey_y, FcitxKey_equal, 0x00A5, - FcitxKey_y, FcitxKey_asciicircum, 0x0177, - FcitxKey_y, FcitxKey_diaeresis, 0x00FF, - FcitxKey_y, FcitxKey_acute, 0x00FD, - FcitxKey_z, FcitxKey_apostrophe, 0x017A, - FcitxKey_z, FcitxKey_period, 0x017C, - FcitxKey_z, FcitxKey_less, 0x017E, - FcitxKey_bar, FcitxKey_C, 0x00A2, - FcitxKey_bar, FcitxKey_c, 0x00A2, - FcitxKey_asciitilde, FcitxKey_space, 0x007E, - FcitxKey_asciitilde, FcitxKey_A, 0x00C3, - FcitxKey_asciitilde, FcitxKey_E, 0x1EBC, - FcitxKey_asciitilde, FcitxKey_I, 0x0128, - FcitxKey_asciitilde, FcitxKey_N, 0x00D1, - FcitxKey_asciitilde, FcitxKey_O, 0x00D5, - FcitxKey_asciitilde, FcitxKey_U, 0x0168, - FcitxKey_asciitilde, FcitxKey_V, 0x1E7C, - FcitxKey_asciitilde, FcitxKey_Y, 0x1EF8, - FcitxKey_asciitilde, FcitxKey_a, 0x00E3, - FcitxKey_asciitilde, FcitxKey_e, 0x1EBD, - FcitxKey_asciitilde, FcitxKey_i, 0x0129, - FcitxKey_asciitilde, FcitxKey_n, 0x00F1, - FcitxKey_asciitilde, FcitxKey_o, 0x00F5, - FcitxKey_asciitilde, FcitxKey_u, 0x0169, - FcitxKey_asciitilde, FcitxKey_v, 0x1E7D, - FcitxKey_asciitilde, FcitxKey_y, 0x1EF9, - FcitxKey_asciitilde, FcitxKey_Acircumflex, 0x1EAA, - FcitxKey_asciitilde, FcitxKey_Ecircumflex, 0x1EC4, - FcitxKey_asciitilde, FcitxKey_Ocircumflex, 0x1ED6, - FcitxKey_asciitilde, FcitxKey_acircumflex, 0x1EAB, - FcitxKey_asciitilde, FcitxKey_ecircumflex, 0x1EC5, - FcitxKey_asciitilde, FcitxKey_ocircumflex, 0x1ED7, - FcitxKey_asciitilde, FcitxKey_Ohorn, 0x1EE0, - FcitxKey_asciitilde, FcitxKey_ohorn, 0x1EE1, - FcitxKey_asciitilde, FcitxKey_Uhorn, 0x1EEE, - FcitxKey_asciitilde, FcitxKey_uhorn, 0x1EEF, - FcitxKey_asciitilde, FcitxKey_Abreve, 0x1EB4, - FcitxKey_asciitilde, FcitxKey_abreve, 0x1EB5, - FcitxKey_asciitilde, FcitxKey_Greek_iotadieresis, 0x1FD7, - FcitxKey_asciitilde, FcitxKey_Greek_upsilondieresis, 0x1FE7, - FcitxKey_asciitilde, FcitxKey_Greek_alpha, 0x1FB6, - FcitxKey_asciitilde, FcitxKey_Greek_eta, 0x1FC6, - FcitxKey_asciitilde, FcitxKey_Greek_iota, 0x1FD6, - FcitxKey_asciitilde, FcitxKey_Greek_upsilon, 0x1FE6, - FcitxKey_asciitilde, FcitxKey_Greek_omega, 0x1FF6, - FcitxKey_asciitilde, 0x1F00, 0x1F06, - FcitxKey_asciitilde, 0x1F01, 0x1F07, - FcitxKey_asciitilde, 0x1F08, 0x1F0E, - FcitxKey_asciitilde, 0x1F09, 0x1F0F, - FcitxKey_asciitilde, 0x1F20, 0x1F26, - FcitxKey_asciitilde, 0x1F21, 0x1F27, - FcitxKey_asciitilde, 0x1F28, 0x1F2E, - FcitxKey_asciitilde, 0x1F29, 0x1F2F, - FcitxKey_asciitilde, 0x1F30, 0x1F36, - FcitxKey_asciitilde, 0x1F31, 0x1F37, - FcitxKey_asciitilde, 0x1F38, 0x1F3E, - FcitxKey_asciitilde, 0x1F39, 0x1F3F, - FcitxKey_asciitilde, 0x1F50, 0x1F56, - FcitxKey_asciitilde, 0x1F51, 0x1F57, - FcitxKey_asciitilde, 0x1F59, 0x1F5F, - FcitxKey_asciitilde, 0x1F60, 0x1F66, - FcitxKey_asciitilde, 0x1F61, 0x1F67, - FcitxKey_asciitilde, 0x1F68, 0x1F6E, - FcitxKey_asciitilde, 0x1F69, 0x1F6F, - FcitxKey_diaeresis, FcitxKey_apostrophe, 0x0385, - FcitxKey_diaeresis, FcitxKey_A, 0x00C4, - FcitxKey_diaeresis, FcitxKey_E, 0x00CB, - FcitxKey_diaeresis, FcitxKey_I, 0x00CF, - FcitxKey_diaeresis, FcitxKey_O, 0x00D6, - FcitxKey_diaeresis, FcitxKey_U, 0x00DC, - FcitxKey_diaeresis, FcitxKey_Y, 0x0178, - FcitxKey_diaeresis, FcitxKey_grave, 0x1FED, - FcitxKey_diaeresis, FcitxKey_a, 0x00E4, - FcitxKey_diaeresis, FcitxKey_e, 0x00EB, - FcitxKey_diaeresis, FcitxKey_i, 0x00EF, - FcitxKey_diaeresis, FcitxKey_o, 0x00F6, - FcitxKey_diaeresis, FcitxKey_u, 0x00FC, - FcitxKey_diaeresis, FcitxKey_y, 0x00FF, - FcitxKey_diaeresis, FcitxKey_asciitilde, 0x1FC1, - FcitxKey_diaeresis, FcitxKey_acute, 0x0385, - FcitxKey_diaeresis, FcitxKey_dead_grave, 0x1FED, - FcitxKey_diaeresis, FcitxKey_dead_acute, 0x0385, - FcitxKey_diaeresis, FcitxKey_dead_tilde, 0x1FC1, - FcitxKey_macron, FcitxKey_A, 0x0100, - FcitxKey_macron, FcitxKey_E, 0x0112, - FcitxKey_macron, FcitxKey_G, 0x1E20, - FcitxKey_macron, FcitxKey_I, 0x012A, - FcitxKey_macron, FcitxKey_O, 0x014C, - FcitxKey_macron, FcitxKey_U, 0x016A, - FcitxKey_macron, FcitxKey_Y, 0x0232, - FcitxKey_macron, FcitxKey_a, 0x0101, - FcitxKey_macron, FcitxKey_e, 0x0113, - FcitxKey_macron, FcitxKey_g, 0x1E21, - FcitxKey_macron, FcitxKey_i, 0x012B, - FcitxKey_macron, FcitxKey_o, 0x014D, - FcitxKey_macron, FcitxKey_u, 0x016B, - FcitxKey_macron, FcitxKey_y, 0x0233, - FcitxKey_macron, FcitxKey_Adiaeresis, 0x01DE, - FcitxKey_macron, FcitxKey_AE, 0x01E2, - FcitxKey_macron, FcitxKey_Otilde, 0x022C, - FcitxKey_macron, FcitxKey_Odiaeresis, 0x022A, - FcitxKey_macron, 0x00DC, 0x01D5, - FcitxKey_macron, FcitxKey_adiaeresis, 0x01DF, - FcitxKey_macron, FcitxKey_ae, 0x01E3, - FcitxKey_macron, FcitxKey_otilde, 0x022D, - FcitxKey_macron, FcitxKey_odiaeresis, 0x022B, - FcitxKey_macron, FcitxKey_udiaeresis, 0x01D6, - FcitxKey_macron, 0x01EA, 0x01EC, - FcitxKey_macron, 0x01EB, 0x01ED, - FcitxKey_macron, 0x0226, 0x01E0, - FcitxKey_macron, 0x0227, 0x01E1, - FcitxKey_macron, 0x022E, 0x0230, - FcitxKey_macron, 0x022F, 0x0231, - FcitxKey_macron, FcitxKey_Cyrillic_i, 0x04E3, - FcitxKey_macron, FcitxKey_Cyrillic_u, 0x04EF, - FcitxKey_macron, FcitxKey_Cyrillic_I, 0x04E2, - FcitxKey_macron, FcitxKey_Cyrillic_U, 0x04EE, - FcitxKey_macron, FcitxKey_Greek_ALPHA, 0x1FB9, - FcitxKey_macron, FcitxKey_Greek_IOTA, 0x1FD9, - FcitxKey_macron, FcitxKey_Greek_UPSILON, 0x1FE9, - FcitxKey_macron, FcitxKey_Greek_alpha, 0x1FB1, - FcitxKey_macron, FcitxKey_Greek_iota, 0x1FD1, - FcitxKey_macron, FcitxKey_Greek_upsilon, 0x1FE1, - FcitxKey_macron, 0x1E36, 0x1E38, - FcitxKey_macron, 0x1E37, 0x1E39, - FcitxKey_macron, 0x1E5A, 0x1E5C, - FcitxKey_macron, 0x1E5B, 0x1E5D, - FcitxKey_acute, FcitxKey_A, 0x00C1, - FcitxKey_acute, FcitxKey_C, 0x0106, - FcitxKey_acute, FcitxKey_E, 0x00C9, - FcitxKey_acute, FcitxKey_G, 0x01F4, - FcitxKey_acute, FcitxKey_I, 0x00CD, - FcitxKey_acute, FcitxKey_K, 0x1E30, - FcitxKey_acute, FcitxKey_L, 0x0139, - FcitxKey_acute, FcitxKey_M, 0x1E3E, - FcitxKey_acute, FcitxKey_N, 0x0143, - FcitxKey_acute, FcitxKey_O, 0x00D3, - FcitxKey_acute, FcitxKey_P, 0x1E54, - FcitxKey_acute, FcitxKey_R, 0x0154, - FcitxKey_acute, FcitxKey_S, 0x015A, - FcitxKey_acute, FcitxKey_U, 0x00DA, - FcitxKey_acute, FcitxKey_W, 0x1E82, - FcitxKey_acute, FcitxKey_Y, 0x00DD, - FcitxKey_acute, FcitxKey_Z, 0x0179, - FcitxKey_acute, FcitxKey_a, 0x00E1, - FcitxKey_acute, FcitxKey_c, 0x0107, - FcitxKey_acute, FcitxKey_e, 0x00E9, - FcitxKey_acute, FcitxKey_g, 0x01F5, - FcitxKey_acute, FcitxKey_i, 0x00ED, - FcitxKey_acute, FcitxKey_k, 0x1E31, - FcitxKey_acute, FcitxKey_l, 0x013A, - FcitxKey_acute, FcitxKey_m, 0x1E3F, - FcitxKey_acute, FcitxKey_n, 0x0144, - FcitxKey_acute, FcitxKey_o, 0x00F3, - FcitxKey_acute, FcitxKey_p, 0x1E55, - FcitxKey_acute, FcitxKey_r, 0x0155, - FcitxKey_acute, FcitxKey_s, 0x015B, - FcitxKey_acute, FcitxKey_u, 0x00FA, - FcitxKey_acute, FcitxKey_w, 0x1E83, - FcitxKey_acute, FcitxKey_y, 0x00FD, - FcitxKey_acute, FcitxKey_z, 0x017A, - FcitxKey_acute, FcitxKey_Acircumflex, 0x1EA4, - FcitxKey_acute, FcitxKey_Aring, 0x01FA, - FcitxKey_acute, FcitxKey_AE, 0x01FC, - FcitxKey_acute, FcitxKey_Ccedilla, 0x1E08, - FcitxKey_acute, FcitxKey_Ecircumflex, 0x1EBE, - FcitxKey_acute, FcitxKey_Idiaeresis, 0x1E2E, - FcitxKey_acute, FcitxKey_Ocircumflex, 0x1ED0, - FcitxKey_acute, FcitxKey_Otilde, 0x1E4C, - FcitxKey_acute, FcitxKey_Ooblique, 0x01FE, - FcitxKey_acute, 0x00DC, 0x01D7, - FcitxKey_acute, FcitxKey_acircumflex, 0x1EA5, - FcitxKey_acute, FcitxKey_aring, 0x01FB, - FcitxKey_acute, FcitxKey_ae, 0x01FD, - FcitxKey_acute, FcitxKey_ccedilla, 0x1E09, - FcitxKey_acute, FcitxKey_ecircumflex, 0x1EBF, - FcitxKey_acute, FcitxKey_idiaeresis, 0x1E2F, - FcitxKey_acute, FcitxKey_ocircumflex, 0x1ED1, - FcitxKey_acute, FcitxKey_otilde, 0x1E4D, - FcitxKey_acute, FcitxKey_oslash, 0x01FF, - FcitxKey_acute, FcitxKey_udiaeresis, 0x01D8, - FcitxKey_acute, FcitxKey_Ohorn, 0x1EDA, - FcitxKey_acute, FcitxKey_ohorn, 0x1EDB, - FcitxKey_acute, FcitxKey_Uhorn, 0x1EE8, - FcitxKey_acute, FcitxKey_uhorn, 0x1EE9, - FcitxKey_acute, FcitxKey_Abreve, 0x1EAE, - FcitxKey_acute, FcitxKey_abreve, 0x1EAF, - FcitxKey_acute, FcitxKey_Emacron, 0x1E16, - FcitxKey_acute, FcitxKey_emacron, 0x1E17, - FcitxKey_acute, FcitxKey_Omacron, 0x1E52, - FcitxKey_acute, FcitxKey_Utilde, 0x1E78, - FcitxKey_acute, FcitxKey_omacron, 0x1E53, - FcitxKey_acute, FcitxKey_utilde, 0x1E79, - FcitxKey_acute, FcitxKey_Cyrillic_ghe, 0x0453, - FcitxKey_acute, FcitxKey_Cyrillic_ka, 0x045C, - FcitxKey_acute, FcitxKey_Cyrillic_GHE, 0x0403, - FcitxKey_acute, FcitxKey_Cyrillic_KA, 0x040C, - FcitxKey_acute, FcitxKey_Greek_iotadieresis, 0x0390, - FcitxKey_acute, FcitxKey_Greek_upsilondieresis, 0x03B0, - FcitxKey_acute, FcitxKey_Greek_ALPHA, 0x0386, - FcitxKey_acute, FcitxKey_Greek_EPSILON, 0x0388, - FcitxKey_acute, FcitxKey_Greek_ETA, 0x0389, - FcitxKey_acute, FcitxKey_Greek_IOTA, 0x038A, - FcitxKey_acute, FcitxKey_Greek_OMICRON, 0x038C, - FcitxKey_acute, FcitxKey_Greek_UPSILON, 0x038E, - FcitxKey_acute, FcitxKey_Greek_OMEGA, 0x038F, - FcitxKey_acute, FcitxKey_Greek_alpha, 0x03AC, - FcitxKey_acute, FcitxKey_Greek_epsilon, 0x03AD, - FcitxKey_acute, FcitxKey_Greek_eta, 0x03AE, - FcitxKey_acute, FcitxKey_Greek_iota, 0x03AF, - FcitxKey_acute, FcitxKey_Greek_omicron, 0x03CC, - FcitxKey_acute, FcitxKey_Greek_upsilon, 0x03CD, - FcitxKey_acute, FcitxKey_Greek_omega, 0x03CE, - FcitxKey_acute, 0x1F00, 0x1F04, - FcitxKey_acute, 0x1F01, 0x1F05, - FcitxKey_acute, 0x1F08, 0x1F0C, - FcitxKey_acute, 0x1F09, 0x1F0D, - FcitxKey_acute, 0x1F10, 0x1F14, - FcitxKey_acute, 0x1F11, 0x1F15, - FcitxKey_acute, 0x1F18, 0x1F1C, - FcitxKey_acute, 0x1F19, 0x1F1D, - FcitxKey_acute, 0x1F20, 0x1F24, - FcitxKey_acute, 0x1F21, 0x1F25, - FcitxKey_acute, 0x1F28, 0x1F2C, - FcitxKey_acute, 0x1F29, 0x1F2D, - FcitxKey_acute, 0x1F30, 0x1F34, - FcitxKey_acute, 0x1F31, 0x1F35, - FcitxKey_acute, 0x1F38, 0x1F3C, - FcitxKey_acute, 0x1F39, 0x1F3D, - FcitxKey_acute, 0x1F40, 0x1F44, - FcitxKey_acute, 0x1F41, 0x1F45, - FcitxKey_acute, 0x1F48, 0x1F4C, - FcitxKey_acute, 0x1F49, 0x1F4D, - FcitxKey_acute, 0x1F50, 0x1F54, - FcitxKey_acute, 0x1F51, 0x1F55, - FcitxKey_acute, 0x1F59, 0x1F5D, - FcitxKey_acute, 0x1F60, 0x1F64, - FcitxKey_acute, 0x1F61, 0x1F65, - FcitxKey_acute, 0x1F68, 0x1F6C, - FcitxKey_acute, 0x1F69, 0x1F6D, - FcitxKey_cedilla, FcitxKey_C, 0x00C7, - FcitxKey_cedilla, FcitxKey_D, 0x1E10, - FcitxKey_cedilla, FcitxKey_E, 0x0228, - FcitxKey_cedilla, FcitxKey_G, 0x0122, - FcitxKey_cedilla, FcitxKey_H, 0x1E28, - FcitxKey_cedilla, FcitxKey_K, 0x0136, - FcitxKey_cedilla, FcitxKey_L, 0x013B, - FcitxKey_cedilla, FcitxKey_N, 0x0145, - FcitxKey_cedilla, FcitxKey_R, 0x0156, - FcitxKey_cedilla, FcitxKey_S, 0x015E, - FcitxKey_cedilla, FcitxKey_T, 0x0162, - FcitxKey_cedilla, FcitxKey_c, 0x00E7, - FcitxKey_cedilla, FcitxKey_d, 0x1E11, - FcitxKey_cedilla, FcitxKey_e, 0x0229, - FcitxKey_cedilla, FcitxKey_g, 0x0123, - FcitxKey_cedilla, FcitxKey_h, 0x1E29, - FcitxKey_cedilla, FcitxKey_k, 0x0137, - FcitxKey_cedilla, FcitxKey_l, 0x013C, - FcitxKey_cedilla, FcitxKey_n, 0x0146, - FcitxKey_cedilla, FcitxKey_r, 0x0157, - FcitxKey_cedilla, FcitxKey_s, 0x015F, - FcitxKey_cedilla, FcitxKey_t, 0x0163, - FcitxKey_breve, FcitxKey_G, 0x011E, - FcitxKey_breve, FcitxKey_g, 0x011F, - 0x05B4, FcitxKey_hebrew_yod, 0xFB1D, - 0x05B7, 0x05F2, 0xFB1F, - 0x05B7, FcitxKey_hebrew_aleph, 0xFB2E, - 0x05B8, FcitxKey_hebrew_aleph, 0xFB2F, - 0x05B9, FcitxKey_hebrew_waw, 0xFB4B, - 0x05BC, FcitxKey_hebrew_aleph, 0xFB30, - 0x05BC, FcitxKey_hebrew_beth, 0xFB31, - 0x05BC, FcitxKey_hebrew_gimmel, 0xFB32, - 0x05BC, FcitxKey_hebrew_daleth, 0xFB33, - 0x05BC, FcitxKey_hebrew_he, 0xFB34, - 0x05BC, FcitxKey_hebrew_waw, 0xFB35, - 0x05BC, FcitxKey_hebrew_zayin, 0xFB36, - 0x05BC, FcitxKey_hebrew_teth, 0xFB38, - 0x05BC, FcitxKey_hebrew_yod, 0xFB39, - 0x05BC, FcitxKey_hebrew_finalkaph, 0xFB3A, - 0x05BC, FcitxKey_hebrew_kaph, 0xFB3B, - 0x05BC, FcitxKey_hebrew_lamed, 0xFB3C, - 0x05BC, FcitxKey_hebrew_mem, 0xFB3E, - 0x05BC, FcitxKey_hebrew_nun, 0xFB40, - 0x05BC, FcitxKey_hebrew_samekh, 0xFB41, - 0x05BC, FcitxKey_hebrew_finalpe, 0xFB43, - 0x05BC, FcitxKey_hebrew_pe, 0xFB44, - 0x05BC, FcitxKey_hebrew_zadi, 0xFB46, - 0x05BC, FcitxKey_hebrew_qoph, 0xFB47, - 0x05BC, FcitxKey_hebrew_resh, 0xFB48, - 0x05BC, FcitxKey_hebrew_shin, 0xFB49, - 0x05BC, FcitxKey_hebrew_taw, 0xFB4A, - 0x05BF, FcitxKey_hebrew_beth, 0xFB4C, - 0x05BF, FcitxKey_hebrew_kaph, 0xFB4D, - 0x05BF, FcitxKey_hebrew_pe, 0xFB4E, - 0x05C1, FcitxKey_hebrew_shin, 0xFB2A, - 0x05C1, 0xFB49, 0xFB2C, - 0x05C2, FcitxKey_hebrew_shin, 0xFB2B, - 0x05C2, 0xFB49, 0xFB2D, - 0x0653, FcitxKey_Arabic_alef, 0x0622, - 0x0654, FcitxKey_Arabic_alef, 0x0623, - 0x0654, FcitxKey_Arabic_waw, 0x0624, - 0x0654, FcitxKey_Arabic_yeh, 0x0626, - 0x0654, 0x06C1, 0x06C2, - 0x0654, 0x06D2, 0x06D3, - 0x0654, 0x06D5, 0x06C0, - 0x0655, FcitxKey_Arabic_alef, 0x0625, - FcitxKey_Cyrillic_pe, FcitxKey_Cyrillic_a, 0x00A7, - FcitxKey_Cyrillic_IE, FcitxKey_equal, 0x20AC, - FcitxKey_Cyrillic_EN, FcitxKey_Cyrillic_o, 0x2116, - FcitxKey_Cyrillic_EN, FcitxKey_Cyrillic_O, 0x2116, - FcitxKey_Cyrillic_ES, FcitxKey_equal, 0x20AC, - FcitxKey_Greek_ALPHA, FcitxKey_apostrophe, 0x0386, - FcitxKey_Greek_EPSILON, FcitxKey_apostrophe, 0x0388, - FcitxKey_Greek_ETA, FcitxKey_apostrophe, 0x0389, - FcitxKey_Greek_IOTA, FcitxKey_quotedbl, 0x03AA, - FcitxKey_Greek_IOTA, FcitxKey_apostrophe, 0x038A, - FcitxKey_Greek_OMICRON, FcitxKey_apostrophe, 0x038C, - FcitxKey_Greek_UPSILON, FcitxKey_quotedbl, 0x03AB, - FcitxKey_Greek_UPSILON, FcitxKey_apostrophe, 0x038E, - FcitxKey_Greek_OMEGA, FcitxKey_apostrophe, 0x038F, - FcitxKey_Greek_alpha, FcitxKey_apostrophe, 0x03AC, - FcitxKey_Greek_epsilon, FcitxKey_apostrophe, 0x03AD, - FcitxKey_Greek_eta, FcitxKey_apostrophe, 0x03AE, - FcitxKey_Greek_iota, FcitxKey_quotedbl, 0x03CA, - FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x03AF, - FcitxKey_Greek_iota, FcitxKey_Greek_alphaaccent, 0x1FB4, - FcitxKey_Greek_iota, FcitxKey_Greek_etaaccent, 0x1FC4, - FcitxKey_Greek_iota, FcitxKey_Greek_omegaaccent, 0x1FF4, - FcitxKey_Greek_iota, FcitxKey_Greek_ALPHA, 0x1FBC, - FcitxKey_Greek_iota, FcitxKey_Greek_ETA, 0x1FCC, - FcitxKey_Greek_iota, FcitxKey_Greek_OMEGA, 0x1FFC, - FcitxKey_Greek_iota, FcitxKey_Greek_alpha, 0x1FB3, - FcitxKey_Greek_iota, FcitxKey_Greek_eta, 0x1FC3, - FcitxKey_Greek_iota, FcitxKey_Greek_omega, 0x1FF3, - FcitxKey_Greek_iota, 0x1F00, 0x1F80, - FcitxKey_Greek_iota, 0x1F01, 0x1F81, - FcitxKey_Greek_iota, 0x1F02, 0x1F82, - FcitxKey_Greek_iota, 0x1F03, 0x1F83, - FcitxKey_Greek_iota, 0x1F04, 0x1F84, - FcitxKey_Greek_iota, 0x1F05, 0x1F85, - FcitxKey_Greek_iota, 0x1F06, 0x1F86, - FcitxKey_Greek_iota, 0x1F07, 0x1F87, - FcitxKey_Greek_iota, 0x1F08, 0x1F88, - FcitxKey_Greek_iota, 0x1F09, 0x1F89, - FcitxKey_Greek_iota, 0x1F0A, 0x1F8A, - FcitxKey_Greek_iota, 0x1F0B, 0x1F8B, - FcitxKey_Greek_iota, 0x1F0C, 0x1F8C, - FcitxKey_Greek_iota, 0x1F0D, 0x1F8D, - FcitxKey_Greek_iota, 0x1F0E, 0x1F8E, - FcitxKey_Greek_iota, 0x1F0F, 0x1F8F, - FcitxKey_Greek_iota, 0x1F20, 0x1F90, - FcitxKey_Greek_iota, 0x1F21, 0x1F91, - FcitxKey_Greek_iota, 0x1F22, 0x1F92, - FcitxKey_Greek_iota, 0x1F23, 0x1F93, - FcitxKey_Greek_iota, 0x1F24, 0x1F94, - FcitxKey_Greek_iota, 0x1F25, 0x1F95, - FcitxKey_Greek_iota, 0x1F26, 0x1F96, - FcitxKey_Greek_iota, 0x1F27, 0x1F97, - FcitxKey_Greek_iota, 0x1F28, 0x1F98, - FcitxKey_Greek_iota, 0x1F29, 0x1F99, - FcitxKey_Greek_iota, 0x1F2A, 0x1F9A, - FcitxKey_Greek_iota, 0x1F2B, 0x1F9B, - FcitxKey_Greek_iota, 0x1F2C, 0x1F9C, - FcitxKey_Greek_iota, 0x1F2D, 0x1F9D, - FcitxKey_Greek_iota, 0x1F2E, 0x1F9E, - FcitxKey_Greek_iota, 0x1F2F, 0x1F9F, - FcitxKey_Greek_iota, 0x1F60, 0x1FA0, - FcitxKey_Greek_iota, 0x1F61, 0x1FA1, - FcitxKey_Greek_iota, 0x1F62, 0x1FA2, - FcitxKey_Greek_iota, 0x1F63, 0x1FA3, - FcitxKey_Greek_iota, 0x1F64, 0x1FA4, - FcitxKey_Greek_iota, 0x1F65, 0x1FA5, - FcitxKey_Greek_iota, 0x1F66, 0x1FA6, - FcitxKey_Greek_iota, 0x1F67, 0x1FA7, - FcitxKey_Greek_iota, 0x1F68, 0x1FA8, - FcitxKey_Greek_iota, 0x1F69, 0x1FA9, - FcitxKey_Greek_iota, 0x1F6A, 0x1FAA, - FcitxKey_Greek_iota, 0x1F6B, 0x1FAB, - FcitxKey_Greek_iota, 0x1F6C, 0x1FAC, - FcitxKey_Greek_iota, 0x1F6D, 0x1FAD, - FcitxKey_Greek_iota, 0x1F6E, 0x1FAE, - FcitxKey_Greek_iota, 0x1F6F, 0x1FAF, - FcitxKey_Greek_iota, 0x1F70, 0x1FB2, - FcitxKey_Greek_iota, 0x1F74, 0x1FC2, - FcitxKey_Greek_iota, 0x1F7C, 0x1FF2, - FcitxKey_Greek_iota, 0x1FB6, 0x1FB7, - FcitxKey_Greek_iota, 0x1FC6, 0x1FC7, - FcitxKey_Greek_iota, 0x1FF6, 0x1FF7, - FcitxKey_Greek_omicron, FcitxKey_apostrophe, 0x03CC, - FcitxKey_Greek_upsilon, FcitxKey_quotedbl, 0x03CB, - FcitxKey_Greek_upsilon, FcitxKey_apostrophe, 0x03CD, - FcitxKey_Greek_omega, FcitxKey_apostrophe, 0x03CE, - FcitxKey_lessthanequal, 0x0338, 0x2270, - FcitxKey_greaterthanequal, 0x0338, 0x2271, - FcitxKey_approximate, 0x0338, 0x2247, - FcitxKey_identical, 0x0338, 0x2262, - FcitxKey_includedin, 0x0338, 0x2284, - FcitxKey_includes, 0x0338, 0x2285, - 0x093C, 0x0915, 0x0958, - 0x093C, 0x0916, 0x0959, - 0x093C, 0x0917, 0x095A, - 0x093C, 0x091C, 0x095B, - 0x093C, 0x0921, 0x095C, - 0x093C, 0x0922, 0x095D, - 0x093C, 0x0928, 0x0929, - 0x093C, 0x092B, 0x095E, - 0x093C, 0x092F, 0x095F, - 0x093C, 0x0930, 0x0931, - 0x093C, 0x0933, 0x0934, - 0x09BC, 0x09A1, 0x09DC, - 0x09BC, 0x09A2, 0x09DD, - 0x09BC, 0x09AF, 0x09DF, - 0x09C7, 0x09BE, 0x09CB, - 0x09C7, 0x09D7, 0x09CC, - 0x0A3C, 0x0A16, 0x0A59, - 0x0A3C, 0x0A17, 0x0A5A, - 0x0A3C, 0x0A1C, 0x0A5B, - 0x0A3C, 0x0A2B, 0x0A5E, - 0x0A3C, 0x0A32, 0x0A33, - 0x0A3C, 0x0A38, 0x0A36, - 0x0B3C, 0x0B21, 0x0B5C, - 0x0B3C, 0x0B22, 0x0B5D, - 0x0B47, 0x0B3E, 0x0B4B, - 0x0B47, 0x0B56, 0x0B48, - 0x0B47, 0x0B57, 0x0B4C, - FcitxKey_leftcaret, 0x0338, 0x226E, - FcitxKey_rightcaret, 0x0338, 0x226F, - FcitxKey_underbar, FcitxKey_parenleft, 0x208D, - FcitxKey_underbar, FcitxKey_parenright, 0x208E, - FcitxKey_underbar, FcitxKey_plus, 0x208A, - FcitxKey_underbar, FcitxKey_0, 0x2080, - FcitxKey_underbar, FcitxKey_1, 0x2081, - FcitxKey_underbar, FcitxKey_2, 0x2082, - FcitxKey_underbar, FcitxKey_3, 0x2083, - FcitxKey_underbar, FcitxKey_4, 0x2084, - FcitxKey_underbar, FcitxKey_5, 0x2085, - FcitxKey_underbar, FcitxKey_6, 0x2086, - FcitxKey_underbar, FcitxKey_7, 0x2087, - FcitxKey_underbar, FcitxKey_8, 0x2088, - FcitxKey_underbar, FcitxKey_9, 0x2089, - FcitxKey_underbar, FcitxKey_equal, 0x208C, - 0x0BC6, 0x0BBE, 0x0BCA, - 0x0BC6, 0x0BD7, 0x0BCC, - FcitxKey_underbar, 0x2212, 0x208B, - FcitxKey_underbar, FcitxKey_KP_Space, 0x2082, - FcitxKey_underbar, FcitxKey_KP_Add, 0x208A, - FcitxKey_underbar, FcitxKey_KP_0, 0x2080, - FcitxKey_underbar, FcitxKey_KP_1, 0x2081, - FcitxKey_underbar, FcitxKey_KP_2, 0x2082, - FcitxKey_underbar, FcitxKey_KP_3, 0x2083, - FcitxKey_underbar, FcitxKey_KP_4, 0x2084, - FcitxKey_underbar, FcitxKey_KP_5, 0x2085, - FcitxKey_underbar, FcitxKey_KP_6, 0x2086, - FcitxKey_underbar, FcitxKey_KP_7, 0x2087, - FcitxKey_underbar, FcitxKey_KP_8, 0x2088, - FcitxKey_underbar, FcitxKey_KP_9, 0x2089, - FcitxKey_underbar, FcitxKey_KP_Equal, 0x208C, - 0x0BC7, 0x0BBE, 0x0BCB, - 0x0BD7, 0x0B92, 0x0B94, - FcitxKey_rightshoe, 0x0338, 0x2285, - FcitxKey_leftshoe, 0x0338, 0x2284, - FcitxKey_righttack, 0x0338, 0x22AC, - 0x0C46, 0x0C56, 0x0C48, - 0x0CBF, 0x0CD5, 0x0CC0, - 0x0CC6, 0x0CC2, 0x0CCA, - 0x0CC6, 0x0CD5, 0x0CC7, - 0x0CC6, 0x0CD6, 0x0CC8, - 0x0CCA, 0x0CD5, 0x0CCB, - 0x0D46, 0x0D3E, 0x0D4A, - 0x0D46, 0x0D57, 0x0D4C, - 0x0D47, 0x0D3E, 0x0D4B, - 0x0DD9, 0x0DCA, 0x0DDA, - 0x0DD9, 0x0DCF, 0x0DDC, - 0x0DD9, 0x0DDF, 0x0DDE, - 0x0DDC, 0x0DCA, 0x0DDD, - 0x0F71, 0x0F72, 0x0F73, - 0x0F71, 0x0F74, 0x0F75, - 0x0F71, 0x0F80, 0x0F81, - 0x0F90, 0x0FB5, 0x0FB9, - 0x0F92, 0x0FB7, 0x0F93, - 0x0F9C, 0x0FB7, 0x0F9D, - 0x0FA1, 0x0FB7, 0x0FA2, - 0x0FA6, 0x0FB7, 0x0FA7, - 0x0FAB, 0x0FB7, 0x0FAC, - 0x0FB2, 0x0F80, 0x0F76, - 0x0FB3, 0x0F80, 0x0F78, - 0x0FB5, 0x0F40, 0x0F69, - 0x0FB7, 0x0F42, 0x0F43, - 0x0FB7, 0x0F4C, 0x0F4D, - 0x0FB7, 0x0F51, 0x0F52, - 0x0FB7, 0x0F56, 0x0F57, - 0x0FB7, 0x0F5B, 0x0F5C, - 0x102E, 0x1025, 0x1026, - 0x1100, 0x1100, 0x1101, - 0x1102, 0x1100, 0x1113, - 0x1102, 0x1102, 0x1114, - 0x1102, 0x1103, 0x1115, - 0x1102, 0x1107, 0x1116, - 0x1103, 0x1100, 0x1117, - 0x1103, 0x1103, 0x1104, - 0x1105, 0x1102, 0x1118, - 0x1105, 0x1105, 0x1119, - 0x1105, 0x110B, 0x111B, - 0x1105, 0x1112, 0x111A, - 0x1106, 0x1107, 0x111C, - 0x1106, 0x110B, 0x111D, - 0x1107, 0x1100, 0x111E, - 0x1107, 0x1102, 0x111F, - 0x1107, 0x1103, 0x1120, - 0x1107, 0x1107, 0x1108, - 0x1107, 0x1109, 0x1121, - 0x1107, 0x110A, 0x1125, - 0x1107, 0x110B, 0x112B, - 0x1107, 0x110C, 0x1127, - 0x1107, 0x110E, 0x1128, - 0x1107, 0x1110, 0x1129, - 0x1107, 0x1111, 0x112A, - 0x1107, 0x112B, 0x112C, - 0x1107, 0x112D, 0x1122, - 0x1107, 0x112F, 0x1123, - 0x1107, 0x1132, 0x1124, - 0x1107, 0x1136, 0x1126, - 0x1108, 0x110B, 0x112C, - 0x1109, 0x1100, 0x112D, - 0x1109, 0x1102, 0x112E, - 0x1109, 0x1103, 0x112F, - 0x1109, 0x1105, 0x1130, - 0x1109, 0x1106, 0x1131, - 0x1109, 0x1107, 0x1132, - 0x1109, 0x1109, 0x110A, - 0x1109, 0x110A, 0x1134, - 0x1109, 0x110B, 0x1135, - 0x1109, 0x110C, 0x1136, - 0x1109, 0x110E, 0x1137, - 0x1109, 0x110F, 0x1138, - 0x1109, 0x1110, 0x1139, - 0x1109, 0x1111, 0x113A, - 0x1109, 0x1112, 0x113B, - 0x1109, 0x111E, 0x1133, - 0x110A, 0x1109, 0x1134, - 0x110B, 0x1100, 0x1141, - 0x110B, 0x1103, 0x1142, - 0x110B, 0x1106, 0x1143, - 0x110B, 0x1107, 0x1144, - 0x110B, 0x1109, 0x1145, - 0x110B, 0x110B, 0x1147, - 0x110B, 0x110C, 0x1148, - 0x110B, 0x110E, 0x1149, - 0x110B, 0x1110, 0x114A, - 0x110B, 0x1111, 0x114B, - 0x110B, 0x1140, 0x1146, - 0x110C, 0x110B, 0x114D, - 0x110C, 0x110C, 0x110D, - 0x110E, 0x110F, 0x1152, - 0x110E, 0x1112, 0x1153, - 0x1111, 0x1107, 0x1156, - 0x1111, 0x110B, 0x1157, - 0x1112, 0x1112, 0x1158, - 0x1121, 0x1100, 0x1122, - 0x1121, 0x1103, 0x1123, - 0x1121, 0x1107, 0x1124, - 0x1121, 0x1109, 0x1125, - 0x1121, 0x110C, 0x1126, - 0x1132, 0x1100, 0x1133, - 0x113C, 0x113C, 0x113D, - 0x113E, 0x113E, 0x113F, - 0x114E, 0x114E, 0x114F, - 0x1150, 0x1150, 0x1151, - 0x1161, 0x1169, 0x1176, - 0x1161, 0x116E, 0x1177, - 0x1161, 0x1175, 0x1162, - 0x1163, 0x1169, 0x1178, - 0x1163, 0x116D, 0x1179, - 0x1163, 0x1175, 0x1164, - 0x1165, 0x1169, 0x117A, - 0x1165, 0x116E, 0x117B, - 0x1165, 0x1173, 0x117C, - 0x1165, 0x1175, 0x1166, - 0x1167, 0x1169, 0x117D, - 0x1167, 0x116E, 0x117E, - 0x1167, 0x1175, 0x1168, - 0x1169, 0x1161, 0x116A, - 0x1169, 0x1162, 0x116B, - 0x1169, 0x1165, 0x117F, - 0x1169, 0x1166, 0x1180, - 0x1169, 0x1168, 0x1181, - 0x1169, 0x1169, 0x1182, - 0x1169, 0x116E, 0x1183, - 0x1169, 0x1175, 0x116C, - 0x116A, 0x1175, 0x116B, - 0x116D, 0x1163, 0x1184, - 0x116D, 0x1164, 0x1185, - 0x116D, 0x1167, 0x1186, - 0x116D, 0x1169, 0x1187, - 0x116D, 0x1175, 0x1188, - 0x116E, 0x1161, 0x1189, - 0x116E, 0x1162, 0x118A, - 0x116E, 0x1165, 0x116F, - 0x116E, 0x1166, 0x1170, - 0x116E, 0x1168, 0x118C, - 0x116E, 0x116E, 0x118D, - 0x116E, 0x1175, 0x1171, - 0x116E, 0x117C, 0x118B, - 0x116F, 0x1173, 0x118B, - 0x116F, 0x1175, 0x1170, - 0x1172, 0x1161, 0x118E, - 0x1172, 0x1165, 0x118F, - 0x1172, 0x1166, 0x1190, - 0x1172, 0x1167, 0x1191, - 0x1172, 0x1168, 0x1192, - 0x1172, 0x116E, 0x1193, - 0x1172, 0x1175, 0x1194, - 0x1173, 0x116E, 0x1195, - 0x1173, 0x1173, 0x1196, - 0x1173, 0x1175, 0x1174, - 0x1174, 0x116E, 0x1197, - 0x1175, 0x1161, 0x1198, - 0x1175, 0x1163, 0x1199, - 0x1175, 0x1169, 0x119A, - 0x1175, 0x116E, 0x119B, - 0x1175, 0x1173, 0x119C, - 0x1175, 0x119E, 0x119D, - 0x119E, 0x1165, 0x119F, - 0x119E, 0x116E, 0x11A0, - 0x119E, 0x1175, 0x11A1, - 0x119E, 0x119E, 0x11A2, - 0x11A8, 0x11A8, 0x11A9, - 0x11A8, 0x11AF, 0x11C3, - 0x11A8, 0x11BA, 0x11AA, - 0x11A8, 0x11E7, 0x11C4, - 0x11AA, 0x11A8, 0x11C4, - 0x11AB, 0x11A8, 0x11C5, - 0x11AB, 0x11AE, 0x11C6, - 0x11AB, 0x11BA, 0x11C7, - 0x11AB, 0x11BD, 0x11AC, - 0x11AB, 0x11C0, 0x11C9, - 0x11AB, 0x11C2, 0x11AD, - 0x11AB, 0x11EB, 0x11C8, - 0x11AE, 0x11A8, 0x11CA, - 0x11AE, 0x11AF, 0x11CB, - 0x11AF, 0x11A8, 0x11B0, - 0x11AF, 0x11AA, 0x11CC, - 0x11AF, 0x11AB, 0x11CD, - 0x11AF, 0x11AE, 0x11CE, - 0x11AF, 0x11AF, 0x11D0, - 0x11AF, 0x11B7, 0x11B1, - 0x11AF, 0x11B8, 0x11B2, - 0x11AF, 0x11B9, 0x11D3, - 0x11AF, 0x11BA, 0x11B3, - 0x11AF, 0x11BB, 0x11D6, - 0x11AF, 0x11BF, 0x11D8, - 0x11AF, 0x11C0, 0x11B4, - 0x11AF, 0x11C1, 0x11B5, - 0x11AF, 0x11C2, 0x11B6, - 0x11AF, 0x11DA, 0x11D1, - 0x11AF, 0x11DD, 0x11D2, - 0x11AF, 0x11E5, 0x11D4, - 0x11AF, 0x11E6, 0x11D5, - 0x11AF, 0x11EB, 0x11D7, - 0x11AF, 0x11F9, 0x11D9, - 0x11B0, 0x11BA, 0x11CC, - 0x11B1, 0x11A8, 0x11D1, - 0x11B1, 0x11BA, 0x11D2, - 0x11B2, 0x11BA, 0x11D3, - 0x11B2, 0x11BC, 0x11D5, - 0x11B2, 0x11C2, 0x11D4, - 0x11B3, 0x11BA, 0x11D6, - 0x11B7, 0x11A8, 0x11DA, - 0x11B7, 0x11AF, 0x11DB, - 0x11B7, 0x11B8, 0x11DC, - 0x11B7, 0x11BA, 0x11DD, - 0x11B7, 0x11BB, 0x11DE, - 0x11B7, 0x11BC, 0x11E2, - 0x11B7, 0x11BE, 0x11E0, - 0x11B7, 0x11C2, 0x11E1, - 0x11B7, 0x11EB, 0x11DF, - 0x11B8, 0x11AF, 0x11E3, - 0x11B8, 0x11BA, 0x11B9, - 0x11B8, 0x11BC, 0x11E6, - 0x11B8, 0x11C1, 0x11E4, - 0x11B8, 0x11C2, 0x11E5, - 0x11BA, 0x11A8, 0x11E7, - 0x11BA, 0x11AE, 0x11E8, - 0x11BA, 0x11AF, 0x11E9, - 0x11BA, 0x11B8, 0x11EA, - 0x11BA, 0x11BA, 0x11BB, - 0x11BC, 0x11A8, 0x11EC, - 0x11BC, 0x11A9, 0x11ED, - 0x11BC, 0x11BC, 0x11EE, - 0x11BC, 0x11BF, 0x11EF, - 0x11C1, 0x11B8, 0x11F3, - 0x11C1, 0x11BC, 0x11F4, - 0x11C2, 0x11AB, 0x11F5, - 0x11C2, 0x11AF, 0x11F6, - 0x11C2, 0x11B7, 0x11F7, - 0x11C2, 0x11B8, 0x11F8, - 0x11CE, 0x11C2, 0x11CF, - 0x11DD, 0x11BA, 0x11DE, - 0x11EC, 0x11A8, 0x11ED, - 0x11F0, 0x11BA, 0x11F1, - 0x11F0, 0x11EB, 0x11F2, - 0x1FBF, FcitxKey_apostrophe, 0x1FCE, - 0x1FBF, FcitxKey_grave, 0x1FCD, - 0x1FBF, FcitxKey_asciitilde, 0x1FCF, - 0x1FBF, FcitxKey_acute, 0x1FCE, - 0x1FBF, FcitxKey_dead_grave, 0x1FCD, - 0x1FBF, FcitxKey_dead_acute, 0x1FCE, - 0x1FBF, FcitxKey_dead_tilde, 0x1FCF, - 0x1FFE, FcitxKey_apostrophe, 0x1FDE, - 0x1FFE, FcitxKey_grave, 0x1FDD, - 0x1FFE, FcitxKey_asciitilde, 0x1FDF, - 0x1FFE, FcitxKey_acute, 0x1FDE, - 0x1FFE, FcitxKey_dead_grave, 0x1FDD, - 0x1FFE, FcitxKey_dead_acute, 0x1FDE, - 0x1FFE, FcitxKey_dead_tilde, 0x1FDF, - 0x2203, 0x0338, 0x2204, - 0x2208, 0x0338, 0x2209, - 0x220B, 0x0338, 0x220C, - 0x2223, 0x0338, 0x2224, - 0x2225, 0x0338, 0x2226, - 0x223C, 0x0338, 0x2241, - 0x2243, 0x0338, 0x2244, - 0x2248, 0x0338, 0x2249, - 0x224D, 0x0338, 0x226D, - 0x2272, 0x0338, 0x2274, - 0x2273, 0x0338, 0x2275, - 0x2276, 0x0338, 0x2278, - 0x2277, 0x0338, 0x2279, - 0x227A, 0x0338, 0x2280, - 0x227B, 0x0338, 0x2281, - 0x227C, 0x0338, 0x22E0, - 0x227D, 0x0338, 0x22E1, - 0x2286, 0x0338, 0x2288, - 0x2287, 0x0338, 0x2289, - 0x2291, 0x0338, 0x22E2, - 0x2292, 0x0338, 0x22E3, - 0x22A8, 0x0338, 0x22AD, - 0x22A9, 0x0338, 0x22AE, - 0x22AB, 0x0338, 0x22AF, - 0x22B2, 0x0338, 0x22EA, - 0x22B3, 0x0338, 0x22EB, - 0x22B4, 0x0338, 0x22EC, - 0x22B5, 0x0338, 0x22ED, - 0x2ADD, 0x0338, 0x2ADC, - FcitxKey_KP_Divide, FcitxKey_D, 0x0110, - FcitxKey_KP_Divide, FcitxKey_G, 0x01E4, - FcitxKey_KP_Divide, FcitxKey_H, 0x0126, - FcitxKey_KP_Divide, FcitxKey_I, 0x0197, - FcitxKey_KP_Divide, FcitxKey_L, 0x0141, - FcitxKey_KP_Divide, FcitxKey_O, 0x00D8, - FcitxKey_KP_Divide, FcitxKey_T, 0x0166, - FcitxKey_KP_Divide, FcitxKey_Z, 0x01B5, - FcitxKey_KP_Divide, FcitxKey_b, 0x0180, - FcitxKey_KP_Divide, FcitxKey_d, 0x0111, - FcitxKey_KP_Divide, FcitxKey_g, 0x01E5, - FcitxKey_KP_Divide, FcitxKey_h, 0x0127, - FcitxKey_KP_Divide, FcitxKey_i, 0x0268, - FcitxKey_KP_Divide, FcitxKey_l, 0x0142, - FcitxKey_KP_Divide, FcitxKey_o, 0x00F8, - FcitxKey_KP_Divide, FcitxKey_t, 0x0167, - FcitxKey_KP_Divide, FcitxKey_z, 0x01B6, - FcitxKey_KP_Divide, 0x0294, 0x02A1, - FcitxKey_KP_Divide, 0x04AE, 0x04B0, - FcitxKey_KP_Divide, 0x04AF, 0x04B1, - FcitxKey_KP_Divide, FcitxKey_Cyrillic_ghe, 0x0493, - FcitxKey_KP_Divide, FcitxKey_Cyrillic_ka, 0x049F, - FcitxKey_KP_Divide, FcitxKey_Cyrillic_GHE, 0x0492, - FcitxKey_KP_Divide, FcitxKey_Cyrillic_KA, 0x049E, - FcitxKey_KP_Divide, FcitxKey_leftarrow, 0x219A, - FcitxKey_KP_Divide, FcitxKey_rightarrow, 0x219B, - FcitxKey_KP_Divide, 0x2194, 0x21AE, - FcitxKey_KP_Equal, 0x0338, 0x2260, - FcitxKey_exclam, FcitxKey_plus, FcitxKey_O, 0x1EE2, - FcitxKey_exclam, FcitxKey_plus, FcitxKey_U, 0x1EF0, - FcitxKey_exclam, FcitxKey_plus, FcitxKey_o, 0x1EE3, - FcitxKey_exclam, FcitxKey_plus, FcitxKey_u, 0x1EF1, - FcitxKey_exclam, FcitxKey_dead_horn, FcitxKey_O, 0x1EE2, - FcitxKey_exclam, FcitxKey_dead_horn, FcitxKey_U, 0x1EF0, - FcitxKey_exclam, FcitxKey_dead_horn, FcitxKey_o, 0x1EE3, - FcitxKey_exclam, FcitxKey_dead_horn, FcitxKey_u, 0x1EF1, - FcitxKey_quotedbl, FcitxKey_apostrophe, FcitxKey_space, 0x0385, - FcitxKey_quotedbl, FcitxKey_apostrophe, FcitxKey_Greek_iota, 0x0390, - FcitxKey_quotedbl, FcitxKey_apostrophe, FcitxKey_Greek_upsilon, 0x03B0, - FcitxKey_quotedbl, FcitxKey_underscore, FcitxKey_U, 0x1E7A, - FcitxKey_quotedbl, FcitxKey_underscore, FcitxKey_u, 0x1E7B, - FcitxKey_quotedbl, FcitxKey_asciitilde, FcitxKey_O, 0x1E4E, - FcitxKey_quotedbl, FcitxKey_asciitilde, FcitxKey_o, 0x1E4F, - FcitxKey_quotedbl, FcitxKey_macron, FcitxKey_U, 0x1E7A, - FcitxKey_quotedbl, FcitxKey_macron, FcitxKey_u, 0x1E7B, - FcitxKey_quotedbl, FcitxKey_dead_tilde, FcitxKey_O, 0x1E4E, - FcitxKey_quotedbl, FcitxKey_dead_tilde, FcitxKey_o, 0x1E4F, - FcitxKey_quotedbl, FcitxKey_dead_macron, FcitxKey_U, 0x1E7A, - FcitxKey_quotedbl, FcitxKey_dead_macron, FcitxKey_u, 0x1E7B, - FcitxKey_apostrophe, FcitxKey_quotedbl, FcitxKey_space, 0x0385, - FcitxKey_apostrophe, FcitxKey_quotedbl, FcitxKey_I, 0x1E2E, - FcitxKey_apostrophe, FcitxKey_quotedbl, FcitxKey_U, 0x01D7, - FcitxKey_apostrophe, FcitxKey_quotedbl, FcitxKey_i, 0x1E2F, - FcitxKey_apostrophe, FcitxKey_quotedbl, FcitxKey_u, 0x01D8, - FcitxKey_apostrophe, FcitxKey_quotedbl, FcitxKey_Greek_iota, 0x0390, - FcitxKey_apostrophe, FcitxKey_quotedbl, FcitxKey_Greek_upsilon, 0x03B0, - FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F0D, - FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_EPSILON, 0x1F1D, - FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F2D, - FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_IOTA, 0x1F3D, - FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_OMICRON, 0x1F4D, - FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_UPSILON, 0x1F5D, - FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1F6D, - FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F05, - FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_epsilon, 0x1F15, - FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F25, - FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_iota, 0x1F35, - FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_omicron, 0x1F45, - FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_upsilon, 0x1F55, - FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1F65, - FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F0C, - FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_EPSILON, 0x1F1C, - FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F2C, - FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_IOTA, 0x1F3C, - FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_OMICRON, 0x1F4C, - FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1F6C, - FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F04, - FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_epsilon, 0x1F14, - FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F24, - FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_iota, 0x1F34, - FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_omicron, 0x1F44, - FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_upsilon, 0x1F54, - FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1F64, - FcitxKey_apostrophe, FcitxKey_plus, FcitxKey_O, 0x1EDA, - FcitxKey_apostrophe, FcitxKey_plus, FcitxKey_U, 0x1EE8, - FcitxKey_apostrophe, FcitxKey_plus, FcitxKey_o, 0x1EDB, - FcitxKey_apostrophe, FcitxKey_plus, FcitxKey_u, 0x1EE9, - FcitxKey_apostrophe, FcitxKey_slash, FcitxKey_O, 0x01FE, - FcitxKey_apostrophe, FcitxKey_slash, FcitxKey_o, 0x01FF, - FcitxKey_apostrophe, FcitxKey_asciicircum, FcitxKey_A, 0x1EA4, - FcitxKey_apostrophe, FcitxKey_asciicircum, FcitxKey_E, 0x1EBE, - FcitxKey_apostrophe, FcitxKey_asciicircum, FcitxKey_O, 0x1ED0, - FcitxKey_apostrophe, FcitxKey_asciicircum, FcitxKey_a, 0x1EA5, - FcitxKey_apostrophe, FcitxKey_asciicircum, FcitxKey_e, 0x1EBF, - FcitxKey_apostrophe, FcitxKey_asciicircum, FcitxKey_o, 0x1ED1, - FcitxKey_apostrophe, FcitxKey_underscore, FcitxKey_E, 0x1E16, - FcitxKey_apostrophe, FcitxKey_underscore, FcitxKey_O, 0x1E52, - FcitxKey_apostrophe, FcitxKey_underscore, FcitxKey_e, 0x1E17, - FcitxKey_apostrophe, FcitxKey_underscore, FcitxKey_o, 0x1E53, - FcitxKey_apostrophe, FcitxKey_b, FcitxKey_A, 0x1EAE, - FcitxKey_apostrophe, FcitxKey_b, FcitxKey_a, 0x1EAF, - FcitxKey_apostrophe, FcitxKey_asciitilde, FcitxKey_O, 0x1E4C, - FcitxKey_apostrophe, FcitxKey_asciitilde, FcitxKey_U, 0x1E78, - FcitxKey_apostrophe, FcitxKey_asciitilde, FcitxKey_o, 0x1E4D, - FcitxKey_apostrophe, FcitxKey_asciitilde, FcitxKey_u, 0x1E79, - FcitxKey_apostrophe, FcitxKey_macron, FcitxKey_E, 0x1E16, - FcitxKey_apostrophe, FcitxKey_macron, FcitxKey_O, 0x1E52, - FcitxKey_apostrophe, FcitxKey_macron, FcitxKey_e, 0x1E17, - FcitxKey_apostrophe, FcitxKey_macron, FcitxKey_o, 0x1E53, - FcitxKey_apostrophe, FcitxKey_cedilla, FcitxKey_C, 0x1E08, - FcitxKey_apostrophe, FcitxKey_cedilla, FcitxKey_c, 0x1E09, - FcitxKey_apostrophe, FcitxKey_dead_circumflex, FcitxKey_A, 0x1EA4, - FcitxKey_apostrophe, FcitxKey_dead_circumflex, FcitxKey_E, 0x1EBE, - FcitxKey_apostrophe, FcitxKey_dead_circumflex, FcitxKey_O, 0x1ED0, - FcitxKey_apostrophe, FcitxKey_dead_circumflex, FcitxKey_a, 0x1EA5, - FcitxKey_apostrophe, FcitxKey_dead_circumflex, FcitxKey_e, 0x1EBF, - FcitxKey_apostrophe, FcitxKey_dead_circumflex, FcitxKey_o, 0x1ED1, - FcitxKey_apostrophe, FcitxKey_dead_tilde, FcitxKey_O, 0x1E4C, - FcitxKey_apostrophe, FcitxKey_dead_tilde, FcitxKey_U, 0x1E78, - FcitxKey_apostrophe, FcitxKey_dead_tilde, FcitxKey_o, 0x1E4D, - FcitxKey_apostrophe, FcitxKey_dead_tilde, FcitxKey_u, 0x1E79, - FcitxKey_apostrophe, FcitxKey_dead_macron, FcitxKey_E, 0x1E16, - FcitxKey_apostrophe, FcitxKey_dead_macron, FcitxKey_O, 0x1E52, - FcitxKey_apostrophe, FcitxKey_dead_macron, FcitxKey_e, 0x1E17, - FcitxKey_apostrophe, FcitxKey_dead_macron, FcitxKey_o, 0x1E53, - FcitxKey_apostrophe, FcitxKey_dead_breve, FcitxKey_A, 0x1EAE, - FcitxKey_apostrophe, FcitxKey_dead_breve, FcitxKey_a, 0x1EAF, - FcitxKey_apostrophe, FcitxKey_dead_diaeresis, FcitxKey_I, 0x1E2E, - FcitxKey_apostrophe, FcitxKey_dead_diaeresis, FcitxKey_U, 0x01D7, - FcitxKey_apostrophe, FcitxKey_dead_diaeresis, FcitxKey_i, 0x1E2F, - FcitxKey_apostrophe, FcitxKey_dead_diaeresis, FcitxKey_u, 0x01D8, - FcitxKey_apostrophe, FcitxKey_dead_diaeresis, FcitxKey_Greek_iota, 0x0390, - FcitxKey_apostrophe, FcitxKey_dead_diaeresis, FcitxKey_Greek_upsilon, 0x03B0, - FcitxKey_apostrophe, FcitxKey_dead_abovering, FcitxKey_A, 0x01FA, - FcitxKey_apostrophe, FcitxKey_dead_abovering, FcitxKey_a, 0x01FB, - FcitxKey_apostrophe, FcitxKey_dead_cedilla, FcitxKey_C, 0x1E08, - FcitxKey_apostrophe, FcitxKey_dead_cedilla, FcitxKey_c, 0x1E09, - FcitxKey_apostrophe, FcitxKey_dead_horn, FcitxKey_O, 0x1EDA, - FcitxKey_apostrophe, FcitxKey_dead_horn, FcitxKey_U, 0x1EE8, - FcitxKey_apostrophe, FcitxKey_dead_horn, FcitxKey_o, 0x1EDB, - FcitxKey_apostrophe, FcitxKey_dead_horn, FcitxKey_u, 0x1EE9, - FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F0C, - FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_EPSILON, 0x1F1C, - FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F2C, - FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_IOTA, 0x1F3C, - FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_OMICRON, 0x1F4C, - FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1F6C, - FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F04, - FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_epsilon, 0x1F14, - FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F24, - FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_iota, 0x1F34, - FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_omicron, 0x1F44, - FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_upsilon, 0x1F54, - FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1F64, - FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F0D, - FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_EPSILON, 0x1F1D, - FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F2D, - FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_IOTA, 0x1F3D, - FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_OMICRON, 0x1F4D, - FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_UPSILON, 0x1F5D, - FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1F6D, - FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F05, - FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_epsilon, 0x1F15, - FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F25, - FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_iota, 0x1F35, - FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_omicron, 0x1F45, - FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_upsilon, 0x1F55, - FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1F65, - FcitxKey_apostrophe, FcitxKey_KP_Divide, FcitxKey_O, 0x01FE, - FcitxKey_apostrophe, FcitxKey_KP_Divide, FcitxKey_o, 0x01FF, - FcitxKey_parenleft, FcitxKey_0, FcitxKey_parenright, 0x24EA, - FcitxKey_parenleft, FcitxKey_1, FcitxKey_parenright, 0x2460, - FcitxKey_parenleft, FcitxKey_2, FcitxKey_parenright, 0x2461, - FcitxKey_parenleft, FcitxKey_3, FcitxKey_parenright, 0x2462, - FcitxKey_parenleft, FcitxKey_4, FcitxKey_parenright, 0x2463, - FcitxKey_parenleft, FcitxKey_5, FcitxKey_parenright, 0x2464, - FcitxKey_parenleft, FcitxKey_6, FcitxKey_parenright, 0x2465, - FcitxKey_parenleft, FcitxKey_7, FcitxKey_parenright, 0x2466, - FcitxKey_parenleft, FcitxKey_8, FcitxKey_parenright, 0x2467, - FcitxKey_parenleft, FcitxKey_9, FcitxKey_parenright, 0x2468, - FcitxKey_parenleft, FcitxKey_A, FcitxKey_parenright, 0x24B6, - FcitxKey_parenleft, FcitxKey_B, FcitxKey_parenright, 0x24B7, - FcitxKey_parenleft, FcitxKey_C, FcitxKey_parenright, 0x24B8, - FcitxKey_parenleft, FcitxKey_D, FcitxKey_parenright, 0x24B9, - FcitxKey_parenleft, FcitxKey_E, FcitxKey_parenright, 0x24BA, - FcitxKey_parenleft, FcitxKey_F, FcitxKey_parenright, 0x24BB, - FcitxKey_parenleft, FcitxKey_G, FcitxKey_parenright, 0x24BC, - FcitxKey_parenleft, FcitxKey_H, FcitxKey_parenright, 0x24BD, - FcitxKey_parenleft, FcitxKey_I, FcitxKey_parenright, 0x24BE, - FcitxKey_parenleft, FcitxKey_J, FcitxKey_parenright, 0x24BF, - FcitxKey_parenleft, FcitxKey_K, FcitxKey_parenright, 0x24C0, - FcitxKey_parenleft, FcitxKey_L, FcitxKey_parenright, 0x24C1, - FcitxKey_parenleft, FcitxKey_M, FcitxKey_parenright, 0x24C2, - FcitxKey_parenleft, FcitxKey_N, FcitxKey_parenright, 0x24C3, - FcitxKey_parenleft, FcitxKey_O, FcitxKey_parenright, 0x24C4, - FcitxKey_parenleft, FcitxKey_P, FcitxKey_parenright, 0x24C5, - FcitxKey_parenleft, FcitxKey_Q, FcitxKey_parenright, 0x24C6, - FcitxKey_parenleft, FcitxKey_R, FcitxKey_parenright, 0x24C7, - FcitxKey_parenleft, FcitxKey_S, FcitxKey_parenright, 0x24C8, - FcitxKey_parenleft, FcitxKey_T, FcitxKey_parenright, 0x24C9, - FcitxKey_parenleft, FcitxKey_U, FcitxKey_parenright, 0x24CA, - FcitxKey_parenleft, FcitxKey_V, FcitxKey_parenright, 0x24CB, - FcitxKey_parenleft, FcitxKey_W, FcitxKey_parenright, 0x24CC, - FcitxKey_parenleft, FcitxKey_X, FcitxKey_parenright, 0x24CD, - FcitxKey_parenleft, FcitxKey_Y, FcitxKey_parenright, 0x24CE, - FcitxKey_parenleft, FcitxKey_Z, FcitxKey_parenright, 0x24CF, - FcitxKey_parenleft, FcitxKey_a, FcitxKey_parenright, 0x24D0, - FcitxKey_parenleft, FcitxKey_b, FcitxKey_parenright, 0x24D1, - FcitxKey_parenleft, FcitxKey_c, FcitxKey_parenright, 0x24D2, - FcitxKey_parenleft, FcitxKey_d, FcitxKey_parenright, 0x24D3, - FcitxKey_parenleft, FcitxKey_e, FcitxKey_parenright, 0x24D4, - FcitxKey_parenleft, FcitxKey_f, FcitxKey_parenright, 0x24D5, - FcitxKey_parenleft, FcitxKey_g, FcitxKey_parenright, 0x24D6, - FcitxKey_parenleft, FcitxKey_h, FcitxKey_parenright, 0x24D7, - FcitxKey_parenleft, FcitxKey_i, FcitxKey_parenright, 0x24D8, - FcitxKey_parenleft, FcitxKey_j, FcitxKey_parenright, 0x24D9, - FcitxKey_parenleft, FcitxKey_k, FcitxKey_parenright, 0x24DA, - FcitxKey_parenleft, FcitxKey_l, FcitxKey_parenright, 0x24DB, - FcitxKey_parenleft, FcitxKey_m, FcitxKey_parenright, 0x24DC, - FcitxKey_parenleft, FcitxKey_n, FcitxKey_parenright, 0x24DD, - FcitxKey_parenleft, FcitxKey_o, FcitxKey_parenright, 0x24DE, - FcitxKey_parenleft, FcitxKey_p, FcitxKey_parenright, 0x24DF, - FcitxKey_parenleft, FcitxKey_q, FcitxKey_parenright, 0x24E0, - FcitxKey_parenleft, FcitxKey_r, FcitxKey_parenright, 0x24E1, - FcitxKey_parenleft, FcitxKey_s, FcitxKey_parenright, 0x24E2, - FcitxKey_parenleft, FcitxKey_t, FcitxKey_parenright, 0x24E3, - FcitxKey_parenleft, FcitxKey_u, FcitxKey_parenright, 0x24E4, - FcitxKey_parenleft, FcitxKey_v, FcitxKey_parenright, 0x24E5, - FcitxKey_parenleft, FcitxKey_w, FcitxKey_parenright, 0x24E6, - FcitxKey_parenleft, FcitxKey_x, FcitxKey_parenright, 0x24E7, - FcitxKey_parenleft, FcitxKey_y, FcitxKey_parenright, 0x24E8, - FcitxKey_parenleft, FcitxKey_z, FcitxKey_parenright, 0x24E9, - FcitxKey_parenleft, FcitxKey_kana_WO, FcitxKey_parenright, 0x32FE, - FcitxKey_parenleft, FcitxKey_kana_A, FcitxKey_parenright, 0x32D0, - FcitxKey_parenleft, FcitxKey_kana_I, FcitxKey_parenright, 0x32D1, - FcitxKey_parenleft, FcitxKey_kana_U, FcitxKey_parenright, 0x32D2, - FcitxKey_parenleft, FcitxKey_kana_E, FcitxKey_parenright, 0x32D3, - FcitxKey_parenleft, FcitxKey_kana_O, FcitxKey_parenright, 0x32D4, - FcitxKey_parenleft, FcitxKey_kana_KA, FcitxKey_parenright, 0x32D5, - FcitxKey_parenleft, FcitxKey_kana_KI, FcitxKey_parenright, 0x32D6, - FcitxKey_parenleft, FcitxKey_kana_KU, FcitxKey_parenright, 0x32D7, - FcitxKey_parenleft, FcitxKey_kana_KE, FcitxKey_parenright, 0x32D8, - FcitxKey_parenleft, FcitxKey_kana_KO, FcitxKey_parenright, 0x32D9, - FcitxKey_parenleft, FcitxKey_kana_SA, FcitxKey_parenright, 0x32DA, - FcitxKey_parenleft, FcitxKey_kana_SHI, FcitxKey_parenright, 0x32DB, - FcitxKey_parenleft, FcitxKey_kana_SU, FcitxKey_parenright, 0x32DC, - FcitxKey_parenleft, FcitxKey_kana_SE, FcitxKey_parenright, 0x32DD, - FcitxKey_parenleft, FcitxKey_kana_SO, FcitxKey_parenright, 0x32DE, - FcitxKey_parenleft, FcitxKey_kana_TA, FcitxKey_parenright, 0x32DF, - FcitxKey_parenleft, FcitxKey_kana_CHI, FcitxKey_parenright, 0x32E0, - FcitxKey_parenleft, FcitxKey_kana_TSU, FcitxKey_parenright, 0x32E1, - FcitxKey_parenleft, FcitxKey_kana_TE, FcitxKey_parenright, 0x32E2, - FcitxKey_parenleft, FcitxKey_kana_TO, FcitxKey_parenright, 0x32E3, - FcitxKey_parenleft, FcitxKey_kana_NA, FcitxKey_parenright, 0x32E4, - FcitxKey_parenleft, FcitxKey_kana_NI, FcitxKey_parenright, 0x32E5, - FcitxKey_parenleft, FcitxKey_kana_NU, FcitxKey_parenright, 0x32E6, - FcitxKey_parenleft, FcitxKey_kana_NE, FcitxKey_parenright, 0x32E7, - FcitxKey_parenleft, FcitxKey_kana_NO, FcitxKey_parenright, 0x32E8, - FcitxKey_parenleft, FcitxKey_kana_HA, FcitxKey_parenright, 0x32E9, - FcitxKey_parenleft, FcitxKey_kana_HI, FcitxKey_parenright, 0x32EA, - FcitxKey_parenleft, FcitxKey_kana_FU, FcitxKey_parenright, 0x32EB, - FcitxKey_parenleft, FcitxKey_kana_HE, FcitxKey_parenright, 0x32EC, - FcitxKey_parenleft, FcitxKey_kana_HO, FcitxKey_parenright, 0x32ED, - FcitxKey_parenleft, FcitxKey_kana_MA, FcitxKey_parenright, 0x32EE, - FcitxKey_parenleft, FcitxKey_kana_MI, FcitxKey_parenright, 0x32EF, - FcitxKey_parenleft, FcitxKey_kana_MU, FcitxKey_parenright, 0x32F0, - FcitxKey_parenleft, FcitxKey_kana_ME, FcitxKey_parenright, 0x32F1, - FcitxKey_parenleft, FcitxKey_kana_MO, FcitxKey_parenright, 0x32F2, - FcitxKey_parenleft, FcitxKey_kana_YA, FcitxKey_parenright, 0x32F3, - FcitxKey_parenleft, FcitxKey_kana_YU, FcitxKey_parenright, 0x32F4, - FcitxKey_parenleft, FcitxKey_kana_YO, FcitxKey_parenright, 0x32F5, - FcitxKey_parenleft, FcitxKey_kana_RA, FcitxKey_parenright, 0x32F6, - FcitxKey_parenleft, FcitxKey_kana_RI, FcitxKey_parenright, 0x32F7, - FcitxKey_parenleft, FcitxKey_kana_RU, FcitxKey_parenright, 0x32F8, - FcitxKey_parenleft, FcitxKey_kana_RE, FcitxKey_parenright, 0x32F9, - FcitxKey_parenleft, FcitxKey_kana_RO, FcitxKey_parenright, 0x32FA, - FcitxKey_parenleft, FcitxKey_kana_WA, FcitxKey_parenright, 0x32FB, - FcitxKey_parenleft, 0x1100, FcitxKey_parenright, 0x3260, - FcitxKey_parenleft, 0x1102, FcitxKey_parenright, 0x3261, - FcitxKey_parenleft, 0x1103, FcitxKey_parenright, 0x3262, - FcitxKey_parenleft, 0x1105, FcitxKey_parenright, 0x3263, - FcitxKey_parenleft, 0x1106, FcitxKey_parenright, 0x3264, - FcitxKey_parenleft, 0x1107, FcitxKey_parenright, 0x3265, - FcitxKey_parenleft, 0x1109, FcitxKey_parenright, 0x3266, - FcitxKey_parenleft, 0x110B, FcitxKey_parenright, 0x3267, - FcitxKey_parenleft, 0x110C, FcitxKey_parenright, 0x3268, - FcitxKey_parenleft, 0x110E, FcitxKey_parenright, 0x3269, - FcitxKey_parenleft, 0x110F, FcitxKey_parenright, 0x326A, - FcitxKey_parenleft, 0x1110, FcitxKey_parenright, 0x326B, - FcitxKey_parenleft, 0x1111, FcitxKey_parenright, 0x326C, - FcitxKey_parenleft, 0x1112, FcitxKey_parenright, 0x326D, - FcitxKey_parenleft, 0x30F0, FcitxKey_parenright, 0x32FC, - FcitxKey_parenleft, 0x30F1, FcitxKey_parenright, 0x32FD, - FcitxKey_parenleft, 0x4E00, FcitxKey_parenright, 0x3280, - FcitxKey_parenleft, 0x4E03, FcitxKey_parenright, 0x3286, - FcitxKey_parenleft, 0x4E09, FcitxKey_parenright, 0x3282, - FcitxKey_parenleft, 0x4E0A, FcitxKey_parenright, 0x32A4, - FcitxKey_parenleft, 0x4E0B, FcitxKey_parenright, 0x32A6, - FcitxKey_parenleft, 0x4E2D, FcitxKey_parenright, 0x32A5, - FcitxKey_parenleft, 0x4E5D, FcitxKey_parenright, 0x3288, - FcitxKey_parenleft, 0x4E8C, FcitxKey_parenright, 0x3281, - FcitxKey_parenleft, 0x4E94, FcitxKey_parenright, 0x3284, - FcitxKey_parenleft, 0x4F01, FcitxKey_parenright, 0x32AD, - FcitxKey_parenleft, 0x4F11, FcitxKey_parenright, 0x32A1, - FcitxKey_parenleft, 0x512A, FcitxKey_parenright, 0x329D, - FcitxKey_parenleft, 0x516B, FcitxKey_parenright, 0x3287, - FcitxKey_parenleft, 0x516D, FcitxKey_parenright, 0x3285, - FcitxKey_parenleft, 0x5199, FcitxKey_parenright, 0x32A2, - FcitxKey_parenleft, 0x52B4, FcitxKey_parenright, 0x3298, - FcitxKey_parenleft, 0x533B, FcitxKey_parenright, 0x32A9, - FcitxKey_parenleft, 0x5341, FcitxKey_parenright, 0x3289, - FcitxKey_parenleft, 0x5354, FcitxKey_parenright, 0x32AF, - FcitxKey_parenleft, 0x5370, FcitxKey_parenright, 0x329E, - FcitxKey_parenleft, 0x53F3, FcitxKey_parenright, 0x32A8, - FcitxKey_parenleft, 0x540D, FcitxKey_parenright, 0x3294, - FcitxKey_parenleft, 0x56DB, FcitxKey_parenright, 0x3283, - FcitxKey_parenleft, 0x571F, FcitxKey_parenright, 0x328F, - FcitxKey_parenleft, 0x591C, FcitxKey_parenright, 0x32B0, - FcitxKey_parenleft, 0x5973, FcitxKey_parenright, 0x329B, - FcitxKey_parenleft, 0x5B66, FcitxKey_parenright, 0x32AB, - FcitxKey_parenleft, 0x5B97, FcitxKey_parenright, 0x32AA, - FcitxKey_parenleft, 0x5DE6, FcitxKey_parenright, 0x32A7, - FcitxKey_parenleft, 0x65E5, FcitxKey_parenright, 0x3290, - FcitxKey_parenleft, 0x6708, FcitxKey_parenright, 0x328A, - FcitxKey_parenleft, 0x6709, FcitxKey_parenright, 0x3292, - FcitxKey_parenleft, 0x6728, FcitxKey_parenright, 0x328D, - FcitxKey_parenleft, 0x682A, FcitxKey_parenright, 0x3291, - FcitxKey_parenleft, 0x6B63, FcitxKey_parenright, 0x32A3, - FcitxKey_parenleft, 0x6C34, FcitxKey_parenright, 0x328C, - FcitxKey_parenleft, 0x6CE8, FcitxKey_parenright, 0x329F, - FcitxKey_parenleft, 0x706B, FcitxKey_parenright, 0x328B, - FcitxKey_parenleft, 0x7279, FcitxKey_parenright, 0x3295, - FcitxKey_parenleft, 0x7537, FcitxKey_parenright, 0x329A, - FcitxKey_parenleft, 0x76E3, FcitxKey_parenright, 0x32AC, - FcitxKey_parenleft, 0x793E, FcitxKey_parenright, 0x3293, - FcitxKey_parenleft, 0x795D, FcitxKey_parenright, 0x3297, - FcitxKey_parenleft, 0x79D8, FcitxKey_parenright, 0x3299, - FcitxKey_parenleft, 0x8CA1, FcitxKey_parenright, 0x3296, - FcitxKey_parenleft, 0x8CC7, FcitxKey_parenright, 0x32AE, - FcitxKey_parenleft, 0x9069, FcitxKey_parenright, 0x329C, - FcitxKey_parenleft, 0x91D1, FcitxKey_parenright, 0x328E, - FcitxKey_parenleft, 0x9805, FcitxKey_parenright, 0x32A0, - FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_parenright, 0x2461, - FcitxKey_parenleft, FcitxKey_KP_0, FcitxKey_parenright, 0x24EA, - FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_parenright, 0x2460, - FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_parenright, 0x2461, - FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_parenright, 0x2462, - FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_parenright, 0x2463, - FcitxKey_parenleft, FcitxKey_KP_5, FcitxKey_parenright, 0x2464, - FcitxKey_parenleft, FcitxKey_KP_6, FcitxKey_parenright, 0x2465, - FcitxKey_parenleft, FcitxKey_KP_7, FcitxKey_parenright, 0x2466, - FcitxKey_parenleft, FcitxKey_KP_8, FcitxKey_parenright, 0x2467, - FcitxKey_parenleft, FcitxKey_KP_9, FcitxKey_parenright, 0x2468, - FcitxKey_minus, FcitxKey_minus, FcitxKey_space, 0x00AD, - FcitxKey_minus, FcitxKey_minus, FcitxKey_minus, 0x2014, - FcitxKey_minus, FcitxKey_minus, FcitxKey_period, 0x2013, - FcitxKey_period, FcitxKey_exclam, FcitxKey_S, 0x1E68, - FcitxKey_period, FcitxKey_exclam, FcitxKey_s, 0x1E69, - FcitxKey_period, FcitxKey_apostrophe, FcitxKey_S, 0x1E64, - FcitxKey_period, FcitxKey_apostrophe, FcitxKey_s, 0x1E65, - FcitxKey_period, FcitxKey_acute, FcitxKey_S, 0x1E64, - FcitxKey_period, FcitxKey_acute, FcitxKey_s, 0x1E65, - FcitxKey_period, FcitxKey_dead_acute, FcitxKey_S, 0x1E64, - FcitxKey_period, FcitxKey_dead_acute, FcitxKey_s, 0x1E65, - FcitxKey_period, FcitxKey_dead_caron, FcitxKey_S, 0x1E66, - FcitxKey_period, FcitxKey_dead_caron, FcitxKey_s, 0x1E67, - FcitxKey_period, FcitxKey_dead_belowdot, FcitxKey_S, 0x1E68, - FcitxKey_period, FcitxKey_dead_belowdot, FcitxKey_s, 0x1E69, - FcitxKey_question, FcitxKey_plus, FcitxKey_O, 0x1EDE, - FcitxKey_question, FcitxKey_plus, FcitxKey_U, 0x1EEC, - FcitxKey_question, FcitxKey_plus, FcitxKey_o, 0x1EDF, - FcitxKey_question, FcitxKey_plus, FcitxKey_u, 0x1EED, - FcitxKey_question, FcitxKey_asciicircum, FcitxKey_A, 0x1EA8, - FcitxKey_question, FcitxKey_asciicircum, FcitxKey_E, 0x1EC2, - FcitxKey_question, FcitxKey_asciicircum, FcitxKey_O, 0x1ED4, - FcitxKey_question, FcitxKey_asciicircum, FcitxKey_a, 0x1EA9, - FcitxKey_question, FcitxKey_asciicircum, FcitxKey_e, 0x1EC3, - FcitxKey_question, FcitxKey_asciicircum, FcitxKey_o, 0x1ED5, - FcitxKey_question, FcitxKey_b, FcitxKey_A, 0x1EB2, - FcitxKey_question, FcitxKey_b, FcitxKey_a, 0x1EB3, - FcitxKey_question, FcitxKey_dead_circumflex, FcitxKey_A, 0x1EA8, - FcitxKey_question, FcitxKey_dead_circumflex, FcitxKey_E, 0x1EC2, - FcitxKey_question, FcitxKey_dead_circumflex, FcitxKey_O, 0x1ED4, - FcitxKey_question, FcitxKey_dead_circumflex, FcitxKey_a, 0x1EA9, - FcitxKey_question, FcitxKey_dead_circumflex, FcitxKey_e, 0x1EC3, - FcitxKey_question, FcitxKey_dead_circumflex, FcitxKey_o, 0x1ED5, - FcitxKey_question, FcitxKey_dead_breve, FcitxKey_A, 0x1EB2, - FcitxKey_question, FcitxKey_dead_breve, FcitxKey_a, 0x1EB3, - FcitxKey_question, FcitxKey_dead_horn, FcitxKey_O, 0x1EDE, - FcitxKey_question, FcitxKey_dead_horn, FcitxKey_U, 0x1EEC, - FcitxKey_question, FcitxKey_dead_horn, FcitxKey_o, 0x1EDF, - FcitxKey_question, FcitxKey_dead_horn, FcitxKey_u, 0x1EED, - FcitxKey_U, FcitxKey_exclam, FcitxKey_A, 0x1EB6, - FcitxKey_U, FcitxKey_exclam, FcitxKey_a, 0x1EB7, - FcitxKey_U, FcitxKey_comma, FcitxKey_E, 0x1E1C, - FcitxKey_U, FcitxKey_comma, FcitxKey_e, 0x1E1D, - FcitxKey_U, FcitxKey_cedilla, FcitxKey_E, 0x1E1C, - FcitxKey_U, FcitxKey_cedilla, FcitxKey_e, 0x1E1D, - FcitxKey_U, FcitxKey_dead_cedilla, FcitxKey_E, 0x1E1C, - FcitxKey_U, FcitxKey_dead_cedilla, FcitxKey_e, 0x1E1D, - FcitxKey_U, FcitxKey_dead_belowdot, FcitxKey_A, 0x1EB6, - FcitxKey_U, FcitxKey_dead_belowdot, FcitxKey_a, 0x1EB7, - FcitxKey_asciicircum, FcitxKey_exclam, FcitxKey_A, 0x1EAC, - FcitxKey_asciicircum, FcitxKey_exclam, FcitxKey_E, 0x1EC6, - FcitxKey_asciicircum, FcitxKey_exclam, FcitxKey_O, 0x1ED8, - FcitxKey_asciicircum, FcitxKey_exclam, FcitxKey_a, 0x1EAD, - FcitxKey_asciicircum, FcitxKey_exclam, FcitxKey_e, 0x1EC7, - FcitxKey_asciicircum, FcitxKey_exclam, FcitxKey_o, 0x1ED9, - FcitxKey_asciicircum, FcitxKey_underscore, FcitxKey_a, 0x00AA, - FcitxKey_asciicircum, FcitxKey_underscore, FcitxKey_h, 0x02B0, - FcitxKey_asciicircum, FcitxKey_underscore, FcitxKey_i, 0x2071, - FcitxKey_asciicircum, FcitxKey_underscore, FcitxKey_j, 0x02B2, - FcitxKey_asciicircum, FcitxKey_underscore, FcitxKey_l, 0x02E1, - FcitxKey_asciicircum, FcitxKey_underscore, FcitxKey_n, 0x207F, - FcitxKey_asciicircum, FcitxKey_underscore, FcitxKey_o, 0x00BA, - FcitxKey_asciicircum, FcitxKey_underscore, FcitxKey_r, 0x02B3, - FcitxKey_asciicircum, FcitxKey_underscore, FcitxKey_s, 0x02E2, - FcitxKey_asciicircum, FcitxKey_underscore, FcitxKey_w, 0x02B7, - FcitxKey_asciicircum, FcitxKey_underscore, FcitxKey_x, 0x02E3, - FcitxKey_asciicircum, FcitxKey_underscore, FcitxKey_y, 0x02B8, - FcitxKey_asciicircum, FcitxKey_underscore, 0x0263, 0x02E0, - FcitxKey_asciicircum, FcitxKey_underscore, 0x0266, 0x02B1, - FcitxKey_asciicircum, FcitxKey_underscore, 0x0279, 0x02B4, - FcitxKey_asciicircum, FcitxKey_underscore, 0x027B, 0x02B5, - FcitxKey_asciicircum, FcitxKey_underscore, 0x0281, 0x02B6, - FcitxKey_asciicircum, FcitxKey_underscore, 0x0295, 0x02E4, - FcitxKey_asciicircum, FcitxKey_underbar, FcitxKey_a, 0x00AA, - FcitxKey_asciicircum, FcitxKey_underbar, FcitxKey_h, 0x02B0, - FcitxKey_asciicircum, FcitxKey_underbar, FcitxKey_i, 0x2071, - FcitxKey_asciicircum, FcitxKey_underbar, FcitxKey_j, 0x02B2, - FcitxKey_asciicircum, FcitxKey_underbar, FcitxKey_l, 0x02E1, - FcitxKey_asciicircum, FcitxKey_underbar, FcitxKey_n, 0x207F, - FcitxKey_asciicircum, FcitxKey_underbar, FcitxKey_o, 0x00BA, - FcitxKey_asciicircum, FcitxKey_underbar, FcitxKey_r, 0x02B3, - FcitxKey_asciicircum, FcitxKey_underbar, FcitxKey_s, 0x02E2, - FcitxKey_asciicircum, FcitxKey_underbar, FcitxKey_w, 0x02B7, - FcitxKey_asciicircum, FcitxKey_underbar, FcitxKey_x, 0x02E3, - FcitxKey_asciicircum, FcitxKey_underbar, FcitxKey_y, 0x02B8, - FcitxKey_asciicircum, FcitxKey_underbar, 0x0263, 0x02E0, - FcitxKey_asciicircum, FcitxKey_underbar, 0x0266, 0x02B1, - FcitxKey_asciicircum, FcitxKey_underbar, 0x0279, 0x02B4, - FcitxKey_asciicircum, FcitxKey_underbar, 0x027B, 0x02B5, - FcitxKey_asciicircum, FcitxKey_underbar, 0x0281, 0x02B6, - FcitxKey_asciicircum, FcitxKey_underbar, 0x0295, 0x02E4, - FcitxKey_asciicircum, FcitxKey_dead_belowdot, FcitxKey_A, 0x1EAC, - FcitxKey_asciicircum, FcitxKey_dead_belowdot, FcitxKey_E, 0x1EC6, - FcitxKey_asciicircum, FcitxKey_dead_belowdot, FcitxKey_O, 0x1ED8, - FcitxKey_asciicircum, FcitxKey_dead_belowdot, FcitxKey_a, 0x1EAD, - FcitxKey_asciicircum, FcitxKey_dead_belowdot, FcitxKey_e, 0x1EC7, - FcitxKey_asciicircum, FcitxKey_dead_belowdot, FcitxKey_o, 0x1ED9, - FcitxKey_underscore, FcitxKey_exclam, FcitxKey_L, 0x1E38, - FcitxKey_underscore, FcitxKey_exclam, FcitxKey_R, 0x1E5C, - FcitxKey_underscore, FcitxKey_exclam, FcitxKey_l, 0x1E39, - FcitxKey_underscore, FcitxKey_exclam, FcitxKey_r, 0x1E5D, - FcitxKey_underscore, FcitxKey_quotedbl, FcitxKey_A, 0x01DE, - FcitxKey_underscore, FcitxKey_quotedbl, FcitxKey_O, 0x022A, - FcitxKey_underscore, FcitxKey_quotedbl, FcitxKey_U, 0x01D5, - FcitxKey_underscore, FcitxKey_quotedbl, FcitxKey_a, 0x01DF, - FcitxKey_underscore, FcitxKey_quotedbl, FcitxKey_o, 0x022B, - FcitxKey_underscore, FcitxKey_quotedbl, FcitxKey_u, 0x01D6, - FcitxKey_underscore, FcitxKey_period, FcitxKey_A, 0x01E0, - FcitxKey_underscore, FcitxKey_period, FcitxKey_O, 0x0230, - FcitxKey_underscore, FcitxKey_period, FcitxKey_a, 0x01E1, - FcitxKey_underscore, FcitxKey_period, FcitxKey_o, 0x0231, - FcitxKey_underscore, FcitxKey_semicolon, FcitxKey_O, 0x01EC, - FcitxKey_underscore, FcitxKey_semicolon, FcitxKey_o, 0x01ED, - FcitxKey_underscore, FcitxKey_asciitilde, FcitxKey_O, 0x022C, - FcitxKey_underscore, FcitxKey_asciitilde, FcitxKey_o, 0x022D, - FcitxKey_underscore, FcitxKey_dead_tilde, FcitxKey_O, 0x022C, - FcitxKey_underscore, FcitxKey_dead_tilde, FcitxKey_o, 0x022D, - FcitxKey_underscore, FcitxKey_dead_abovedot, FcitxKey_A, 0x01E0, - FcitxKey_underscore, FcitxKey_dead_abovedot, FcitxKey_O, 0x0230, - FcitxKey_underscore, FcitxKey_dead_abovedot, FcitxKey_a, 0x01E1, - FcitxKey_underscore, FcitxKey_dead_abovedot, FcitxKey_o, 0x0231, - FcitxKey_underscore, FcitxKey_dead_diaeresis, FcitxKey_A, 0x01DE, - FcitxKey_underscore, FcitxKey_dead_diaeresis, FcitxKey_O, 0x022A, - FcitxKey_underscore, FcitxKey_dead_diaeresis, FcitxKey_U, 0x01D5, - FcitxKey_underscore, FcitxKey_dead_diaeresis, FcitxKey_a, 0x01DF, - FcitxKey_underscore, FcitxKey_dead_diaeresis, FcitxKey_o, 0x022B, - FcitxKey_underscore, FcitxKey_dead_diaeresis, FcitxKey_u, 0x01D6, - FcitxKey_underscore, FcitxKey_dead_ogonek, FcitxKey_O, 0x01EC, - FcitxKey_underscore, FcitxKey_dead_ogonek, FcitxKey_o, 0x01ED, - FcitxKey_underscore, FcitxKey_dead_belowdot, FcitxKey_L, 0x1E38, - FcitxKey_underscore, FcitxKey_dead_belowdot, FcitxKey_R, 0x1E5C, - FcitxKey_underscore, FcitxKey_dead_belowdot, FcitxKey_l, 0x1E39, - FcitxKey_underscore, FcitxKey_dead_belowdot, FcitxKey_r, 0x1E5D, - FcitxKey_grave, FcitxKey_quotedbl, FcitxKey_U, 0x01DB, - FcitxKey_grave, FcitxKey_quotedbl, FcitxKey_u, 0x01DC, - FcitxKey_grave, FcitxKey_quotedbl, FcitxKey_Greek_iota, 0x1FD2, - FcitxKey_grave, FcitxKey_quotedbl, FcitxKey_Greek_upsilon, 0x1FE2, - FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F0B, - FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_EPSILON, 0x1F1B, - FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F2B, - FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_IOTA, 0x1F3B, - FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_OMICRON, 0x1F4B, - FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_UPSILON, 0x1F5B, - FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1F6B, - FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F03, - FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_epsilon, 0x1F13, - FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F23, - FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_iota, 0x1F33, - FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_omicron, 0x1F43, - FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_upsilon, 0x1F53, - FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1F63, - FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F0A, - FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_EPSILON, 0x1F1A, - FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F2A, - FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_IOTA, 0x1F3A, - FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_OMICRON, 0x1F4A, - FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1F6A, - FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F02, - FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_epsilon, 0x1F12, - FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F22, - FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_iota, 0x1F32, - FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_omicron, 0x1F42, - FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_upsilon, 0x1F52, - FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1F62, - FcitxKey_grave, FcitxKey_plus, FcitxKey_O, 0x1EDC, - FcitxKey_grave, FcitxKey_plus, FcitxKey_U, 0x1EEA, - FcitxKey_grave, FcitxKey_plus, FcitxKey_o, 0x1EDD, - FcitxKey_grave, FcitxKey_plus, FcitxKey_u, 0x1EEB, - FcitxKey_grave, FcitxKey_asciicircum, FcitxKey_A, 0x1EA6, - FcitxKey_grave, FcitxKey_asciicircum, FcitxKey_E, 0x1EC0, - FcitxKey_grave, FcitxKey_asciicircum, FcitxKey_O, 0x1ED2, - FcitxKey_grave, FcitxKey_asciicircum, FcitxKey_a, 0x1EA7, - FcitxKey_grave, FcitxKey_asciicircum, FcitxKey_e, 0x1EC1, - FcitxKey_grave, FcitxKey_asciicircum, FcitxKey_o, 0x1ED3, - FcitxKey_grave, FcitxKey_underscore, FcitxKey_E, 0x1E14, - FcitxKey_grave, FcitxKey_underscore, FcitxKey_O, 0x1E50, - FcitxKey_grave, FcitxKey_underscore, FcitxKey_e, 0x1E15, - FcitxKey_grave, FcitxKey_underscore, FcitxKey_o, 0x1E51, - FcitxKey_grave, FcitxKey_b, FcitxKey_A, 0x1EB0, - FcitxKey_grave, FcitxKey_b, FcitxKey_a, 0x1EB1, - FcitxKey_grave, FcitxKey_macron, FcitxKey_E, 0x1E14, - FcitxKey_grave, FcitxKey_macron, FcitxKey_O, 0x1E50, - FcitxKey_grave, FcitxKey_macron, FcitxKey_e, 0x1E15, - FcitxKey_grave, FcitxKey_macron, FcitxKey_o, 0x1E51, - FcitxKey_grave, FcitxKey_dead_circumflex, FcitxKey_A, 0x1EA6, - FcitxKey_grave, FcitxKey_dead_circumflex, FcitxKey_E, 0x1EC0, - FcitxKey_grave, FcitxKey_dead_circumflex, FcitxKey_O, 0x1ED2, - FcitxKey_grave, FcitxKey_dead_circumflex, FcitxKey_a, 0x1EA7, - FcitxKey_grave, FcitxKey_dead_circumflex, FcitxKey_e, 0x1EC1, - FcitxKey_grave, FcitxKey_dead_circumflex, FcitxKey_o, 0x1ED3, - FcitxKey_grave, FcitxKey_dead_macron, FcitxKey_E, 0x1E14, - FcitxKey_grave, FcitxKey_dead_macron, FcitxKey_O, 0x1E50, - FcitxKey_grave, FcitxKey_dead_macron, FcitxKey_e, 0x1E15, - FcitxKey_grave, FcitxKey_dead_macron, FcitxKey_o, 0x1E51, - FcitxKey_grave, FcitxKey_dead_breve, FcitxKey_A, 0x1EB0, - FcitxKey_grave, FcitxKey_dead_breve, FcitxKey_a, 0x1EB1, - FcitxKey_grave, FcitxKey_dead_diaeresis, FcitxKey_U, 0x01DB, - FcitxKey_grave, FcitxKey_dead_diaeresis, FcitxKey_u, 0x01DC, - FcitxKey_grave, FcitxKey_dead_diaeresis, FcitxKey_Greek_iota, 0x1FD2, - FcitxKey_grave, FcitxKey_dead_diaeresis, FcitxKey_Greek_upsilon, 0x1FE2, - FcitxKey_grave, FcitxKey_dead_horn, FcitxKey_O, 0x1EDC, - FcitxKey_grave, FcitxKey_dead_horn, FcitxKey_U, 0x1EEA, - FcitxKey_grave, FcitxKey_dead_horn, FcitxKey_o, 0x1EDD, - FcitxKey_grave, FcitxKey_dead_horn, FcitxKey_u, 0x1EEB, - FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F0A, - FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_EPSILON, 0x1F1A, - FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F2A, - FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_IOTA, 0x1F3A, - FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_OMICRON, 0x1F4A, - FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1F6A, - FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F02, - FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_epsilon, 0x1F12, - FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F22, - FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_iota, 0x1F32, - FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_omicron, 0x1F42, - FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_upsilon, 0x1F52, - FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1F62, - FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F0B, - FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_EPSILON, 0x1F1B, - FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F2B, - FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_IOTA, 0x1F3B, - FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_OMICRON, 0x1F4B, - FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_UPSILON, 0x1F5B, - FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1F6B, - FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F03, - FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_epsilon, 0x1F13, - FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F23, - FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_iota, 0x1F33, - FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_omicron, 0x1F43, - FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_upsilon, 0x1F53, - FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1F63, - FcitxKey_b, FcitxKey_exclam, FcitxKey_A, 0x1EB6, - FcitxKey_b, FcitxKey_exclam, FcitxKey_a, 0x1EB7, - FcitxKey_b, FcitxKey_comma, FcitxKey_E, 0x1E1C, - FcitxKey_b, FcitxKey_comma, FcitxKey_e, 0x1E1D, - FcitxKey_b, FcitxKey_cedilla, FcitxKey_E, 0x1E1C, - FcitxKey_b, FcitxKey_cedilla, FcitxKey_e, 0x1E1D, - FcitxKey_b, FcitxKey_dead_cedilla, FcitxKey_E, 0x1E1C, - FcitxKey_b, FcitxKey_dead_cedilla, FcitxKey_e, 0x1E1D, - FcitxKey_b, FcitxKey_dead_belowdot, FcitxKey_A, 0x1EB6, - FcitxKey_b, FcitxKey_dead_belowdot, FcitxKey_a, 0x1EB7, - FcitxKey_c, FcitxKey_quotedbl, FcitxKey_U, 0x01D9, - FcitxKey_c, FcitxKey_quotedbl, FcitxKey_u, 0x01DA, - FcitxKey_c, FcitxKey_dead_diaeresis, FcitxKey_U, 0x01D9, - FcitxKey_c, FcitxKey_dead_diaeresis, FcitxKey_u, 0x01DA, - FcitxKey_o, FcitxKey_apostrophe, FcitxKey_A, 0x01FA, - FcitxKey_o, FcitxKey_apostrophe, FcitxKey_a, 0x01FB, - FcitxKey_asciitilde, FcitxKey_quotedbl, FcitxKey_Greek_iota, 0x1FD7, - FcitxKey_asciitilde, FcitxKey_quotedbl, FcitxKey_Greek_upsilon, 0x1FE7, - FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F0F, - FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F2F, - FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_IOTA, 0x1F3F, - FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_UPSILON, 0x1F5F, - FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1F6F, - FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F07, - FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F27, - FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_iota, 0x1F37, - FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_upsilon, 0x1F57, - FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1F67, - FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F0E, - FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F2E, - FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_IOTA, 0x1F3E, - FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1F6E, - FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F06, - FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F26, - FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_iota, 0x1F36, - FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_upsilon, 0x1F56, - FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1F66, - FcitxKey_asciitilde, FcitxKey_plus, FcitxKey_O, 0x1EE0, - FcitxKey_asciitilde, FcitxKey_plus, FcitxKey_U, 0x1EEE, - FcitxKey_asciitilde, FcitxKey_plus, FcitxKey_o, 0x1EE1, - FcitxKey_asciitilde, FcitxKey_plus, FcitxKey_u, 0x1EEF, - FcitxKey_asciitilde, FcitxKey_asciicircum, FcitxKey_A, 0x1EAA, - FcitxKey_asciitilde, FcitxKey_asciicircum, FcitxKey_E, 0x1EC4, - FcitxKey_asciitilde, FcitxKey_asciicircum, FcitxKey_O, 0x1ED6, - FcitxKey_asciitilde, FcitxKey_asciicircum, FcitxKey_a, 0x1EAB, - FcitxKey_asciitilde, FcitxKey_asciicircum, FcitxKey_e, 0x1EC5, - FcitxKey_asciitilde, FcitxKey_asciicircum, FcitxKey_o, 0x1ED7, - FcitxKey_asciitilde, FcitxKey_b, FcitxKey_A, 0x1EB4, - FcitxKey_asciitilde, FcitxKey_b, FcitxKey_a, 0x1EB5, - FcitxKey_asciitilde, FcitxKey_dead_circumflex, FcitxKey_A, 0x1EAA, - FcitxKey_asciitilde, FcitxKey_dead_circumflex, FcitxKey_E, 0x1EC4, - FcitxKey_asciitilde, FcitxKey_dead_circumflex, FcitxKey_O, 0x1ED6, - FcitxKey_asciitilde, FcitxKey_dead_circumflex, FcitxKey_a, 0x1EAB, - FcitxKey_asciitilde, FcitxKey_dead_circumflex, FcitxKey_e, 0x1EC5, - FcitxKey_asciitilde, FcitxKey_dead_circumflex, FcitxKey_o, 0x1ED7, - FcitxKey_asciitilde, FcitxKey_dead_breve, FcitxKey_A, 0x1EB4, - FcitxKey_asciitilde, FcitxKey_dead_breve, FcitxKey_a, 0x1EB5, - FcitxKey_asciitilde, FcitxKey_dead_diaeresis, FcitxKey_Greek_iota, 0x1FD7, - FcitxKey_asciitilde, FcitxKey_dead_diaeresis, FcitxKey_Greek_upsilon, 0x1FE7, - FcitxKey_asciitilde, FcitxKey_dead_horn, FcitxKey_O, 0x1EE0, - FcitxKey_asciitilde, FcitxKey_dead_horn, FcitxKey_U, 0x1EEE, - FcitxKey_asciitilde, FcitxKey_dead_horn, FcitxKey_o, 0x1EE1, - FcitxKey_asciitilde, FcitxKey_dead_horn, FcitxKey_u, 0x1EEF, - FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F0E, - FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F2E, - FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_IOTA, 0x1F3E, - FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1F6E, - FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F06, - FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F26, - FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_iota, 0x1F36, - FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_upsilon, 0x1F56, - FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1F66, - FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F0F, - FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F2F, - FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_IOTA, 0x1F3F, - FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_UPSILON, 0x1F5F, - FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1F6F, - FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F07, - FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F27, - FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_iota, 0x1F37, - FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_upsilon, 0x1F57, - FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1F67, - FcitxKey_macron, FcitxKey_exclam, FcitxKey_L, 0x1E38, - FcitxKey_macron, FcitxKey_exclam, FcitxKey_R, 0x1E5C, - FcitxKey_macron, FcitxKey_exclam, FcitxKey_l, 0x1E39, - FcitxKey_macron, FcitxKey_exclam, FcitxKey_r, 0x1E5D, - FcitxKey_macron, FcitxKey_quotedbl, FcitxKey_A, 0x01DE, - FcitxKey_macron, FcitxKey_quotedbl, FcitxKey_O, 0x022A, - FcitxKey_macron, FcitxKey_quotedbl, FcitxKey_U, 0x01D5, - FcitxKey_macron, FcitxKey_quotedbl, FcitxKey_a, 0x01DF, - FcitxKey_macron, FcitxKey_quotedbl, FcitxKey_o, 0x022B, - FcitxKey_macron, FcitxKey_quotedbl, FcitxKey_u, 0x01D6, - FcitxKey_macron, FcitxKey_period, FcitxKey_A, 0x01E0, - FcitxKey_macron, FcitxKey_period, FcitxKey_O, 0x0230, - FcitxKey_macron, FcitxKey_period, FcitxKey_a, 0x01E1, - FcitxKey_macron, FcitxKey_period, FcitxKey_o, 0x0231, - FcitxKey_macron, FcitxKey_semicolon, FcitxKey_O, 0x01EC, - FcitxKey_macron, FcitxKey_semicolon, FcitxKey_o, 0x01ED, - FcitxKey_macron, FcitxKey_asciitilde, FcitxKey_O, 0x022C, - FcitxKey_macron, FcitxKey_asciitilde, FcitxKey_o, 0x022D, - FcitxKey_macron, FcitxKey_dead_tilde, FcitxKey_O, 0x022C, - FcitxKey_macron, FcitxKey_dead_tilde, FcitxKey_o, 0x022D, - FcitxKey_macron, FcitxKey_dead_abovedot, FcitxKey_A, 0x01E0, - FcitxKey_macron, FcitxKey_dead_abovedot, FcitxKey_O, 0x0230, - FcitxKey_macron, FcitxKey_dead_abovedot, FcitxKey_a, 0x01E1, - FcitxKey_macron, FcitxKey_dead_abovedot, FcitxKey_o, 0x0231, - FcitxKey_macron, FcitxKey_dead_diaeresis, FcitxKey_A, 0x01DE, - FcitxKey_macron, FcitxKey_dead_diaeresis, FcitxKey_O, 0x022A, - FcitxKey_macron, FcitxKey_dead_diaeresis, FcitxKey_U, 0x01D5, - FcitxKey_macron, FcitxKey_dead_diaeresis, FcitxKey_a, 0x01DF, - FcitxKey_macron, FcitxKey_dead_diaeresis, FcitxKey_o, 0x022B, - FcitxKey_macron, FcitxKey_dead_diaeresis, FcitxKey_u, 0x01D6, - FcitxKey_macron, FcitxKey_dead_ogonek, FcitxKey_O, 0x01EC, - FcitxKey_macron, FcitxKey_dead_ogonek, FcitxKey_o, 0x01ED, - FcitxKey_macron, FcitxKey_dead_belowdot, FcitxKey_L, 0x1E38, - FcitxKey_macron, FcitxKey_dead_belowdot, FcitxKey_R, 0x1E5C, - FcitxKey_macron, FcitxKey_dead_belowdot, FcitxKey_l, 0x1E39, - FcitxKey_macron, FcitxKey_dead_belowdot, FcitxKey_r, 0x1E5D, - FcitxKey_acute, FcitxKey_quotedbl, FcitxKey_I, 0x1E2E, - FcitxKey_acute, FcitxKey_quotedbl, FcitxKey_U, 0x01D7, - FcitxKey_acute, FcitxKey_quotedbl, FcitxKey_i, 0x1E2F, - FcitxKey_acute, FcitxKey_quotedbl, FcitxKey_u, 0x01D8, - FcitxKey_acute, FcitxKey_quotedbl, FcitxKey_Greek_iota, 0x0390, - FcitxKey_acute, FcitxKey_quotedbl, FcitxKey_Greek_upsilon, 0x03B0, - FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F0D, - FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_EPSILON, 0x1F1D, - FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F2D, - FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_IOTA, 0x1F3D, - FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_OMICRON, 0x1F4D, - FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_UPSILON, 0x1F5D, - FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1F6D, - FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F05, - FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_epsilon, 0x1F15, - FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F25, - FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_iota, 0x1F35, - FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_omicron, 0x1F45, - FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_upsilon, 0x1F55, - FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1F65, - FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F0C, - FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_EPSILON, 0x1F1C, - FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F2C, - FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_IOTA, 0x1F3C, - FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_OMICRON, 0x1F4C, - FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1F6C, - FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F04, - FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_epsilon, 0x1F14, - FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F24, - FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_iota, 0x1F34, - FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_omicron, 0x1F44, - FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_upsilon, 0x1F54, - FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1F64, - FcitxKey_acute, FcitxKey_plus, FcitxKey_O, 0x1EDA, - FcitxKey_acute, FcitxKey_plus, FcitxKey_U, 0x1EE8, - FcitxKey_acute, FcitxKey_plus, FcitxKey_o, 0x1EDB, - FcitxKey_acute, FcitxKey_plus, FcitxKey_u, 0x1EE9, - FcitxKey_acute, FcitxKey_comma, FcitxKey_C, 0x1E08, - FcitxKey_acute, FcitxKey_comma, FcitxKey_c, 0x1E09, - FcitxKey_acute, FcitxKey_slash, FcitxKey_O, 0x01FE, - FcitxKey_acute, FcitxKey_slash, FcitxKey_o, 0x01FF, - FcitxKey_acute, FcitxKey_asciicircum, FcitxKey_A, 0x1EA4, - FcitxKey_acute, FcitxKey_asciicircum, FcitxKey_E, 0x1EBE, - FcitxKey_acute, FcitxKey_asciicircum, FcitxKey_O, 0x1ED0, - FcitxKey_acute, FcitxKey_asciicircum, FcitxKey_a, 0x1EA5, - FcitxKey_acute, FcitxKey_asciicircum, FcitxKey_e, 0x1EBF, - FcitxKey_acute, FcitxKey_asciicircum, FcitxKey_o, 0x1ED1, - FcitxKey_acute, FcitxKey_underscore, FcitxKey_E, 0x1E16, - FcitxKey_acute, FcitxKey_underscore, FcitxKey_O, 0x1E52, - FcitxKey_acute, FcitxKey_underscore, FcitxKey_e, 0x1E17, - FcitxKey_acute, FcitxKey_underscore, FcitxKey_o, 0x1E53, - FcitxKey_acute, FcitxKey_b, FcitxKey_A, 0x1EAE, - FcitxKey_acute, FcitxKey_b, FcitxKey_a, 0x1EAF, - FcitxKey_acute, FcitxKey_asciitilde, FcitxKey_O, 0x1E4C, - FcitxKey_acute, FcitxKey_asciitilde, FcitxKey_U, 0x1E78, - FcitxKey_acute, FcitxKey_asciitilde, FcitxKey_o, 0x1E4D, - FcitxKey_acute, FcitxKey_asciitilde, FcitxKey_u, 0x1E79, - FcitxKey_acute, FcitxKey_macron, FcitxKey_E, 0x1E16, - FcitxKey_acute, FcitxKey_macron, FcitxKey_O, 0x1E52, - FcitxKey_acute, FcitxKey_macron, FcitxKey_e, 0x1E17, - FcitxKey_acute, FcitxKey_macron, FcitxKey_o, 0x1E53, - FcitxKey_acute, FcitxKey_cedilla, FcitxKey_C, 0x1E08, - FcitxKey_acute, FcitxKey_cedilla, FcitxKey_c, 0x1E09, - FcitxKey_acute, FcitxKey_dead_circumflex, FcitxKey_A, 0x1EA4, - FcitxKey_acute, FcitxKey_dead_circumflex, FcitxKey_E, 0x1EBE, - FcitxKey_acute, FcitxKey_dead_circumflex, FcitxKey_O, 0x1ED0, - FcitxKey_acute, FcitxKey_dead_circumflex, FcitxKey_a, 0x1EA5, - FcitxKey_acute, FcitxKey_dead_circumflex, FcitxKey_e, 0x1EBF, - FcitxKey_acute, FcitxKey_dead_circumflex, FcitxKey_o, 0x1ED1, - FcitxKey_acute, FcitxKey_dead_tilde, FcitxKey_O, 0x1E4C, - FcitxKey_acute, FcitxKey_dead_tilde, FcitxKey_U, 0x1E78, - FcitxKey_acute, FcitxKey_dead_tilde, FcitxKey_o, 0x1E4D, - FcitxKey_acute, FcitxKey_dead_tilde, FcitxKey_u, 0x1E79, - FcitxKey_acute, FcitxKey_dead_macron, FcitxKey_E, 0x1E16, - FcitxKey_acute, FcitxKey_dead_macron, FcitxKey_O, 0x1E52, - FcitxKey_acute, FcitxKey_dead_macron, FcitxKey_e, 0x1E17, - FcitxKey_acute, FcitxKey_dead_macron, FcitxKey_o, 0x1E53, - FcitxKey_acute, FcitxKey_dead_breve, FcitxKey_A, 0x1EAE, - FcitxKey_acute, FcitxKey_dead_breve, FcitxKey_a, 0x1EAF, - FcitxKey_acute, FcitxKey_dead_diaeresis, FcitxKey_I, 0x1E2E, - FcitxKey_acute, FcitxKey_dead_diaeresis, FcitxKey_U, 0x01D7, - FcitxKey_acute, FcitxKey_dead_diaeresis, FcitxKey_i, 0x1E2F, - FcitxKey_acute, FcitxKey_dead_diaeresis, FcitxKey_u, 0x01D8, - FcitxKey_acute, FcitxKey_dead_diaeresis, FcitxKey_Greek_iota, 0x0390, - FcitxKey_acute, FcitxKey_dead_diaeresis, FcitxKey_Greek_upsilon, 0x03B0, - FcitxKey_acute, FcitxKey_dead_abovering, FcitxKey_A, 0x01FA, - FcitxKey_acute, FcitxKey_dead_abovering, FcitxKey_a, 0x01FB, - FcitxKey_acute, FcitxKey_dead_cedilla, FcitxKey_C, 0x1E08, - FcitxKey_acute, FcitxKey_dead_cedilla, FcitxKey_c, 0x1E09, - FcitxKey_acute, FcitxKey_dead_horn, FcitxKey_O, 0x1EDA, - FcitxKey_acute, FcitxKey_dead_horn, FcitxKey_U, 0x1EE8, - FcitxKey_acute, FcitxKey_dead_horn, FcitxKey_o, 0x1EDB, - FcitxKey_acute, FcitxKey_dead_horn, FcitxKey_u, 0x1EE9, - FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F0C, - FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_EPSILON, 0x1F1C, - FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F2C, - FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_IOTA, 0x1F3C, - FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_OMICRON, 0x1F4C, - FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1F6C, - FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F04, - FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_epsilon, 0x1F14, - FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F24, - FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_iota, 0x1F34, - FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_omicron, 0x1F44, - FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_upsilon, 0x1F54, - FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1F64, - FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F0D, - FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_EPSILON, 0x1F1D, - FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F2D, - FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_IOTA, 0x1F3D, - FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_OMICRON, 0x1F4D, - FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_UPSILON, 0x1F5D, - FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1F6D, - FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F05, - FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_epsilon, 0x1F15, - FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F25, - FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_iota, 0x1F35, - FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_omicron, 0x1F45, - FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_upsilon, 0x1F55, - FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1F65, - FcitxKey_acute, FcitxKey_KP_Divide, FcitxKey_O, 0x01FE, - FcitxKey_acute, FcitxKey_KP_Divide, FcitxKey_o, 0x01FF, - 0x05C1, 0x05BC, FcitxKey_hebrew_shin, 0xFB2C, - 0x05C2, 0x05BC, FcitxKey_hebrew_shin, 0xFB2D, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_Greek_alpha, 0x1FB4, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_Greek_eta, 0x1FC4, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_Greek_omega, 0x1FF4, - FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x1F00, 0x1F84, - FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x1F01, 0x1F85, - FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x1F08, 0x1F8C, - FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x1F09, 0x1F8D, - FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x1F20, 0x1F94, - FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x1F21, 0x1F95, - FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x1F28, 0x1F9C, - FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x1F29, 0x1F9D, - FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x1F60, 0x1FA4, - FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x1F61, 0x1FA5, - FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x1F68, 0x1FAC, - FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x1F69, 0x1FAD, - FcitxKey_Greek_iota, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F89, - FcitxKey_Greek_iota, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F99, - FcitxKey_Greek_iota, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FA9, - FcitxKey_Greek_iota, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F81, - FcitxKey_Greek_iota, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F91, - FcitxKey_Greek_iota, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA1, - FcitxKey_Greek_iota, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F88, - FcitxKey_Greek_iota, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F98, - FcitxKey_Greek_iota, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FA8, - FcitxKey_Greek_iota, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F80, - FcitxKey_Greek_iota, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F90, - FcitxKey_Greek_iota, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA0, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_Greek_alpha, 0x1FB2, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_Greek_eta, 0x1FC2, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_Greek_omega, 0x1FF2, - FcitxKey_Greek_iota, FcitxKey_grave, 0x1F00, 0x1F82, - FcitxKey_Greek_iota, FcitxKey_grave, 0x1F01, 0x1F83, - FcitxKey_Greek_iota, FcitxKey_grave, 0x1F08, 0x1F8A, - FcitxKey_Greek_iota, FcitxKey_grave, 0x1F09, 0x1F8B, - FcitxKey_Greek_iota, FcitxKey_grave, 0x1F20, 0x1F92, - FcitxKey_Greek_iota, FcitxKey_grave, 0x1F21, 0x1F93, - FcitxKey_Greek_iota, FcitxKey_grave, 0x1F28, 0x1F9A, - FcitxKey_Greek_iota, FcitxKey_grave, 0x1F29, 0x1F9B, - FcitxKey_Greek_iota, FcitxKey_grave, 0x1F60, 0x1FA2, - FcitxKey_Greek_iota, FcitxKey_grave, 0x1F61, 0x1FA3, - FcitxKey_Greek_iota, FcitxKey_grave, 0x1F68, 0x1FAA, - FcitxKey_Greek_iota, FcitxKey_grave, 0x1F69, 0x1FAB, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_Greek_alpha, 0x1FB7, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_Greek_eta, 0x1FC7, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_Greek_omega, 0x1FF7, - FcitxKey_Greek_iota, FcitxKey_asciitilde, 0x1F00, 0x1F86, - FcitxKey_Greek_iota, FcitxKey_asciitilde, 0x1F01, 0x1F87, - FcitxKey_Greek_iota, FcitxKey_asciitilde, 0x1F08, 0x1F8E, - FcitxKey_Greek_iota, FcitxKey_asciitilde, 0x1F09, 0x1F8F, - FcitxKey_Greek_iota, FcitxKey_asciitilde, 0x1F20, 0x1F96, - FcitxKey_Greek_iota, FcitxKey_asciitilde, 0x1F21, 0x1F97, - FcitxKey_Greek_iota, FcitxKey_asciitilde, 0x1F28, 0x1F9E, - FcitxKey_Greek_iota, FcitxKey_asciitilde, 0x1F29, 0x1F9F, - FcitxKey_Greek_iota, FcitxKey_asciitilde, 0x1F60, 0x1FA6, - FcitxKey_Greek_iota, FcitxKey_asciitilde, 0x1F61, 0x1FA7, - FcitxKey_Greek_iota, FcitxKey_asciitilde, 0x1F68, 0x1FAE, - FcitxKey_Greek_iota, FcitxKey_asciitilde, 0x1F69, 0x1FAF, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_Greek_alpha, 0x1FB4, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_Greek_eta, 0x1FC4, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_Greek_omega, 0x1FF4, - FcitxKey_Greek_iota, FcitxKey_acute, 0x1F00, 0x1F84, - FcitxKey_Greek_iota, FcitxKey_acute, 0x1F01, 0x1F85, - FcitxKey_Greek_iota, FcitxKey_acute, 0x1F08, 0x1F8C, - FcitxKey_Greek_iota, FcitxKey_acute, 0x1F09, 0x1F8D, - FcitxKey_Greek_iota, FcitxKey_acute, 0x1F20, 0x1F94, - FcitxKey_Greek_iota, FcitxKey_acute, 0x1F21, 0x1F95, - FcitxKey_Greek_iota, FcitxKey_acute, 0x1F28, 0x1F9C, - FcitxKey_Greek_iota, FcitxKey_acute, 0x1F29, 0x1F9D, - FcitxKey_Greek_iota, FcitxKey_acute, 0x1F60, 0x1FA4, - FcitxKey_Greek_iota, FcitxKey_acute, 0x1F61, 0x1FA5, - FcitxKey_Greek_iota, FcitxKey_acute, 0x1F68, 0x1FAC, - FcitxKey_Greek_iota, FcitxKey_acute, 0x1F69, 0x1FAD, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_Greek_alpha, 0x1FB2, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_Greek_eta, 0x1FC2, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_Greek_omega, 0x1FF2, - FcitxKey_Greek_iota, FcitxKey_dead_grave, 0x1F00, 0x1F82, - FcitxKey_Greek_iota, FcitxKey_dead_grave, 0x1F01, 0x1F83, - FcitxKey_Greek_iota, FcitxKey_dead_grave, 0x1F08, 0x1F8A, - FcitxKey_Greek_iota, FcitxKey_dead_grave, 0x1F09, 0x1F8B, - FcitxKey_Greek_iota, FcitxKey_dead_grave, 0x1F20, 0x1F92, - FcitxKey_Greek_iota, FcitxKey_dead_grave, 0x1F21, 0x1F93, - FcitxKey_Greek_iota, FcitxKey_dead_grave, 0x1F28, 0x1F9A, - FcitxKey_Greek_iota, FcitxKey_dead_grave, 0x1F29, 0x1F9B, - FcitxKey_Greek_iota, FcitxKey_dead_grave, 0x1F60, 0x1FA2, - FcitxKey_Greek_iota, FcitxKey_dead_grave, 0x1F61, 0x1FA3, - FcitxKey_Greek_iota, FcitxKey_dead_grave, 0x1F68, 0x1FAA, - FcitxKey_Greek_iota, FcitxKey_dead_grave, 0x1F69, 0x1FAB, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_Greek_alpha, 0x1FB4, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_Greek_eta, 0x1FC4, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_Greek_omega, 0x1FF4, - FcitxKey_Greek_iota, FcitxKey_dead_acute, 0x1F00, 0x1F84, - FcitxKey_Greek_iota, FcitxKey_dead_acute, 0x1F01, 0x1F85, - FcitxKey_Greek_iota, FcitxKey_dead_acute, 0x1F08, 0x1F8C, - FcitxKey_Greek_iota, FcitxKey_dead_acute, 0x1F09, 0x1F8D, - FcitxKey_Greek_iota, FcitxKey_dead_acute, 0x1F20, 0x1F94, - FcitxKey_Greek_iota, FcitxKey_dead_acute, 0x1F21, 0x1F95, - FcitxKey_Greek_iota, FcitxKey_dead_acute, 0x1F28, 0x1F9C, - FcitxKey_Greek_iota, FcitxKey_dead_acute, 0x1F29, 0x1F9D, - FcitxKey_Greek_iota, FcitxKey_dead_acute, 0x1F60, 0x1FA4, - FcitxKey_Greek_iota, FcitxKey_dead_acute, 0x1F61, 0x1FA5, - FcitxKey_Greek_iota, FcitxKey_dead_acute, 0x1F68, 0x1FAC, - FcitxKey_Greek_iota, FcitxKey_dead_acute, 0x1F69, 0x1FAD, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_Greek_alpha, 0x1FB7, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_Greek_eta, 0x1FC7, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_Greek_omega, 0x1FF7, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, 0x1F00, 0x1F86, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, 0x1F01, 0x1F87, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, 0x1F08, 0x1F8E, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, 0x1F09, 0x1F8F, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, 0x1F20, 0x1F96, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, 0x1F21, 0x1F97, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, 0x1F28, 0x1F9E, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, 0x1F29, 0x1F9F, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, 0x1F60, 0x1FA6, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, 0x1F61, 0x1FA7, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, 0x1F68, 0x1FAE, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, 0x1F69, 0x1FAF, - FcitxKey_Greek_iota, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F88, - FcitxKey_Greek_iota, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F98, - FcitxKey_Greek_iota, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FA8, - FcitxKey_Greek_iota, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F80, - FcitxKey_Greek_iota, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F90, - FcitxKey_Greek_iota, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA0, - FcitxKey_Greek_iota, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F89, - FcitxKey_Greek_iota, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F99, - FcitxKey_Greek_iota, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FA9, - FcitxKey_Greek_iota, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F81, - FcitxKey_Greek_iota, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F91, - FcitxKey_Greek_iota, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA1, - FcitxKey_parenleft, FcitxKey_1, FcitxKey_0, FcitxKey_parenright, 0x2469, - FcitxKey_parenleft, FcitxKey_1, FcitxKey_1, FcitxKey_parenright, 0x246A, - FcitxKey_parenleft, FcitxKey_1, FcitxKey_2, FcitxKey_parenright, 0x246B, - FcitxKey_parenleft, FcitxKey_1, FcitxKey_3, FcitxKey_parenright, 0x246C, - FcitxKey_parenleft, FcitxKey_1, FcitxKey_4, FcitxKey_parenright, 0x246D, - FcitxKey_parenleft, FcitxKey_1, FcitxKey_5, FcitxKey_parenright, 0x246E, - FcitxKey_parenleft, FcitxKey_1, FcitxKey_6, FcitxKey_parenright, 0x246F, - FcitxKey_parenleft, FcitxKey_1, FcitxKey_7, FcitxKey_parenright, 0x2470, - FcitxKey_parenleft, FcitxKey_1, FcitxKey_8, FcitxKey_parenright, 0x2471, - FcitxKey_parenleft, FcitxKey_1, FcitxKey_9, FcitxKey_parenright, 0x2472, - FcitxKey_parenleft, FcitxKey_1, FcitxKey_KP_Space, FcitxKey_parenright, 0x246B, - FcitxKey_parenleft, FcitxKey_1, FcitxKey_KP_0, FcitxKey_parenright, 0x2469, - FcitxKey_parenleft, FcitxKey_1, FcitxKey_KP_1, FcitxKey_parenright, 0x246A, - FcitxKey_parenleft, FcitxKey_1, FcitxKey_KP_2, FcitxKey_parenright, 0x246B, - FcitxKey_parenleft, FcitxKey_1, FcitxKey_KP_3, FcitxKey_parenright, 0x246C, - FcitxKey_parenleft, FcitxKey_1, FcitxKey_KP_4, FcitxKey_parenright, 0x246D, - FcitxKey_parenleft, FcitxKey_1, FcitxKey_KP_5, FcitxKey_parenright, 0x246E, - FcitxKey_parenleft, FcitxKey_1, FcitxKey_KP_6, FcitxKey_parenright, 0x246F, - FcitxKey_parenleft, FcitxKey_1, FcitxKey_KP_7, FcitxKey_parenright, 0x2470, - FcitxKey_parenleft, FcitxKey_1, FcitxKey_KP_8, FcitxKey_parenright, 0x2471, - FcitxKey_parenleft, FcitxKey_1, FcitxKey_KP_9, FcitxKey_parenright, 0x2472, - FcitxKey_parenleft, FcitxKey_2, FcitxKey_0, FcitxKey_parenright, 0x2473, - FcitxKey_parenleft, FcitxKey_2, FcitxKey_1, FcitxKey_parenright, 0x3251, - FcitxKey_parenleft, FcitxKey_2, FcitxKey_2, FcitxKey_parenright, 0x3252, - FcitxKey_parenleft, FcitxKey_2, FcitxKey_3, FcitxKey_parenright, 0x3253, - FcitxKey_parenleft, FcitxKey_2, FcitxKey_4, FcitxKey_parenright, 0x3254, - FcitxKey_parenleft, FcitxKey_2, FcitxKey_5, FcitxKey_parenright, 0x3255, - FcitxKey_parenleft, FcitxKey_2, FcitxKey_6, FcitxKey_parenright, 0x3256, - FcitxKey_parenleft, FcitxKey_2, FcitxKey_7, FcitxKey_parenright, 0x3257, - FcitxKey_parenleft, FcitxKey_2, FcitxKey_8, FcitxKey_parenright, 0x3258, - FcitxKey_parenleft, FcitxKey_2, FcitxKey_9, FcitxKey_parenright, 0x3259, - FcitxKey_parenleft, FcitxKey_2, FcitxKey_KP_Space, FcitxKey_parenright, 0x3252, - FcitxKey_parenleft, FcitxKey_2, FcitxKey_KP_0, FcitxKey_parenright, 0x2473, - FcitxKey_parenleft, FcitxKey_2, FcitxKey_KP_1, FcitxKey_parenright, 0x3251, - FcitxKey_parenleft, FcitxKey_2, FcitxKey_KP_2, FcitxKey_parenright, 0x3252, - FcitxKey_parenleft, FcitxKey_2, FcitxKey_KP_3, FcitxKey_parenright, 0x3253, - FcitxKey_parenleft, FcitxKey_2, FcitxKey_KP_4, FcitxKey_parenright, 0x3254, - FcitxKey_parenleft, FcitxKey_2, FcitxKey_KP_5, FcitxKey_parenright, 0x3255, - FcitxKey_parenleft, FcitxKey_2, FcitxKey_KP_6, FcitxKey_parenright, 0x3256, - FcitxKey_parenleft, FcitxKey_2, FcitxKey_KP_7, FcitxKey_parenright, 0x3257, - FcitxKey_parenleft, FcitxKey_2, FcitxKey_KP_8, FcitxKey_parenright, 0x3258, - FcitxKey_parenleft, FcitxKey_2, FcitxKey_KP_9, FcitxKey_parenright, 0x3259, - FcitxKey_parenleft, FcitxKey_3, FcitxKey_0, FcitxKey_parenright, 0x325A, - FcitxKey_parenleft, FcitxKey_3, FcitxKey_1, FcitxKey_parenright, 0x325B, - FcitxKey_parenleft, FcitxKey_3, FcitxKey_2, FcitxKey_parenright, 0x325C, - FcitxKey_parenleft, FcitxKey_3, FcitxKey_3, FcitxKey_parenright, 0x325D, - FcitxKey_parenleft, FcitxKey_3, FcitxKey_4, FcitxKey_parenright, 0x325E, - FcitxKey_parenleft, FcitxKey_3, FcitxKey_5, FcitxKey_parenright, 0x325F, - FcitxKey_parenleft, FcitxKey_3, FcitxKey_6, FcitxKey_parenright, 0x32B1, - FcitxKey_parenleft, FcitxKey_3, FcitxKey_7, FcitxKey_parenright, 0x32B2, - FcitxKey_parenleft, FcitxKey_3, FcitxKey_8, FcitxKey_parenright, 0x32B3, - FcitxKey_parenleft, FcitxKey_3, FcitxKey_9, FcitxKey_parenright, 0x32B4, - FcitxKey_parenleft, FcitxKey_3, FcitxKey_KP_Space, FcitxKey_parenright, 0x325C, - FcitxKey_parenleft, FcitxKey_3, FcitxKey_KP_0, FcitxKey_parenright, 0x325A, - FcitxKey_parenleft, FcitxKey_3, FcitxKey_KP_1, FcitxKey_parenright, 0x325B, - FcitxKey_parenleft, FcitxKey_3, FcitxKey_KP_2, FcitxKey_parenright, 0x325C, - FcitxKey_parenleft, FcitxKey_3, FcitxKey_KP_3, FcitxKey_parenright, 0x325D, - FcitxKey_parenleft, FcitxKey_3, FcitxKey_KP_4, FcitxKey_parenright, 0x325E, - FcitxKey_parenleft, FcitxKey_3, FcitxKey_KP_5, FcitxKey_parenright, 0x325F, - FcitxKey_parenleft, FcitxKey_3, FcitxKey_KP_6, FcitxKey_parenright, 0x32B1, - FcitxKey_parenleft, FcitxKey_3, FcitxKey_KP_7, FcitxKey_parenright, 0x32B2, - FcitxKey_parenleft, FcitxKey_3, FcitxKey_KP_8, FcitxKey_parenright, 0x32B3, - FcitxKey_parenleft, FcitxKey_3, FcitxKey_KP_9, FcitxKey_parenright, 0x32B4, - FcitxKey_parenleft, FcitxKey_4, FcitxKey_0, FcitxKey_parenright, 0x32B5, - FcitxKey_parenleft, FcitxKey_4, FcitxKey_1, FcitxKey_parenright, 0x32B6, - FcitxKey_parenleft, FcitxKey_4, FcitxKey_2, FcitxKey_parenright, 0x32B7, - FcitxKey_parenleft, FcitxKey_4, FcitxKey_3, FcitxKey_parenright, 0x32B8, - FcitxKey_parenleft, FcitxKey_4, FcitxKey_4, FcitxKey_parenright, 0x32B9, - FcitxKey_parenleft, FcitxKey_4, FcitxKey_5, FcitxKey_parenright, 0x32BA, - FcitxKey_parenleft, FcitxKey_4, FcitxKey_6, FcitxKey_parenright, 0x32BB, - FcitxKey_parenleft, FcitxKey_4, FcitxKey_7, FcitxKey_parenright, 0x32BC, - FcitxKey_parenleft, FcitxKey_4, FcitxKey_8, FcitxKey_parenright, 0x32BD, - FcitxKey_parenleft, FcitxKey_4, FcitxKey_9, FcitxKey_parenright, 0x32BE, - FcitxKey_parenleft, FcitxKey_4, FcitxKey_KP_Space, FcitxKey_parenright, 0x32B7, - FcitxKey_parenleft, FcitxKey_4, FcitxKey_KP_0, FcitxKey_parenright, 0x32B5, - FcitxKey_parenleft, FcitxKey_4, FcitxKey_KP_1, FcitxKey_parenright, 0x32B6, - FcitxKey_parenleft, FcitxKey_4, FcitxKey_KP_2, FcitxKey_parenright, 0x32B7, - FcitxKey_parenleft, FcitxKey_4, FcitxKey_KP_3, FcitxKey_parenright, 0x32B8, - FcitxKey_parenleft, FcitxKey_4, FcitxKey_KP_4, FcitxKey_parenright, 0x32B9, - FcitxKey_parenleft, FcitxKey_4, FcitxKey_KP_5, FcitxKey_parenright, 0x32BA, - FcitxKey_parenleft, FcitxKey_4, FcitxKey_KP_6, FcitxKey_parenright, 0x32BB, - FcitxKey_parenleft, FcitxKey_4, FcitxKey_KP_7, FcitxKey_parenright, 0x32BC, - FcitxKey_parenleft, FcitxKey_4, FcitxKey_KP_8, FcitxKey_parenright, 0x32BD, - FcitxKey_parenleft, FcitxKey_4, FcitxKey_KP_9, FcitxKey_parenright, 0x32BE, - FcitxKey_parenleft, FcitxKey_5, FcitxKey_KP_0, FcitxKey_parenright, 0x32BF, - FcitxKey_parenleft, 0x1100, 0x1161, FcitxKey_parenright, 0x326E, - FcitxKey_parenleft, 0x1102, 0x1161, FcitxKey_parenright, 0x326F, - FcitxKey_parenleft, 0x1103, 0x1161, FcitxKey_parenright, 0x3270, - FcitxKey_parenleft, 0x1105, 0x1161, FcitxKey_parenright, 0x3271, - FcitxKey_parenleft, 0x1106, 0x1161, FcitxKey_parenright, 0x3272, - FcitxKey_parenleft, 0x1107, 0x1161, FcitxKey_parenright, 0x3273, - FcitxKey_parenleft, 0x1109, 0x1161, FcitxKey_parenright, 0x3274, - FcitxKey_parenleft, 0x110B, 0x1161, FcitxKey_parenright, 0x3275, - FcitxKey_parenleft, 0x110C, 0x1161, FcitxKey_parenright, 0x3276, - FcitxKey_parenleft, 0x110E, 0x1161, FcitxKey_parenright, 0x3277, - FcitxKey_parenleft, 0x110F, 0x1161, FcitxKey_parenright, 0x3278, - FcitxKey_parenleft, 0x1110, 0x1161, FcitxKey_parenright, 0x3279, - FcitxKey_parenleft, 0x1111, 0x1161, FcitxKey_parenright, 0x327A, - FcitxKey_parenleft, 0x1112, 0x1161, FcitxKey_parenright, 0x327B, - FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_0, FcitxKey_parenright, 0x2473, - FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_1, FcitxKey_parenright, 0x3251, - FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_2, FcitxKey_parenright, 0x3252, - FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_3, FcitxKey_parenright, 0x3253, - FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_4, FcitxKey_parenright, 0x3254, - FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_5, FcitxKey_parenright, 0x3255, - FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_6, FcitxKey_parenright, 0x3256, - FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_7, FcitxKey_parenright, 0x3257, - FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_8, FcitxKey_parenright, 0x3258, - FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_9, FcitxKey_parenright, 0x3259, - FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_KP_Space, FcitxKey_parenright, 0x3252, - FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_KP_0, FcitxKey_parenright, 0x2473, - FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_KP_1, FcitxKey_parenright, 0x3251, - FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_KP_2, FcitxKey_parenright, 0x3252, - FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_KP_3, FcitxKey_parenright, 0x3253, - FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_KP_4, FcitxKey_parenright, 0x3254, - FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_KP_5, FcitxKey_parenright, 0x3255, - FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_KP_6, FcitxKey_parenright, 0x3256, - FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_KP_7, FcitxKey_parenright, 0x3257, - FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_KP_8, FcitxKey_parenright, 0x3258, - FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_KP_9, FcitxKey_parenright, 0x3259, - FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_0, FcitxKey_parenright, 0x2469, - FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_1, FcitxKey_parenright, 0x246A, - FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_2, FcitxKey_parenright, 0x246B, - FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_3, FcitxKey_parenright, 0x246C, - FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_4, FcitxKey_parenright, 0x246D, - FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_5, FcitxKey_parenright, 0x246E, - FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_6, FcitxKey_parenright, 0x246F, - FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_7, FcitxKey_parenright, 0x2470, - FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_8, FcitxKey_parenright, 0x2471, - FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_9, FcitxKey_parenright, 0x2472, - FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_KP_Space, FcitxKey_parenright, 0x246B, - FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_KP_0, FcitxKey_parenright, 0x2469, - FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_KP_1, FcitxKey_parenright, 0x246A, - FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_KP_2, FcitxKey_parenright, 0x246B, - FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_KP_3, FcitxKey_parenright, 0x246C, - FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_KP_4, FcitxKey_parenright, 0x246D, - FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_KP_5, FcitxKey_parenright, 0x246E, - FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_KP_6, FcitxKey_parenright, 0x246F, - FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_KP_7, FcitxKey_parenright, 0x2470, - FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_KP_8, FcitxKey_parenright, 0x2471, - FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_KP_9, FcitxKey_parenright, 0x2472, - FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_0, FcitxKey_parenright, 0x2473, - FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_1, FcitxKey_parenright, 0x3251, - FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_2, FcitxKey_parenright, 0x3252, - FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_3, FcitxKey_parenright, 0x3253, - FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_4, FcitxKey_parenright, 0x3254, - FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_5, FcitxKey_parenright, 0x3255, - FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_6, FcitxKey_parenright, 0x3256, - FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_7, FcitxKey_parenright, 0x3257, - FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_8, FcitxKey_parenright, 0x3258, - FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_9, FcitxKey_parenright, 0x3259, - FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_KP_Space, FcitxKey_parenright, 0x3252, - FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_KP_0, FcitxKey_parenright, 0x2473, - FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_KP_1, FcitxKey_parenright, 0x3251, - FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_KP_2, FcitxKey_parenright, 0x3252, - FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_KP_3, FcitxKey_parenright, 0x3253, - FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_KP_4, FcitxKey_parenright, 0x3254, - FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_KP_5, FcitxKey_parenright, 0x3255, - FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_KP_6, FcitxKey_parenright, 0x3256, - FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_KP_7, FcitxKey_parenright, 0x3257, - FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_KP_8, FcitxKey_parenright, 0x3258, - FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_KP_9, FcitxKey_parenright, 0x3259, - FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_0, FcitxKey_parenright, 0x325A, - FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_1, FcitxKey_parenright, 0x325B, - FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_2, FcitxKey_parenright, 0x325C, - FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_3, FcitxKey_parenright, 0x325D, - FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_4, FcitxKey_parenright, 0x325E, - FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_5, FcitxKey_parenright, 0x325F, - FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_6, FcitxKey_parenright, 0x32B1, - FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_7, FcitxKey_parenright, 0x32B2, - FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_8, FcitxKey_parenright, 0x32B3, - FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_9, FcitxKey_parenright, 0x32B4, - FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_KP_Space, FcitxKey_parenright, 0x325C, - FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_KP_0, FcitxKey_parenright, 0x325A, - FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_KP_1, FcitxKey_parenright, 0x325B, - FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_KP_2, FcitxKey_parenright, 0x325C, - FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_KP_3, FcitxKey_parenright, 0x325D, - FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_KP_4, FcitxKey_parenright, 0x325E, - FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_KP_5, FcitxKey_parenright, 0x325F, - FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_KP_6, FcitxKey_parenright, 0x32B1, - FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_KP_7, FcitxKey_parenright, 0x32B2, - FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_KP_8, FcitxKey_parenright, 0x32B3, - FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_KP_9, FcitxKey_parenright, 0x32B4, - FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_0, FcitxKey_parenright, 0x32B5, - FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_1, FcitxKey_parenright, 0x32B6, - FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_2, FcitxKey_parenright, 0x32B7, - FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_3, FcitxKey_parenright, 0x32B8, - FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_4, FcitxKey_parenright, 0x32B9, - FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_5, FcitxKey_parenright, 0x32BA, - FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_6, FcitxKey_parenright, 0x32BB, - FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_7, FcitxKey_parenright, 0x32BC, - FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_8, FcitxKey_parenright, 0x32BD, - FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_9, FcitxKey_parenright, 0x32BE, - FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_KP_Space, FcitxKey_parenright, 0x32B7, - FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_KP_0, FcitxKey_parenright, 0x32B5, - FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_KP_1, FcitxKey_parenright, 0x32B6, - FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_KP_2, FcitxKey_parenright, 0x32B7, - FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_KP_3, FcitxKey_parenright, 0x32B8, - FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_KP_4, FcitxKey_parenright, 0x32B9, - FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_KP_5, FcitxKey_parenright, 0x32BA, - FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_KP_6, FcitxKey_parenright, 0x32BB, - FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_KP_7, FcitxKey_parenright, 0x32BC, - FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_KP_8, FcitxKey_parenright, 0x32BD, - FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_KP_9, FcitxKey_parenright, 0x32BE, - FcitxKey_parenleft, FcitxKey_KP_5, FcitxKey_KP_0, FcitxKey_parenright, 0x32BF, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8D, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9D, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAD, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F85, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F95, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA5, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8C, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9C, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAC, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F84, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F94, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA4, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8C, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9C, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAC, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F84, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F94, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA4, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8D, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9D, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAD, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F85, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F95, - FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA5, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8B, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9B, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAB, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F83, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F93, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA3, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8A, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9A, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAA, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F82, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F92, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA2, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8A, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9A, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAA, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F82, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F92, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA2, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8B, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9B, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAB, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F83, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F93, - FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA3, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8F, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9F, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAF, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F87, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F97, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA7, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8E, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9E, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAE, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F86, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F96, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA6, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8E, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9E, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAE, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F86, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F96, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA6, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8F, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9F, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAF, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F87, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F97, - FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA7, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8D, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9D, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAD, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F85, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F95, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA5, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8C, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9C, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAC, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F84, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F94, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA4, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8C, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9C, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAC, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F84, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F94, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA4, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8D, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9D, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAD, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F85, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F95, - FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA5, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8B, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9B, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAB, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F83, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F93, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA3, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8A, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9A, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAA, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F82, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F92, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA2, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8A, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9A, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAA, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F82, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F92, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA2, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8B, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9B, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAB, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F83, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F93, - FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA3, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8D, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9D, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAD, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F85, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F95, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA5, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8C, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9C, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAC, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F84, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F94, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA4, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8C, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9C, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAC, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F84, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F94, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA4, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8D, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9D, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAD, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F85, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F95, - FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA5, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8F, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9F, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAF, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F87, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F97, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA7, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8E, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9E, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAE, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F86, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F96, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA6, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8E, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9E, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAE, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F86, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F96, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA6, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8F, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9F, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAF, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F87, - FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F97, -}; - -#endif - - -// kate: indent-mode cstyle; space-indent on; indent-width 0; diff -Nru fcitx-4.2.2/src/frontend/qt/fcitx-formatted-preedit.cpp fcitx-4.2.4.1/src/frontend/qt/fcitx-formatted-preedit.cpp --- fcitx-4.2.2/src/frontend/qt/fcitx-formatted-preedit.cpp 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/qt/fcitx-formatted-preedit.cpp 2012-06-10 14:34:48.000000000 +0000 @@ -50,6 +50,10 @@ m_string = str; } +bool FcitxFormattedPreedit::operator==(const FcitxFormattedPreedit& preedit) const +{ + return (preedit.m_format == m_format) && (preedit.m_string == m_string); +} QDBusArgument& operator<<(QDBusArgument& argument, const FcitxFormattedPreedit& preedit) { diff -Nru fcitx-4.2.2/src/frontend/qt/fcitx-formatted-preedit.h fcitx-4.2.4.1/src/frontend/qt/fcitx-formatted-preedit.h --- fcitx-4.2.2/src/frontend/qt/fcitx-formatted-preedit.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/qt/fcitx-formatted-preedit.h 2012-06-10 14:34:48.000000000 +0000 @@ -32,6 +32,8 @@ void setFormat(qint32 format); static void registerMetaType(); + + bool operator ==(const FcitxFormattedPreedit& preedit) const; private: QString m_string; qint32 m_format; diff -Nru fcitx-4.2.2/src/frontend/qt/fcitx-input-context.cpp fcitx-4.2.4.1/src/frontend/qt/fcitx-input-context.cpp --- fcitx-4.2.2/src/frontend/qt/fcitx-input-context.cpp 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/qt/fcitx-input-context.cpp 2012-06-10 14:34:48.000000000 +0000 @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2011~2011 by CSSlayer * + * Copyright (C) 2011~2012 by CSSlayer * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -32,7 +32,7 @@ #include "fcitx-config/hotkey.h" #include "module/dbus/dbusstuff.h" #include "frontend/ipc/ipc.h" -#include "fcitx-compose-data.h" +#include "im/keyboard/fcitx-compose-data.h" #include "fcitx-input-context.h" #include "keyserver_x11.h" @@ -42,6 +42,7 @@ #include #include #include +#include static const int XKeyPress = KeyPress; static const int XKeyRelease = KeyRelease; #undef KeyPress @@ -50,6 +51,14 @@ #undef FocusOut #endif +#ifndef Q_LIKELY +#define Q_LIKELY(x) (x) +#endif + +#ifndef Q_UNLIKELY +#define Q_UNLIKELY(x) (x) +#endif + typedef struct _FcitxComposeTableCompact FcitxComposeTableCompact; struct _FcitxComposeTableCompact { const quint32 *data; @@ -96,6 +105,25 @@ return 0; } +static boolean +get_boolean_env(const char *name, + boolean defval) +{ + const char *value = getenv(name); + + if (value == NULL) + return defval; + + if (strcmp(value, "") == 0 || + strcmp(value, "0") == 0 || + strcmp(value, "false") == 0 || + strcmp(value, "False") == 0 || + strcmp(value, "FALSE") == 0) + return false; + + return true; +} + static const uint fcitx_compose_ignore[] = { FcitxKey_Shift_L, FcitxKey_Shift_R, @@ -120,18 +148,6 @@ static bool key_filtered = false; -static boolean FcitxIsHotKey(FcitxKeySym sym, int state, FcitxHotkey * hotkey); - -boolean FcitxIsHotKey(FcitxKeySym sym, int state, FcitxHotkey * hotkey) -{ - state &= FcitxKeyState_Ctrl_Alt_Shift; - if (hotkey[0].sym && sym == hotkey[0].sym && (hotkey[0].state == state)) - return true; - if (hotkey[1].sym && sym == hotkey[1].sym && (hotkey[1].state == state)) - return true; - return false; -} - QFcitxInputContext::QFcitxInputContext() : m_connection(QDBusConnection::sessionBus()), m_dbusproxy(0), @@ -139,9 +155,10 @@ m_icproxy(0), m_id(0), m_path(""), - m_enable(false), m_has_focus(false), - m_n_compose(0) + m_n_compose(0), + m_cursorPos(0), + m_useSurroundingText(false) { FcitxFormattedPreedit::registerMetaType(); @@ -150,9 +167,6 @@ m_dbusproxy = new org::freedesktop::DBus("org.freedesktop.DBus", "/org/freedesktop/DBus", m_connection, this); connect(m_dbusproxy, SIGNAL(NameOwnerChanged(QString, QString, QString)), this, SLOT(imChanged(QString, QString, QString))); - m_triggerKey[0].sym = m_triggerKey[1].sym = (FcitxKeySym) 0; - m_triggerKey[0].state = m_triggerKey[1].state = 0; - m_serviceName = QString("%1-%2").arg(FCITX_DBUS_SERVICE).arg(fcitx_utils_get_display_number()); createInputContext(); @@ -182,8 +196,19 @@ return ""; } +void QFcitxInputContext::commitPreedit() +{ + if (m_commitPreedit.length() > 0) { + QInputMethodEvent e; + e.setCommitString(m_commitPreedit); + m_commitPreedit.clear(); + sendEvent(e); + } +} + void QFcitxInputContext::reset() { + commitPreedit(); if (isValid()) m_icproxy->Reset(); } @@ -195,12 +220,35 @@ return; } + if (m_useSurroundingText) { + QVariant var = widget->inputMethodQuery(Qt::ImSurroundingText); + QVariant var1 = widget->inputMethodQuery(Qt::ImCursorPosition); + QVariant var2 = widget->inputMethodQuery(Qt::ImAnchorPosition); + if (var.isValid() && var1.isValid() && !m_capacity.testFlag(CAPACITY_PASSWORD) ) { + addCapacity(CAPACITY_SURROUNDING_TEXT); + QString text = var.toString(); + int cursor = var1.toInt(); + int anchor; + if (var2.isValid()) + anchor = var2.toInt(); + else + anchor = cursor; + m_icproxy->SetSurroundingText(text, cursor, anchor); + } + else { + removeCapacity(CAPACITY_SURROUNDING_TEXT); + } + } + QRect rect = widget->inputMethodQuery(Qt::ImMicroFocus).toRect(); QPoint topleft = widget->mapToGlobal(QPoint(0, 0)); rect.translate(topleft); - m_icproxy->SetCursorLocation(rect.x(), rect.y() + rect.height()); + if (m_rect != rect) { + m_rect = rect; + m_icproxy->SetCursorRect(rect.x(), rect.y(), rect.width(), rect.height()); + } } @@ -274,6 +322,20 @@ } +void QFcitxInputContext::mouseHandler(int x, QMouseEvent* event) +{ + if ((event->type() == QEvent::MouseButtonPress + || event->type() == QEvent::MouseButtonRelease) + && (x <= 0 || x >= m_preedit.length()) + ) + { + commitPreedit(); + if (isValid()) + m_icproxy->Reset(); + } +} + + QKeyEvent* QFcitxInputContext::createKeyEvent(uint keyval, uint state, int type) { Q_UNUSED(keyval); @@ -367,8 +429,11 @@ else removeCapacity(CAPACITY_PASSWORD); - if (!isValid() || (event->type != XKeyRelease && event->type != XKeyPress)) { - return x11FilterEventFallback(keywidget, event, 0); + if (Q_UNLIKELY(event->xkey.state & FcitxKeyState_IgnoredMask)) + return false; + + if (Q_UNLIKELY(!isValid() || (event->type != XKeyRelease && event->type != XKeyPress))) { + return x11FilterEventFallback(event, 0); } KeySym sym = 0; @@ -376,18 +441,6 @@ memset(strbuf, 0, 64); XLookupString(&event->xkey, strbuf, 64, &sym, NULL); - - if (!m_enable) { - FcitxKeySym fcitxsym; - uint fcitxstate; - FcitxHotkeyGetKey((FcitxKeySym) sym, event->xkey.state, &fcitxsym, &fcitxstate); - if (!FcitxIsHotKey(fcitxsym, fcitxstate, m_triggerKey)) { - return x11FilterEventFallback(keywidget, event, sym); - } - } - - m_icproxy->FocusIn(); - QDBusPendingReply< int > result = this->m_icproxy->ProcessKeyEvent( sym, event->xkey.keycode, @@ -395,30 +448,58 @@ (event->type == XKeyPress) ? FCITX_PRESS_KEY : FCITX_RELEASE_KEY, event->xkey.time ); - { + if (Q_LIKELY(m_syncMode)) { QEventLoop loop; QDBusPendingCallWatcher watcher(result); loop.connect(&watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), SLOT(quit())); - loop.exec(QEventLoop::ExcludeUserInputEvents | QEventLoop::WaitForMoreEvents); + loop.exec(QEventLoop::ExcludeUserInputEvents); + + if (result.isError() || result.value() <= 0) { + QTimer::singleShot(0, this, SLOT(updateIM())); + return x11FilterEventFallback(event, sym); + } else { + update(); + return true; + } + return false; } + else { + ProcessKeyWatcher* watcher = new ProcessKeyWatcher(event, sym, result); + connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), SLOT(x11ProcessKeyEventCallback(QDBusPendingCallWatcher*))); + return true; + } +} +void QFcitxInputContext::x11ProcessKeyEventCallback(QDBusPendingCallWatcher* watcher) +{ + ProcessKeyWatcher* pkwatcher = static_cast(watcher); + QDBusPendingReply< int > result(*watcher); + bool r = false; if (result.isError() || result.value() <= 0) { - return x11FilterEventFallback(keywidget, event, sym); + QTimer::singleShot(0, this, SLOT(updateIM())); + r = x11FilterEventFallback(pkwatcher->event, pkwatcher->sym); } else { update(); - return true; + r = true; + } + if (r) { + free(pkwatcher->event); + delete pkwatcher; + } + else { + pkwatcher->event->xkey.state |= FcitxKeyState_IgnoredMask; + QTimer::singleShot(0, pkwatcher, SLOT(processEvent())); } - return false; } -bool QFcitxInputContext::x11FilterEventFallback(QWidget *keywidget, XEvent *event, KeySym sym) +bool QFcitxInputContext::x11FilterEventFallback(XEvent *event, KeySym sym) { if (event->type == XKeyPress || event->type == XKeyRelease) { if (processCompose(sym, event->xkey.state, (event->type == XKeyPress) ? FCITX_PRESS_KEY : FCITX_RELEASE_KEY)) { return true; } } - return QInputContext::x11FilterEvent(keywidget, event); + return false; } #endif // Q_WS_X11 @@ -438,9 +519,6 @@ delete m_icproxy; m_icproxy = NULL; } - m_enable = false; - m_triggerKey[0].sym = m_triggerKey[1].sym = (FcitxKeySym) 0; - m_triggerKey[0].state = m_triggerKey[1].state = 0; } /* new rise */ @@ -451,13 +529,14 @@ void QFcitxInputContext::createInputContext() { + m_rect = QRect(); m_improxy = new org::fcitx::Fcitx::InputMethod(m_serviceName, FCITX_IM_DBUS_PATH, m_connection, this); if (!m_improxy->isValid()) return; char* name = fcitx_utils_get_process_name(); - QDBusPendingReply< int, bool, uint, uint, uint, uint > result = m_improxy->CreateICv2(name); + QDBusPendingReply< int, bool, uint, uint, uint, uint > result = m_improxy->CreateICv3(name, getpid()); free(name); QDBusPendingCallWatcher* watcher = new QDBusPendingCallWatcher(result); connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(createInputContextFinished(QDBusPendingCallWatcher*))); @@ -470,19 +549,12 @@ qWarning() << result.error(); else { this->m_id = qdbus_cast(result.argumentAt(0)); - this->m_enable = qdbus_cast(result.argumentAt(1)); - m_triggerKey[0].sym = (FcitxKeySym) qdbus_cast(result.argumentAt(2)); - m_triggerKey[0].state = qdbus_cast(result.argumentAt(3)); - m_triggerKey[1].sym = (FcitxKeySym) qdbus_cast(result.argumentAt(4)); - m_triggerKey[1].state = qdbus_cast(result.argumentAt(5)); this->m_path = QString(FCITX_IC_DBUS_PATH_QSTRING).arg(m_id); m_icproxy = new org::fcitx::Fcitx::InputContext(m_serviceName, m_path, m_connection, this); - connect(m_icproxy, SIGNAL(CloseIM()), this, SLOT(closeIM())); connect(m_icproxy, SIGNAL(CommitString(QString)), this, SLOT(commitString(QString))); - connect(m_icproxy, SIGNAL(EnableIM()), this, SLOT(enableIM())); connect(m_icproxy, SIGNAL(ForwardKey(uint, uint, int)), this, SLOT(forwardKey(uint, uint, int))); - connect(m_icproxy, SIGNAL(UpdatePreedit(QString, int)), this, SLOT(updatePreedit(QString, int))); connect(m_icproxy, SIGNAL(UpdateFormattedPreedit(FcitxFormattedPreeditList,int)), this, SLOT(updateFormattedPreedit(FcitxFormattedPreeditList,int))); + connect(m_icproxy, SIGNAL(DeleteSurroundingText(int,uint)), this, SLOT(deleteSurroundingText(int,uint))); if (m_icproxy->isValid() && focusWidget() != NULL) m_icproxy->FocusIn(); @@ -490,6 +562,12 @@ QFlags flag; flag |= CAPACITY_PREEDIT; flag |= CAPACITY_FORMATTED_PREEDIT; + flag |= CAPACITY_CLIENT_UNFOCUS_COMMIT; + m_useSurroundingText = get_boolean_env("FCITX_QT_ENABLE_SURROUNDING_TEXT", false); + if (m_useSurroundingText) + flag |= CAPACITY_SURROUNDING_TEXT; + + m_syncMode = get_boolean_env("FCITX_QT_USE_SYNC", true); addCapacity(flag, true); } @@ -502,21 +580,6 @@ return; QDBusPendingReply< void > result = m_icproxy->SetCapacity((uint) m_capacity); - - QEventLoop loop; - QDBusPendingCallWatcher watcher(result); - loop.connect(&watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), SLOT(quit())); - loop.exec(QEventLoop::ExcludeUserInputEvents | QEventLoop::WaitForMoreEvents); -} - -void QFcitxInputContext::closeIM() -{ - this->m_enable = false; -} - -void QFcitxInputContext::enableIM() -{ - this->m_enable = true; } void QFcitxInputContext::commitString(const QString& str) @@ -527,30 +590,18 @@ update(); } -void QFcitxInputContext::updatePreedit(const QString& str, int cursorPos) -{ - QByteArray array = str.toUtf8(); - array.truncate(cursorPos); - cursorPos = QString::fromUtf8(array).length(); - - QList attrList; - QTextCharFormat format; - format.setUnderlineStyle(QTextCharFormat::DashUnderline); - attrList.append(QAttribute(QInputMethodEvent::Cursor, cursorPos, 1, 0)); - attrList.append(QAttribute(QInputMethodEvent::TextFormat, 0, str.length(), format)); - QInputMethodEvent event(str, attrList); - sendEvent(event); - update(); -} - void QFcitxInputContext::updateFormattedPreedit(const FcitxFormattedPreeditList& preeditList, int cursorPos) { - QString str; + m_preeditList = preeditList; + m_cursorPos = cursorPos; + QString str, commitStr; int pos = 0; QList attrList; Q_FOREACH(const FcitxFormattedPreedit& preedit, preeditList) { str += preedit.string(); + if (!(preedit.format() & MSG_DONOT_COMMIT_WHEN_UNFOCUS)) + commitStr += preedit.string(); QTextCharFormat format; if ((preedit.format() & MSG_NOUNDERLINE) == 0) { format.setUnderlineStyle(QTextCharFormat::DashUnderline); @@ -575,21 +626,30 @@ attrList.append(QAttribute(QInputMethodEvent::Cursor, cursorPos, 1, 0)); QInputMethodEvent event(str, attrList); + m_preedit = str; + m_commitPreedit = commitStr; sendEvent(event); update(); } +void QFcitxInputContext::deleteSurroundingText(int offset, uint nchar) +{ + QInputMethodEvent event; + event.setCommitString("", offset, nchar); + sendEvent(event); + update(); +} void QFcitxInputContext::forwardKey(uint keyval, uint state, int type) { QWidget* widget = focusWidget(); - if (widget != NULL) { + if (Q_LIKELY(widget != NULL)) { key_filtered = true; #ifdef Q_WS_X11 const WId window_id = widget->winId(); Display* x11_display = QX11Info::display(); - XEvent* xevent = createXEvent(x11_display, window_id, keyval, state, type); + XEvent* xevent = createXEvent(x11_display, window_id, keyval, state | FcitxKeyState_IgnoredMask, type); qApp->x11ProcessEvent(xevent); free(xevent); #else @@ -836,4 +896,10 @@ } return false; } + +void QFcitxInputContext::updateIM() +{ + update(); +} + // kate: indent-mode cstyle; space-indent on; indent-width 0; diff -Nru fcitx-4.2.2/src/frontend/qt/fcitx-input-context.h fcitx-4.2.4.1/src/frontend/qt/fcitx-input-context.h --- fcitx-4.2.2/src/frontend/qt/fcitx-input-context.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/qt/fcitx-input-context.h 2012-06-10 14:34:48.000000000 +0000 @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2011~2011 by CSSlayer * + * Copyright (C) 2011~2012 by CSSlayer * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -24,6 +24,7 @@ #include #include #include +#include #include "org.freedesktop.DBus.h" #include "org.fcitx.Fcitx.InputMethod.h" #include "org.fcitx.Fcitx.InputContext.h" @@ -32,7 +33,27 @@ #if defined(Q_WS_X11) #include -#include +#include "fcitx/frontend.h" + +class ProcessKeyWatcher : public QDBusPendingCallWatcher +{ + Q_OBJECT +public: + ProcessKeyWatcher(XEvent* e, KeySym s, const QDBusPendingCall &call, QObject *parent = 0) : QDBusPendingCallWatcher(call, parent) { + event = static_cast(malloc(sizeof(XEvent))); + *event = *e; + sym = s; + } + +public slots: + void processEvent() { + qApp->x11ProcessEvent(event); + this->deleteLater(); + } +public: + XEvent* event; + KeySym sym; +}; #endif @@ -59,23 +80,26 @@ virtual bool x11FilterEvent(QWidget *keywidget, XEvent *event); #endif // Q_WS_X11 virtual bool filterEvent(const QEvent* event); + virtual void mouseHandler(int x, QMouseEvent* event); private Q_SLOTS: void imChanged(const QString& service, const QString& oldowner, const QString& newowner); - void closeIM(); - void enableIM(); void commitString(const QString& str); - void updatePreedit(const QString& str, int cursorPos); void updateFormattedPreedit(const FcitxFormattedPreeditList& preeditList, int cursorPos); void forwardKey(uint keyval, uint state, int type); + void deleteSurroundingText(int offset, uint nchar); void createInputContextFinished(QDBusPendingCallWatcher* watcher); + void updateIM(); +#if defined(Q_WS_X11) + void x11ProcessKeyEventCallback(QDBusPendingCallWatcher* watcher); +#endif private: void createInputContext(); bool processCompose(uint keyval, uint state, FcitxKeyEventType event); bool checkAlgorithmically(); bool checkCompactTable(const struct _FcitxComposeTableCompact *table); #if defined(Q_WS_X11) - bool x11FilterEventFallback(QWidget *keywidget, XEvent *event , KeySym sym); + bool x11FilterEventFallback(XEvent *event , KeySym sym); XEvent* createXEvent(Display* dpy, WId wid, uint keyval, uint state, int type); #endif // Q_WS_X11 QKeyEvent* createKeyEvent(uint keyval, uint state, int type); @@ -100,6 +124,7 @@ } void updateCapacity(); + void commitPreedit(); QDBusConnection m_connection; org::freedesktop::DBus* m_dbusproxy; @@ -108,12 +133,17 @@ QFlags m_capacity; int m_id; QString m_path; - bool m_enable; bool m_has_focus; - FcitxHotkey m_triggerKey[2]; uint m_compose_buffer[FCITX_MAX_COMPOSE_LEN + 1]; int m_n_compose; QString m_serviceName; + QString m_preedit; + QString m_commitPreedit; + FcitxFormattedPreeditList m_preeditList; + int m_cursorPos; + boolean m_useSurroundingText; + boolean m_syncMode; + QRect m_rect; }; #endif //__FCITX_INPUT_CONTEXT_H_ diff -Nru fcitx-4.2.2/src/frontend/qt/fcitx-plugin.cpp fcitx-4.2.4.1/src/frontend/qt/fcitx-plugin.cpp --- fcitx-4.2.2/src/frontend/qt/fcitx-plugin.cpp 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/qt/fcitx-plugin.cpp 2012-06-10 14:34:48.000000000 +0000 @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2011~2011 by CSSlayer * + * Copyright (C) 2011~2012 by CSSlayer * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * diff -Nru fcitx-4.2.2/src/frontend/qt/org.fcitx.Fcitx.InputContext.xml fcitx-4.2.4.1/src/frontend/qt/org.fcitx.Fcitx.InputContext.xml --- fcitx-4.2.2/src/frontend/qt/org.fcitx.Fcitx.InputContext.xml 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/qt/org.fcitx.Fcitx.InputContext.xml 2012-06-10 14:34:48.000000000 +0000 @@ -12,13 +12,29 @@ + + + + + + + + + + + + + + + + @@ -36,10 +52,6 @@ - - - - @@ -58,5 +70,9 @@ + + + + \ No newline at end of file diff -Nru fcitx-4.2.2/src/frontend/qt/org.fcitx.Fcitx.InputMethod.xml fcitx-4.2.4.1/src/frontend/qt/org.fcitx.Fcitx.InputMethod.xml --- fcitx-4.2.2/src/frontend/qt/org.fcitx.Fcitx.InputMethod.xml 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/qt/org.fcitx.Fcitx.InputMethod.xml 2012-06-10 14:34:48.000000000 +0000 @@ -2,15 +2,9 @@ "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> - - - - - - - - + + diff -Nru fcitx-4.2.2/src/frontend/xim/CMakeLists.txt fcitx-4.2.4.1/src/frontend/xim/CMakeLists.txt --- fcitx-4.2.2/src/frontend/xim/CMakeLists.txt 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/xim/CMakeLists.txt 2012-06-10 14:34:48.000000000 +0000 @@ -8,6 +8,7 @@ xim.c ximhandler.c ximconfig.c + ximqueue.c ) set(Ximd_SOURCES diff -Nru fcitx-4.2.2/src/frontend/xim/fcitx-xim.conf.in fcitx-4.2.4.1/src/frontend/xim/fcitx-xim.conf.in --- fcitx-4.2.2/src/frontend/xim/fcitx-xim.conf.in 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/xim/fcitx-xim.conf.in 2012-06-10 14:34:48.000000000 +0000 @@ -6,4 +6,5 @@ Enabled=True Library=fcitx-xim.so Type=SharedLibrary -Dependency=fcitx-x11 \ No newline at end of file +Dependency=fcitx-x11 +Advance=True diff -Nru fcitx-4.2.2/src/frontend/xim/lib/i18nMethod.c fcitx-4.2.4.1/src/frontend/xim/lib/i18nMethod.c --- fcitx-4.2.2/src/frontend/xim/lib/i18nMethod.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/xim/lib/i18nMethod.c 2012-06-10 14:34:48.000000000 +0000 @@ -777,6 +777,8 @@ Xi18nClient *client; client = (Xi18nClient *) _Xi18nFindClient(i18n_core, call_data->connect_id); + if (!client) + return False; /* create FrameMgr */ fm = FrameMgrInit(forward_event_fr, diff -Nru fcitx-4.2.2/src/frontend/xim/lib/i18nPtHdr.c fcitx-4.2.4.1/src/frontend/xim/lib/i18nPtHdr.c --- fcitx-4.2.2/src/frontend/xim/lib/i18nPtHdr.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/xim/lib/i18nPtHdr.c 2012-06-10 14:34:48.000000000 +0000 @@ -528,6 +528,8 @@ CARD16 input_context_ID; client = (Xi18nClient *)_Xi18nFindClient(i18n_core, connect_id); + if (!client) + return; fm = FrameMgrInit(sync_reply_fr, (char *) p, _Xi18nNeedSwap(i18n_core, connect_id)); @@ -1519,6 +1521,8 @@ Xi18n i18n_core = ims->protocol; Xi18nClient *client = (Xi18nClient *) _Xi18nFindClient(i18n_core, connect_id); + if (!client) + return; while (client->sync == False && client->pending) { XimProtoHdr *hdr = (XimProtoHdr *) client->pending->p; @@ -1560,6 +1564,8 @@ Xi18nClient *client; client = (Xi18nClient *) _Xi18nFindClient(i18n_core, connect_id); + if (!client) + return; if (hdr == (XimProtoHdr *) NULL) return; /*endif*/ diff -Nru fcitx-4.2.2/src/frontend/xim/lib/i18nUtil.c fcitx-4.2.4.1/src/frontend/xim/lib/i18nUtil.c --- fcitx-4.2.2/src/frontend/xim/lib/i18nUtil.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/xim/lib/i18nUtil.c 2012-06-10 14:34:48.000000000 +0000 @@ -92,6 +92,8 @@ Xi18nClient *target = _Xi18nFindClient(i18n_core, connect_id); Xi18nClient *ccp; Xi18nClient *ccp0; + if (!target) + return; for (ccp = i18n_core->address.clients, ccp0 = NULL; ccp != NULL; diff -Nru fcitx-4.2.2/src/frontend/xim/lib/i18nX.c fcitx-4.2.4.1/src/frontend/xim/lib/i18nX.c --- fcitx-4.2.2/src/frontend/xim/lib/i18nX.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/xim/lib/i18nX.c 2012-06-10 14:34:48.000000000 +0000 @@ -264,6 +264,8 @@ { Xi18n i18n_core = ims->protocol; Xi18nClient *client = _Xi18nFindClient(i18n_core, connect_id); + if (!client) + return False; XSpecRec *spec = (XSpecRec *) i18n_core->address.connect_addr; XClient *x_client = (XClient *) client->trans_rec; XEvent event; @@ -359,6 +361,8 @@ Xi18n i18n_core = ims->protocol; XEvent event; Xi18nClient *client = _Xi18nFindClient(i18n_core, connect_id); + if (!client) + return False; XClient *x_client = (XClient *) client->trans_rec; for (;;) { @@ -399,6 +403,8 @@ Xi18n i18n_core = ims->protocol; Display *dpy = i18n_core->address.dpy; Xi18nClient *client = _Xi18nFindClient(i18n_core, connect_id); + if (!client) + return False; XClient *x_client = (XClient *) client->trans_rec; XDestroyWindow(dpy, x_client->accept_win); diff -Nru fcitx-4.2.2/src/frontend/xim/lib/IMdkit.h fcitx-4.2.4.1/src/frontend/xim/lib/IMdkit.h --- fcitx-4.2.2/src/frontend/xim/lib/IMdkit.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/xim/lib/IMdkit.h 2012-06-10 14:34:48.000000000 +0000 @@ -123,6 +123,7 @@ extern Status IMCloseIM(XIMS); extern char *IMSetIMValues(XIMS, ...); extern char *IMGetIMValues(XIMS, ...); + /* pending operation */ void IMForwardEvent(XIMS, XPointer); void IMCommitString(XIMS, XPointer); int IMCallCallback(XIMS, XPointer); diff -Nru fcitx-4.2.2/src/frontend/xim/xim.c fcitx-4.2.4.1/src/frontend/xim/xim.c --- fcitx-4.2.2/src/frontend/xim/xim.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/xim/xim.c 2012-06-10 14:34:48.000000000 +0000 @@ -39,6 +39,7 @@ #include "IC.h" #include "xim.h" #include "ximhandler.h" +#include "ximqueue.h" #include "module/x11/x11stuff.h" #include "fcitx-config/xdg.h" #include "fcitx/hook.h" @@ -50,8 +51,10 @@ static void XimCommitString(void* arg, FcitxInputContext* ic, const char* str); static void XimForwardKey(void* arg, FcitxInputContext* ic, FcitxKeyEventType event, FcitxKeySym sym, unsigned int state); static void XimSetWindowOffset(void* arg, FcitxInputContext* ic, int x, int y); -static void XimGetWindowPosition(void* arg, FcitxInputContext* ic, int* x, int* y); +static void XimGetWindowRect(void* arg, FcitxInputContext* ic, int* x, int* y, int* w, int* h); static void XimUpdatePreedit(void* arg, FcitxInputContext* ic); +// static pid_t XimGetPid(void* arg, FcitxInputContext* ic); +// static pid_t XimFindApplicationPid(FcitxXimFrontend* xim, Window w); static Bool XimProtocolHandler(XIMS _ims, IMProtocol * call_data); @@ -90,11 +93,13 @@ XimCommitString, XimForwardKey, XimSetWindowOffset, - XimGetWindowPosition, + XimGetWindowRect, XimUpdatePreedit, NULL, NULL, XimCheckICFromSameApplication, + NULL, + NULL, NULL }; @@ -137,6 +142,8 @@ return NULL; } + FcitxAddon* ximaddon = FcitxAddonsGetAddonByName(FcitxInstanceGetAddons(instance), "fcitx-xim"); + xim->x11addon = FcitxAddonsGetAddonByName(FcitxInstanceGetAddons(instance), "fcitx-x11"); xim->iScreen = DefaultScreen(xim->display); xim->owner = instance; xim->frontendid = frontendid; @@ -162,6 +169,7 @@ imname = DEFAULT_IMNAME; } } + XimQueueInit(xim); if (GetXimConfigDesc() == NULL) xim->bUseOnTheSpotStyle = false; @@ -240,6 +248,9 @@ free(xim); return NULL; } + + AddFunction(ximaddon, XimConsumeQueue); + return xim; } @@ -318,8 +329,6 @@ return XIMUnsetFocusHandler(ximfrontend, (IMChangeICStruct *) call_data);; case XIM_RESET_IC: return True; - case XIM_TRIGGER_NOTIFY: - return XIMTriggerNotifyHandler(ximfrontend, (IMTriggerNotifyStruct *) call_data); case XIM_PREEDIT_START_REPLY: return 0; case XIM_PREEDIT_CARET_REPLY: @@ -335,8 +344,10 @@ { FcitxXimFrontend* xim = (FcitxXimFrontend*) arg; - if (xim->ims) + if (xim->ims) { IMCloseIM(xim->ims); + xim->ims = NULL; + } return true; } @@ -344,55 +355,43 @@ void XimEnableIM(void* arg, FcitxInputContext* ic) { FcitxXimFrontend* xim = (FcitxXimFrontend*) arg; - IMChangeFocusStruct call_data; FcitxXimIC* ximic = (FcitxXimIC*) ic->privateic; - call_data.connect_id = ximic->connect_id; - call_data.icid = ximic->id; - IMPreeditStart(xim->ims, (XPointer) &call_data); + IMChangeFocusStruct* call_data = fcitx_utils_new(IMChangeFocusStruct); + call_data->connect_id = ximic->connect_id; + call_data->icid = ximic->id; + XimPendingCall(xim, XCT_PREEDIT_START, (XPointer) call_data); } void XimCloseIM(void* arg, FcitxInputContext* ic) { FcitxXimFrontend* xim = (FcitxXimFrontend*) arg; - IMChangeFocusStruct call_data; + IMChangeFocusStruct* call_data = fcitx_utils_new(IMChangeFocusStruct); FcitxXimIC* ximic = (FcitxXimIC*) ic->privateic; - call_data.connect_id = ximic->connect_id; - call_data.icid = ximic->id; - IMPreeditEnd(xim->ims, (XPointer) &call_data); + call_data->connect_id = ximic->connect_id; + call_data->icid = ximic->id; + XimPendingCall(xim, XCT_PREEDIT_END, (XPointer) call_data); } void XimCommitString(void* arg, FcitxInputContext* ic, const char* str) { FcitxXimFrontend* xim = (FcitxXimFrontend*) arg; XTextProperty tp; - IMCommitStruct cms; FcitxXimIC* ximic = (FcitxXimIC*) ic->privateic; /* avoid Seg fault */ if (!ic) return; - /* - * I'm not sure whether xim should commit string before preedit done - * but this can fix opera's crash in specific input box - * quite strange. - */ - if (GetXimIC(ic)->bPreeditStarted == true) { - XimPreeditCallbackDraw(xim, GetXimIC(ic), "", 0); - XimPreeditCallbackDone(xim, GetXimIC(ic)); - GetXimIC(ic)->bPreeditStarted = false; - } Xutf8TextListToTextProperty(xim->display, (char **) &str, 1, XCompoundTextStyle, &tp); + IMCommitStruct* cms = fcitx_utils_new(IMCommitStruct); - memset(&cms, 0, sizeof(IMCommitStruct)); - cms.major_code = XIM_COMMIT; - cms.icid = ximic->id; - cms.connect_id = ximic->connect_id; - cms.flag = XimLookupChars; - cms.commit_string = (char *) tp.value; - IMCommitString(xim->ims, (XPointer) & cms); - XFree(tp.value); + cms->major_code = XIM_COMMIT; + cms->icid = ximic->id; + cms->connect_id = ximic->connect_id; + cms->flag = XimLookupChars; + cms->commit_string = (char *) tp.value; + XimPendingCall(xim, XCT_COMMIT, (XPointer) cms); } void XimForwardKey(void *arg, FcitxInputContext* ic, FcitxKeyEventType event, FcitxKeySym sym, unsigned int state) @@ -438,10 +437,12 @@ } } -void XimGetWindowPosition(void* arg, FcitxInputContext* ic, int* x, int* y) +void XimGetWindowRect(void* arg, FcitxInputContext* ic, int* x, int* y, int* w, int* h) { *x = ic->offset_x; *y = ic->offset_y; + *w = 0; + *h = 0; } void XimUpdatePreedit(void* arg, FcitxInputContext* ic) @@ -466,10 +467,63 @@ GetXimIC(ic)->bPreeditStarted = true; } if (strlen(strPreedit) != 0) { - XimPreeditCallbackDraw(xim, GetXimIC(ic), strPreedit, FcitxInputStateGetCursorPos(input)); + XimPreeditCallbackDraw(xim, GetXimIC(ic), strPreedit, FcitxInputStateGetClientCursorPos(input)); } free(strPreedit); } +#if 0 +pid_t XimGetPid(void* arg, FcitxInputContext* ic) +{ + FcitxXimFrontend* xim = (FcitxXimFrontend*) arg; + Window w = None; + FcitxXimIC* ximic = GetXimIC(ic); + if (ximic->focus_win) + w = ximic->focus_win; + else if (ximic->client_win) + w = ximic->client_win; + + return XimFindApplicationPid(xim, w); +} + +pid_t XimFindApplicationPid(FcitxXimFrontend* xim, Window w) { + if (w == DefaultRootWindow(xim->display)) + return 0; + + Atom actual_type; + int actual_format; + unsigned long nitems; + unsigned long bytes; + unsigned char* prop; + int status = XGetWindowProperty( + xim->display, w, XInternAtom(xim->display, "_NET_WM_PID", True), 0, + 1024L, False, AnyPropertyType, &actual_type, &actual_format, &nitems, + &bytes, (unsigned char**) &prop); + if (status != 0) { + if (status == BadRequest) + return 0; + return 0; + } + if (!prop) { + Window parent; + Window root; + Window* children = NULL; + unsigned int sz = 0; + status = XQueryTree(xim->display, w, &root, &parent, &children, &sz); + if (status != 0) { + if (status == BadRequest) + return 0; + return 0; + } + if (children) + XFree(children); + return XimFindApplicationPid(xim, parent); + } else { + // TODO: is this portable? + return prop[1] * 256 + prop[0]; + } +} +#endif + // kate: indent-mode cstyle; space-indent on; indent-width 0; diff -Nru fcitx-4.2.2/src/frontend/xim/xim.h fcitx-4.2.4.1/src/frontend/xim/xim.h --- fcitx-4.2.2/src/frontend/xim/xim.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/xim/xim.h 2012-06-10 14:34:48.000000000 +0000 @@ -49,6 +49,8 @@ long unsigned int currentSerialNumberKey; XIMFeedback *feedback; int feedback_len; + FcitxAddon* x11addon; + UT_array* queue; } FcitxXimFrontend; CONFIG_BINDING_DECLARE(FcitxXimFrontend) diff -Nru fcitx-4.2.2/src/frontend/xim/ximhandler.c fcitx-4.2.4.1/src/frontend/xim/ximhandler.c --- fcitx-4.2.2/src/frontend/xim/ximhandler.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/xim/ximhandler.c 2012-06-10 14:34:48.000000000 +0000 @@ -23,12 +23,14 @@ #include "fcitx/ui.h" #include "fcitx/ime.h" #include "fcitx/instance.h" +#include "fcitx/module.h" #include "fcitx-config/hotkey.h" #include "fcitx-utils/log.h" #include "xim.h" #include "ximhandler.h" #include "Xi18n.h" #include "IC.h" +#include "ximqueue.h" Bool XIMOpenHandler(FcitxXimFrontend* xim, IMOpenStruct * call_data) { @@ -83,9 +85,9 @@ FcitxInputContext* ic = FcitxInstanceGetCurrentIC(xim->owner); if (ic && GetXimIC(ic)->id == call_data->icid) { FcitxUICommitPreedit(xim->owner); - FcitxUIOnInputUnFocus(xim->owner); FcitxUICloseInputWindow(xim->owner); FcitxInstanceSetCurrentIC(xim->owner, NULL); + FcitxUIOnInputUnFocus(xim->owner); } return True; @@ -105,7 +107,8 @@ if (ic == NULL) { ic = FcitxInstanceFindIC(xim->owner, xim->frontendid, &call_data->icid); - FcitxInstanceSetCurrentIC(xim->owner, ic); + if (FcitxInstanceSetCurrentIC(xim->owner, ic) && ic) + FcitxUIOnInputFocus(xim->owner); } return True; @@ -118,19 +121,6 @@ return True; } -Bool XIMTriggerNotifyHandler(FcitxXimFrontend* xim, IMTriggerNotifyStruct * call_data) -{ - FcitxInputContext* ic = FcitxInstanceFindIC(xim->owner, xim->frontendid, &call_data->icid); - if (ic == NULL) - return True; - - FcitxInstanceSetCurrentIC(xim->owner, ic); - FcitxInstanceEnableIM(xim->owner, ic, false); - FcitxUIOnTriggerOn(xim->owner); - return True; -} - - void SetTrackPos(FcitxXimFrontend* xim, FcitxInputContext* ic, IMChangeICStruct * call_data) { if (ic == NULL) @@ -195,7 +185,8 @@ if (ic == NULL) { ic = FcitxInstanceFindIC(xim->owner, xim->frontendid, &call_data->icid); - FcitxInstanceSetCurrentIC(xim->owner, ic); + if (FcitxInstanceSetCurrentIC(xim->owner, ic) && ic) + FcitxUIOnInputFocus(xim->owner); } if (ic == NULL) @@ -205,7 +196,8 @@ ic = FcitxInstanceFindIC(xim->owner, xim->frontendid, &call_data->icid); if (ic == NULL) return; - FcitxInstanceSetCurrentIC(xim->owner, ic); + if (FcitxInstanceSetCurrentIC(xim->owner, ic)) + FcitxUIOnInputFocus(xim->owner); } kev = (XKeyEvent *) & call_data->event; @@ -266,64 +258,48 @@ XEvent* xEvent ) { - IMForwardEventStruct forwardEvent; + IMForwardEventStruct* forwardEvent = fcitx_utils_new(IMForwardEventStruct); - memset(&forwardEvent, 0, sizeof(IMForwardEventStruct)); - forwardEvent.connect_id = ic->connect_id; - forwardEvent.icid = ic->id; - forwardEvent.major_code = XIM_FORWARD_EVENT; - forwardEvent.sync_bit = 0; - forwardEvent.serial_number = xim->currentSerialNumberCallData; + forwardEvent->connect_id = ic->connect_id; + forwardEvent->icid = ic->id; + forwardEvent->major_code = XIM_FORWARD_EVENT; + forwardEvent->sync_bit = 0; + forwardEvent->serial_number = xim->currentSerialNumberCallData; - memcpy(&(forwardEvent.event), xEvent, sizeof(XEvent)); - IMForwardEvent(xim->ims, (XPointer)(&forwardEvent)); + memcpy(&(forwardEvent->event), xEvent, sizeof(XEvent)); + XimPendingCall(xim, XCT_FORWARD, (XPointer)forwardEvent); } -void XIMClose(FcitxXimFrontend* xim, FcitxInputContext* ic, FcitxKeySym sym, unsigned int state, int count) -{ - if (ic == NULL) - return; - IMChangeFocusStruct call_data; - - call_data.connect_id = GetXimIC(ic)->connect_id; - call_data.icid = GetXimIC(ic)->id; - - IMPreeditEnd(xim->ims, (XPointer) &call_data); -} - - void XimPreeditCallbackStart(FcitxXimFrontend *xim, const FcitxXimIC* ic) { - IMPreeditCBStruct pcb; + IMPreeditCBStruct* pcb = fcitx_utils_new(IMPreeditCBStruct); - pcb.major_code = XIM_PREEDIT_START; - pcb.minor_code = 0; - pcb.connect_id = ic->connect_id; - pcb.icid = ic->id; - pcb.todo.return_value = 0; - IMCallCallback(xim->ims, (XPointer) & pcb); + pcb->major_code = XIM_PREEDIT_START; + pcb->minor_code = 0; + pcb->connect_id = ic->connect_id; + pcb->icid = ic->id; + pcb->todo.return_value = 0; + XimPendingCall(xim, XCT_CALLCALLBACK, (XPointer) pcb); } void XimPreeditCallbackDone(FcitxXimFrontend *xim, const FcitxXimIC* ic) { - IMPreeditCBStruct pcb; + IMPreeditCBStruct* pcb = fcitx_utils_new(IMPreeditCBStruct); - pcb.major_code = XIM_PREEDIT_DONE; - pcb.minor_code = 0; - pcb.connect_id = ic->connect_id; - pcb.icid = ic->id; - pcb.todo.return_value = 0; - IMCallCallback(xim->ims, (XPointer) & pcb); + pcb->major_code = XIM_PREEDIT_DONE; + pcb->minor_code = 0; + pcb->connect_id = ic->connect_id; + pcb->icid = ic->id; + pcb->todo.return_value = 0; + XimPendingCall(xim, XCT_CALLCALLBACK, (XPointer) pcb); } void XimPreeditCallbackDraw(FcitxXimFrontend* xim, FcitxXimIC* ic, const char* preedit_string, int cursorPos) { - IMPreeditCBStruct pcb; - XIMText text; XTextProperty tp; uint i, len; @@ -361,33 +337,26 @@ } xim->feedback[len] = 0; - pcb.major_code = XIM_PREEDIT_DRAW; - pcb.connect_id = ic->connect_id; - pcb.icid = ic->id; - - pcb.todo.draw.caret = cursorPos; - pcb.todo.draw.chg_first = 0; - pcb.todo.draw.chg_length = ic->onspot_preedit_length; - pcb.todo.draw.text = &text; - - text.feedback = xim->feedback; - - if (len > 0) { - Xutf8TextListToTextProperty(xim->display, - (char **)&preedit_string, - 1, XCompoundTextStyle, &tp); - text.encoding_is_wchar = 0; - text.length = strlen((char*)tp.value); - text.string.multi_byte = (char*)tp.value; - IMCallCallback(xim->ims, (XPointer) & pcb); - XFree(tp.value); - } else { - text.encoding_is_wchar = 0; - text.length = 0; - text.string.multi_byte = ""; - IMCallCallback(xim->ims, (XPointer) & pcb); - len = 0; - } + IMPreeditCBStruct* pcb = fcitx_utils_new(IMPreeditCBStruct); + XIMText* text = fcitx_utils_new(XIMText); + pcb->major_code = XIM_PREEDIT_DRAW; + pcb->connect_id = ic->connect_id; + pcb->icid = ic->id; + + pcb->todo.draw.caret = fcitx_utf8_strnlen(preedit_string, cursorPos); + pcb->todo.draw.chg_first = 0; + pcb->todo.draw.chg_length = ic->onspot_preedit_length; + pcb->todo.draw.text = text; + + text->feedback = xim->feedback; + + Xutf8TextListToTextProperty(xim->display, + (char **)&preedit_string, + 1, XCompoundTextStyle, &tp); + text->encoding_is_wchar = 0; + text->length = strlen((char*)tp.value); + text->string.multi_byte = (char*)tp.value; + XimPendingCall(xim, XCT_CALLCALLBACK, (XPointer) pcb); ic->onspot_preedit_length = len; } diff -Nru fcitx-4.2.2/src/frontend/xim/ximhandler.h fcitx-4.2.4.1/src/frontend/xim/ximhandler.h --- fcitx-4.2.2/src/frontend/xim/ximhandler.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/xim/ximhandler.h 2012-06-10 14:34:48.000000000 +0000 @@ -34,7 +34,6 @@ Bool XIMCloseHandler(FcitxXimFrontend* xim, IMOpenStruct * call_data); Bool XIMCreateICHandler(FcitxXimFrontend* xim, IMChangeICStruct * call_data); Bool XIMDestroyICHandler(FcitxXimFrontend* xim, IMChangeICStruct * call_data); -Bool XIMTriggerNotifyHandler(FcitxXimFrontend* xim, IMTriggerNotifyStruct * call_data); void XIMProcessKey(FcitxXimFrontend* xim, IMForwardEventStruct * call_data); void XimForwardKeyInternal(FcitxXimFrontend *xim, struct _FcitxXimIC* ic, XEvent* xEvent); void XimPreeditCallbackStart(FcitxXimFrontend* xim, const struct _FcitxXimIC* ic); diff -Nru fcitx-4.2.2/src/frontend/xim/ximqueue.c fcitx-4.2.4.1/src/frontend/xim/ximqueue.c --- fcitx-4.2.2/src/frontend/xim/ximqueue.c 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/xim/ximqueue.c 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,81 @@ +#include +#include +#include + +#include "fcitx/module.h" +#include "fcitx/instance.h" +#include "fcitx-utils/log.h" +#include "module/x11/x11stuff.h" +#include "ximqueue.h" + +struct _XimQueue { + XimCallType type; + XPointer ptr; +}; + +static const UT_icd ptr_icd = { sizeof(XimQueue), NULL, NULL, NULL }; + +void XimQueueInit(FcitxXimFrontend* xim) +{ + utarray_new(xim->queue, &ptr_icd); +} + +void* XimConsumeQueue(void* arg, FcitxModuleFunctionArg args) +{ + FcitxXimFrontend* xim = arg; + if (!xim->ims) + return NULL; + XimQueue* item; + + size_t len = utarray_len(xim->queue); + + for (item = (XimQueue*) utarray_front(xim->queue); + item != NULL; + item = (XimQueue*) utarray_next(xim->queue, item)) + { + switch(item->type) { + case XCT_FORWARD: + { + IMForwardEvent(xim->ims, item->ptr); + } + break; + case XCT_CALLCALLBACK: + { + IMCallCallback(xim->ims, item->ptr); + IMPreeditCBStruct* pcb = (IMPreeditCBStruct*) item->ptr; + if (pcb->major_code == XIM_PREEDIT_DRAW) { + XFree(pcb->todo.draw.text->string.multi_byte); + free(pcb->todo.draw.text); + } + } + break; + case XCT_COMMIT: + { + IMCommitString(xim->ims, item->ptr); + IMCommitStruct* cms = (IMCommitStruct*) item->ptr; + XFree(cms->commit_string); + } + break; + case XCT_PREEDIT_START: + IMPreeditStart(xim->ims, item->ptr); + break; + case XCT_PREEDIT_END: + IMPreeditEnd(xim->ims, item->ptr); + break; + } + free(item->ptr); + } + + utarray_clear(xim->queue); + if (len) + FcitxInstanceSetRecheckEvent(xim->owner); + return NULL; +} + +void XimPendingCall(FcitxXimFrontend* xim, XimCallType type, XPointer ptr) +{ + XimQueue item; + item.type = type; + item.ptr = ptr; + utarray_push_back(xim->queue, &item); +} \ No newline at end of file diff -Nru fcitx-4.2.2/src/frontend/xim/ximqueue.h fcitx-4.2.4.1/src/frontend/xim/ximqueue.h --- fcitx-4.2.2/src/frontend/xim/ximqueue.h 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/frontend/xim/ximqueue.h 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,16 @@ +#include "xim.h" +#include + +typedef enum _XimCallType { + XCT_FORWARD, + XCT_COMMIT, + XCT_CALLCALLBACK, + XCT_PREEDIT_START, + XCT_PREEDIT_END +} XimCallType; + +typedef struct _XimQueue XimQueue; + +void XimQueueInit(FcitxXimFrontend* xim); +void* XimConsumeQueue(void* arg, FcitxModuleFunctionArg args); +void XimPendingCall(FcitxXimFrontend* xim, XimCallType type, XPointer ptr); \ No newline at end of file diff -Nru fcitx-4.2.2/src/im/CMakeLists.txt fcitx-4.2.4.1/src/im/CMakeLists.txt --- fcitx-4.2.2/src/im/CMakeLists.txt 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/im/CMakeLists.txt 2012-06-10 14:34:48.000000000 +0000 @@ -1,4 +1,5 @@ add_subdirectory(pinyin) +add_subdirectory(keyboard) if (ENABLE_TABLE) add_subdirectory(table) diff -Nru fcitx-4.2.2/src/im/keyboard/CMakeLists.txt fcitx-4.2.4.1/src/im/keyboard/CMakeLists.txt --- fcitx-4.2.2/src/im/keyboard/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/im/keyboard/CMakeLists.txt 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,26 @@ +include_directories ( + ${PROJECT_BINARY_DIR} + ${PROJECT_SOURCE_DIR}/src/module/xkb + ${LIBINTL_INCLUDE_DIR} + ${LIBXML2_INCLUDE_DIR} + ${LIBICONV_INCLUDE_DIR} + ${ICU_INCLUDE_DIRS} + ) +if (PRESAGE_FOUND) + include_directories(${PRESAGE_INCLUDE_DIR}) +endif (PRESAGE_FOUND) + +set(fcitx_keyboard_SOURCES + keyboard.c + isocodes.c + keyboardconfig.c +) + +fcitx_add_addon(fcitx-keyboard ${fcitx_keyboard_SOURCES}) +target_link_libraries(fcitx-keyboard ${ENCHANT_LIBRARIES} ${LIBXML2_LIBRARIES} ${LIBICONV_LIBRARIES} ${ICU_LIBRARIES}) +if (PRESAGE_FOUND) +target_link_libraries(fcitx-keyboard ${PRESAGE_LIBRARIES}) +endif (PRESAGE_FOUND) + +fcitx_add_addon_conf_file(fcitx-keyboard.conf) +fcitx_add_configdesc_file(fcitx-keyboard.desc) diff -Nru fcitx-4.2.2/src/im/keyboard/fcitx-compose-data.h fcitx-4.2.4.1/src/im/keyboard/fcitx-compose-data.h --- fcitx-4.2.2/src/im/keyboard/fcitx-compose-data.h 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/im/keyboard/fcitx-compose-data.h 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,4452 @@ +/* vim:set noet ts=4: */ +/* + * ibus - The Input Bus + * + * Copyright (c) 2007-2008 Huang Peng + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA + */ +#ifndef __FcitxKey_COMPOSE_DATA_H_ +#define __FcitxKey_COMPOSE_DATA_H_ + +#include "fcitx-config/hotkey.h" + +static const uint32_t fcitx_compose_seqs_compact[] = { + FcitxKey_dead_stroke, 138, 226, 235, 235, 235, + FcitxKey_Greek_accentdieresis, 235, 239, 239, 239, 239, + FcitxKey_dead_grave, 239, 299, 386, 598, 598, + FcitxKey_dead_acute, 598, 664, 760, 1036, 1036, + FcitxKey_dead_circumflex, 1036, 1176, 1176, 1376, 1376, + FcitxKey_dead_tilde, 1376, 1458, 1521, 1661, 1661, + FcitxKey_dead_macron, 1661, 1707, 1707, 1779, 1779, + FcitxKey_dead_breve, 1779, 1833, 1833, 1857, 1857, + FcitxKey_dead_abovedot, 1857, 1887, 1890, 1922, 1922, + FcitxKey_dead_diaeresis, 1922, 2010, 2019, 2043, 2043, + FcitxKey_dead_abovering, 2043, 2053, 2053, 2053, 2053, + FcitxKey_dead_doubleacute, 2053, 2063, 2063, 2063, 2063, + FcitxKey_dead_caron, 2063, 2089, 2089, 2097, 2097, + FcitxKey_dead_cedilla, 2097, 2111, 2111, 2111, 2111, + FcitxKey_dead_ogonek, 2111, 2121, 2121, 2121, 2121, + FcitxKey_dead_iota, 2121, 2143, 2242, 2674, 3334, + FcitxKey_dead_voiced_sound, 3334, 3380, 3380, 3380, 3380, + FcitxKey_dead_semivoiced_sound, 3380, 3390, 3390, 3390, 3390, + FcitxKey_dead_belowdot, 3390, 3400, 3400, 3416, 3416, + FcitxKey_dead_hook, 3416, 3494, 3494, 3550, 3550, + FcitxKey_dead_psili, 3550, 3578, 3578, 3578, 3578, + FcitxKey_dead_dasia, 3578, 3610, 3610, 3610, 3610, + FcitxKey_Multi_key, 3610, 3610, 9589, 13297, 15157, + FcitxKey_space, 0x002F, + FcitxKey_2, 0x01BB, + FcitxKey_A, 0x023A, + FcitxKey_B, 0x0243, + FcitxKey_C, 0x023B, + FcitxKey_D, 0x0110, + FcitxKey_E, 0x0246, + FcitxKey_G, 0x01E4, + FcitxKey_H, 0x0126, + FcitxKey_I, 0x0197, + FcitxKey_J, 0x0248, + FcitxKey_L, 0x0141, + FcitxKey_O, 0x00D8, + FcitxKey_P, 0x2C63, + FcitxKey_R, 0x024C, + FcitxKey_T, 0x0166, + FcitxKey_U, 0x0244, + FcitxKey_Y, 0x024E, + FcitxKey_Z, 0x01B5, + FcitxKey_a, 0x2C65, + FcitxKey_b, 0x0180, + FcitxKey_c, 0x023C, + FcitxKey_d, 0x0111, + FcitxKey_e, 0x0247, + FcitxKey_g, 0x01E5, + FcitxKey_h, 0x0127, + FcitxKey_i, 0x0268, + FcitxKey_j, 0x0249, + FcitxKey_l, 0x0142, + FcitxKey_o, 0x00F8, + FcitxKey_p, 0x1D7D, + FcitxKey_r, 0x024D, + FcitxKey_t, 0x0167, + FcitxKey_u, 0x0289, + FcitxKey_y, 0x024F, + FcitxKey_z, 0x01B6, + FcitxKey_nobreakspace, 0x0338, + FcitxKey_Oacute, 0x01FE, + FcitxKey_oacute, 0x01FF, + 0x0237, 0x025F, + 0x0269, 0x1D7C, + FcitxKey_dead_stroke, 0x002F, + FcitxKey_lessthanequal, 0x2270, + FcitxKey_greaterthanequal, 0x2271, + FcitxKey_dead_acute, FcitxKey_O, 0x01FE, + FcitxKey_dead_acute, FcitxKey_o, 0x01FF, + FcitxKey_dead_abovedot, FcitxKey_j, 0x025F, + FcitxKey_Greek_iota, 0x0390, + FcitxKey_Greek_upsilon, 0x03B0, + FcitxKey_space, 0x0060, + FcitxKey_V, 0x01DB, + FcitxKey_v, 0x01DC, + FcitxKey_Abreve, 0x1EB0, + FcitxKey_abreve, 0x1EB1, + FcitxKey_Emacron, 0x1E14, + FcitxKey_emacron, 0x1E15, + FcitxKey_Omacron, 0x1E50, + FcitxKey_omacron, 0x1E51, + FcitxKey_Cyrillic_ie, 0x0450, + FcitxKey_Cyrillic_i, 0x045D, + FcitxKey_Cyrillic_IE, 0x0400, + FcitxKey_Cyrillic_I, 0x040D, + FcitxKey_Greek_iotadieresis, 0x1FD2, + FcitxKey_Greek_upsilondieresis, 0x1FE2, + FcitxKey_Greek_ALPHA, 0x1FBA, + FcitxKey_Greek_EPSILON, 0x1FC8, + FcitxKey_Greek_ETA, 0x1FCA, + FcitxKey_Greek_IOTA, 0x1FDA, + FcitxKey_Greek_OMICRON, 0x1FF8, + FcitxKey_Greek_UPSILON, 0x1FEA, + FcitxKey_Greek_OMEGA, 0x1FFA, + FcitxKey_Greek_alpha, 0x1F70, + FcitxKey_Greek_epsilon, 0x1F72, + FcitxKey_Greek_eta, 0x1F74, + FcitxKey_Greek_iota, 0x1F76, + FcitxKey_Greek_omicron, 0x1F78, + FcitxKey_Greek_upsilon, 0x1F7A, + FcitxKey_Greek_omega, 0x1F7C, + FcitxKey_dead_grave, 0x0060, + FcitxKey_dead_diaeresis, FcitxKey_Greek_iota, 0x1FD2, + FcitxKey_dead_diaeresis, FcitxKey_Greek_upsilon, 0x1FE2, + FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F0A, + FcitxKey_dead_psili, FcitxKey_Greek_EPSILON, 0x1F1A, + FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F2A, + FcitxKey_dead_psili, FcitxKey_Greek_IOTA, 0x1F3A, + FcitxKey_dead_psili, FcitxKey_Greek_OMICRON, 0x1F4A, + FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1F6A, + FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F02, + FcitxKey_dead_psili, FcitxKey_Greek_epsilon, 0x1F12, + FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F22, + FcitxKey_dead_psili, FcitxKey_Greek_iota, 0x1F32, + FcitxKey_dead_psili, FcitxKey_Greek_omicron, 0x1F42, + FcitxKey_dead_psili, FcitxKey_Greek_upsilon, 0x1F52, + FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1F62, + FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F0B, + FcitxKey_dead_dasia, FcitxKey_Greek_EPSILON, 0x1F1B, + FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F2B, + FcitxKey_dead_dasia, FcitxKey_Greek_IOTA, 0x1F3B, + FcitxKey_dead_dasia, FcitxKey_Greek_OMICRON, 0x1F4B, + FcitxKey_dead_dasia, FcitxKey_Greek_UPSILON, 0x1F5B, + FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1F6B, + FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F03, + FcitxKey_dead_dasia, FcitxKey_Greek_epsilon, 0x1F13, + FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F23, + FcitxKey_dead_dasia, FcitxKey_Greek_iota, 0x1F33, + FcitxKey_dead_dasia, FcitxKey_Greek_omicron, 0x1F43, + FcitxKey_dead_dasia, FcitxKey_Greek_upsilon, 0x1F53, + FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1F63, + FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_U, 0x01DB, + FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_u, 0x01DC, + FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_Greek_iota, 0x1FD2, + FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_Greek_upsilon, 0x1FE2, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F0B, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_EPSILON, 0x1F1B, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F2B, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_IOTA, 0x1F3B, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_OMICRON, 0x1F4B, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_UPSILON, 0x1F5B, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1F6B, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F03, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_epsilon, 0x1F13, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F23, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_iota, 0x1F33, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_omicron, 0x1F43, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_upsilon, 0x1F53, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1F63, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F0A, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_EPSILON, 0x1F1A, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F2A, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_IOTA, 0x1F3A, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_OMICRON, 0x1F4A, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1F6A, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F02, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_epsilon, 0x1F12, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F22, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_iota, 0x1F32, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_omicron, 0x1F42, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_upsilon, 0x1F52, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1F62, + FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_O, 0x1EDC, + FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_U, 0x1EEA, + FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_o, 0x1EDD, + FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_u, 0x1EEB, + FcitxKey_Multi_key, FcitxKey_U, FcitxKey_A, 0x1EB0, + FcitxKey_Multi_key, FcitxKey_U, FcitxKey_a, 0x1EB1, + FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_A, 0x1EA6, + FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_E, 0x1EC0, + FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_O, 0x1ED2, + FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_a, 0x1EA7, + FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_e, 0x1EC1, + FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_o, 0x1ED3, + FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_E, 0x1E14, + FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_O, 0x1E50, + FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_e, 0x1E15, + FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_o, 0x1E51, + FcitxKey_Multi_key, FcitxKey_b, FcitxKey_A, 0x1EB0, + FcitxKey_Multi_key, FcitxKey_b, FcitxKey_a, 0x1EB1, + FcitxKey_Multi_key, FcitxKey_macron, FcitxKey_E, 0x1E14, + FcitxKey_Multi_key, FcitxKey_macron, FcitxKey_O, 0x1E50, + FcitxKey_Multi_key, FcitxKey_macron, FcitxKey_e, 0x1E15, + FcitxKey_Multi_key, FcitxKey_macron, FcitxKey_o, 0x1E51, + FcitxKey_space, 0x0027, + FcitxKey_V, 0x01D7, + FcitxKey_v, 0x01D8, + FcitxKey_Abreve, 0x1EAE, + FcitxKey_abreve, 0x1EAF, + FcitxKey_Emacron, 0x1E16, + FcitxKey_emacron, 0x1E17, + FcitxKey_Utilde, 0x1E78, + FcitxKey_omacron, 0x1E53, + FcitxKey_utilde, 0x1E79, + FcitxKey_Cyrillic_ghe, 0x0453, + FcitxKey_Cyrillic_ka, 0x045C, + FcitxKey_Cyrillic_GHE, 0x0403, + FcitxKey_Cyrillic_KA, 0x040C, + FcitxKey_Greek_iotadieresis, 0x0390, + FcitxKey_Greek_upsilondieresis, 0x03B0, + FcitxKey_Greek_ALPHA, 0x0386, + FcitxKey_Greek_EPSILON, 0x0388, + FcitxKey_Greek_ETA, 0x0389, + FcitxKey_Greek_IOTA, 0x038A, + FcitxKey_Greek_OMICRON, 0x038C, + FcitxKey_Greek_UPSILON, 0x038E, + FcitxKey_Greek_OMEGA, 0x038F, + FcitxKey_Greek_alpha, 0x03AC, + FcitxKey_Greek_epsilon, 0x03AD, + FcitxKey_Greek_eta, 0x03AE, + FcitxKey_Greek_iota, 0x03AF, + FcitxKey_Greek_omicron, 0x03CC, + FcitxKey_Greek_upsilon, 0x03CD, + FcitxKey_Greek_omega, 0x03CE, + FcitxKey_Sabovedot, 0x1E64, + FcitxKey_sabovedot, 0x1E65, + FcitxKey_dead_acute, 0x00B4, + FcitxKey_dead_stroke, FcitxKey_O, 0x01FE, + FcitxKey_dead_stroke, FcitxKey_o, 0x01FF, + FcitxKey_dead_diaeresis, FcitxKey_space, 0x0385, + FcitxKey_dead_diaeresis, FcitxKey_Greek_iota, 0x0390, + FcitxKey_dead_diaeresis, FcitxKey_Greek_upsilon, 0x03B0, + FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F0C, + FcitxKey_dead_psili, FcitxKey_Greek_EPSILON, 0x1F1C, + FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F2C, + FcitxKey_dead_psili, FcitxKey_Greek_IOTA, 0x1F3C, + FcitxKey_dead_psili, FcitxKey_Greek_OMICRON, 0x1F4C, + FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1F6C, + FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F04, + FcitxKey_dead_psili, FcitxKey_Greek_epsilon, 0x1F14, + FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F24, + FcitxKey_dead_psili, FcitxKey_Greek_iota, 0x1F34, + FcitxKey_dead_psili, FcitxKey_Greek_omicron, 0x1F44, + FcitxKey_dead_psili, FcitxKey_Greek_upsilon, 0x1F54, + FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1F64, + FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F0D, + FcitxKey_dead_dasia, FcitxKey_Greek_EPSILON, 0x1F1D, + FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F2D, + FcitxKey_dead_dasia, FcitxKey_Greek_IOTA, 0x1F3D, + FcitxKey_dead_dasia, FcitxKey_Greek_OMICRON, 0x1F4D, + FcitxKey_dead_dasia, FcitxKey_Greek_UPSILON, 0x1F5D, + FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1F6D, + FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F05, + FcitxKey_dead_dasia, FcitxKey_Greek_epsilon, 0x1F15, + FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F25, + FcitxKey_dead_dasia, FcitxKey_Greek_iota, 0x1F35, + FcitxKey_dead_dasia, FcitxKey_Greek_omicron, 0x1F45, + FcitxKey_dead_dasia, FcitxKey_Greek_upsilon, 0x1F55, + FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1F65, + FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_I, 0x1E2E, + FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_U, 0x01D7, + FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_i, 0x1E2F, + FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_u, 0x01D8, + FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_Greek_iota, 0x0390, + FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_Greek_upsilon, 0x03B0, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F0D, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_EPSILON, 0x1F1D, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F2D, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_IOTA, 0x1F3D, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_OMICRON, 0x1F4D, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_UPSILON, 0x1F5D, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1F6D, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F05, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_epsilon, 0x1F15, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F25, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_iota, 0x1F35, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_omicron, 0x1F45, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_upsilon, 0x1F55, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1F65, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F0C, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_EPSILON, 0x1F1C, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F2C, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_IOTA, 0x1F3C, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_OMICRON, 0x1F4C, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1F6C, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F04, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_epsilon, 0x1F14, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F24, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_iota, 0x1F34, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_omicron, 0x1F44, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_upsilon, 0x1F54, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1F64, + FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_O, 0x1EDA, + FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_U, 0x1EE8, + FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_o, 0x1EDB, + FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_u, 0x1EE9, + FcitxKey_Multi_key, FcitxKey_comma, FcitxKey_C, 0x1E08, + FcitxKey_Multi_key, FcitxKey_comma, FcitxKey_c, 0x1E09, + FcitxKey_Multi_key, FcitxKey_slash, FcitxKey_O, 0x01FE, + FcitxKey_Multi_key, FcitxKey_slash, FcitxKey_o, 0x01FF, + FcitxKey_Multi_key, FcitxKey_U, FcitxKey_A, 0x1EAE, + FcitxKey_Multi_key, FcitxKey_U, FcitxKey_a, 0x1EAF, + FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_A, 0x1EA4, + FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_E, 0x1EBE, + FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_O, 0x1ED0, + FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_a, 0x1EA5, + FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_e, 0x1EBF, + FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_o, 0x1ED1, + FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_E, 0x1E16, + FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_O, 0x1E52, + FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_e, 0x1E17, + FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_o, 0x1E53, + FcitxKey_Multi_key, FcitxKey_b, FcitxKey_A, 0x1EAE, + FcitxKey_Multi_key, FcitxKey_b, FcitxKey_a, 0x1EAF, + FcitxKey_Multi_key, FcitxKey_o, FcitxKey_A, 0x01FA, + FcitxKey_Multi_key, FcitxKey_o, FcitxKey_a, 0x01FB, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_O, 0x1E4C, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_U, 0x1E78, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_o, 0x1E4D, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_u, 0x1E79, + FcitxKey_Multi_key, FcitxKey_macron, FcitxKey_E, 0x1E16, + FcitxKey_Multi_key, FcitxKey_macron, FcitxKey_O, 0x1E52, + FcitxKey_Multi_key, FcitxKey_macron, FcitxKey_e, 0x1E17, + FcitxKey_Multi_key, FcitxKey_macron, FcitxKey_o, 0x1E53, + FcitxKey_Multi_key, FcitxKey_cedilla, FcitxKey_C, 0x1E08, + FcitxKey_Multi_key, FcitxKey_cedilla, FcitxKey_c, 0x1E09, + FcitxKey_Multi_key, FcitxKey_KP_Divide, FcitxKey_O, 0x01FE, + FcitxKey_Multi_key, FcitxKey_KP_Divide, FcitxKey_o, 0x01FF, + FcitxKey_space, 0x005E, + FcitxKey_parenleft, 0x207D, + FcitxKey_parenright, 0x207E, + FcitxKey_plus, 0x207A, + FcitxKey_minus, 0x207B, + FcitxKey_0, 0x2070, + FcitxKey_1, 0x00B9, + FcitxKey_2, 0x00B2, + FcitxKey_3, 0x00B3, + FcitxKey_4, 0x2074, + FcitxKey_5, 0x2075, + FcitxKey_6, 0x2076, + FcitxKey_7, 0x2077, + FcitxKey_8, 0x2078, + FcitxKey_9, 0x2079, + FcitxKey_equal, 0x207C, + FcitxKey_nobreakspace, 0x0302, + FcitxKey_Agrave, 0x1EA6, + FcitxKey_Aacute, 0x1EA4, + FcitxKey_Atilde, 0x1EAA, + FcitxKey_Egrave, 0x1EC0, + FcitxKey_Eacute, 0x1EBE, + FcitxKey_Ograve, 0x1ED2, + FcitxKey_Oacute, 0x1ED0, + FcitxKey_Otilde, 0x1ED6, + FcitxKey_agrave, 0x1EA7, + FcitxKey_aacute, 0x1EA5, + FcitxKey_atilde, 0x1EAB, + FcitxKey_egrave, 0x1EC1, + FcitxKey_eacute, 0x1EBF, + FcitxKey_ograve, 0x1ED3, + FcitxKey_oacute, 0x1ED1, + FcitxKey_otilde, 0x1ED7, + FcitxKey_Ahook, 0x1EA8, + FcitxKey_ahook, 0x1EA9, + FcitxKey_Ehook, 0x1EC2, + FcitxKey_ehook, 0x1EC3, + FcitxKey_Etilde, 0x1EC4, + FcitxKey_etilde, 0x1EC5, + FcitxKey_Ohook, 0x1ED4, + FcitxKey_ohook, 0x1ED5, + 0x2212, 0x207B, + 0x4E00, 0x3192, + 0x4E01, 0x319C, + 0x4E09, 0x3194, + 0x4E0A, 0x3196, + 0x4E0B, 0x3198, + 0x4E19, 0x319B, + 0x4E2D, 0x3197, + 0x4E59, 0x319A, + 0x4E8C, 0x3193, + 0x4EBA, 0x319F, + 0x56DB, 0x3195, + 0x5730, 0x319E, + 0x5929, 0x319D, + 0x7532, 0x3199, + FcitxKey_dead_circumflex, 0x005E, + FcitxKey_KP_Space, 0x00B2, + FcitxKey_KP_Add, 0x207A, + FcitxKey_KP_0, 0x2070, + FcitxKey_KP_1, 0x00B9, + FcitxKey_KP_2, 0x00B2, + FcitxKey_KP_3, 0x00B3, + FcitxKey_KP_4, 0x2074, + FcitxKey_KP_5, 0x2075, + FcitxKey_KP_6, 0x2076, + FcitxKey_KP_7, 0x2077, + FcitxKey_KP_8, 0x2078, + FcitxKey_KP_9, 0x2079, + FcitxKey_KP_Equal, 0x207C, + FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_A, 0x1EAC, + FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_E, 0x1EC6, + FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_O, 0x1ED8, + FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_a, 0x1EAD, + FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_e, 0x1EC7, + FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_o, 0x1ED9, + FcitxKey_Multi_key, FcitxKey_S, FcitxKey_M, 0x2120, + FcitxKey_Multi_key, FcitxKey_S, FcitxKey_m, 0x2120, + FcitxKey_Multi_key, FcitxKey_T, FcitxKey_M, 0x2122, + FcitxKey_Multi_key, FcitxKey_T, FcitxKey_m, 0x2122, + FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_a, 0x00AA, + FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_h, 0x02B0, + FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_i, 0x2071, + FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_j, 0x02B2, + FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_l, 0x02E1, + FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_n, 0x207F, + FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_o, 0x00BA, + FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_r, 0x02B3, + FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_s, 0x02E2, + FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_w, 0x02B7, + FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_x, 0x02E3, + FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_y, 0x02B8, + FcitxKey_Multi_key, FcitxKey_underscore, 0x0263, 0x02E0, + FcitxKey_Multi_key, FcitxKey_underscore, 0x0266, 0x02B1, + FcitxKey_Multi_key, FcitxKey_underscore, 0x0279, 0x02B4, + FcitxKey_Multi_key, FcitxKey_underscore, 0x027B, 0x02B5, + FcitxKey_Multi_key, FcitxKey_underscore, 0x0281, 0x02B6, + FcitxKey_Multi_key, FcitxKey_underscore, 0x0295, 0x02E4, + FcitxKey_Multi_key, FcitxKey_s, FcitxKey_M, 0x2120, + FcitxKey_Multi_key, FcitxKey_s, FcitxKey_m, 0x2120, + FcitxKey_Multi_key, FcitxKey_t, FcitxKey_M, 0x2122, + FcitxKey_Multi_key, FcitxKey_t, FcitxKey_m, 0x2122, + FcitxKey_Multi_key, FcitxKey_underbar, FcitxKey_a, 0x00AA, + FcitxKey_Multi_key, FcitxKey_underbar, FcitxKey_h, 0x02B0, + FcitxKey_Multi_key, FcitxKey_underbar, FcitxKey_i, 0x2071, + FcitxKey_Multi_key, FcitxKey_underbar, FcitxKey_j, 0x02B2, + FcitxKey_Multi_key, FcitxKey_underbar, FcitxKey_l, 0x02E1, + FcitxKey_Multi_key, FcitxKey_underbar, FcitxKey_n, 0x207F, + FcitxKey_Multi_key, FcitxKey_underbar, FcitxKey_o, 0x00BA, + FcitxKey_Multi_key, FcitxKey_underbar, FcitxKey_r, 0x02B3, + FcitxKey_Multi_key, FcitxKey_underbar, FcitxKey_s, 0x02E2, + FcitxKey_Multi_key, FcitxKey_underbar, FcitxKey_w, 0x02B7, + FcitxKey_Multi_key, FcitxKey_underbar, FcitxKey_x, 0x02E3, + FcitxKey_Multi_key, FcitxKey_underbar, FcitxKey_y, 0x02B8, + FcitxKey_Multi_key, FcitxKey_underbar, 0x0263, 0x02E0, + FcitxKey_Multi_key, FcitxKey_underbar, 0x0266, 0x02B1, + FcitxKey_Multi_key, FcitxKey_underbar, 0x0279, 0x02B4, + FcitxKey_Multi_key, FcitxKey_underbar, 0x027B, 0x02B5, + FcitxKey_Multi_key, FcitxKey_underbar, 0x0281, 0x02B6, + FcitxKey_Multi_key, FcitxKey_underbar, 0x0295, 0x02E4, + FcitxKey_space, 0x007E, + FcitxKey_less, 0x2272, + FcitxKey_equal, 0x2243, + FcitxKey_greater, 0x2273, + FcitxKey_Oacute, 0x1E4C, + FcitxKey_Odiaeresis, 0x1E4E, + FcitxKey_Uacute, 0x1E78, + FcitxKey_oacute, 0x1E4D, + FcitxKey_odiaeresis, 0x1E4F, + FcitxKey_uacute, 0x1E79, + FcitxKey_Abreve, 0x1EB4, + FcitxKey_abreve, 0x1EB5, + FcitxKey_Omacron, 0x022C, + FcitxKey_omacron, 0x022D, + FcitxKey_Greek_iotadieresis, 0x1FD7, + FcitxKey_Greek_upsilondieresis, 0x1FE7, + FcitxKey_Greek_alpha, 0x1FB6, + FcitxKey_Greek_eta, 0x1FC6, + FcitxKey_Greek_iota, 0x1FD6, + FcitxKey_Greek_upsilon, 0x1FE6, + FcitxKey_Greek_omega, 0x1FF6, + 0x1F00, 0x1F06, + 0x1F01, 0x1F07, + 0x1F08, 0x1F0E, + 0x1F09, 0x1F0F, + 0x1F20, 0x1F26, + 0x1F21, 0x1F27, + 0x1F28, 0x1F2E, + 0x1F29, 0x1F2F, + 0x1F30, 0x1F36, + 0x1F31, 0x1F37, + 0x1F38, 0x1F3E, + 0x1F39, 0x1F3F, + 0x1F50, 0x1F56, + 0x1F51, 0x1F57, + 0x1F59, 0x1F5F, + 0x1F60, 0x1F66, + 0x1F61, 0x1F67, + 0x1F68, 0x1F6E, + 0x1F69, 0x1F6F, + FcitxKey_dead_tilde, 0x007E, + FcitxKey_dead_diaeresis, FcitxKey_Greek_iota, 0x1FD7, + FcitxKey_dead_diaeresis, FcitxKey_Greek_upsilon, 0x1FE7, + FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F0E, + FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F2E, + FcitxKey_dead_psili, FcitxKey_Greek_IOTA, 0x1F3E, + FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1F6E, + FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F06, + FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F26, + FcitxKey_dead_psili, FcitxKey_Greek_iota, 0x1F36, + FcitxKey_dead_psili, FcitxKey_Greek_upsilon, 0x1F56, + FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1F66, + FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F0F, + FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F2F, + FcitxKey_dead_dasia, FcitxKey_Greek_IOTA, 0x1F3F, + FcitxKey_dead_dasia, FcitxKey_Greek_UPSILON, 0x1F5F, + FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1F6F, + FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F07, + FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F27, + FcitxKey_dead_dasia, FcitxKey_Greek_iota, 0x1F37, + FcitxKey_dead_dasia, FcitxKey_Greek_upsilon, 0x1F57, + FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1F67, + FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_Greek_iota, 0x1FD7, + FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_Greek_upsilon, 0x1FE7, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F0F, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F2F, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_IOTA, 0x1F3F, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_UPSILON, 0x1F5F, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1F6F, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F07, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F27, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_iota, 0x1F37, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_upsilon, 0x1F57, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1F67, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F0E, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F2E, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_IOTA, 0x1F3E, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1F6E, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F06, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F26, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_iota, 0x1F36, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_upsilon, 0x1F56, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1F66, + FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_O, 0x1EE0, + FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_U, 0x1EEE, + FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_o, 0x1EE1, + FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_u, 0x1EEF, + FcitxKey_Multi_key, FcitxKey_U, FcitxKey_A, 0x1EB4, + FcitxKey_Multi_key, FcitxKey_U, FcitxKey_a, 0x1EB5, + FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_A, 0x1EAA, + FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_E, 0x1EC4, + FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_O, 0x1ED6, + FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_a, 0x1EAB, + FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_e, 0x1EC5, + FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_o, 0x1ED7, + FcitxKey_Multi_key, FcitxKey_b, FcitxKey_A, 0x1EB4, + FcitxKey_Multi_key, FcitxKey_b, FcitxKey_a, 0x1EB5, + FcitxKey_space, 0x00AF, + FcitxKey_V, 0x01D5, + FcitxKey_v, 0x01D6, + FcitxKey_nobreakspace, 0x0304, + FcitxKey_Egrave, 0x1E14, + FcitxKey_Eacute, 0x1E16, + FcitxKey_Ograve, 0x1E50, + FcitxKey_Oacute, 0x1E52, + FcitxKey_egrave, 0x1E15, + FcitxKey_eacute, 0x1E17, + FcitxKey_ograve, 0x1E51, + FcitxKey_oacute, 0x1E53, + FcitxKey_Cyrillic_i, 0x04E3, + FcitxKey_Cyrillic_u, 0x04EF, + FcitxKey_Cyrillic_I, 0x04E2, + FcitxKey_Cyrillic_U, 0x04EE, + FcitxKey_Greek_ALPHA, 0x1FB9, + FcitxKey_Greek_IOTA, 0x1FD9, + FcitxKey_Greek_UPSILON, 0x1FE9, + FcitxKey_Greek_alpha, 0x1FB1, + FcitxKey_Greek_iota, 0x1FD1, + FcitxKey_Greek_upsilon, 0x1FE1, + FcitxKey_dead_macron, 0x00AF, + FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_L, 0x1E38, + FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_R, 0x1E5C, + FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_l, 0x1E39, + FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_r, 0x1E5D, + FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_A, 0x01DE, + FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_O, 0x022A, + FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_U, 0x01D5, + FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_a, 0x01DF, + FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_o, 0x022B, + FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_u, 0x01D6, + FcitxKey_Multi_key, FcitxKey_period, FcitxKey_A, 0x01E0, + FcitxKey_Multi_key, FcitxKey_period, FcitxKey_O, 0x0230, + FcitxKey_Multi_key, FcitxKey_period, FcitxKey_a, 0x01E1, + FcitxKey_Multi_key, FcitxKey_period, FcitxKey_o, 0x0231, + FcitxKey_Multi_key, FcitxKey_semicolon, FcitxKey_O, 0x01EC, + FcitxKey_Multi_key, FcitxKey_semicolon, FcitxKey_o, 0x01ED, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_O, 0x022C, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_o, 0x022D, + FcitxKey_space, 0x02D8, + FcitxKey_nobreakspace, 0x0306, + FcitxKey_Agrave, 0x1EB0, + FcitxKey_Aacute, 0x1EAE, + FcitxKey_Atilde, 0x1EB4, + FcitxKey_agrave, 0x1EB1, + FcitxKey_aacute, 0x1EAF, + FcitxKey_atilde, 0x1EB5, + FcitxKey_Cyrillic_a, 0x04D1, + FcitxKey_Cyrillic_ie, 0x04D7, + FcitxKey_Cyrillic_i, 0x0439, + FcitxKey_Cyrillic_u, 0x045E, + FcitxKey_Cyrillic_zhe, 0x04C2, + FcitxKey_Cyrillic_A, 0x04D0, + FcitxKey_Cyrillic_IE, 0x04D6, + FcitxKey_Cyrillic_I, 0x0419, + FcitxKey_Cyrillic_U, 0x040E, + FcitxKey_Cyrillic_ZHE, 0x04C1, + FcitxKey_Greek_ALPHA, 0x1FB8, + FcitxKey_Greek_IOTA, 0x1FD8, + FcitxKey_Greek_UPSILON, 0x1FE8, + FcitxKey_Greek_alpha, 0x1FB0, + FcitxKey_Greek_iota, 0x1FD0, + FcitxKey_Greek_upsilon, 0x1FE0, + FcitxKey_Ahook, 0x1EB2, + FcitxKey_ahook, 0x1EB3, + FcitxKey_dead_breve, 0x02D8, + FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_A, 0x1EB6, + FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_a, 0x1EB7, + FcitxKey_Multi_key, FcitxKey_comma, FcitxKey_E, 0x1E1C, + FcitxKey_Multi_key, FcitxKey_comma, FcitxKey_e, 0x1E1D, + FcitxKey_Multi_key, FcitxKey_cedilla, FcitxKey_E, 0x1E1C, + FcitxKey_Multi_key, FcitxKey_cedilla, FcitxKey_e, 0x1E1D, + FcitxKey_space, 0x02D9, + FcitxKey_L, 0x013F, + FcitxKey_i, 0x0131, + FcitxKey_j, 0x0237, + FcitxKey_l, 0x0140, + FcitxKey_nobreakspace, 0x0307, + FcitxKey_Sacute, 0x1E64, + FcitxKey_Scaron, 0x1E66, + FcitxKey_sacute, 0x1E65, + FcitxKey_scaron, 0x1E67, + FcitxKey_Amacron, 0x01E0, + FcitxKey_Omacron, 0x0230, + FcitxKey_amacron, 0x01E1, + FcitxKey_omacron, 0x0231, + FcitxKey_dead_abovedot, 0x02D9, + FcitxKey_dead_stroke, FcitxKey_j, 0x025F, + FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_S, 0x1E68, + FcitxKey_Multi_key, FcitxKey_exclam, FcitxKey_s, 0x1E69, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_S, 0x1E64, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_s, 0x1E65, + FcitxKey_Multi_key, FcitxKey_c, FcitxKey_S, 0x1E66, + FcitxKey_Multi_key, FcitxKey_c, FcitxKey_s, 0x1E67, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_S, 0x1E64, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_s, 0x1E65, + FcitxKey_space, 0x0022, + FcitxKey_apostrophe, 0x0344, + FcitxKey_nobreakspace, 0x0308, + FcitxKey_acute, 0x0344, + FcitxKey_Iacute, 0x1E2E, + FcitxKey_Ugrave, 0x01DB, + FcitxKey_Uacute, 0x01D7, + FcitxKey_iacute, 0x1E2F, + FcitxKey_ugrave, 0x01DC, + FcitxKey_uacute, 0x01D8, + 0x01D3, 0x01D9, + 0x01D4, 0x01DA, + FcitxKey_Amacron, 0x01DE, + FcitxKey_Umacron, 0x1E7A, + FcitxKey_amacron, 0x01DF, + FcitxKey_omacron, 0x022B, + FcitxKey_umacron, 0x1E7B, + FcitxKey_Ukrainian_i, 0x0457, + FcitxKey_Ukrainian_I, 0x0407, + FcitxKey_Cyrillic_a, 0x04D3, + FcitxKey_Cyrillic_ie, 0x0451, + FcitxKey_Cyrillic_i, 0x04E5, + FcitxKey_Cyrillic_o, 0x04E7, + FcitxKey_Cyrillic_u, 0x04F1, + FcitxKey_Cyrillic_zhe, 0x04DD, + FcitxKey_Cyrillic_yeru, 0x04F9, + FcitxKey_Cyrillic_ze, 0x04DF, + FcitxKey_Cyrillic_e, 0x04ED, + FcitxKey_Cyrillic_che, 0x04F5, + FcitxKey_Cyrillic_A, 0x04D2, + FcitxKey_Cyrillic_IE, 0x0401, + FcitxKey_Cyrillic_I, 0x04E4, + FcitxKey_Cyrillic_O, 0x04E6, + FcitxKey_Cyrillic_U, 0x04F0, + FcitxKey_Cyrillic_ZHE, 0x04DC, + FcitxKey_Cyrillic_YERU, 0x04F8, + FcitxKey_Cyrillic_ZE, 0x04DE, + FcitxKey_Cyrillic_E, 0x04EC, + FcitxKey_Cyrillic_CHE, 0x04F4, + FcitxKey_Greek_IOTA, 0x03AA, + FcitxKey_Greek_UPSILON, 0x03AB, + FcitxKey_Greek_iota, 0x03CA, + FcitxKey_Greek_upsilon, 0x03CB, + FcitxKey_dead_diaeresis, 0x00A8, + FcitxKey_dead_acute, FcitxKey_space, 0x0385, + FcitxKey_dead_acute, FcitxKey_Greek_iota, 0x0390, + FcitxKey_dead_acute, FcitxKey_Greek_upsilon, 0x03B0, + FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_U, 0x1E7A, + FcitxKey_Multi_key, FcitxKey_underscore, FcitxKey_u, 0x1E7B, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_O, 0x1E4E, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_o, 0x1E4F, + FcitxKey_Multi_key, FcitxKey_macron, FcitxKey_U, 0x1E7A, + FcitxKey_Multi_key, FcitxKey_macron, FcitxKey_u, 0x1E7B, + FcitxKey_space, 0x00B0, + FcitxKey_nobreakspace, 0x030A, + FcitxKey_Aacute, 0x01FA, + FcitxKey_aacute, 0x01FB, + FcitxKey_dead_abovering, 0x00B0, + FcitxKey_space, 0x02DD, + FcitxKey_nobreakspace, 0x030B, + FcitxKey_Cyrillic_u, 0x04F3, + FcitxKey_Cyrillic_U, 0x04F2, + FcitxKey_dead_doubleacute, 0x02DD, + FcitxKey_space, 0x02C7, + FcitxKey_parenleft, 0x208D, + FcitxKey_parenright, 0x208E, + FcitxKey_plus, 0x208A, + FcitxKey_minus, 0x208B, + FcitxKey_equal, 0x208C, + FcitxKey_V, 0x01D9, + FcitxKey_v, 0x01DA, + FcitxKey_nobreakspace, 0x030C, + 0x01F2, 0x01C5, + FcitxKey_Sabovedot, 0x1E66, + FcitxKey_sabovedot, 0x1E67, + FcitxKey_dead_caron, 0x02C7, + FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_U, 0x01D9, + FcitxKey_Multi_key, FcitxKey_quotedbl, FcitxKey_u, 0x01DA, + FcitxKey_space, 0x00B8, + FcitxKey_nobreakspace, 0x0327, + FcitxKey_cent, 0x20B5, + FcitxKey_Cacute, 0x1E08, + FcitxKey_cacute, 0x1E09, + FcitxKey_ColonSign, 0x20B5, + FcitxKey_dead_cedilla, 0x00B8, + FcitxKey_space, 0x02DB, + FcitxKey_nobreakspace, 0x0328, + FcitxKey_Omacron, 0x01EC, + FcitxKey_omacron, 0x01ED, + FcitxKey_dead_ogonek, 0x02DB, + FcitxKey_space, 0x037A, + FcitxKey_Greek_alphaaccent, 0x1FB4, + FcitxKey_Greek_etaaccent, 0x1FC4, + FcitxKey_Greek_omegaaccent, 0x1FF4, + FcitxKey_Greek_ALPHA, 0x1FBC, + FcitxKey_Greek_ETA, 0x1FCC, + FcitxKey_Greek_OMEGA, 0x1FFC, + FcitxKey_Greek_alpha, 0x1FB3, + FcitxKey_Greek_eta, 0x1FC3, + FcitxKey_Greek_omega, 0x1FF3, + FcitxKey_dead_iota, 0x037A, + FcitxKey_dead_grave, FcitxKey_Greek_alpha, 0x1FB2, + FcitxKey_dead_grave, FcitxKey_Greek_eta, 0x1FC2, + FcitxKey_dead_grave, FcitxKey_Greek_omega, 0x1FF2, + FcitxKey_dead_acute, FcitxKey_Greek_alpha, 0x1FB4, + FcitxKey_dead_acute, FcitxKey_Greek_eta, 0x1FC4, + FcitxKey_dead_acute, FcitxKey_Greek_omega, 0x1FF4, + FcitxKey_dead_tilde, FcitxKey_Greek_alpha, 0x1FB7, + FcitxKey_dead_tilde, FcitxKey_Greek_eta, 0x1FC7, + FcitxKey_dead_tilde, FcitxKey_Greek_omega, 0x1FF7, + FcitxKey_dead_tilde, 0x1F00, 0x1F86, + FcitxKey_dead_tilde, 0x1F01, 0x1F87, + FcitxKey_dead_tilde, 0x1F08, 0x1F8E, + FcitxKey_dead_tilde, 0x1F09, 0x1F8F, + FcitxKey_dead_tilde, 0x1F20, 0x1F96, + FcitxKey_dead_tilde, 0x1F21, 0x1F97, + FcitxKey_dead_tilde, 0x1F28, 0x1F9E, + FcitxKey_dead_tilde, 0x1F29, 0x1F9F, + FcitxKey_dead_tilde, 0x1F60, 0x1FA6, + FcitxKey_dead_tilde, 0x1F61, 0x1FA7, + FcitxKey_dead_tilde, 0x1F68, 0x1FAE, + FcitxKey_dead_tilde, 0x1F69, 0x1FAF, + FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F88, + FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F98, + FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FA8, + FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F80, + FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F90, + FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA0, + FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F89, + FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F99, + FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FA9, + FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F81, + FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F91, + FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA1, + FcitxKey_dead_grave, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8A, + FcitxKey_dead_grave, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9A, + FcitxKey_dead_grave, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAA, + FcitxKey_dead_grave, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F82, + FcitxKey_dead_grave, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F92, + FcitxKey_dead_grave, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA2, + FcitxKey_dead_grave, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8B, + FcitxKey_dead_grave, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9B, + FcitxKey_dead_grave, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAB, + FcitxKey_dead_grave, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F83, + FcitxKey_dead_grave, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F93, + FcitxKey_dead_grave, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA3, + FcitxKey_dead_acute, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8C, + FcitxKey_dead_acute, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9C, + FcitxKey_dead_acute, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAC, + FcitxKey_dead_acute, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F84, + FcitxKey_dead_acute, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F94, + FcitxKey_dead_acute, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA4, + FcitxKey_dead_acute, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8D, + FcitxKey_dead_acute, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9D, + FcitxKey_dead_acute, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAD, + FcitxKey_dead_acute, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F85, + FcitxKey_dead_acute, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F95, + FcitxKey_dead_acute, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA5, + FcitxKey_dead_tilde, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8E, + FcitxKey_dead_tilde, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9E, + FcitxKey_dead_tilde, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAE, + FcitxKey_dead_tilde, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F86, + FcitxKey_dead_tilde, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F96, + FcitxKey_dead_tilde, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA6, + FcitxKey_dead_tilde, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8F, + FcitxKey_dead_tilde, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9F, + FcitxKey_dead_tilde, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAF, + FcitxKey_dead_tilde, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F87, + FcitxKey_dead_tilde, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F97, + FcitxKey_dead_tilde, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA7, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_Greek_alpha, 0x1FB4, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_Greek_eta, 0x1FC4, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_Greek_omega, 0x1FF4, + FcitxKey_Multi_key, FcitxKey_apostrophe, 0x1F00, 0x1F84, + FcitxKey_Multi_key, FcitxKey_apostrophe, 0x1F01, 0x1F85, + FcitxKey_Multi_key, FcitxKey_apostrophe, 0x1F08, 0x1F8C, + FcitxKey_Multi_key, FcitxKey_apostrophe, 0x1F09, 0x1F8D, + FcitxKey_Multi_key, FcitxKey_apostrophe, 0x1F20, 0x1F94, + FcitxKey_Multi_key, FcitxKey_apostrophe, 0x1F21, 0x1F95, + FcitxKey_Multi_key, FcitxKey_apostrophe, 0x1F28, 0x1F9C, + FcitxKey_Multi_key, FcitxKey_apostrophe, 0x1F29, 0x1F9D, + FcitxKey_Multi_key, FcitxKey_apostrophe, 0x1F60, 0x1FA4, + FcitxKey_Multi_key, FcitxKey_apostrophe, 0x1F61, 0x1FA5, + FcitxKey_Multi_key, FcitxKey_apostrophe, 0x1F68, 0x1FAC, + FcitxKey_Multi_key, FcitxKey_apostrophe, 0x1F69, 0x1FAD, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F89, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F99, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FA9, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F81, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F91, + FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA1, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F88, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F98, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FA8, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F80, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F90, + FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA0, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_Greek_alpha, 0x1FB2, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_Greek_eta, 0x1FC2, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_Greek_omega, 0x1FF2, + FcitxKey_Multi_key, FcitxKey_grave, 0x1F00, 0x1F82, + FcitxKey_Multi_key, FcitxKey_grave, 0x1F01, 0x1F83, + FcitxKey_Multi_key, FcitxKey_grave, 0x1F08, 0x1F8A, + FcitxKey_Multi_key, FcitxKey_grave, 0x1F09, 0x1F8B, + FcitxKey_Multi_key, FcitxKey_grave, 0x1F20, 0x1F92, + FcitxKey_Multi_key, FcitxKey_grave, 0x1F21, 0x1F93, + FcitxKey_Multi_key, FcitxKey_grave, 0x1F28, 0x1F9A, + FcitxKey_Multi_key, FcitxKey_grave, 0x1F29, 0x1F9B, + FcitxKey_Multi_key, FcitxKey_grave, 0x1F60, 0x1FA2, + FcitxKey_Multi_key, FcitxKey_grave, 0x1F61, 0x1FA3, + FcitxKey_Multi_key, FcitxKey_grave, 0x1F68, 0x1FAA, + FcitxKey_Multi_key, FcitxKey_grave, 0x1F69, 0x1FAB, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_Greek_alpha, 0x1FB7, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_Greek_eta, 0x1FC7, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_Greek_omega, 0x1FF7, + FcitxKey_Multi_key, FcitxKey_asciitilde, 0x1F00, 0x1F86, + FcitxKey_Multi_key, FcitxKey_asciitilde, 0x1F01, 0x1F87, + FcitxKey_Multi_key, FcitxKey_asciitilde, 0x1F08, 0x1F8E, + FcitxKey_Multi_key, FcitxKey_asciitilde, 0x1F09, 0x1F8F, + FcitxKey_Multi_key, FcitxKey_asciitilde, 0x1F20, 0x1F96, + FcitxKey_Multi_key, FcitxKey_asciitilde, 0x1F21, 0x1F97, + FcitxKey_Multi_key, FcitxKey_asciitilde, 0x1F28, 0x1F9E, + FcitxKey_Multi_key, FcitxKey_asciitilde, 0x1F29, 0x1F9F, + FcitxKey_Multi_key, FcitxKey_asciitilde, 0x1F60, 0x1FA6, + FcitxKey_Multi_key, FcitxKey_asciitilde, 0x1F61, 0x1FA7, + FcitxKey_Multi_key, FcitxKey_asciitilde, 0x1F68, 0x1FAE, + FcitxKey_Multi_key, FcitxKey_asciitilde, 0x1F69, 0x1FAF, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_Greek_alpha, 0x1FB4, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_Greek_eta, 0x1FC4, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_Greek_omega, 0x1FF4, + FcitxKey_Multi_key, FcitxKey_acute, 0x1F00, 0x1F84, + FcitxKey_Multi_key, FcitxKey_acute, 0x1F01, 0x1F85, + FcitxKey_Multi_key, FcitxKey_acute, 0x1F08, 0x1F8C, + FcitxKey_Multi_key, FcitxKey_acute, 0x1F09, 0x1F8D, + FcitxKey_Multi_key, FcitxKey_acute, 0x1F20, 0x1F94, + FcitxKey_Multi_key, FcitxKey_acute, 0x1F21, 0x1F95, + FcitxKey_Multi_key, FcitxKey_acute, 0x1F28, 0x1F9C, + FcitxKey_Multi_key, FcitxKey_acute, 0x1F29, 0x1F9D, + FcitxKey_Multi_key, FcitxKey_acute, 0x1F60, 0x1FA4, + FcitxKey_Multi_key, FcitxKey_acute, 0x1F61, 0x1FA5, + FcitxKey_Multi_key, FcitxKey_acute, 0x1F68, 0x1FAC, + FcitxKey_Multi_key, FcitxKey_acute, 0x1F69, 0x1FAD, + FcitxKey_dead_grave, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8B, + FcitxKey_dead_grave, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9B, + FcitxKey_dead_grave, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAB, + FcitxKey_dead_grave, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F83, + FcitxKey_dead_grave, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F93, + FcitxKey_dead_grave, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA3, + FcitxKey_dead_grave, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8A, + FcitxKey_dead_grave, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9A, + FcitxKey_dead_grave, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAA, + FcitxKey_dead_grave, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F82, + FcitxKey_dead_grave, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F92, + FcitxKey_dead_grave, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA2, + FcitxKey_dead_acute, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8D, + FcitxKey_dead_acute, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9D, + FcitxKey_dead_acute, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAD, + FcitxKey_dead_acute, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F85, + FcitxKey_dead_acute, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F95, + FcitxKey_dead_acute, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA5, + FcitxKey_dead_acute, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8C, + FcitxKey_dead_acute, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9C, + FcitxKey_dead_acute, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAC, + FcitxKey_dead_acute, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F84, + FcitxKey_dead_acute, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F94, + FcitxKey_dead_acute, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA4, + FcitxKey_dead_tilde, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8F, + FcitxKey_dead_tilde, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9F, + FcitxKey_dead_tilde, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAF, + FcitxKey_dead_tilde, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F87, + FcitxKey_dead_tilde, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F97, + FcitxKey_dead_tilde, FcitxKey_Multi_key, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA7, + FcitxKey_dead_tilde, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8E, + FcitxKey_dead_tilde, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9E, + FcitxKey_dead_tilde, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAE, + FcitxKey_dead_tilde, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F86, + FcitxKey_dead_tilde, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F96, + FcitxKey_dead_tilde, FcitxKey_Multi_key, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA6, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8D, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9D, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAD, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F85, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F95, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA5, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8C, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9C, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAC, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F84, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F94, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA4, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8C, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9C, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAC, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F84, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F94, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA4, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8D, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9D, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAD, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F85, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F95, + FcitxKey_Multi_key, FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA5, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8B, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9B, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAB, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F83, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F93, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA3, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8A, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9A, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAA, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F82, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F92, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA2, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8A, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9A, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAA, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F82, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F92, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA2, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8B, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9B, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAB, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F83, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F93, + FcitxKey_Multi_key, FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA3, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8F, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9F, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAF, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F87, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F97, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA7, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8E, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9E, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAE, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F86, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F96, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA6, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8E, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9E, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAE, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F86, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F96, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA6, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8F, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9F, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAF, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F87, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F97, + FcitxKey_Multi_key, FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA7, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8D, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9D, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAD, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F85, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F95, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA5, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8C, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9C, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAC, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F84, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F94, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA4, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8C, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9C, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAC, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F84, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F94, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA4, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8D, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9D, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAD, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F85, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F95, + FcitxKey_Multi_key, FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA5, + FcitxKey_kana_WO, 0x30FA, + FcitxKey_kana_U, 0x30F4, + FcitxKey_kana_KA, 0x30AC, + FcitxKey_kana_KI, 0x30AE, + FcitxKey_kana_KU, 0x30B0, + FcitxKey_kana_KE, 0x30B2, + FcitxKey_kana_KO, 0x30B4, + FcitxKey_kana_SA, 0x30B6, + FcitxKey_kana_SHI, 0x30B8, + FcitxKey_kana_SU, 0x30BA, + FcitxKey_kana_SE, 0x30BC, + FcitxKey_kana_SO, 0x30BE, + FcitxKey_kana_TA, 0x30C0, + FcitxKey_kana_CHI, 0x30C2, + FcitxKey_kana_TSU, 0x30C5, + FcitxKey_kana_TE, 0x30C7, + FcitxKey_kana_TO, 0x30C9, + FcitxKey_kana_HA, 0x30D0, + FcitxKey_kana_HI, 0x30D3, + FcitxKey_kana_FU, 0x30D6, + FcitxKey_kana_HE, 0x30D9, + FcitxKey_kana_HO, 0x30DC, + FcitxKey_kana_WA, 0x30F7, + FcitxKey_kana_HA, 0x30D1, + FcitxKey_kana_HI, 0x30D4, + FcitxKey_kana_FU, 0x30D7, + FcitxKey_kana_HE, 0x30DA, + FcitxKey_kana_HO, 0x30DD, + FcitxKey_plus, 0x2A25, + FcitxKey_minus, 0x2A2A, + FcitxKey_equal, 0x2A66, + FcitxKey_Abreve, 0x1EB6, + FcitxKey_abreve, 0x1EB7, + FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_O, 0x1EE2, + FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_U, 0x1EF0, + FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_o, 0x1EE3, + FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_u, 0x1EF1, + FcitxKey_space, 0x0309, + FcitxKey_B, 0x0181, + FcitxKey_C, 0x0187, + FcitxKey_D, 0x018A, + FcitxKey_F, 0x0191, + FcitxKey_G, 0x0193, + FcitxKey_K, 0x0198, + FcitxKey_M, 0x2C6E, + FcitxKey_N, 0x019D, + FcitxKey_P, 0x01A4, + FcitxKey_T, 0x01AC, + FcitxKey_V, 0x01B2, + FcitxKey_W, 0x2C72, + FcitxKey_Z, 0x0224, + FcitxKey_b, 0x0253, + FcitxKey_c, 0x0188, + FcitxKey_d, 0x0257, + FcitxKey_f, 0x0192, + FcitxKey_g, 0x0260, + FcitxKey_h, 0x0266, + FcitxKey_k, 0x0199, + FcitxKey_m, 0x0271, + FcitxKey_n, 0x0272, + FcitxKey_p, 0x01A5, + FcitxKey_q, 0x02A0, + FcitxKey_s, 0x0282, + FcitxKey_t, 0x01AD, + FcitxKey_v, 0x028B, + FcitxKey_w, 0x2C73, + FcitxKey_z, 0x0225, + FcitxKey_nobreakspace, 0x0309, + FcitxKey_Abreve, 0x1EB2, + FcitxKey_abreve, 0x1EB3, + 0x0256, 0x1D91, + FcitxKey_schwa, 0x025A, + 0x025C, 0x025D, + 0x025F, 0x0284, + 0x0279, 0x027B, + FcitxKey_dead_hook, 0x0309, + FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_O, 0x1EDE, + FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_U, 0x1EEC, + FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_o, 0x1EDF, + FcitxKey_Multi_key, FcitxKey_plus, FcitxKey_u, 0x1EED, + FcitxKey_Multi_key, FcitxKey_U, FcitxKey_A, 0x1EB2, + FcitxKey_Multi_key, FcitxKey_U, FcitxKey_a, 0x1EB3, + FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_A, 0x1EA8, + FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_E, 0x1EC2, + FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_O, 0x1ED4, + FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_a, 0x1EA9, + FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_e, 0x1EC3, + FcitxKey_Multi_key, FcitxKey_asciicircum, FcitxKey_o, 0x1ED5, + FcitxKey_Multi_key, FcitxKey_b, FcitxKey_A, 0x1EB2, + FcitxKey_Multi_key, FcitxKey_b, FcitxKey_a, 0x1EB3, + FcitxKey_Greek_ALPHA, 0x1F08, + FcitxKey_Greek_EPSILON, 0x1F18, + FcitxKey_Greek_ETA, 0x1F28, + FcitxKey_Greek_IOTA, 0x1F38, + FcitxKey_Greek_OMICRON, 0x1F48, + FcitxKey_Greek_OMEGA, 0x1F68, + FcitxKey_Greek_alpha, 0x1F00, + FcitxKey_Greek_epsilon, 0x1F10, + FcitxKey_Greek_eta, 0x1F20, + FcitxKey_Greek_iota, 0x1F30, + FcitxKey_Greek_omicron, 0x1F40, + FcitxKey_Greek_rho, 0x1FE4, + FcitxKey_Greek_upsilon, 0x1F50, + FcitxKey_Greek_omega, 0x1F60, + FcitxKey_Greek_ALPHA, 0x1F09, + FcitxKey_Greek_EPSILON, 0x1F19, + FcitxKey_Greek_ETA, 0x1F29, + FcitxKey_Greek_IOTA, 0x1F39, + FcitxKey_Greek_OMICRON, 0x1F49, + FcitxKey_Greek_RHO, 0x1FEC, + FcitxKey_Greek_UPSILON, 0x1F59, + FcitxKey_Greek_OMEGA, 0x1F69, + FcitxKey_Greek_alpha, 0x1F01, + FcitxKey_Greek_epsilon, 0x1F11, + FcitxKey_Greek_eta, 0x1F21, + FcitxKey_Greek_iota, 0x1F31, + FcitxKey_Greek_omicron, 0x1F41, + FcitxKey_Greek_rho, 0x1FE5, + FcitxKey_Greek_upsilon, 0x1F51, + FcitxKey_Greek_omega, 0x1F61, + FcitxKey_space, FcitxKey_space, 0x00A0, + FcitxKey_space, FcitxKey_apostrophe, 0x0027, + FcitxKey_space, FcitxKey_parenleft, 0x02D8, + FcitxKey_space, FcitxKey_comma, 0x00B8, + FcitxKey_space, FcitxKey_minus, 0x007E, + FcitxKey_space, FcitxKey_period, 0x2008, + FcitxKey_space, FcitxKey_less, 0x02C7, + FcitxKey_space, FcitxKey_greater, 0x005E, + FcitxKey_space, FcitxKey_asciicircum, 0x005E, + FcitxKey_space, FcitxKey_grave, 0x0060, + FcitxKey_space, FcitxKey_asciitilde, 0x007E, + FcitxKey_exclam, FcitxKey_exclam, 0x00A1, + FcitxKey_exclam, FcitxKey_question, 0x203D, + FcitxKey_exclam, FcitxKey_A, 0x1EA0, + FcitxKey_exclam, FcitxKey_B, 0x1E04, + FcitxKey_exclam, FcitxKey_D, 0x1E0C, + FcitxKey_exclam, FcitxKey_E, 0x1EB8, + FcitxKey_exclam, FcitxKey_H, 0x1E24, + FcitxKey_exclam, FcitxKey_I, 0x1ECA, + FcitxKey_exclam, FcitxKey_K, 0x1E32, + FcitxKey_exclam, FcitxKey_L, 0x1E36, + FcitxKey_exclam, FcitxKey_M, 0x1E42, + FcitxKey_exclam, FcitxKey_N, 0x1E46, + FcitxKey_exclam, FcitxKey_O, 0x1ECC, + FcitxKey_exclam, FcitxKey_P, 0x00B6, + FcitxKey_exclam, FcitxKey_R, 0x1E5A, + FcitxKey_exclam, FcitxKey_S, 0x00A7, + FcitxKey_exclam, FcitxKey_T, 0x1E6C, + FcitxKey_exclam, FcitxKey_U, 0x1EE4, + FcitxKey_exclam, FcitxKey_V, 0x1E7E, + FcitxKey_exclam, FcitxKey_W, 0x1E88, + FcitxKey_exclam, FcitxKey_Y, 0x1EF4, + FcitxKey_exclam, FcitxKey_Z, 0x1E92, + FcitxKey_exclam, FcitxKey_asciicircum, 0x00A6, + FcitxKey_exclam, FcitxKey_a, 0x1EA1, + FcitxKey_exclam, FcitxKey_b, 0x1E05, + FcitxKey_exclam, FcitxKey_d, 0x1E0D, + FcitxKey_exclam, FcitxKey_e, 0x1EB9, + FcitxKey_exclam, FcitxKey_h, 0x1E25, + FcitxKey_exclam, FcitxKey_i, 0x1ECB, + FcitxKey_exclam, FcitxKey_k, 0x1E33, + FcitxKey_exclam, FcitxKey_l, 0x1E37, + FcitxKey_exclam, FcitxKey_m, 0x1E43, + FcitxKey_exclam, FcitxKey_n, 0x1E47, + FcitxKey_exclam, FcitxKey_o, 0x1ECD, + FcitxKey_exclam, FcitxKey_p, 0x00B6, + FcitxKey_exclam, FcitxKey_r, 0x1E5B, + FcitxKey_exclam, FcitxKey_s, 0x00A7, + FcitxKey_exclam, FcitxKey_t, 0x1E6D, + FcitxKey_exclam, FcitxKey_u, 0x1EE5, + FcitxKey_exclam, FcitxKey_v, 0x1E7F, + FcitxKey_exclam, FcitxKey_w, 0x1E89, + FcitxKey_exclam, FcitxKey_y, 0x1EF5, + FcitxKey_exclam, FcitxKey_z, 0x1E93, + FcitxKey_exclam, FcitxKey_Ohorn, 0x1EE2, + FcitxKey_exclam, FcitxKey_ohorn, 0x1EE3, + FcitxKey_exclam, FcitxKey_Uhorn, 0x1EF0, + FcitxKey_exclam, FcitxKey_uhorn, 0x1EF1, + FcitxKey_quotedbl, FcitxKey_quotedbl, 0x00A8, + FcitxKey_quotedbl, FcitxKey_apostrophe, 0x0344, + FcitxKey_quotedbl, FcitxKey_comma, 0x201E, + FcitxKey_quotedbl, FcitxKey_slash, 0x301E, + FcitxKey_quotedbl, FcitxKey_less, 0x201C, + FcitxKey_quotedbl, FcitxKey_greater, 0x201D, + FcitxKey_quotedbl, FcitxKey_A, 0x00C4, + FcitxKey_quotedbl, FcitxKey_E, 0x00CB, + FcitxKey_quotedbl, FcitxKey_H, 0x1E26, + FcitxKey_quotedbl, FcitxKey_I, 0x00CF, + FcitxKey_quotedbl, FcitxKey_O, 0x00D6, + FcitxKey_quotedbl, FcitxKey_U, 0x00DC, + FcitxKey_quotedbl, FcitxKey_W, 0x1E84, + FcitxKey_quotedbl, FcitxKey_X, 0x1E8C, + FcitxKey_quotedbl, FcitxKey_Y, 0x0178, + FcitxKey_quotedbl, FcitxKey_backslash, 0x301D, + FcitxKey_quotedbl, FcitxKey_a, 0x00E4, + FcitxKey_quotedbl, FcitxKey_e, 0x00EB, + FcitxKey_quotedbl, FcitxKey_h, 0x1E27, + FcitxKey_quotedbl, FcitxKey_i, 0x00EF, + FcitxKey_quotedbl, FcitxKey_o, 0x00F6, + FcitxKey_quotedbl, FcitxKey_t, 0x1E97, + FcitxKey_quotedbl, FcitxKey_u, 0x00FC, + FcitxKey_quotedbl, FcitxKey_w, 0x1E85, + FcitxKey_quotedbl, FcitxKey_x, 0x1E8D, + FcitxKey_quotedbl, FcitxKey_y, 0x00FF, + FcitxKey_quotedbl, FcitxKey_acute, 0x0344, + FcitxKey_quotedbl, FcitxKey_Otilde, 0x1E4E, + FcitxKey_quotedbl, FcitxKey_otilde, 0x1E4F, + FcitxKey_quotedbl, 0x03D2, 0x03D4, + FcitxKey_quotedbl, FcitxKey_Umacron, 0x1E7A, + FcitxKey_quotedbl, FcitxKey_umacron, 0x1E7B, + FcitxKey_quotedbl, 0x04D8, 0x04DA, + FcitxKey_quotedbl, 0x04D9, 0x04DB, + FcitxKey_quotedbl, 0x04E8, 0x04EA, + FcitxKey_quotedbl, 0x04E9, 0x04EB, + FcitxKey_quotedbl, FcitxKey_Ukrainian_i, 0x0457, + FcitxKey_quotedbl, FcitxKey_Ukrainian_I, 0x0407, + FcitxKey_quotedbl, FcitxKey_Cyrillic_a, 0x04D3, + FcitxKey_quotedbl, FcitxKey_Cyrillic_ie, 0x0451, + FcitxKey_quotedbl, FcitxKey_Cyrillic_i, 0x04E5, + FcitxKey_quotedbl, FcitxKey_Cyrillic_o, 0x04E7, + FcitxKey_quotedbl, FcitxKey_Cyrillic_u, 0x04F1, + FcitxKey_quotedbl, FcitxKey_Cyrillic_zhe, 0x04DD, + FcitxKey_quotedbl, FcitxKey_Cyrillic_yeru, 0x04F9, + FcitxKey_quotedbl, FcitxKey_Cyrillic_ze, 0x04DF, + FcitxKey_quotedbl, FcitxKey_Cyrillic_e, 0x04ED, + FcitxKey_quotedbl, FcitxKey_Cyrillic_che, 0x04F5, + FcitxKey_quotedbl, FcitxKey_Cyrillic_A, 0x04D2, + FcitxKey_quotedbl, FcitxKey_Cyrillic_IE, 0x0401, + FcitxKey_quotedbl, FcitxKey_Cyrillic_I, 0x04E4, + FcitxKey_quotedbl, FcitxKey_Cyrillic_O, 0x04E6, + FcitxKey_quotedbl, FcitxKey_Cyrillic_U, 0x04F0, + FcitxKey_quotedbl, FcitxKey_Cyrillic_ZHE, 0x04DC, + FcitxKey_quotedbl, FcitxKey_Cyrillic_YERU, 0x04F8, + FcitxKey_quotedbl, FcitxKey_Cyrillic_ZE, 0x04DE, + FcitxKey_quotedbl, FcitxKey_Cyrillic_E, 0x04EC, + FcitxKey_quotedbl, FcitxKey_Cyrillic_CHE, 0x04F4, + FcitxKey_quotedbl, FcitxKey_Greek_IOTA, 0x03AA, + FcitxKey_quotedbl, FcitxKey_Greek_UPSILON, 0x03AB, + FcitxKey_quotedbl, FcitxKey_Greek_iota, 0x03CA, + FcitxKey_quotedbl, FcitxKey_Greek_upsilon, 0x03CB, + FcitxKey_quotedbl, FcitxKey_dead_acute, 0x0344, + FcitxKey_numbersign, FcitxKey_numbersign, 0x266F, + FcitxKey_numbersign, FcitxKey_b, 0x266D, + FcitxKey_numbersign, FcitxKey_f, 0x266E, + FcitxKey_percent, FcitxKey_o, 0x2030, + FcitxKey_apostrophe, FcitxKey_space, 0x0027, + FcitxKey_apostrophe, FcitxKey_apostrophe, 0x00B4, + FcitxKey_apostrophe, FcitxKey_comma, 0x201A, + FcitxKey_apostrophe, FcitxKey_less, 0x2018, + FcitxKey_apostrophe, FcitxKey_greater, 0x2019, + FcitxKey_apostrophe, FcitxKey_A, 0x00C1, + FcitxKey_apostrophe, FcitxKey_C, 0x0106, + FcitxKey_apostrophe, FcitxKey_E, 0x00C9, + FcitxKey_apostrophe, FcitxKey_G, 0x01F4, + FcitxKey_apostrophe, FcitxKey_I, 0x00CD, + FcitxKey_apostrophe, FcitxKey_K, 0x1E30, + FcitxKey_apostrophe, FcitxKey_L, 0x0139, + FcitxKey_apostrophe, FcitxKey_M, 0x1E3E, + FcitxKey_apostrophe, FcitxKey_N, 0x0143, + FcitxKey_apostrophe, FcitxKey_O, 0x00D3, + FcitxKey_apostrophe, FcitxKey_P, 0x1E54, + FcitxKey_apostrophe, FcitxKey_R, 0x0154, + FcitxKey_apostrophe, FcitxKey_S, 0x015A, + FcitxKey_apostrophe, FcitxKey_U, 0x00DA, + FcitxKey_apostrophe, FcitxKey_W, 0x1E82, + FcitxKey_apostrophe, FcitxKey_Y, 0x00DD, + FcitxKey_apostrophe, FcitxKey_Z, 0x0179, + FcitxKey_apostrophe, FcitxKey_a, 0x00E1, + FcitxKey_apostrophe, FcitxKey_c, 0x0107, + FcitxKey_apostrophe, FcitxKey_e, 0x00E9, + FcitxKey_apostrophe, FcitxKey_g, 0x01F5, + FcitxKey_apostrophe, FcitxKey_i, 0x00ED, + FcitxKey_apostrophe, FcitxKey_k, 0x1E31, + FcitxKey_apostrophe, FcitxKey_l, 0x013A, + FcitxKey_apostrophe, FcitxKey_m, 0x1E3F, + FcitxKey_apostrophe, FcitxKey_n, 0x0144, + FcitxKey_apostrophe, FcitxKey_o, 0x00F3, + FcitxKey_apostrophe, FcitxKey_p, 0x1E55, + FcitxKey_apostrophe, FcitxKey_r, 0x0155, + FcitxKey_apostrophe, FcitxKey_s, 0x015B, + FcitxKey_apostrophe, FcitxKey_u, 0x00FA, + FcitxKey_apostrophe, FcitxKey_w, 0x1E83, + FcitxKey_apostrophe, FcitxKey_y, 0x00FD, + FcitxKey_apostrophe, FcitxKey_z, 0x017A, + FcitxKey_apostrophe, FcitxKey_Acircumflex, 0x1EA4, + FcitxKey_apostrophe, FcitxKey_Aring, 0x01FA, + FcitxKey_apostrophe, FcitxKey_AE, 0x01FC, + FcitxKey_apostrophe, FcitxKey_Ccedilla, 0x1E08, + FcitxKey_apostrophe, FcitxKey_Ecircumflex, 0x1EBE, + FcitxKey_apostrophe, FcitxKey_Idiaeresis, 0x1E2E, + FcitxKey_apostrophe, FcitxKey_Ocircumflex, 0x1ED0, + FcitxKey_apostrophe, FcitxKey_Otilde, 0x1E4C, + FcitxKey_apostrophe, FcitxKey_Ooblique, 0x01FE, + FcitxKey_apostrophe, 0x00DC, 0x01D7, + FcitxKey_apostrophe, FcitxKey_acircumflex, 0x1EA5, + FcitxKey_apostrophe, FcitxKey_aring, 0x01FB, + FcitxKey_apostrophe, FcitxKey_ae, 0x01FD, + FcitxKey_apostrophe, FcitxKey_ccedilla, 0x1E09, + FcitxKey_apostrophe, FcitxKey_ecircumflex, 0x1EBF, + FcitxKey_apostrophe, FcitxKey_idiaeresis, 0x1E2F, + FcitxKey_apostrophe, FcitxKey_ocircumflex, 0x1ED1, + FcitxKey_apostrophe, FcitxKey_otilde, 0x1E4D, + FcitxKey_apostrophe, FcitxKey_oslash, 0x01FF, + FcitxKey_apostrophe, FcitxKey_udiaeresis, 0x01D8, + FcitxKey_apostrophe, FcitxKey_Ohorn, 0x1EDA, + FcitxKey_apostrophe, FcitxKey_ohorn, 0x1EDB, + FcitxKey_apostrophe, FcitxKey_Uhorn, 0x1EE8, + FcitxKey_apostrophe, FcitxKey_uhorn, 0x1EE9, + FcitxKey_apostrophe, FcitxKey_Abreve, 0x1EAE, + FcitxKey_apostrophe, FcitxKey_abreve, 0x1EAF, + FcitxKey_apostrophe, FcitxKey_Emacron, 0x1E16, + FcitxKey_apostrophe, FcitxKey_emacron, 0x1E17, + FcitxKey_apostrophe, FcitxKey_Omacron, 0x1E52, + FcitxKey_apostrophe, FcitxKey_Utilde, 0x1E78, + FcitxKey_apostrophe, FcitxKey_omacron, 0x1E53, + FcitxKey_apostrophe, FcitxKey_utilde, 0x1E79, + FcitxKey_apostrophe, FcitxKey_Cyrillic_ghe, 0x0453, + FcitxKey_apostrophe, FcitxKey_Cyrillic_ka, 0x045C, + FcitxKey_apostrophe, FcitxKey_Cyrillic_GHE, 0x0403, + FcitxKey_apostrophe, FcitxKey_Cyrillic_KA, 0x040C, + FcitxKey_apostrophe, FcitxKey_Greek_iotadieresis, 0x0390, + FcitxKey_apostrophe, FcitxKey_Greek_upsilondieresis, 0x03B0, + FcitxKey_apostrophe, FcitxKey_Greek_ALPHA, 0x0386, + FcitxKey_apostrophe, FcitxKey_Greek_EPSILON, 0x0388, + FcitxKey_apostrophe, FcitxKey_Greek_ETA, 0x0389, + FcitxKey_apostrophe, FcitxKey_Greek_IOTA, 0x038A, + FcitxKey_apostrophe, FcitxKey_Greek_OMICRON, 0x038C, + FcitxKey_apostrophe, FcitxKey_Greek_UPSILON, 0x038E, + FcitxKey_apostrophe, FcitxKey_Greek_OMEGA, 0x038F, + FcitxKey_apostrophe, FcitxKey_Greek_alpha, 0x03AC, + FcitxKey_apostrophe, FcitxKey_Greek_epsilon, 0x03AD, + FcitxKey_apostrophe, FcitxKey_Greek_eta, 0x03AE, + FcitxKey_apostrophe, FcitxKey_Greek_iota, 0x03AF, + FcitxKey_apostrophe, FcitxKey_Greek_omicron, 0x03CC, + FcitxKey_apostrophe, FcitxKey_Greek_upsilon, 0x03CD, + FcitxKey_apostrophe, FcitxKey_Greek_omega, 0x03CE, + FcitxKey_apostrophe, 0x1F00, 0x1F04, + FcitxKey_apostrophe, 0x1F01, 0x1F05, + FcitxKey_apostrophe, 0x1F08, 0x1F0C, + FcitxKey_apostrophe, 0x1F09, 0x1F0D, + FcitxKey_apostrophe, 0x1F10, 0x1F14, + FcitxKey_apostrophe, 0x1F11, 0x1F15, + FcitxKey_apostrophe, 0x1F18, 0x1F1C, + FcitxKey_apostrophe, 0x1F19, 0x1F1D, + FcitxKey_apostrophe, 0x1F20, 0x1F24, + FcitxKey_apostrophe, 0x1F21, 0x1F25, + FcitxKey_apostrophe, 0x1F28, 0x1F2C, + FcitxKey_apostrophe, 0x1F29, 0x1F2D, + FcitxKey_apostrophe, 0x1F30, 0x1F34, + FcitxKey_apostrophe, 0x1F31, 0x1F35, + FcitxKey_apostrophe, 0x1F38, 0x1F3C, + FcitxKey_apostrophe, 0x1F39, 0x1F3D, + FcitxKey_apostrophe, 0x1F40, 0x1F44, + FcitxKey_apostrophe, 0x1F41, 0x1F45, + FcitxKey_apostrophe, 0x1F48, 0x1F4C, + FcitxKey_apostrophe, 0x1F49, 0x1F4D, + FcitxKey_apostrophe, 0x1F50, 0x1F54, + FcitxKey_apostrophe, 0x1F51, 0x1F55, + FcitxKey_apostrophe, 0x1F59, 0x1F5D, + FcitxKey_apostrophe, 0x1F60, 0x1F64, + FcitxKey_apostrophe, 0x1F61, 0x1F65, + FcitxKey_apostrophe, 0x1F68, 0x1F6C, + FcitxKey_apostrophe, 0x1F69, 0x1F6D, + FcitxKey_parenleft, FcitxKey_space, 0x02D8, + FcitxKey_parenleft, FcitxKey_parenleft, 0x005B, + FcitxKey_parenleft, FcitxKey_minus, 0x007B, + FcitxKey_parenleft, FcitxKey_A, 0x0102, + FcitxKey_parenleft, FcitxKey_G, 0x011E, + FcitxKey_parenleft, FcitxKey_a, 0x0103, + FcitxKey_parenleft, FcitxKey_c, 0x00A9, + FcitxKey_parenleft, FcitxKey_g, 0x011F, + FcitxKey_parenleft, FcitxKey_r, 0x00AE, + FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F09, + FcitxKey_parenleft, FcitxKey_Greek_EPSILON, 0x1F19, + FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F29, + FcitxKey_parenleft, FcitxKey_Greek_IOTA, 0x1F39, + FcitxKey_parenleft, FcitxKey_Greek_OMICRON, 0x1F49, + FcitxKey_parenleft, FcitxKey_Greek_RHO, 0x1FEC, + FcitxKey_parenleft, FcitxKey_Greek_UPSILON, 0x1F59, + FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1F69, + FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F01, + FcitxKey_parenleft, FcitxKey_Greek_epsilon, 0x1F11, + FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F21, + FcitxKey_parenleft, FcitxKey_Greek_iota, 0x1F31, + FcitxKey_parenleft, FcitxKey_Greek_omicron, 0x1F41, + FcitxKey_parenleft, FcitxKey_Greek_rho, 0x1FE5, + FcitxKey_parenleft, FcitxKey_Greek_upsilon, 0x1F51, + FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1F61, + FcitxKey_parenright, FcitxKey_parenright, 0x005D, + FcitxKey_parenright, FcitxKey_minus, 0x007D, + FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F08, + FcitxKey_parenright, FcitxKey_Greek_EPSILON, 0x1F18, + FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F28, + FcitxKey_parenright, FcitxKey_Greek_IOTA, 0x1F38, + FcitxKey_parenright, FcitxKey_Greek_OMICRON, 0x1F48, + FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1F68, + FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F00, + FcitxKey_parenright, FcitxKey_Greek_epsilon, 0x1F10, + FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F20, + FcitxKey_parenright, FcitxKey_Greek_iota, 0x1F30, + FcitxKey_parenright, FcitxKey_Greek_omicron, 0x1F40, + FcitxKey_parenright, FcitxKey_Greek_rho, 0x1FE4, + FcitxKey_parenright, FcitxKey_Greek_upsilon, 0x1F50, + FcitxKey_parenright, FcitxKey_Greek_omega, 0x1F60, + FcitxKey_asterisk, FcitxKey_0, 0x00B0, + FcitxKey_asterisk, FcitxKey_A, 0x00C5, + FcitxKey_asterisk, FcitxKey_U, 0x016E, + FcitxKey_asterisk, FcitxKey_a, 0x00E5, + FcitxKey_asterisk, FcitxKey_u, 0x016F, + FcitxKey_plus, FcitxKey_plus, 0x0023, + FcitxKey_plus, FcitxKey_minus, 0x00B1, + FcitxKey_plus, FcitxKey_O, 0x01A0, + FcitxKey_plus, FcitxKey_U, 0x01AF, + FcitxKey_plus, FcitxKey_o, 0x01A1, + FcitxKey_plus, FcitxKey_u, 0x01B0, + FcitxKey_comma, FcitxKey_space, 0x00B8, + FcitxKey_comma, FcitxKey_quotedbl, 0x201E, + FcitxKey_comma, FcitxKey_apostrophe, 0x201A, + FcitxKey_comma, FcitxKey_comma, 0x00B8, + FcitxKey_comma, FcitxKey_minus, 0x00AC, + FcitxKey_comma, FcitxKey_A, 0x0104, + FcitxKey_comma, FcitxKey_C, 0x00C7, + FcitxKey_comma, FcitxKey_D, 0x1E10, + FcitxKey_comma, FcitxKey_E, 0x0118, + FcitxKey_comma, FcitxKey_G, 0x0122, + FcitxKey_comma, FcitxKey_H, 0x1E28, + FcitxKey_comma, FcitxKey_I, 0x012E, + FcitxKey_comma, FcitxKey_K, 0x0136, + FcitxKey_comma, FcitxKey_L, 0x013B, + FcitxKey_comma, FcitxKey_N, 0x0145, + FcitxKey_comma, FcitxKey_R, 0x0156, + FcitxKey_comma, FcitxKey_S, 0x015E, + FcitxKey_comma, FcitxKey_T, 0x0162, + FcitxKey_comma, FcitxKey_U, 0x0172, + FcitxKey_comma, FcitxKey_a, 0x0105, + FcitxKey_comma, FcitxKey_c, 0x00E7, + FcitxKey_comma, FcitxKey_d, 0x1E11, + FcitxKey_comma, FcitxKey_e, 0x0119, + FcitxKey_comma, FcitxKey_g, 0x0123, + FcitxKey_comma, FcitxKey_h, 0x1E29, + FcitxKey_comma, FcitxKey_i, 0x012F, + FcitxKey_comma, FcitxKey_k, 0x0137, + FcitxKey_comma, FcitxKey_l, 0x013C, + FcitxKey_comma, FcitxKey_n, 0x0146, + FcitxKey_comma, FcitxKey_r, 0x0157, + FcitxKey_comma, FcitxKey_s, 0x015F, + FcitxKey_comma, FcitxKey_t, 0x0163, + FcitxKey_comma, FcitxKey_u, 0x0173, + FcitxKey_minus, FcitxKey_space, 0x007E, + FcitxKey_minus, FcitxKey_parenleft, 0x007B, + FcitxKey_minus, FcitxKey_parenright, 0x007D, + FcitxKey_minus, FcitxKey_plus, 0x00B1, + FcitxKey_minus, FcitxKey_comma, 0x00AC, + FcitxKey_minus, FcitxKey_colon, 0x00F7, + FcitxKey_minus, FcitxKey_A, 0x00C3, + FcitxKey_minus, FcitxKey_D, 0x0110, + FcitxKey_minus, FcitxKey_E, 0x0112, + FcitxKey_minus, FcitxKey_I, 0x012A, + FcitxKey_minus, FcitxKey_L, 0x00A3, + FcitxKey_minus, FcitxKey_N, 0x00D1, + FcitxKey_minus, FcitxKey_O, 0x00D5, + FcitxKey_minus, FcitxKey_U, 0x016A, + FcitxKey_minus, FcitxKey_Y, 0x00A5, + FcitxKey_minus, FcitxKey_asciicircum, 0x00AF, + FcitxKey_minus, FcitxKey_a, 0x00E3, + FcitxKey_minus, FcitxKey_d, 0x0111, + FcitxKey_minus, FcitxKey_e, 0x0113, + FcitxKey_minus, FcitxKey_i, 0x012B, + FcitxKey_minus, FcitxKey_l, 0x00A3, + FcitxKey_minus, FcitxKey_n, 0x00F1, + FcitxKey_minus, FcitxKey_o, 0x00F5, + FcitxKey_minus, FcitxKey_u, 0x016B, + FcitxKey_minus, FcitxKey_y, 0x00A5, + FcitxKey_period, FcitxKey_minus, 0x00B7, + FcitxKey_period, FcitxKey_period, 0x02D9, + FcitxKey_period, FcitxKey_less, 0x2039, + FcitxKey_period, FcitxKey_equal, 0x2022, + FcitxKey_period, FcitxKey_greater, 0x203A, + FcitxKey_period, FcitxKey_A, 0x0226, + FcitxKey_period, FcitxKey_B, 0x1E02, + FcitxKey_period, FcitxKey_C, 0x010A, + FcitxKey_period, FcitxKey_D, 0x1E0A, + FcitxKey_period, FcitxKey_E, 0x0116, + FcitxKey_period, FcitxKey_F, 0x1E1E, + FcitxKey_period, FcitxKey_G, 0x0120, + FcitxKey_period, FcitxKey_H, 0x1E22, + FcitxKey_period, FcitxKey_I, 0x0130, + FcitxKey_period, FcitxKey_M, 0x1E40, + FcitxKey_period, FcitxKey_N, 0x1E44, + FcitxKey_period, FcitxKey_O, 0x022E, + FcitxKey_period, FcitxKey_P, 0x1E56, + FcitxKey_period, FcitxKey_R, 0x1E58, + FcitxKey_period, FcitxKey_S, 0x1E60, + FcitxKey_period, FcitxKey_T, 0x1E6A, + FcitxKey_period, FcitxKey_W, 0x1E86, + FcitxKey_period, FcitxKey_X, 0x1E8A, + FcitxKey_period, FcitxKey_Y, 0x1E8E, + FcitxKey_period, FcitxKey_Z, 0x017B, + FcitxKey_period, FcitxKey_asciicircum, 0x00B7, + FcitxKey_period, FcitxKey_a, 0x0227, + FcitxKey_period, FcitxKey_b, 0x1E03, + FcitxKey_period, FcitxKey_c, 0x010B, + FcitxKey_period, FcitxKey_d, 0x1E0B, + FcitxKey_period, FcitxKey_e, 0x0117, + FcitxKey_period, FcitxKey_f, 0x1E1F, + FcitxKey_period, FcitxKey_g, 0x0121, + FcitxKey_period, FcitxKey_h, 0x1E23, + FcitxKey_period, FcitxKey_i, 0x0131, + FcitxKey_period, FcitxKey_m, 0x1E41, + FcitxKey_period, FcitxKey_n, 0x1E45, + FcitxKey_period, FcitxKey_o, 0x022F, + FcitxKey_period, FcitxKey_p, 0x1E57, + FcitxKey_period, FcitxKey_r, 0x1E59, + FcitxKey_period, FcitxKey_s, 0x1E61, + FcitxKey_period, FcitxKey_t, 0x1E6B, + FcitxKey_period, FcitxKey_w, 0x1E87, + FcitxKey_period, FcitxKey_x, 0x1E8B, + FcitxKey_period, FcitxKey_y, 0x1E8F, + FcitxKey_period, FcitxKey_z, 0x017C, + FcitxKey_period, 0x017F, 0x1E9B, + FcitxKey_period, FcitxKey_Sacute, 0x1E64, + FcitxKey_period, FcitxKey_Scaron, 0x1E66, + FcitxKey_period, FcitxKey_sacute, 0x1E65, + FcitxKey_period, FcitxKey_scaron, 0x1E67, + FcitxKey_period, 0x1E62, 0x1E68, + FcitxKey_period, 0x1E63, 0x1E69, + FcitxKey_slash, FcitxKey_slash, 0x005C, + FcitxKey_slash, FcitxKey_less, 0x005C, + FcitxKey_slash, FcitxKey_C, 0x00A2, + FcitxKey_slash, FcitxKey_D, 0x0110, + FcitxKey_slash, FcitxKey_G, 0x01E4, + FcitxKey_slash, FcitxKey_H, 0x0126, + FcitxKey_slash, FcitxKey_I, 0x0197, + FcitxKey_slash, FcitxKey_L, 0x0141, + FcitxKey_slash, FcitxKey_O, 0x00D8, + FcitxKey_slash, FcitxKey_T, 0x0166, + FcitxKey_slash, FcitxKey_U, 0x00B5, + FcitxKey_slash, FcitxKey_Z, 0x01B5, + FcitxKey_slash, FcitxKey_asciicircum, 0x007C, + FcitxKey_slash, FcitxKey_b, 0x0180, + FcitxKey_slash, FcitxKey_c, 0x00A2, + FcitxKey_slash, FcitxKey_d, 0x0111, + FcitxKey_slash, FcitxKey_g, 0x01E5, + FcitxKey_slash, FcitxKey_h, 0x0127, + FcitxKey_slash, FcitxKey_i, 0x0268, + FcitxKey_slash, FcitxKey_l, 0x0142, + FcitxKey_slash, FcitxKey_m, 0x20A5, + FcitxKey_slash, FcitxKey_o, 0x00F8, + FcitxKey_slash, FcitxKey_t, 0x0167, + FcitxKey_slash, FcitxKey_u, 0x00B5, + FcitxKey_slash, FcitxKey_z, 0x01B6, + FcitxKey_slash, 0x0294, 0x02A1, + FcitxKey_slash, 0x04AE, 0x04B0, + FcitxKey_slash, 0x04AF, 0x04B1, + FcitxKey_slash, FcitxKey_Cyrillic_ghe, 0x0493, + FcitxKey_slash, FcitxKey_Cyrillic_ka, 0x049F, + FcitxKey_slash, FcitxKey_Cyrillic_GHE, 0x0492, + FcitxKey_slash, FcitxKey_Cyrillic_KA, 0x049E, + FcitxKey_slash, FcitxKey_leftarrow, 0x219A, + FcitxKey_slash, FcitxKey_rightarrow, 0x219B, + FcitxKey_slash, 0x2194, 0x21AE, + FcitxKey_0, FcitxKey_asterisk, 0x00B0, + FcitxKey_0, FcitxKey_C, 0x00A9, + FcitxKey_0, FcitxKey_S, 0x00A7, + FcitxKey_0, FcitxKey_X, 0x00A4, + FcitxKey_0, FcitxKey_asciicircum, 0x00B0, + FcitxKey_0, FcitxKey_c, 0x00A9, + FcitxKey_0, FcitxKey_s, 0x00A7, + FcitxKey_0, FcitxKey_x, 0x00A4, + FcitxKey_1, FcitxKey_2, 0x00BD, + FcitxKey_1, FcitxKey_3, 0x2153, + FcitxKey_1, FcitxKey_4, 0x00BC, + FcitxKey_1, FcitxKey_5, 0x2155, + FcitxKey_1, FcitxKey_6, 0x2159, + FcitxKey_1, FcitxKey_8, 0x215B, + FcitxKey_1, FcitxKey_S, 0x00B9, + FcitxKey_1, FcitxKey_asciicircum, 0x00B9, + FcitxKey_1, FcitxKey_s, 0x00B9, + FcitxKey_2, FcitxKey_3, 0x2154, + FcitxKey_2, FcitxKey_5, 0x2156, + FcitxKey_2, FcitxKey_S, 0x00B2, + FcitxKey_2, FcitxKey_asciicircum, 0x00B2, + FcitxKey_2, FcitxKey_s, 0x00B2, + FcitxKey_3, FcitxKey_4, 0x00BE, + FcitxKey_3, FcitxKey_5, 0x2157, + FcitxKey_3, FcitxKey_8, 0x215C, + FcitxKey_3, FcitxKey_S, 0x00B3, + FcitxKey_3, FcitxKey_asciicircum, 0x00B3, + FcitxKey_3, FcitxKey_s, 0x00B3, + FcitxKey_4, FcitxKey_5, 0x2158, + FcitxKey_5, FcitxKey_6, 0x215A, + FcitxKey_5, FcitxKey_8, 0x215D, + FcitxKey_7, FcitxKey_8, 0x215E, + FcitxKey_colon, FcitxKey_minus, 0x00F7, + FcitxKey_semicolon, FcitxKey_A, 0x0104, + FcitxKey_semicolon, FcitxKey_E, 0x0118, + FcitxKey_semicolon, FcitxKey_I, 0x012E, + FcitxKey_semicolon, FcitxKey_O, 0x01EA, + FcitxKey_semicolon, FcitxKey_U, 0x0172, + FcitxKey_semicolon, FcitxKey_a, 0x0105, + FcitxKey_semicolon, FcitxKey_e, 0x0119, + FcitxKey_semicolon, FcitxKey_i, 0x012F, + FcitxKey_semicolon, FcitxKey_o, 0x01EB, + FcitxKey_semicolon, FcitxKey_u, 0x0173, + FcitxKey_less, FcitxKey_space, 0x02C7, + FcitxKey_less, FcitxKey_quotedbl, 0x201C, + FcitxKey_less, FcitxKey_apostrophe, 0x2018, + FcitxKey_less, FcitxKey_slash, 0x005C, + FcitxKey_less, FcitxKey_less, 0x00AB, + FcitxKey_less, FcitxKey_C, 0x010C, + FcitxKey_less, FcitxKey_D, 0x010E, + FcitxKey_less, FcitxKey_E, 0x011A, + FcitxKey_less, FcitxKey_L, 0x013D, + FcitxKey_less, FcitxKey_N, 0x0147, + FcitxKey_less, FcitxKey_R, 0x0158, + FcitxKey_less, FcitxKey_S, 0x0160, + FcitxKey_less, FcitxKey_T, 0x0164, + FcitxKey_less, FcitxKey_Z, 0x017D, + FcitxKey_less, FcitxKey_c, 0x010D, + FcitxKey_less, FcitxKey_d, 0x010F, + FcitxKey_less, FcitxKey_e, 0x011B, + FcitxKey_less, FcitxKey_l, 0x013E, + FcitxKey_less, FcitxKey_n, 0x0148, + FcitxKey_less, FcitxKey_r, 0x0159, + FcitxKey_less, FcitxKey_s, 0x0161, + FcitxKey_less, FcitxKey_t, 0x0165, + FcitxKey_less, FcitxKey_z, 0x017E, + FcitxKey_less, 0x0338, 0x226E, + FcitxKey_equal, FcitxKey_C, 0x20AC, + FcitxKey_equal, FcitxKey_E, 0x20AC, + FcitxKey_equal, FcitxKey_L, 0x00A3, + FcitxKey_equal, FcitxKey_N, 0x20A6, + FcitxKey_equal, FcitxKey_O, 0x0150, + FcitxKey_equal, FcitxKey_U, 0x0170, + FcitxKey_equal, FcitxKey_W, 0x20A9, + FcitxKey_equal, FcitxKey_Y, 0x00A5, + FcitxKey_equal, FcitxKey_c, 0x20AC, + FcitxKey_equal, FcitxKey_e, 0x20AC, + FcitxKey_equal, FcitxKey_l, 0x00A3, + FcitxKey_equal, FcitxKey_o, 0x0151, + FcitxKey_equal, FcitxKey_u, 0x0171, + FcitxKey_equal, FcitxKey_y, 0x00A5, + FcitxKey_equal, 0x0338, 0x2260, + FcitxKey_equal, FcitxKey_Cyrillic_u, 0x04F3, + FcitxKey_equal, FcitxKey_Cyrillic_IE, 0x20AC, + FcitxKey_equal, FcitxKey_Cyrillic_ES, 0x20AC, + FcitxKey_equal, FcitxKey_Cyrillic_U, 0x04F2, + FcitxKey_greater, FcitxKey_space, 0x005E, + FcitxKey_greater, FcitxKey_quotedbl, 0x201D, + FcitxKey_greater, FcitxKey_apostrophe, 0x2019, + FcitxKey_greater, FcitxKey_greater, 0x00BB, + FcitxKey_greater, FcitxKey_A, 0x00C2, + FcitxKey_greater, FcitxKey_E, 0x00CA, + FcitxKey_greater, FcitxKey_I, 0x00CE, + FcitxKey_greater, FcitxKey_O, 0x00D4, + FcitxKey_greater, FcitxKey_U, 0x00DB, + FcitxKey_greater, FcitxKey_a, 0x00E2, + FcitxKey_greater, FcitxKey_e, 0x00EA, + FcitxKey_greater, FcitxKey_i, 0x00EE, + FcitxKey_greater, FcitxKey_o, 0x00F4, + FcitxKey_greater, FcitxKey_u, 0x00FB, + FcitxKey_greater, 0x0338, 0x226F, + FcitxKey_question, FcitxKey_exclam, 0x203D, + FcitxKey_question, FcitxKey_question, 0x00BF, + FcitxKey_question, FcitxKey_A, 0x1EA2, + FcitxKey_question, FcitxKey_E, 0x1EBA, + FcitxKey_question, FcitxKey_I, 0x1EC8, + FcitxKey_question, FcitxKey_O, 0x1ECE, + FcitxKey_question, FcitxKey_U, 0x1EE6, + FcitxKey_question, FcitxKey_Y, 0x1EF6, + FcitxKey_question, FcitxKey_a, 0x1EA3, + FcitxKey_question, FcitxKey_e, 0x1EBB, + FcitxKey_question, FcitxKey_i, 0x1EC9, + FcitxKey_question, FcitxKey_o, 0x1ECF, + FcitxKey_question, FcitxKey_u, 0x1EE7, + FcitxKey_question, FcitxKey_y, 0x1EF7, + FcitxKey_question, FcitxKey_Acircumflex, 0x1EA8, + FcitxKey_question, FcitxKey_Ecircumflex, 0x1EC2, + FcitxKey_question, FcitxKey_Ocircumflex, 0x1ED4, + FcitxKey_question, FcitxKey_acircumflex, 0x1EA9, + FcitxKey_question, FcitxKey_ecircumflex, 0x1EC3, + FcitxKey_question, FcitxKey_ocircumflex, 0x1ED5, + FcitxKey_question, FcitxKey_Ohorn, 0x1EDE, + FcitxKey_question, FcitxKey_ohorn, 0x1EDF, + FcitxKey_question, FcitxKey_Uhorn, 0x1EEC, + FcitxKey_question, FcitxKey_uhorn, 0x1EED, + FcitxKey_question, FcitxKey_Abreve, 0x1EB2, + FcitxKey_question, FcitxKey_abreve, 0x1EB3, + FcitxKey_A, FcitxKey_quotedbl, 0x00C4, + FcitxKey_A, FcitxKey_apostrophe, 0x00C1, + FcitxKey_A, FcitxKey_parenleft, 0x0102, + FcitxKey_A, FcitxKey_asterisk, 0x00C5, + FcitxKey_A, FcitxKey_comma, 0x0104, + FcitxKey_A, FcitxKey_minus, 0x00C3, + FcitxKey_A, FcitxKey_greater, 0x00C2, + FcitxKey_A, FcitxKey_A, 0x00C5, + FcitxKey_A, FcitxKey_E, 0x00C6, + FcitxKey_A, FcitxKey_T, 0x0040, + FcitxKey_A, FcitxKey_asciicircum, 0x00C2, + FcitxKey_A, FcitxKey_underscore, 0x00AA, + FcitxKey_A, FcitxKey_grave, 0x00C0, + FcitxKey_A, FcitxKey_asciitilde, 0x00C3, + FcitxKey_A, FcitxKey_diaeresis, 0x00C4, + FcitxKey_A, FcitxKey_acute, 0x00C1, + FcitxKey_B, FcitxKey_period, 0x1E02, + FcitxKey_C, FcitxKey_apostrophe, 0x0106, + FcitxKey_C, FcitxKey_comma, 0x00C7, + FcitxKey_C, FcitxKey_period, 0x010A, + FcitxKey_C, FcitxKey_slash, 0x00A2, + FcitxKey_C, FcitxKey_0, 0x00A9, + FcitxKey_C, FcitxKey_less, 0x010C, + FcitxKey_C, FcitxKey_equal, 0x20AC, + FcitxKey_C, FcitxKey_E, 0x20A0, + FcitxKey_C, FcitxKey_O, 0x00A9, + FcitxKey_C, FcitxKey_o, 0x00A9, + FcitxKey_C, FcitxKey_r, 0x20A2, + FcitxKey_C, FcitxKey_bar, 0x00A2, + FcitxKey_D, FcitxKey_minus, 0x0110, + FcitxKey_D, FcitxKey_period, 0x1E0A, + FcitxKey_D, FcitxKey_less, 0x010E, + FcitxKey_D, FcitxKey_H, 0x00D0, + FcitxKey_E, FcitxKey_quotedbl, 0x00CB, + FcitxKey_E, FcitxKey_apostrophe, 0x00C9, + FcitxKey_E, FcitxKey_comma, 0x0118, + FcitxKey_E, FcitxKey_minus, 0x0112, + FcitxKey_E, FcitxKey_period, 0x0116, + FcitxKey_E, FcitxKey_less, 0x011A, + FcitxKey_E, FcitxKey_equal, 0x20AC, + FcitxKey_E, FcitxKey_greater, 0x00CA, + FcitxKey_E, FcitxKey_asciicircum, 0x00CA, + FcitxKey_E, FcitxKey_underscore, 0x0112, + FcitxKey_E, FcitxKey_grave, 0x00C8, + FcitxKey_E, FcitxKey_diaeresis, 0x00CB, + FcitxKey_E, FcitxKey_acute, 0x00C9, + FcitxKey_F, FcitxKey_period, 0x1E1E, + FcitxKey_F, FcitxKey_r, 0x20A3, + FcitxKey_G, FcitxKey_parenleft, 0x011E, + FcitxKey_G, FcitxKey_comma, 0x0122, + FcitxKey_G, FcitxKey_period, 0x0120, + FcitxKey_G, FcitxKey_U, 0x011E, + FcitxKey_G, FcitxKey_breve, 0x011E, + FcitxKey_I, FcitxKey_quotedbl, 0x00CF, + FcitxKey_I, FcitxKey_apostrophe, 0x00CD, + FcitxKey_I, FcitxKey_comma, 0x012E, + FcitxKey_I, FcitxKey_minus, 0x012A, + FcitxKey_I, FcitxKey_period, 0x0130, + FcitxKey_I, FcitxKey_greater, 0x00CE, + FcitxKey_I, FcitxKey_asciicircum, 0x00CE, + FcitxKey_I, FcitxKey_underscore, 0x012A, + FcitxKey_I, FcitxKey_grave, 0x00CC, + FcitxKey_I, FcitxKey_asciitilde, 0x0128, + FcitxKey_I, FcitxKey_diaeresis, 0x00CF, + FcitxKey_I, FcitxKey_acute, 0x00CD, + FcitxKey_K, FcitxKey_comma, 0x0136, + FcitxKey_L, FcitxKey_apostrophe, 0x0139, + FcitxKey_L, FcitxKey_comma, 0x013B, + FcitxKey_L, FcitxKey_minus, 0x00A3, + FcitxKey_L, FcitxKey_slash, 0x0141, + FcitxKey_L, FcitxKey_less, 0x013D, + FcitxKey_L, FcitxKey_equal, 0x00A3, + FcitxKey_L, FcitxKey_V, 0x007C, + FcitxKey_M, FcitxKey_period, 0x1E40, + FcitxKey_N, FcitxKey_apostrophe, 0x0143, + FcitxKey_N, FcitxKey_comma, 0x0145, + FcitxKey_N, FcitxKey_minus, 0x00D1, + FcitxKey_N, FcitxKey_less, 0x0147, + FcitxKey_N, FcitxKey_equal, 0x20A6, + FcitxKey_N, FcitxKey_G, 0x014A, + FcitxKey_N, FcitxKey_O, 0x2116, + FcitxKey_N, FcitxKey_o, 0x2116, + FcitxKey_N, FcitxKey_asciitilde, 0x00D1, + FcitxKey_O, FcitxKey_quotedbl, 0x00D6, + FcitxKey_O, FcitxKey_apostrophe, 0x00D3, + FcitxKey_O, FcitxKey_minus, 0x00D5, + FcitxKey_O, FcitxKey_slash, 0x00D8, + FcitxKey_O, FcitxKey_greater, 0x00D4, + FcitxKey_O, FcitxKey_C, 0x00A9, + FcitxKey_O, FcitxKey_E, 0x0152, + FcitxKey_O, FcitxKey_R, 0x00AE, + FcitxKey_O, FcitxKey_S, 0x00A7, + FcitxKey_O, FcitxKey_X, 0x00A4, + FcitxKey_O, FcitxKey_asciicircum, 0x00D4, + FcitxKey_O, FcitxKey_underscore, 0x00BA, + FcitxKey_O, FcitxKey_grave, 0x00D2, + FcitxKey_O, FcitxKey_c, 0x00A9, + FcitxKey_O, FcitxKey_r, 0x00AE, + FcitxKey_O, FcitxKey_x, 0x00A4, + FcitxKey_O, FcitxKey_asciitilde, 0x00D5, + FcitxKey_O, FcitxKey_diaeresis, 0x00D6, + FcitxKey_O, FcitxKey_acute, 0x00D3, + FcitxKey_P, FcitxKey_exclam, 0x00B6, + FcitxKey_P, FcitxKey_period, 0x1E56, + FcitxKey_P, FcitxKey_P, 0x00B6, + FcitxKey_P, FcitxKey_t, 0x20A7, + FcitxKey_R, FcitxKey_apostrophe, 0x0154, + FcitxKey_R, FcitxKey_comma, 0x0156, + FcitxKey_R, FcitxKey_less, 0x0158, + FcitxKey_R, FcitxKey_O, 0x00AE, + FcitxKey_R, FcitxKey_s, 0x20A8, + FcitxKey_S, FcitxKey_exclam, 0x00A7, + FcitxKey_S, FcitxKey_apostrophe, 0x015A, + FcitxKey_S, FcitxKey_comma, 0x015E, + FcitxKey_S, FcitxKey_period, 0x1E60, + FcitxKey_S, FcitxKey_0, 0x00A7, + FcitxKey_S, FcitxKey_1, 0x00B9, + FcitxKey_S, FcitxKey_2, 0x00B2, + FcitxKey_S, FcitxKey_3, 0x00B3, + FcitxKey_S, FcitxKey_less, 0x0160, + FcitxKey_S, FcitxKey_M, 0x2120, + FcitxKey_S, FcitxKey_O, 0x00A7, + FcitxKey_S, FcitxKey_m, 0x2120, + FcitxKey_S, FcitxKey_cedilla, 0x015E, + FcitxKey_T, FcitxKey_minus, 0x0166, + FcitxKey_T, FcitxKey_period, 0x1E6A, + FcitxKey_T, FcitxKey_slash, 0x0166, + FcitxKey_T, FcitxKey_less, 0x0164, + FcitxKey_T, FcitxKey_H, 0x00DE, + FcitxKey_T, FcitxKey_M, 0x2122, + FcitxKey_T, FcitxKey_m, 0x2122, + FcitxKey_U, FcitxKey_quotedbl, 0x00DC, + FcitxKey_U, FcitxKey_apostrophe, 0x00DA, + FcitxKey_U, FcitxKey_asterisk, 0x016E, + FcitxKey_U, FcitxKey_comma, 0x0172, + FcitxKey_U, FcitxKey_minus, 0x016A, + FcitxKey_U, FcitxKey_slash, 0x00B5, + FcitxKey_U, FcitxKey_greater, 0x00DB, + FcitxKey_U, FcitxKey_A, 0x0102, + FcitxKey_U, FcitxKey_E, 0x0114, + FcitxKey_U, FcitxKey_G, 0x011E, + FcitxKey_U, FcitxKey_I, 0x012C, + FcitxKey_U, FcitxKey_O, 0x014E, + FcitxKey_U, FcitxKey_U, 0x016C, + FcitxKey_U, FcitxKey_asciicircum, 0x00DB, + FcitxKey_U, FcitxKey_underscore, 0x016A, + FcitxKey_U, FcitxKey_grave, 0x00D9, + FcitxKey_U, FcitxKey_a, 0x0103, + FcitxKey_U, FcitxKey_e, 0x0115, + FcitxKey_U, FcitxKey_g, 0x011F, + FcitxKey_U, FcitxKey_i, 0x012D, + FcitxKey_U, FcitxKey_o, 0x014F, + FcitxKey_U, FcitxKey_u, 0x016D, + FcitxKey_U, FcitxKey_asciitilde, 0x0168, + FcitxKey_U, FcitxKey_diaeresis, 0x00DC, + FcitxKey_U, FcitxKey_acute, 0x00DA, + FcitxKey_U, 0x0228, 0x1E1C, + FcitxKey_U, 0x0229, 0x1E1D, + FcitxKey_U, FcitxKey_Cyrillic_a, 0x04D1, + FcitxKey_U, FcitxKey_Cyrillic_ie, 0x04D7, + FcitxKey_U, FcitxKey_Cyrillic_i, 0x0439, + FcitxKey_U, FcitxKey_Cyrillic_u, 0x045E, + FcitxKey_U, FcitxKey_Cyrillic_zhe, 0x04C2, + FcitxKey_U, FcitxKey_Cyrillic_A, 0x04D0, + FcitxKey_U, FcitxKey_Cyrillic_IE, 0x04D6, + FcitxKey_U, FcitxKey_Cyrillic_I, 0x0419, + FcitxKey_U, FcitxKey_Cyrillic_U, 0x040E, + FcitxKey_U, FcitxKey_Cyrillic_ZHE, 0x04C1, + FcitxKey_U, FcitxKey_Greek_ALPHA, 0x1FB8, + FcitxKey_U, FcitxKey_Greek_IOTA, 0x1FD8, + FcitxKey_U, FcitxKey_Greek_UPSILON, 0x1FE8, + FcitxKey_U, FcitxKey_Greek_alpha, 0x1FB0, + FcitxKey_U, FcitxKey_Greek_iota, 0x1FD0, + FcitxKey_U, FcitxKey_Greek_upsilon, 0x1FE0, + FcitxKey_U, 0x1EA0, 0x1EB6, + FcitxKey_U, 0x1EA1, 0x1EB7, + FcitxKey_V, FcitxKey_L, 0x007C, + FcitxKey_W, FcitxKey_equal, 0x20A9, + FcitxKey_W, FcitxKey_asciicircum, 0x0174, + FcitxKey_X, FcitxKey_0, 0x00A4, + FcitxKey_X, FcitxKey_O, 0x00A4, + FcitxKey_X, FcitxKey_o, 0x00A4, + FcitxKey_Y, FcitxKey_quotedbl, 0x0178, + FcitxKey_Y, FcitxKey_apostrophe, 0x00DD, + FcitxKey_Y, FcitxKey_minus, 0x00A5, + FcitxKey_Y, FcitxKey_equal, 0x00A5, + FcitxKey_Y, FcitxKey_asciicircum, 0x0176, + FcitxKey_Y, FcitxKey_diaeresis, 0x0178, + FcitxKey_Y, FcitxKey_acute, 0x00DD, + FcitxKey_Z, FcitxKey_apostrophe, 0x0179, + FcitxKey_Z, FcitxKey_period, 0x017B, + FcitxKey_Z, FcitxKey_less, 0x017D, + FcitxKey_asciicircum, FcitxKey_space, 0x005E, + FcitxKey_asciicircum, FcitxKey_parenleft, 0x207D, + FcitxKey_asciicircum, FcitxKey_parenright, 0x207E, + FcitxKey_asciicircum, FcitxKey_plus, 0x207A, + FcitxKey_asciicircum, FcitxKey_minus, 0x00AF, + FcitxKey_asciicircum, FcitxKey_period, 0x00B7, + FcitxKey_asciicircum, FcitxKey_slash, 0x007C, + FcitxKey_asciicircum, FcitxKey_0, 0x00B0, + FcitxKey_asciicircum, FcitxKey_1, 0x00B9, + FcitxKey_asciicircum, FcitxKey_2, 0x00B2, + FcitxKey_asciicircum, FcitxKey_3, 0x00B3, + FcitxKey_asciicircum, FcitxKey_4, 0x2074, + FcitxKey_asciicircum, FcitxKey_5, 0x2075, + FcitxKey_asciicircum, FcitxKey_6, 0x2076, + FcitxKey_asciicircum, FcitxKey_7, 0x2077, + FcitxKey_asciicircum, FcitxKey_8, 0x2078, + FcitxKey_asciicircum, FcitxKey_9, 0x2079, + FcitxKey_asciicircum, FcitxKey_equal, 0x207C, + FcitxKey_asciicircum, FcitxKey_A, 0x00C2, + FcitxKey_asciicircum, FcitxKey_C, 0x0108, + FcitxKey_asciicircum, FcitxKey_E, 0x00CA, + FcitxKey_asciicircum, FcitxKey_G, 0x011C, + FcitxKey_asciicircum, FcitxKey_H, 0x0124, + FcitxKey_asciicircum, FcitxKey_I, 0x00CE, + FcitxKey_asciicircum, FcitxKey_J, 0x0134, + FcitxKey_asciicircum, FcitxKey_O, 0x00D4, + FcitxKey_asciicircum, FcitxKey_S, 0x015C, + FcitxKey_asciicircum, FcitxKey_U, 0x00DB, + FcitxKey_asciicircum, FcitxKey_W, 0x0174, + FcitxKey_asciicircum, FcitxKey_Y, 0x0176, + FcitxKey_asciicircum, FcitxKey_Z, 0x1E90, + FcitxKey_asciicircum, FcitxKey_underscore, 0x00AF, + FcitxKey_asciicircum, FcitxKey_a, 0x00E2, + FcitxKey_asciicircum, FcitxKey_c, 0x0109, + FcitxKey_asciicircum, FcitxKey_e, 0x00EA, + FcitxKey_asciicircum, FcitxKey_g, 0x011D, + FcitxKey_asciicircum, FcitxKey_h, 0x0125, + FcitxKey_asciicircum, FcitxKey_i, 0x00EE, + FcitxKey_asciicircum, FcitxKey_j, 0x0135, + FcitxKey_asciicircum, FcitxKey_o, 0x00F4, + FcitxKey_asciicircum, FcitxKey_s, 0x015D, + FcitxKey_asciicircum, FcitxKey_u, 0x00FB, + FcitxKey_asciicircum, FcitxKey_w, 0x0175, + FcitxKey_asciicircum, FcitxKey_y, 0x0177, + FcitxKey_asciicircum, FcitxKey_z, 0x1E91, + FcitxKey_asciicircum, 0x1EA0, 0x1EAC, + FcitxKey_asciicircum, 0x1EA1, 0x1EAD, + FcitxKey_asciicircum, 0x1EB8, 0x1EC6, + FcitxKey_asciicircum, 0x1EB9, 0x1EC7, + FcitxKey_asciicircum, 0x1ECC, 0x1ED8, + FcitxKey_asciicircum, 0x1ECD, 0x1ED9, + FcitxKey_asciicircum, 0x2212, 0x207B, + FcitxKey_asciicircum, 0x4E00, 0x3192, + FcitxKey_asciicircum, 0x4E01, 0x319C, + FcitxKey_asciicircum, 0x4E09, 0x3194, + FcitxKey_asciicircum, 0x4E0A, 0x3196, + FcitxKey_asciicircum, 0x4E0B, 0x3198, + FcitxKey_asciicircum, 0x4E19, 0x319B, + FcitxKey_asciicircum, 0x4E2D, 0x3197, + FcitxKey_asciicircum, 0x4E59, 0x319A, + FcitxKey_asciicircum, 0x4E8C, 0x3193, + FcitxKey_asciicircum, 0x4EBA, 0x319F, + FcitxKey_asciicircum, 0x56DB, 0x3195, + FcitxKey_asciicircum, 0x5730, 0x319E, + FcitxKey_asciicircum, 0x5929, 0x319D, + FcitxKey_asciicircum, 0x7532, 0x3199, + FcitxKey_asciicircum, FcitxKey_KP_Space, 0x00B2, + FcitxKey_asciicircum, FcitxKey_KP_Add, 0x207A, + FcitxKey_asciicircum, FcitxKey_KP_0, 0x2070, + FcitxKey_asciicircum, FcitxKey_KP_1, 0x00B9, + FcitxKey_asciicircum, FcitxKey_KP_2, 0x00B2, + FcitxKey_asciicircum, FcitxKey_KP_3, 0x00B3, + FcitxKey_asciicircum, FcitxKey_KP_4, 0x2074, + FcitxKey_asciicircum, FcitxKey_KP_5, 0x2075, + FcitxKey_asciicircum, FcitxKey_KP_6, 0x2076, + FcitxKey_asciicircum, FcitxKey_KP_7, 0x2077, + FcitxKey_asciicircum, FcitxKey_KP_8, 0x2078, + FcitxKey_asciicircum, FcitxKey_KP_9, 0x2079, + FcitxKey_asciicircum, FcitxKey_KP_Equal, 0x207C, + FcitxKey_underscore, FcitxKey_parenleft, 0x208D, + FcitxKey_underscore, FcitxKey_parenright, 0x208E, + FcitxKey_underscore, FcitxKey_plus, 0x208A, + FcitxKey_underscore, FcitxKey_0, 0x2080, + FcitxKey_underscore, FcitxKey_1, 0x2081, + FcitxKey_underscore, FcitxKey_2, 0x2082, + FcitxKey_underscore, FcitxKey_3, 0x2083, + FcitxKey_underscore, FcitxKey_4, 0x2084, + FcitxKey_underscore, FcitxKey_5, 0x2085, + FcitxKey_underscore, FcitxKey_6, 0x2086, + FcitxKey_underscore, FcitxKey_7, 0x2087, + FcitxKey_underscore, FcitxKey_8, 0x2088, + FcitxKey_underscore, FcitxKey_9, 0x2089, + FcitxKey_underscore, FcitxKey_equal, 0x208C, + FcitxKey_underscore, FcitxKey_A, 0x00AA, + FcitxKey_underscore, FcitxKey_E, 0x0112, + FcitxKey_underscore, FcitxKey_G, 0x1E20, + FcitxKey_underscore, FcitxKey_I, 0x012A, + FcitxKey_underscore, FcitxKey_O, 0x00BA, + FcitxKey_underscore, FcitxKey_U, 0x016A, + FcitxKey_underscore, FcitxKey_Y, 0x0232, + FcitxKey_underscore, FcitxKey_asciicircum, 0x00AF, + FcitxKey_underscore, FcitxKey_underscore, 0x00AF, + FcitxKey_underscore, FcitxKey_a, 0x00AA, + FcitxKey_underscore, FcitxKey_e, 0x0113, + FcitxKey_underscore, FcitxKey_g, 0x1E21, + FcitxKey_underscore, FcitxKey_i, 0x012B, + FcitxKey_underscore, FcitxKey_o, 0x00BA, + FcitxKey_underscore, FcitxKey_u, 0x016B, + FcitxKey_underscore, FcitxKey_y, 0x0233, + FcitxKey_underscore, FcitxKey_Adiaeresis, 0x01DE, + FcitxKey_underscore, FcitxKey_AE, 0x01E2, + FcitxKey_underscore, FcitxKey_Otilde, 0x022C, + FcitxKey_underscore, FcitxKey_Odiaeresis, 0x022A, + FcitxKey_underscore, 0x00DC, 0x01D5, + FcitxKey_underscore, FcitxKey_adiaeresis, 0x01DF, + FcitxKey_underscore, FcitxKey_ae, 0x01E3, + FcitxKey_underscore, FcitxKey_otilde, 0x022D, + FcitxKey_underscore, FcitxKey_odiaeresis, 0x022B, + FcitxKey_underscore, FcitxKey_udiaeresis, 0x01D6, + FcitxKey_underscore, 0x01EA, 0x01EC, + FcitxKey_underscore, 0x01EB, 0x01ED, + FcitxKey_underscore, 0x0226, 0x01E0, + FcitxKey_underscore, 0x0227, 0x01E1, + FcitxKey_underscore, 0x022E, 0x0230, + FcitxKey_underscore, 0x022F, 0x0231, + FcitxKey_underscore, FcitxKey_Cyrillic_i, 0x04E3, + FcitxKey_underscore, FcitxKey_Cyrillic_u, 0x04EF, + FcitxKey_underscore, FcitxKey_Cyrillic_I, 0x04E2, + FcitxKey_underscore, FcitxKey_Cyrillic_U, 0x04EE, + FcitxKey_underscore, FcitxKey_Greek_ALPHA, 0x1FB9, + FcitxKey_underscore, FcitxKey_Greek_IOTA, 0x1FD9, + FcitxKey_underscore, FcitxKey_Greek_UPSILON, 0x1FE9, + FcitxKey_underscore, FcitxKey_Greek_alpha, 0x1FB1, + FcitxKey_underscore, FcitxKey_Greek_iota, 0x1FD1, + FcitxKey_underscore, FcitxKey_Greek_upsilon, 0x1FE1, + FcitxKey_underscore, 0x1E36, 0x1E38, + FcitxKey_underscore, 0x1E37, 0x1E39, + FcitxKey_underscore, 0x1E5A, 0x1E5C, + FcitxKey_underscore, 0x1E5B, 0x1E5D, + FcitxKey_underscore, 0x2212, 0x208B, + FcitxKey_underscore, FcitxKey_KP_Space, 0x2082, + FcitxKey_underscore, FcitxKey_KP_Add, 0x208A, + FcitxKey_underscore, FcitxKey_KP_0, 0x2080, + FcitxKey_underscore, FcitxKey_KP_1, 0x2081, + FcitxKey_underscore, FcitxKey_KP_2, 0x2082, + FcitxKey_underscore, FcitxKey_KP_3, 0x2083, + FcitxKey_underscore, FcitxKey_KP_4, 0x2084, + FcitxKey_underscore, FcitxKey_KP_5, 0x2085, + FcitxKey_underscore, FcitxKey_KP_6, 0x2086, + FcitxKey_underscore, FcitxKey_KP_7, 0x2087, + FcitxKey_underscore, FcitxKey_KP_8, 0x2088, + FcitxKey_underscore, FcitxKey_KP_9, 0x2089, + FcitxKey_underscore, FcitxKey_KP_Equal, 0x208C, + FcitxKey_grave, FcitxKey_space, 0x0060, + FcitxKey_grave, FcitxKey_A, 0x00C0, + FcitxKey_grave, FcitxKey_E, 0x00C8, + FcitxKey_grave, FcitxKey_I, 0x00CC, + FcitxKey_grave, FcitxKey_N, 0x01F8, + FcitxKey_grave, FcitxKey_O, 0x00D2, + FcitxKey_grave, FcitxKey_U, 0x00D9, + FcitxKey_grave, FcitxKey_W, 0x1E80, + FcitxKey_grave, FcitxKey_Y, 0x1EF2, + FcitxKey_grave, FcitxKey_a, 0x00E0, + FcitxKey_grave, FcitxKey_e, 0x00E8, + FcitxKey_grave, FcitxKey_i, 0x00EC, + FcitxKey_grave, FcitxKey_n, 0x01F9, + FcitxKey_grave, FcitxKey_o, 0x00F2, + FcitxKey_grave, FcitxKey_u, 0x00F9, + FcitxKey_grave, FcitxKey_w, 0x1E81, + FcitxKey_grave, FcitxKey_y, 0x1EF3, + FcitxKey_grave, FcitxKey_Acircumflex, 0x1EA6, + FcitxKey_grave, FcitxKey_Ecircumflex, 0x1EC0, + FcitxKey_grave, FcitxKey_Ocircumflex, 0x1ED2, + FcitxKey_grave, 0x00DC, 0x01DB, + FcitxKey_grave, FcitxKey_acircumflex, 0x1EA7, + FcitxKey_grave, FcitxKey_ecircumflex, 0x1EC1, + FcitxKey_grave, FcitxKey_ocircumflex, 0x1ED3, + FcitxKey_grave, FcitxKey_udiaeresis, 0x01DC, + FcitxKey_grave, FcitxKey_Ohorn, 0x1EDC, + FcitxKey_grave, FcitxKey_ohorn, 0x1EDD, + FcitxKey_grave, FcitxKey_Uhorn, 0x1EEA, + FcitxKey_grave, FcitxKey_uhorn, 0x1EEB, + FcitxKey_grave, FcitxKey_Abreve, 0x1EB0, + FcitxKey_grave, FcitxKey_abreve, 0x1EB1, + FcitxKey_grave, FcitxKey_Emacron, 0x1E14, + FcitxKey_grave, FcitxKey_emacron, 0x1E15, + FcitxKey_grave, FcitxKey_Omacron, 0x1E50, + FcitxKey_grave, FcitxKey_omacron, 0x1E51, + FcitxKey_grave, FcitxKey_Cyrillic_ie, 0x0450, + FcitxKey_grave, FcitxKey_Cyrillic_i, 0x045D, + FcitxKey_grave, FcitxKey_Cyrillic_IE, 0x0400, + FcitxKey_grave, FcitxKey_Cyrillic_I, 0x040D, + FcitxKey_grave, FcitxKey_Greek_iotadieresis, 0x1FD2, + FcitxKey_grave, FcitxKey_Greek_upsilondieresis, 0x1FE2, + FcitxKey_grave, FcitxKey_Greek_ALPHA, 0x1FBA, + FcitxKey_grave, FcitxKey_Greek_EPSILON, 0x1FC8, + FcitxKey_grave, FcitxKey_Greek_ETA, 0x1FCA, + FcitxKey_grave, FcitxKey_Greek_IOTA, 0x1FDA, + FcitxKey_grave, FcitxKey_Greek_OMICRON, 0x1FF8, + FcitxKey_grave, FcitxKey_Greek_UPSILON, 0x1FEA, + FcitxKey_grave, FcitxKey_Greek_OMEGA, 0x1FFA, + FcitxKey_grave, FcitxKey_Greek_alpha, 0x1F70, + FcitxKey_grave, FcitxKey_Greek_epsilon, 0x1F72, + FcitxKey_grave, FcitxKey_Greek_eta, 0x1F74, + FcitxKey_grave, FcitxKey_Greek_iota, 0x1F76, + FcitxKey_grave, FcitxKey_Greek_omicron, 0x1F78, + FcitxKey_grave, FcitxKey_Greek_upsilon, 0x1F7A, + FcitxKey_grave, FcitxKey_Greek_omega, 0x1F7C, + FcitxKey_grave, 0x1F00, 0x1F02, + FcitxKey_grave, 0x1F01, 0x1F03, + FcitxKey_grave, 0x1F08, 0x1F0A, + FcitxKey_grave, 0x1F09, 0x1F0B, + FcitxKey_grave, 0x1F10, 0x1F12, + FcitxKey_grave, 0x1F11, 0x1F13, + FcitxKey_grave, 0x1F18, 0x1F1A, + FcitxKey_grave, 0x1F19, 0x1F1B, + FcitxKey_grave, 0x1F20, 0x1F22, + FcitxKey_grave, 0x1F21, 0x1F23, + FcitxKey_grave, 0x1F28, 0x1F2A, + FcitxKey_grave, 0x1F29, 0x1F2B, + FcitxKey_grave, 0x1F30, 0x1F32, + FcitxKey_grave, 0x1F31, 0x1F33, + FcitxKey_grave, 0x1F38, 0x1F3A, + FcitxKey_grave, 0x1F39, 0x1F3B, + FcitxKey_grave, 0x1F40, 0x1F42, + FcitxKey_grave, 0x1F41, 0x1F43, + FcitxKey_grave, 0x1F48, 0x1F4A, + FcitxKey_grave, 0x1F49, 0x1F4B, + FcitxKey_grave, 0x1F50, 0x1F52, + FcitxKey_grave, 0x1F51, 0x1F53, + FcitxKey_grave, 0x1F59, 0x1F5B, + FcitxKey_grave, 0x1F60, 0x1F62, + FcitxKey_grave, 0x1F61, 0x1F63, + FcitxKey_grave, 0x1F68, 0x1F6A, + FcitxKey_grave, 0x1F69, 0x1F6B, + FcitxKey_a, FcitxKey_quotedbl, 0x00E4, + FcitxKey_a, FcitxKey_apostrophe, 0x00E1, + FcitxKey_a, FcitxKey_parenleft, 0x0103, + FcitxKey_a, FcitxKey_asterisk, 0x00E5, + FcitxKey_a, FcitxKey_comma, 0x0105, + FcitxKey_a, FcitxKey_minus, 0x00E3, + FcitxKey_a, FcitxKey_greater, 0x00E2, + FcitxKey_a, FcitxKey_asciicircum, 0x00E2, + FcitxKey_a, FcitxKey_underscore, 0x00AA, + FcitxKey_a, FcitxKey_grave, 0x00E0, + FcitxKey_a, FcitxKey_a, 0x00E5, + FcitxKey_a, FcitxKey_e, 0x00E6, + FcitxKey_a, FcitxKey_asciitilde, 0x00E3, + FcitxKey_a, FcitxKey_diaeresis, 0x00E4, + FcitxKey_a, FcitxKey_acute, 0x00E1, + FcitxKey_b, FcitxKey_period, 0x1E03, + FcitxKey_b, FcitxKey_A, 0x0102, + FcitxKey_b, FcitxKey_E, 0x0114, + FcitxKey_b, FcitxKey_G, 0x011E, + FcitxKey_b, FcitxKey_I, 0x012C, + FcitxKey_b, FcitxKey_O, 0x014E, + FcitxKey_b, FcitxKey_U, 0x016C, + FcitxKey_b, FcitxKey_a, 0x0103, + FcitxKey_b, FcitxKey_e, 0x0115, + FcitxKey_b, FcitxKey_g, 0x011F, + FcitxKey_b, FcitxKey_i, 0x012D, + FcitxKey_b, FcitxKey_o, 0x014F, + FcitxKey_b, FcitxKey_u, 0x016D, + FcitxKey_b, 0x0228, 0x1E1C, + FcitxKey_b, 0x0229, 0x1E1D, + FcitxKey_b, FcitxKey_Cyrillic_a, 0x04D1, + FcitxKey_b, FcitxKey_Cyrillic_ie, 0x04D7, + FcitxKey_b, FcitxKey_Cyrillic_i, 0x0439, + FcitxKey_b, FcitxKey_Cyrillic_u, 0x045E, + FcitxKey_b, FcitxKey_Cyrillic_zhe, 0x04C2, + FcitxKey_b, FcitxKey_Cyrillic_A, 0x04D0, + FcitxKey_b, FcitxKey_Cyrillic_IE, 0x04D6, + FcitxKey_b, FcitxKey_Cyrillic_I, 0x0419, + FcitxKey_b, FcitxKey_Cyrillic_U, 0x040E, + FcitxKey_b, FcitxKey_Cyrillic_ZHE, 0x04C1, + FcitxKey_b, FcitxKey_Greek_ALPHA, 0x1FB8, + FcitxKey_b, FcitxKey_Greek_IOTA, 0x1FD8, + FcitxKey_b, FcitxKey_Greek_UPSILON, 0x1FE8, + FcitxKey_b, FcitxKey_Greek_alpha, 0x1FB0, + FcitxKey_b, FcitxKey_Greek_iota, 0x1FD0, + FcitxKey_b, FcitxKey_Greek_upsilon, 0x1FE0, + FcitxKey_b, 0x1EA0, 0x1EB6, + FcitxKey_b, 0x1EA1, 0x1EB7, + FcitxKey_c, FcitxKey_apostrophe, 0x0107, + FcitxKey_c, FcitxKey_comma, 0x00E7, + FcitxKey_c, FcitxKey_period, 0x010B, + FcitxKey_c, FcitxKey_slash, 0x00A2, + FcitxKey_c, FcitxKey_0, 0x00A9, + FcitxKey_c, FcitxKey_less, 0x010D, + FcitxKey_c, FcitxKey_equal, 0x20AC, + FcitxKey_c, FcitxKey_A, 0x01CD, + FcitxKey_c, FcitxKey_C, 0x010C, + FcitxKey_c, FcitxKey_D, 0x010E, + FcitxKey_c, FcitxKey_E, 0x011A, + FcitxKey_c, FcitxKey_G, 0x01E6, + FcitxKey_c, FcitxKey_H, 0x021E, + FcitxKey_c, FcitxKey_I, 0x01CF, + FcitxKey_c, FcitxKey_K, 0x01E8, + FcitxKey_c, FcitxKey_L, 0x013D, + FcitxKey_c, FcitxKey_N, 0x0147, + FcitxKey_c, FcitxKey_O, 0x00A9, + FcitxKey_c, FcitxKey_R, 0x0158, + FcitxKey_c, FcitxKey_S, 0x0160, + FcitxKey_c, FcitxKey_T, 0x0164, + FcitxKey_c, FcitxKey_U, 0x01D3, + FcitxKey_c, FcitxKey_Z, 0x017D, + FcitxKey_c, FcitxKey_a, 0x01CE, + FcitxKey_c, FcitxKey_c, 0x010D, + FcitxKey_c, FcitxKey_d, 0x010F, + FcitxKey_c, FcitxKey_e, 0x011B, + FcitxKey_c, FcitxKey_g, 0x01E7, + FcitxKey_c, FcitxKey_h, 0x021F, + FcitxKey_c, FcitxKey_i, 0x01D0, + FcitxKey_c, FcitxKey_j, 0x01F0, + FcitxKey_c, FcitxKey_k, 0x01E9, + FcitxKey_c, FcitxKey_l, 0x013E, + FcitxKey_c, FcitxKey_n, 0x0148, + FcitxKey_c, FcitxKey_o, 0x00A9, + FcitxKey_c, FcitxKey_r, 0x0159, + FcitxKey_c, FcitxKey_s, 0x0161, + FcitxKey_c, FcitxKey_t, 0x0165, + FcitxKey_c, FcitxKey_u, 0x01D4, + FcitxKey_c, FcitxKey_z, 0x017E, + FcitxKey_c, FcitxKey_bar, 0x00A2, + FcitxKey_c, 0x00DC, 0x01D9, + FcitxKey_c, FcitxKey_udiaeresis, 0x01DA, + FcitxKey_c, 0x01B7, 0x01EE, + FcitxKey_c, 0x0292, 0x01EF, + FcitxKey_d, FcitxKey_minus, 0x0111, + FcitxKey_d, FcitxKey_period, 0x1E0B, + FcitxKey_d, FcitxKey_less, 0x010F, + FcitxKey_d, FcitxKey_h, 0x00F0, + FcitxKey_e, FcitxKey_quotedbl, 0x00EB, + FcitxKey_e, FcitxKey_apostrophe, 0x00E9, + FcitxKey_e, FcitxKey_comma, 0x0119, + FcitxKey_e, FcitxKey_minus, 0x0113, + FcitxKey_e, FcitxKey_period, 0x0117, + FcitxKey_e, FcitxKey_less, 0x011B, + FcitxKey_e, FcitxKey_equal, 0x20AC, + FcitxKey_e, FcitxKey_greater, 0x00EA, + FcitxKey_e, FcitxKey_asciicircum, 0x00EA, + FcitxKey_e, FcitxKey_underscore, 0x0113, + FcitxKey_e, FcitxKey_grave, 0x00E8, + FcitxKey_e, FcitxKey_e, 0x0259, + FcitxKey_e, FcitxKey_diaeresis, 0x00EB, + FcitxKey_e, FcitxKey_acute, 0x00E9, + FcitxKey_f, FcitxKey_period, 0x1E1F, + FcitxKey_f, FcitxKey_S, 0x017F, + FcitxKey_f, FcitxKey_s, 0x017F, + FcitxKey_g, FcitxKey_parenleft, 0x011F, + FcitxKey_g, FcitxKey_comma, 0x0123, + FcitxKey_g, FcitxKey_period, 0x0121, + FcitxKey_g, FcitxKey_U, 0x011F, + FcitxKey_g, FcitxKey_breve, 0x011F, + FcitxKey_i, FcitxKey_quotedbl, 0x00EF, + FcitxKey_i, FcitxKey_apostrophe, 0x00ED, + FcitxKey_i, FcitxKey_comma, 0x012F, + FcitxKey_i, FcitxKey_minus, 0x012B, + FcitxKey_i, FcitxKey_period, 0x0131, + FcitxKey_i, FcitxKey_greater, 0x00EE, + FcitxKey_i, FcitxKey_asciicircum, 0x00EE, + FcitxKey_i, FcitxKey_underscore, 0x012B, + FcitxKey_i, FcitxKey_grave, 0x00EC, + FcitxKey_i, FcitxKey_asciitilde, 0x0129, + FcitxKey_i, FcitxKey_diaeresis, 0x00EF, + FcitxKey_i, FcitxKey_acute, 0x00ED, + FcitxKey_k, FcitxKey_comma, 0x0137, + FcitxKey_k, FcitxKey_k, 0x0138, + FcitxKey_l, FcitxKey_apostrophe, 0x013A, + FcitxKey_l, FcitxKey_comma, 0x013C, + FcitxKey_l, FcitxKey_minus, 0x00A3, + FcitxKey_l, FcitxKey_slash, 0x0142, + FcitxKey_l, FcitxKey_less, 0x013E, + FcitxKey_l, FcitxKey_equal, 0x00A3, + FcitxKey_l, FcitxKey_v, 0x007C, + FcitxKey_m, FcitxKey_period, 0x1E41, + FcitxKey_m, FcitxKey_slash, 0x20A5, + FcitxKey_m, FcitxKey_u, 0x00B5, + FcitxKey_n, FcitxKey_apostrophe, 0x0144, + FcitxKey_n, FcitxKey_comma, 0x0146, + FcitxKey_n, FcitxKey_minus, 0x00F1, + FcitxKey_n, FcitxKey_less, 0x0148, + FcitxKey_n, FcitxKey_g, 0x014B, + FcitxKey_n, FcitxKey_asciitilde, 0x00F1, + FcitxKey_o, FcitxKey_quotedbl, 0x00F6, + FcitxKey_o, FcitxKey_apostrophe, 0x00F3, + FcitxKey_o, FcitxKey_minus, 0x00F5, + FcitxKey_o, FcitxKey_slash, 0x00F8, + FcitxKey_o, FcitxKey_greater, 0x00F4, + FcitxKey_o, FcitxKey_A, 0x00C5, + FcitxKey_o, FcitxKey_C, 0x00A9, + FcitxKey_o, FcitxKey_R, 0x00AE, + FcitxKey_o, FcitxKey_U, 0x016E, + FcitxKey_o, FcitxKey_X, 0x00A4, + FcitxKey_o, FcitxKey_asciicircum, 0x00F4, + FcitxKey_o, FcitxKey_underscore, 0x00BA, + FcitxKey_o, FcitxKey_grave, 0x00F2, + FcitxKey_o, FcitxKey_a, 0x00E5, + FcitxKey_o, FcitxKey_c, 0x00A9, + FcitxKey_o, FcitxKey_e, 0x0153, + FcitxKey_o, FcitxKey_o, 0x00B0, + FcitxKey_o, FcitxKey_r, 0x00AE, + FcitxKey_o, FcitxKey_s, 0x00A7, + FcitxKey_o, FcitxKey_u, 0x016F, + FcitxKey_o, FcitxKey_w, 0x1E98, + FcitxKey_o, FcitxKey_x, 0x00A4, + FcitxKey_o, FcitxKey_y, 0x1E99, + FcitxKey_o, FcitxKey_asciitilde, 0x00F5, + FcitxKey_o, FcitxKey_diaeresis, 0x00F6, + FcitxKey_o, FcitxKey_acute, 0x00F3, + FcitxKey_p, FcitxKey_exclam, 0x00B6, + FcitxKey_p, FcitxKey_period, 0x1E57, + FcitxKey_r, FcitxKey_apostrophe, 0x0155, + FcitxKey_r, FcitxKey_comma, 0x0157, + FcitxKey_r, FcitxKey_less, 0x0159, + FcitxKey_s, FcitxKey_exclam, 0x00A7, + FcitxKey_s, FcitxKey_apostrophe, 0x015B, + FcitxKey_s, FcitxKey_comma, 0x015F, + FcitxKey_s, FcitxKey_period, 0x1E61, + FcitxKey_s, FcitxKey_0, 0x00A7, + FcitxKey_s, FcitxKey_1, 0x00B9, + FcitxKey_s, FcitxKey_2, 0x00B2, + FcitxKey_s, FcitxKey_3, 0x00B3, + FcitxKey_s, FcitxKey_less, 0x0161, + FcitxKey_s, FcitxKey_M, 0x2120, + FcitxKey_s, FcitxKey_m, 0x2120, + FcitxKey_s, FcitxKey_o, 0x00A7, + FcitxKey_s, FcitxKey_s, 0x00DF, + FcitxKey_s, FcitxKey_cedilla, 0x015F, + FcitxKey_t, FcitxKey_minus, 0x0167, + FcitxKey_t, FcitxKey_period, 0x1E6B, + FcitxKey_t, FcitxKey_slash, 0x0167, + FcitxKey_t, FcitxKey_less, 0x0165, + FcitxKey_t, FcitxKey_M, 0x2122, + FcitxKey_t, FcitxKey_h, 0x00FE, + FcitxKey_t, FcitxKey_m, 0x2122, + FcitxKey_u, FcitxKey_quotedbl, 0x00FC, + FcitxKey_u, FcitxKey_apostrophe, 0x00FA, + FcitxKey_u, FcitxKey_asterisk, 0x016F, + FcitxKey_u, FcitxKey_comma, 0x0173, + FcitxKey_u, FcitxKey_minus, 0x016B, + FcitxKey_u, FcitxKey_slash, 0x00B5, + FcitxKey_u, FcitxKey_greater, 0x00FB, + FcitxKey_u, FcitxKey_asciicircum, 0x00FB, + FcitxKey_u, FcitxKey_underscore, 0x016B, + FcitxKey_u, FcitxKey_grave, 0x00F9, + FcitxKey_u, FcitxKey_u, 0x016D, + FcitxKey_u, FcitxKey_asciitilde, 0x0169, + FcitxKey_u, FcitxKey_diaeresis, 0x00FC, + FcitxKey_u, FcitxKey_acute, 0x00FA, + FcitxKey_v, FcitxKey_Z, 0x017D, + FcitxKey_v, FcitxKey_l, 0x007C, + FcitxKey_v, FcitxKey_z, 0x017E, + FcitxKey_w, FcitxKey_asciicircum, 0x0175, + FcitxKey_x, FcitxKey_0, 0x00A4, + FcitxKey_x, FcitxKey_O, 0x00A4, + FcitxKey_x, FcitxKey_o, 0x00A4, + FcitxKey_x, FcitxKey_x, 0x00D7, + FcitxKey_y, FcitxKey_quotedbl, 0x00FF, + FcitxKey_y, FcitxKey_apostrophe, 0x00FD, + FcitxKey_y, FcitxKey_minus, 0x00A5, + FcitxKey_y, FcitxKey_equal, 0x00A5, + FcitxKey_y, FcitxKey_asciicircum, 0x0177, + FcitxKey_y, FcitxKey_diaeresis, 0x00FF, + FcitxKey_y, FcitxKey_acute, 0x00FD, + FcitxKey_z, FcitxKey_apostrophe, 0x017A, + FcitxKey_z, FcitxKey_period, 0x017C, + FcitxKey_z, FcitxKey_less, 0x017E, + FcitxKey_bar, FcitxKey_C, 0x00A2, + FcitxKey_bar, FcitxKey_c, 0x00A2, + FcitxKey_asciitilde, FcitxKey_space, 0x007E, + FcitxKey_asciitilde, FcitxKey_A, 0x00C3, + FcitxKey_asciitilde, FcitxKey_E, 0x1EBC, + FcitxKey_asciitilde, FcitxKey_I, 0x0128, + FcitxKey_asciitilde, FcitxKey_N, 0x00D1, + FcitxKey_asciitilde, FcitxKey_O, 0x00D5, + FcitxKey_asciitilde, FcitxKey_U, 0x0168, + FcitxKey_asciitilde, FcitxKey_V, 0x1E7C, + FcitxKey_asciitilde, FcitxKey_Y, 0x1EF8, + FcitxKey_asciitilde, FcitxKey_a, 0x00E3, + FcitxKey_asciitilde, FcitxKey_e, 0x1EBD, + FcitxKey_asciitilde, FcitxKey_i, 0x0129, + FcitxKey_asciitilde, FcitxKey_n, 0x00F1, + FcitxKey_asciitilde, FcitxKey_o, 0x00F5, + FcitxKey_asciitilde, FcitxKey_u, 0x0169, + FcitxKey_asciitilde, FcitxKey_v, 0x1E7D, + FcitxKey_asciitilde, FcitxKey_y, 0x1EF9, + FcitxKey_asciitilde, FcitxKey_Acircumflex, 0x1EAA, + FcitxKey_asciitilde, FcitxKey_Ecircumflex, 0x1EC4, + FcitxKey_asciitilde, FcitxKey_Ocircumflex, 0x1ED6, + FcitxKey_asciitilde, FcitxKey_acircumflex, 0x1EAB, + FcitxKey_asciitilde, FcitxKey_ecircumflex, 0x1EC5, + FcitxKey_asciitilde, FcitxKey_ocircumflex, 0x1ED7, + FcitxKey_asciitilde, FcitxKey_Ohorn, 0x1EE0, + FcitxKey_asciitilde, FcitxKey_ohorn, 0x1EE1, + FcitxKey_asciitilde, FcitxKey_Uhorn, 0x1EEE, + FcitxKey_asciitilde, FcitxKey_uhorn, 0x1EEF, + FcitxKey_asciitilde, FcitxKey_Abreve, 0x1EB4, + FcitxKey_asciitilde, FcitxKey_abreve, 0x1EB5, + FcitxKey_asciitilde, FcitxKey_Greek_iotadieresis, 0x1FD7, + FcitxKey_asciitilde, FcitxKey_Greek_upsilondieresis, 0x1FE7, + FcitxKey_asciitilde, FcitxKey_Greek_alpha, 0x1FB6, + FcitxKey_asciitilde, FcitxKey_Greek_eta, 0x1FC6, + FcitxKey_asciitilde, FcitxKey_Greek_iota, 0x1FD6, + FcitxKey_asciitilde, FcitxKey_Greek_upsilon, 0x1FE6, + FcitxKey_asciitilde, FcitxKey_Greek_omega, 0x1FF6, + FcitxKey_asciitilde, 0x1F00, 0x1F06, + FcitxKey_asciitilde, 0x1F01, 0x1F07, + FcitxKey_asciitilde, 0x1F08, 0x1F0E, + FcitxKey_asciitilde, 0x1F09, 0x1F0F, + FcitxKey_asciitilde, 0x1F20, 0x1F26, + FcitxKey_asciitilde, 0x1F21, 0x1F27, + FcitxKey_asciitilde, 0x1F28, 0x1F2E, + FcitxKey_asciitilde, 0x1F29, 0x1F2F, + FcitxKey_asciitilde, 0x1F30, 0x1F36, + FcitxKey_asciitilde, 0x1F31, 0x1F37, + FcitxKey_asciitilde, 0x1F38, 0x1F3E, + FcitxKey_asciitilde, 0x1F39, 0x1F3F, + FcitxKey_asciitilde, 0x1F50, 0x1F56, + FcitxKey_asciitilde, 0x1F51, 0x1F57, + FcitxKey_asciitilde, 0x1F59, 0x1F5F, + FcitxKey_asciitilde, 0x1F60, 0x1F66, + FcitxKey_asciitilde, 0x1F61, 0x1F67, + FcitxKey_asciitilde, 0x1F68, 0x1F6E, + FcitxKey_asciitilde, 0x1F69, 0x1F6F, + FcitxKey_diaeresis, FcitxKey_apostrophe, 0x0385, + FcitxKey_diaeresis, FcitxKey_A, 0x00C4, + FcitxKey_diaeresis, FcitxKey_E, 0x00CB, + FcitxKey_diaeresis, FcitxKey_I, 0x00CF, + FcitxKey_diaeresis, FcitxKey_O, 0x00D6, + FcitxKey_diaeresis, FcitxKey_U, 0x00DC, + FcitxKey_diaeresis, FcitxKey_Y, 0x0178, + FcitxKey_diaeresis, FcitxKey_grave, 0x1FED, + FcitxKey_diaeresis, FcitxKey_a, 0x00E4, + FcitxKey_diaeresis, FcitxKey_e, 0x00EB, + FcitxKey_diaeresis, FcitxKey_i, 0x00EF, + FcitxKey_diaeresis, FcitxKey_o, 0x00F6, + FcitxKey_diaeresis, FcitxKey_u, 0x00FC, + FcitxKey_diaeresis, FcitxKey_y, 0x00FF, + FcitxKey_diaeresis, FcitxKey_asciitilde, 0x1FC1, + FcitxKey_diaeresis, FcitxKey_acute, 0x0385, + FcitxKey_diaeresis, FcitxKey_dead_grave, 0x1FED, + FcitxKey_diaeresis, FcitxKey_dead_acute, 0x0385, + FcitxKey_diaeresis, FcitxKey_dead_tilde, 0x1FC1, + FcitxKey_macron, FcitxKey_A, 0x0100, + FcitxKey_macron, FcitxKey_E, 0x0112, + FcitxKey_macron, FcitxKey_G, 0x1E20, + FcitxKey_macron, FcitxKey_I, 0x012A, + FcitxKey_macron, FcitxKey_O, 0x014C, + FcitxKey_macron, FcitxKey_U, 0x016A, + FcitxKey_macron, FcitxKey_Y, 0x0232, + FcitxKey_macron, FcitxKey_a, 0x0101, + FcitxKey_macron, FcitxKey_e, 0x0113, + FcitxKey_macron, FcitxKey_g, 0x1E21, + FcitxKey_macron, FcitxKey_i, 0x012B, + FcitxKey_macron, FcitxKey_o, 0x014D, + FcitxKey_macron, FcitxKey_u, 0x016B, + FcitxKey_macron, FcitxKey_y, 0x0233, + FcitxKey_macron, FcitxKey_Adiaeresis, 0x01DE, + FcitxKey_macron, FcitxKey_AE, 0x01E2, + FcitxKey_macron, FcitxKey_Otilde, 0x022C, + FcitxKey_macron, FcitxKey_Odiaeresis, 0x022A, + FcitxKey_macron, 0x00DC, 0x01D5, + FcitxKey_macron, FcitxKey_adiaeresis, 0x01DF, + FcitxKey_macron, FcitxKey_ae, 0x01E3, + FcitxKey_macron, FcitxKey_otilde, 0x022D, + FcitxKey_macron, FcitxKey_odiaeresis, 0x022B, + FcitxKey_macron, FcitxKey_udiaeresis, 0x01D6, + FcitxKey_macron, 0x01EA, 0x01EC, + FcitxKey_macron, 0x01EB, 0x01ED, + FcitxKey_macron, 0x0226, 0x01E0, + FcitxKey_macron, 0x0227, 0x01E1, + FcitxKey_macron, 0x022E, 0x0230, + FcitxKey_macron, 0x022F, 0x0231, + FcitxKey_macron, FcitxKey_Cyrillic_i, 0x04E3, + FcitxKey_macron, FcitxKey_Cyrillic_u, 0x04EF, + FcitxKey_macron, FcitxKey_Cyrillic_I, 0x04E2, + FcitxKey_macron, FcitxKey_Cyrillic_U, 0x04EE, + FcitxKey_macron, FcitxKey_Greek_ALPHA, 0x1FB9, + FcitxKey_macron, FcitxKey_Greek_IOTA, 0x1FD9, + FcitxKey_macron, FcitxKey_Greek_UPSILON, 0x1FE9, + FcitxKey_macron, FcitxKey_Greek_alpha, 0x1FB1, + FcitxKey_macron, FcitxKey_Greek_iota, 0x1FD1, + FcitxKey_macron, FcitxKey_Greek_upsilon, 0x1FE1, + FcitxKey_macron, 0x1E36, 0x1E38, + FcitxKey_macron, 0x1E37, 0x1E39, + FcitxKey_macron, 0x1E5A, 0x1E5C, + FcitxKey_macron, 0x1E5B, 0x1E5D, + FcitxKey_acute, FcitxKey_A, 0x00C1, + FcitxKey_acute, FcitxKey_C, 0x0106, + FcitxKey_acute, FcitxKey_E, 0x00C9, + FcitxKey_acute, FcitxKey_G, 0x01F4, + FcitxKey_acute, FcitxKey_I, 0x00CD, + FcitxKey_acute, FcitxKey_K, 0x1E30, + FcitxKey_acute, FcitxKey_L, 0x0139, + FcitxKey_acute, FcitxKey_M, 0x1E3E, + FcitxKey_acute, FcitxKey_N, 0x0143, + FcitxKey_acute, FcitxKey_O, 0x00D3, + FcitxKey_acute, FcitxKey_P, 0x1E54, + FcitxKey_acute, FcitxKey_R, 0x0154, + FcitxKey_acute, FcitxKey_S, 0x015A, + FcitxKey_acute, FcitxKey_U, 0x00DA, + FcitxKey_acute, FcitxKey_W, 0x1E82, + FcitxKey_acute, FcitxKey_Y, 0x00DD, + FcitxKey_acute, FcitxKey_Z, 0x0179, + FcitxKey_acute, FcitxKey_a, 0x00E1, + FcitxKey_acute, FcitxKey_c, 0x0107, + FcitxKey_acute, FcitxKey_e, 0x00E9, + FcitxKey_acute, FcitxKey_g, 0x01F5, + FcitxKey_acute, FcitxKey_i, 0x00ED, + FcitxKey_acute, FcitxKey_k, 0x1E31, + FcitxKey_acute, FcitxKey_l, 0x013A, + FcitxKey_acute, FcitxKey_m, 0x1E3F, + FcitxKey_acute, FcitxKey_n, 0x0144, + FcitxKey_acute, FcitxKey_o, 0x00F3, + FcitxKey_acute, FcitxKey_p, 0x1E55, + FcitxKey_acute, FcitxKey_r, 0x0155, + FcitxKey_acute, FcitxKey_s, 0x015B, + FcitxKey_acute, FcitxKey_u, 0x00FA, + FcitxKey_acute, FcitxKey_w, 0x1E83, + FcitxKey_acute, FcitxKey_y, 0x00FD, + FcitxKey_acute, FcitxKey_z, 0x017A, + FcitxKey_acute, FcitxKey_Acircumflex, 0x1EA4, + FcitxKey_acute, FcitxKey_Aring, 0x01FA, + FcitxKey_acute, FcitxKey_AE, 0x01FC, + FcitxKey_acute, FcitxKey_Ccedilla, 0x1E08, + FcitxKey_acute, FcitxKey_Ecircumflex, 0x1EBE, + FcitxKey_acute, FcitxKey_Idiaeresis, 0x1E2E, + FcitxKey_acute, FcitxKey_Ocircumflex, 0x1ED0, + FcitxKey_acute, FcitxKey_Otilde, 0x1E4C, + FcitxKey_acute, FcitxKey_Ooblique, 0x01FE, + FcitxKey_acute, 0x00DC, 0x01D7, + FcitxKey_acute, FcitxKey_acircumflex, 0x1EA5, + FcitxKey_acute, FcitxKey_aring, 0x01FB, + FcitxKey_acute, FcitxKey_ae, 0x01FD, + FcitxKey_acute, FcitxKey_ccedilla, 0x1E09, + FcitxKey_acute, FcitxKey_ecircumflex, 0x1EBF, + FcitxKey_acute, FcitxKey_idiaeresis, 0x1E2F, + FcitxKey_acute, FcitxKey_ocircumflex, 0x1ED1, + FcitxKey_acute, FcitxKey_otilde, 0x1E4D, + FcitxKey_acute, FcitxKey_oslash, 0x01FF, + FcitxKey_acute, FcitxKey_udiaeresis, 0x01D8, + FcitxKey_acute, FcitxKey_Ohorn, 0x1EDA, + FcitxKey_acute, FcitxKey_ohorn, 0x1EDB, + FcitxKey_acute, FcitxKey_Uhorn, 0x1EE8, + FcitxKey_acute, FcitxKey_uhorn, 0x1EE9, + FcitxKey_acute, FcitxKey_Abreve, 0x1EAE, + FcitxKey_acute, FcitxKey_abreve, 0x1EAF, + FcitxKey_acute, FcitxKey_Emacron, 0x1E16, + FcitxKey_acute, FcitxKey_emacron, 0x1E17, + FcitxKey_acute, FcitxKey_Omacron, 0x1E52, + FcitxKey_acute, FcitxKey_Utilde, 0x1E78, + FcitxKey_acute, FcitxKey_omacron, 0x1E53, + FcitxKey_acute, FcitxKey_utilde, 0x1E79, + FcitxKey_acute, FcitxKey_Cyrillic_ghe, 0x0453, + FcitxKey_acute, FcitxKey_Cyrillic_ka, 0x045C, + FcitxKey_acute, FcitxKey_Cyrillic_GHE, 0x0403, + FcitxKey_acute, FcitxKey_Cyrillic_KA, 0x040C, + FcitxKey_acute, FcitxKey_Greek_iotadieresis, 0x0390, + FcitxKey_acute, FcitxKey_Greek_upsilondieresis, 0x03B0, + FcitxKey_acute, FcitxKey_Greek_ALPHA, 0x0386, + FcitxKey_acute, FcitxKey_Greek_EPSILON, 0x0388, + FcitxKey_acute, FcitxKey_Greek_ETA, 0x0389, + FcitxKey_acute, FcitxKey_Greek_IOTA, 0x038A, + FcitxKey_acute, FcitxKey_Greek_OMICRON, 0x038C, + FcitxKey_acute, FcitxKey_Greek_UPSILON, 0x038E, + FcitxKey_acute, FcitxKey_Greek_OMEGA, 0x038F, + FcitxKey_acute, FcitxKey_Greek_alpha, 0x03AC, + FcitxKey_acute, FcitxKey_Greek_epsilon, 0x03AD, + FcitxKey_acute, FcitxKey_Greek_eta, 0x03AE, + FcitxKey_acute, FcitxKey_Greek_iota, 0x03AF, + FcitxKey_acute, FcitxKey_Greek_omicron, 0x03CC, + FcitxKey_acute, FcitxKey_Greek_upsilon, 0x03CD, + FcitxKey_acute, FcitxKey_Greek_omega, 0x03CE, + FcitxKey_acute, 0x1F00, 0x1F04, + FcitxKey_acute, 0x1F01, 0x1F05, + FcitxKey_acute, 0x1F08, 0x1F0C, + FcitxKey_acute, 0x1F09, 0x1F0D, + FcitxKey_acute, 0x1F10, 0x1F14, + FcitxKey_acute, 0x1F11, 0x1F15, + FcitxKey_acute, 0x1F18, 0x1F1C, + FcitxKey_acute, 0x1F19, 0x1F1D, + FcitxKey_acute, 0x1F20, 0x1F24, + FcitxKey_acute, 0x1F21, 0x1F25, + FcitxKey_acute, 0x1F28, 0x1F2C, + FcitxKey_acute, 0x1F29, 0x1F2D, + FcitxKey_acute, 0x1F30, 0x1F34, + FcitxKey_acute, 0x1F31, 0x1F35, + FcitxKey_acute, 0x1F38, 0x1F3C, + FcitxKey_acute, 0x1F39, 0x1F3D, + FcitxKey_acute, 0x1F40, 0x1F44, + FcitxKey_acute, 0x1F41, 0x1F45, + FcitxKey_acute, 0x1F48, 0x1F4C, + FcitxKey_acute, 0x1F49, 0x1F4D, + FcitxKey_acute, 0x1F50, 0x1F54, + FcitxKey_acute, 0x1F51, 0x1F55, + FcitxKey_acute, 0x1F59, 0x1F5D, + FcitxKey_acute, 0x1F60, 0x1F64, + FcitxKey_acute, 0x1F61, 0x1F65, + FcitxKey_acute, 0x1F68, 0x1F6C, + FcitxKey_acute, 0x1F69, 0x1F6D, + FcitxKey_cedilla, FcitxKey_C, 0x00C7, + FcitxKey_cedilla, FcitxKey_D, 0x1E10, + FcitxKey_cedilla, FcitxKey_E, 0x0228, + FcitxKey_cedilla, FcitxKey_G, 0x0122, + FcitxKey_cedilla, FcitxKey_H, 0x1E28, + FcitxKey_cedilla, FcitxKey_K, 0x0136, + FcitxKey_cedilla, FcitxKey_L, 0x013B, + FcitxKey_cedilla, FcitxKey_N, 0x0145, + FcitxKey_cedilla, FcitxKey_R, 0x0156, + FcitxKey_cedilla, FcitxKey_S, 0x015E, + FcitxKey_cedilla, FcitxKey_T, 0x0162, + FcitxKey_cedilla, FcitxKey_c, 0x00E7, + FcitxKey_cedilla, FcitxKey_d, 0x1E11, + FcitxKey_cedilla, FcitxKey_e, 0x0229, + FcitxKey_cedilla, FcitxKey_g, 0x0123, + FcitxKey_cedilla, FcitxKey_h, 0x1E29, + FcitxKey_cedilla, FcitxKey_k, 0x0137, + FcitxKey_cedilla, FcitxKey_l, 0x013C, + FcitxKey_cedilla, FcitxKey_n, 0x0146, + FcitxKey_cedilla, FcitxKey_r, 0x0157, + FcitxKey_cedilla, FcitxKey_s, 0x015F, + FcitxKey_cedilla, FcitxKey_t, 0x0163, + FcitxKey_breve, FcitxKey_G, 0x011E, + FcitxKey_breve, FcitxKey_g, 0x011F, + 0x05B4, FcitxKey_hebrew_yod, 0xFB1D, + 0x05B7, 0x05F2, 0xFB1F, + 0x05B7, FcitxKey_hebrew_aleph, 0xFB2E, + 0x05B8, FcitxKey_hebrew_aleph, 0xFB2F, + 0x05B9, FcitxKey_hebrew_waw, 0xFB4B, + 0x05BC, FcitxKey_hebrew_aleph, 0xFB30, + 0x05BC, FcitxKey_hebrew_beth, 0xFB31, + 0x05BC, FcitxKey_hebrew_gimmel, 0xFB32, + 0x05BC, FcitxKey_hebrew_daleth, 0xFB33, + 0x05BC, FcitxKey_hebrew_he, 0xFB34, + 0x05BC, FcitxKey_hebrew_waw, 0xFB35, + 0x05BC, FcitxKey_hebrew_zayin, 0xFB36, + 0x05BC, FcitxKey_hebrew_teth, 0xFB38, + 0x05BC, FcitxKey_hebrew_yod, 0xFB39, + 0x05BC, FcitxKey_hebrew_finalkaph, 0xFB3A, + 0x05BC, FcitxKey_hebrew_kaph, 0xFB3B, + 0x05BC, FcitxKey_hebrew_lamed, 0xFB3C, + 0x05BC, FcitxKey_hebrew_mem, 0xFB3E, + 0x05BC, FcitxKey_hebrew_nun, 0xFB40, + 0x05BC, FcitxKey_hebrew_samekh, 0xFB41, + 0x05BC, FcitxKey_hebrew_finalpe, 0xFB43, + 0x05BC, FcitxKey_hebrew_pe, 0xFB44, + 0x05BC, FcitxKey_hebrew_zadi, 0xFB46, + 0x05BC, FcitxKey_hebrew_qoph, 0xFB47, + 0x05BC, FcitxKey_hebrew_resh, 0xFB48, + 0x05BC, FcitxKey_hebrew_shin, 0xFB49, + 0x05BC, FcitxKey_hebrew_taw, 0xFB4A, + 0x05BF, FcitxKey_hebrew_beth, 0xFB4C, + 0x05BF, FcitxKey_hebrew_kaph, 0xFB4D, + 0x05BF, FcitxKey_hebrew_pe, 0xFB4E, + 0x05C1, FcitxKey_hebrew_shin, 0xFB2A, + 0x05C1, 0xFB49, 0xFB2C, + 0x05C2, FcitxKey_hebrew_shin, 0xFB2B, + 0x05C2, 0xFB49, 0xFB2D, + 0x0653, FcitxKey_Arabic_alef, 0x0622, + 0x0654, FcitxKey_Arabic_alef, 0x0623, + 0x0654, FcitxKey_Arabic_waw, 0x0624, + 0x0654, FcitxKey_Arabic_yeh, 0x0626, + 0x0654, 0x06C1, 0x06C2, + 0x0654, 0x06D2, 0x06D3, + 0x0654, 0x06D5, 0x06C0, + 0x0655, FcitxKey_Arabic_alef, 0x0625, + FcitxKey_Cyrillic_pe, FcitxKey_Cyrillic_a, 0x00A7, + FcitxKey_Cyrillic_IE, FcitxKey_equal, 0x20AC, + FcitxKey_Cyrillic_EN, FcitxKey_Cyrillic_o, 0x2116, + FcitxKey_Cyrillic_EN, FcitxKey_Cyrillic_O, 0x2116, + FcitxKey_Cyrillic_ES, FcitxKey_equal, 0x20AC, + FcitxKey_Greek_ALPHA, FcitxKey_apostrophe, 0x0386, + FcitxKey_Greek_EPSILON, FcitxKey_apostrophe, 0x0388, + FcitxKey_Greek_ETA, FcitxKey_apostrophe, 0x0389, + FcitxKey_Greek_IOTA, FcitxKey_quotedbl, 0x03AA, + FcitxKey_Greek_IOTA, FcitxKey_apostrophe, 0x038A, + FcitxKey_Greek_OMICRON, FcitxKey_apostrophe, 0x038C, + FcitxKey_Greek_UPSILON, FcitxKey_quotedbl, 0x03AB, + FcitxKey_Greek_UPSILON, FcitxKey_apostrophe, 0x038E, + FcitxKey_Greek_OMEGA, FcitxKey_apostrophe, 0x038F, + FcitxKey_Greek_alpha, FcitxKey_apostrophe, 0x03AC, + FcitxKey_Greek_epsilon, FcitxKey_apostrophe, 0x03AD, + FcitxKey_Greek_eta, FcitxKey_apostrophe, 0x03AE, + FcitxKey_Greek_iota, FcitxKey_quotedbl, 0x03CA, + FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x03AF, + FcitxKey_Greek_iota, FcitxKey_Greek_alphaaccent, 0x1FB4, + FcitxKey_Greek_iota, FcitxKey_Greek_etaaccent, 0x1FC4, + FcitxKey_Greek_iota, FcitxKey_Greek_omegaaccent, 0x1FF4, + FcitxKey_Greek_iota, FcitxKey_Greek_ALPHA, 0x1FBC, + FcitxKey_Greek_iota, FcitxKey_Greek_ETA, 0x1FCC, + FcitxKey_Greek_iota, FcitxKey_Greek_OMEGA, 0x1FFC, + FcitxKey_Greek_iota, FcitxKey_Greek_alpha, 0x1FB3, + FcitxKey_Greek_iota, FcitxKey_Greek_eta, 0x1FC3, + FcitxKey_Greek_iota, FcitxKey_Greek_omega, 0x1FF3, + FcitxKey_Greek_iota, 0x1F00, 0x1F80, + FcitxKey_Greek_iota, 0x1F01, 0x1F81, + FcitxKey_Greek_iota, 0x1F02, 0x1F82, + FcitxKey_Greek_iota, 0x1F03, 0x1F83, + FcitxKey_Greek_iota, 0x1F04, 0x1F84, + FcitxKey_Greek_iota, 0x1F05, 0x1F85, + FcitxKey_Greek_iota, 0x1F06, 0x1F86, + FcitxKey_Greek_iota, 0x1F07, 0x1F87, + FcitxKey_Greek_iota, 0x1F08, 0x1F88, + FcitxKey_Greek_iota, 0x1F09, 0x1F89, + FcitxKey_Greek_iota, 0x1F0A, 0x1F8A, + FcitxKey_Greek_iota, 0x1F0B, 0x1F8B, + FcitxKey_Greek_iota, 0x1F0C, 0x1F8C, + FcitxKey_Greek_iota, 0x1F0D, 0x1F8D, + FcitxKey_Greek_iota, 0x1F0E, 0x1F8E, + FcitxKey_Greek_iota, 0x1F0F, 0x1F8F, + FcitxKey_Greek_iota, 0x1F20, 0x1F90, + FcitxKey_Greek_iota, 0x1F21, 0x1F91, + FcitxKey_Greek_iota, 0x1F22, 0x1F92, + FcitxKey_Greek_iota, 0x1F23, 0x1F93, + FcitxKey_Greek_iota, 0x1F24, 0x1F94, + FcitxKey_Greek_iota, 0x1F25, 0x1F95, + FcitxKey_Greek_iota, 0x1F26, 0x1F96, + FcitxKey_Greek_iota, 0x1F27, 0x1F97, + FcitxKey_Greek_iota, 0x1F28, 0x1F98, + FcitxKey_Greek_iota, 0x1F29, 0x1F99, + FcitxKey_Greek_iota, 0x1F2A, 0x1F9A, + FcitxKey_Greek_iota, 0x1F2B, 0x1F9B, + FcitxKey_Greek_iota, 0x1F2C, 0x1F9C, + FcitxKey_Greek_iota, 0x1F2D, 0x1F9D, + FcitxKey_Greek_iota, 0x1F2E, 0x1F9E, + FcitxKey_Greek_iota, 0x1F2F, 0x1F9F, + FcitxKey_Greek_iota, 0x1F60, 0x1FA0, + FcitxKey_Greek_iota, 0x1F61, 0x1FA1, + FcitxKey_Greek_iota, 0x1F62, 0x1FA2, + FcitxKey_Greek_iota, 0x1F63, 0x1FA3, + FcitxKey_Greek_iota, 0x1F64, 0x1FA4, + FcitxKey_Greek_iota, 0x1F65, 0x1FA5, + FcitxKey_Greek_iota, 0x1F66, 0x1FA6, + FcitxKey_Greek_iota, 0x1F67, 0x1FA7, + FcitxKey_Greek_iota, 0x1F68, 0x1FA8, + FcitxKey_Greek_iota, 0x1F69, 0x1FA9, + FcitxKey_Greek_iota, 0x1F6A, 0x1FAA, + FcitxKey_Greek_iota, 0x1F6B, 0x1FAB, + FcitxKey_Greek_iota, 0x1F6C, 0x1FAC, + FcitxKey_Greek_iota, 0x1F6D, 0x1FAD, + FcitxKey_Greek_iota, 0x1F6E, 0x1FAE, + FcitxKey_Greek_iota, 0x1F6F, 0x1FAF, + FcitxKey_Greek_iota, 0x1F70, 0x1FB2, + FcitxKey_Greek_iota, 0x1F74, 0x1FC2, + FcitxKey_Greek_iota, 0x1F7C, 0x1FF2, + FcitxKey_Greek_iota, 0x1FB6, 0x1FB7, + FcitxKey_Greek_iota, 0x1FC6, 0x1FC7, + FcitxKey_Greek_iota, 0x1FF6, 0x1FF7, + FcitxKey_Greek_omicron, FcitxKey_apostrophe, 0x03CC, + FcitxKey_Greek_upsilon, FcitxKey_quotedbl, 0x03CB, + FcitxKey_Greek_upsilon, FcitxKey_apostrophe, 0x03CD, + FcitxKey_Greek_omega, FcitxKey_apostrophe, 0x03CE, + FcitxKey_lessthanequal, 0x0338, 0x2270, + FcitxKey_greaterthanequal, 0x0338, 0x2271, + FcitxKey_approximate, 0x0338, 0x2247, + FcitxKey_identical, 0x0338, 0x2262, + FcitxKey_includedin, 0x0338, 0x2284, + FcitxKey_includes, 0x0338, 0x2285, + 0x093C, 0x0915, 0x0958, + 0x093C, 0x0916, 0x0959, + 0x093C, 0x0917, 0x095A, + 0x093C, 0x091C, 0x095B, + 0x093C, 0x0921, 0x095C, + 0x093C, 0x0922, 0x095D, + 0x093C, 0x0928, 0x0929, + 0x093C, 0x092B, 0x095E, + 0x093C, 0x092F, 0x095F, + 0x093C, 0x0930, 0x0931, + 0x093C, 0x0933, 0x0934, + 0x09BC, 0x09A1, 0x09DC, + 0x09BC, 0x09A2, 0x09DD, + 0x09BC, 0x09AF, 0x09DF, + 0x09C7, 0x09BE, 0x09CB, + 0x09C7, 0x09D7, 0x09CC, + 0x0A3C, 0x0A16, 0x0A59, + 0x0A3C, 0x0A17, 0x0A5A, + 0x0A3C, 0x0A1C, 0x0A5B, + 0x0A3C, 0x0A2B, 0x0A5E, + 0x0A3C, 0x0A32, 0x0A33, + 0x0A3C, 0x0A38, 0x0A36, + 0x0B3C, 0x0B21, 0x0B5C, + 0x0B3C, 0x0B22, 0x0B5D, + 0x0B47, 0x0B3E, 0x0B4B, + 0x0B47, 0x0B56, 0x0B48, + 0x0B47, 0x0B57, 0x0B4C, + FcitxKey_leftcaret, 0x0338, 0x226E, + FcitxKey_rightcaret, 0x0338, 0x226F, + FcitxKey_underbar, FcitxKey_parenleft, 0x208D, + FcitxKey_underbar, FcitxKey_parenright, 0x208E, + FcitxKey_underbar, FcitxKey_plus, 0x208A, + FcitxKey_underbar, FcitxKey_0, 0x2080, + FcitxKey_underbar, FcitxKey_1, 0x2081, + FcitxKey_underbar, FcitxKey_2, 0x2082, + FcitxKey_underbar, FcitxKey_3, 0x2083, + FcitxKey_underbar, FcitxKey_4, 0x2084, + FcitxKey_underbar, FcitxKey_5, 0x2085, + FcitxKey_underbar, FcitxKey_6, 0x2086, + FcitxKey_underbar, FcitxKey_7, 0x2087, + FcitxKey_underbar, FcitxKey_8, 0x2088, + FcitxKey_underbar, FcitxKey_9, 0x2089, + FcitxKey_underbar, FcitxKey_equal, 0x208C, + 0x0BC6, 0x0BBE, 0x0BCA, + 0x0BC6, 0x0BD7, 0x0BCC, + FcitxKey_underbar, 0x2212, 0x208B, + FcitxKey_underbar, FcitxKey_KP_Space, 0x2082, + FcitxKey_underbar, FcitxKey_KP_Add, 0x208A, + FcitxKey_underbar, FcitxKey_KP_0, 0x2080, + FcitxKey_underbar, FcitxKey_KP_1, 0x2081, + FcitxKey_underbar, FcitxKey_KP_2, 0x2082, + FcitxKey_underbar, FcitxKey_KP_3, 0x2083, + FcitxKey_underbar, FcitxKey_KP_4, 0x2084, + FcitxKey_underbar, FcitxKey_KP_5, 0x2085, + FcitxKey_underbar, FcitxKey_KP_6, 0x2086, + FcitxKey_underbar, FcitxKey_KP_7, 0x2087, + FcitxKey_underbar, FcitxKey_KP_8, 0x2088, + FcitxKey_underbar, FcitxKey_KP_9, 0x2089, + FcitxKey_underbar, FcitxKey_KP_Equal, 0x208C, + 0x0BC7, 0x0BBE, 0x0BCB, + 0x0BD7, 0x0B92, 0x0B94, + FcitxKey_rightshoe, 0x0338, 0x2285, + FcitxKey_leftshoe, 0x0338, 0x2284, + FcitxKey_righttack, 0x0338, 0x22AC, + 0x0C46, 0x0C56, 0x0C48, + 0x0CBF, 0x0CD5, 0x0CC0, + 0x0CC6, 0x0CC2, 0x0CCA, + 0x0CC6, 0x0CD5, 0x0CC7, + 0x0CC6, 0x0CD6, 0x0CC8, + 0x0CCA, 0x0CD5, 0x0CCB, + 0x0D46, 0x0D3E, 0x0D4A, + 0x0D46, 0x0D57, 0x0D4C, + 0x0D47, 0x0D3E, 0x0D4B, + 0x0DD9, 0x0DCA, 0x0DDA, + 0x0DD9, 0x0DCF, 0x0DDC, + 0x0DD9, 0x0DDF, 0x0DDE, + 0x0DDC, 0x0DCA, 0x0DDD, + 0x0F71, 0x0F72, 0x0F73, + 0x0F71, 0x0F74, 0x0F75, + 0x0F71, 0x0F80, 0x0F81, + 0x0F90, 0x0FB5, 0x0FB9, + 0x0F92, 0x0FB7, 0x0F93, + 0x0F9C, 0x0FB7, 0x0F9D, + 0x0FA1, 0x0FB7, 0x0FA2, + 0x0FA6, 0x0FB7, 0x0FA7, + 0x0FAB, 0x0FB7, 0x0FAC, + 0x0FB2, 0x0F80, 0x0F76, + 0x0FB3, 0x0F80, 0x0F78, + 0x0FB5, 0x0F40, 0x0F69, + 0x0FB7, 0x0F42, 0x0F43, + 0x0FB7, 0x0F4C, 0x0F4D, + 0x0FB7, 0x0F51, 0x0F52, + 0x0FB7, 0x0F56, 0x0F57, + 0x0FB7, 0x0F5B, 0x0F5C, + 0x102E, 0x1025, 0x1026, + 0x1100, 0x1100, 0x1101, + 0x1102, 0x1100, 0x1113, + 0x1102, 0x1102, 0x1114, + 0x1102, 0x1103, 0x1115, + 0x1102, 0x1107, 0x1116, + 0x1103, 0x1100, 0x1117, + 0x1103, 0x1103, 0x1104, + 0x1105, 0x1102, 0x1118, + 0x1105, 0x1105, 0x1119, + 0x1105, 0x110B, 0x111B, + 0x1105, 0x1112, 0x111A, + 0x1106, 0x1107, 0x111C, + 0x1106, 0x110B, 0x111D, + 0x1107, 0x1100, 0x111E, + 0x1107, 0x1102, 0x111F, + 0x1107, 0x1103, 0x1120, + 0x1107, 0x1107, 0x1108, + 0x1107, 0x1109, 0x1121, + 0x1107, 0x110A, 0x1125, + 0x1107, 0x110B, 0x112B, + 0x1107, 0x110C, 0x1127, + 0x1107, 0x110E, 0x1128, + 0x1107, 0x1110, 0x1129, + 0x1107, 0x1111, 0x112A, + 0x1107, 0x112B, 0x112C, + 0x1107, 0x112D, 0x1122, + 0x1107, 0x112F, 0x1123, + 0x1107, 0x1132, 0x1124, + 0x1107, 0x1136, 0x1126, + 0x1108, 0x110B, 0x112C, + 0x1109, 0x1100, 0x112D, + 0x1109, 0x1102, 0x112E, + 0x1109, 0x1103, 0x112F, + 0x1109, 0x1105, 0x1130, + 0x1109, 0x1106, 0x1131, + 0x1109, 0x1107, 0x1132, + 0x1109, 0x1109, 0x110A, + 0x1109, 0x110A, 0x1134, + 0x1109, 0x110B, 0x1135, + 0x1109, 0x110C, 0x1136, + 0x1109, 0x110E, 0x1137, + 0x1109, 0x110F, 0x1138, + 0x1109, 0x1110, 0x1139, + 0x1109, 0x1111, 0x113A, + 0x1109, 0x1112, 0x113B, + 0x1109, 0x111E, 0x1133, + 0x110A, 0x1109, 0x1134, + 0x110B, 0x1100, 0x1141, + 0x110B, 0x1103, 0x1142, + 0x110B, 0x1106, 0x1143, + 0x110B, 0x1107, 0x1144, + 0x110B, 0x1109, 0x1145, + 0x110B, 0x110B, 0x1147, + 0x110B, 0x110C, 0x1148, + 0x110B, 0x110E, 0x1149, + 0x110B, 0x1110, 0x114A, + 0x110B, 0x1111, 0x114B, + 0x110B, 0x1140, 0x1146, + 0x110C, 0x110B, 0x114D, + 0x110C, 0x110C, 0x110D, + 0x110E, 0x110F, 0x1152, + 0x110E, 0x1112, 0x1153, + 0x1111, 0x1107, 0x1156, + 0x1111, 0x110B, 0x1157, + 0x1112, 0x1112, 0x1158, + 0x1121, 0x1100, 0x1122, + 0x1121, 0x1103, 0x1123, + 0x1121, 0x1107, 0x1124, + 0x1121, 0x1109, 0x1125, + 0x1121, 0x110C, 0x1126, + 0x1132, 0x1100, 0x1133, + 0x113C, 0x113C, 0x113D, + 0x113E, 0x113E, 0x113F, + 0x114E, 0x114E, 0x114F, + 0x1150, 0x1150, 0x1151, + 0x1161, 0x1169, 0x1176, + 0x1161, 0x116E, 0x1177, + 0x1161, 0x1175, 0x1162, + 0x1163, 0x1169, 0x1178, + 0x1163, 0x116D, 0x1179, + 0x1163, 0x1175, 0x1164, + 0x1165, 0x1169, 0x117A, + 0x1165, 0x116E, 0x117B, + 0x1165, 0x1173, 0x117C, + 0x1165, 0x1175, 0x1166, + 0x1167, 0x1169, 0x117D, + 0x1167, 0x116E, 0x117E, + 0x1167, 0x1175, 0x1168, + 0x1169, 0x1161, 0x116A, + 0x1169, 0x1162, 0x116B, + 0x1169, 0x1165, 0x117F, + 0x1169, 0x1166, 0x1180, + 0x1169, 0x1168, 0x1181, + 0x1169, 0x1169, 0x1182, + 0x1169, 0x116E, 0x1183, + 0x1169, 0x1175, 0x116C, + 0x116A, 0x1175, 0x116B, + 0x116D, 0x1163, 0x1184, + 0x116D, 0x1164, 0x1185, + 0x116D, 0x1167, 0x1186, + 0x116D, 0x1169, 0x1187, + 0x116D, 0x1175, 0x1188, + 0x116E, 0x1161, 0x1189, + 0x116E, 0x1162, 0x118A, + 0x116E, 0x1165, 0x116F, + 0x116E, 0x1166, 0x1170, + 0x116E, 0x1168, 0x118C, + 0x116E, 0x116E, 0x118D, + 0x116E, 0x1175, 0x1171, + 0x116E, 0x117C, 0x118B, + 0x116F, 0x1173, 0x118B, + 0x116F, 0x1175, 0x1170, + 0x1172, 0x1161, 0x118E, + 0x1172, 0x1165, 0x118F, + 0x1172, 0x1166, 0x1190, + 0x1172, 0x1167, 0x1191, + 0x1172, 0x1168, 0x1192, + 0x1172, 0x116E, 0x1193, + 0x1172, 0x1175, 0x1194, + 0x1173, 0x116E, 0x1195, + 0x1173, 0x1173, 0x1196, + 0x1173, 0x1175, 0x1174, + 0x1174, 0x116E, 0x1197, + 0x1175, 0x1161, 0x1198, + 0x1175, 0x1163, 0x1199, + 0x1175, 0x1169, 0x119A, + 0x1175, 0x116E, 0x119B, + 0x1175, 0x1173, 0x119C, + 0x1175, 0x119E, 0x119D, + 0x119E, 0x1165, 0x119F, + 0x119E, 0x116E, 0x11A0, + 0x119E, 0x1175, 0x11A1, + 0x119E, 0x119E, 0x11A2, + 0x11A8, 0x11A8, 0x11A9, + 0x11A8, 0x11AF, 0x11C3, + 0x11A8, 0x11BA, 0x11AA, + 0x11A8, 0x11E7, 0x11C4, + 0x11AA, 0x11A8, 0x11C4, + 0x11AB, 0x11A8, 0x11C5, + 0x11AB, 0x11AE, 0x11C6, + 0x11AB, 0x11BA, 0x11C7, + 0x11AB, 0x11BD, 0x11AC, + 0x11AB, 0x11C0, 0x11C9, + 0x11AB, 0x11C2, 0x11AD, + 0x11AB, 0x11EB, 0x11C8, + 0x11AE, 0x11A8, 0x11CA, + 0x11AE, 0x11AF, 0x11CB, + 0x11AF, 0x11A8, 0x11B0, + 0x11AF, 0x11AA, 0x11CC, + 0x11AF, 0x11AB, 0x11CD, + 0x11AF, 0x11AE, 0x11CE, + 0x11AF, 0x11AF, 0x11D0, + 0x11AF, 0x11B7, 0x11B1, + 0x11AF, 0x11B8, 0x11B2, + 0x11AF, 0x11B9, 0x11D3, + 0x11AF, 0x11BA, 0x11B3, + 0x11AF, 0x11BB, 0x11D6, + 0x11AF, 0x11BF, 0x11D8, + 0x11AF, 0x11C0, 0x11B4, + 0x11AF, 0x11C1, 0x11B5, + 0x11AF, 0x11C2, 0x11B6, + 0x11AF, 0x11DA, 0x11D1, + 0x11AF, 0x11DD, 0x11D2, + 0x11AF, 0x11E5, 0x11D4, + 0x11AF, 0x11E6, 0x11D5, + 0x11AF, 0x11EB, 0x11D7, + 0x11AF, 0x11F9, 0x11D9, + 0x11B0, 0x11BA, 0x11CC, + 0x11B1, 0x11A8, 0x11D1, + 0x11B1, 0x11BA, 0x11D2, + 0x11B2, 0x11BA, 0x11D3, + 0x11B2, 0x11BC, 0x11D5, + 0x11B2, 0x11C2, 0x11D4, + 0x11B3, 0x11BA, 0x11D6, + 0x11B7, 0x11A8, 0x11DA, + 0x11B7, 0x11AF, 0x11DB, + 0x11B7, 0x11B8, 0x11DC, + 0x11B7, 0x11BA, 0x11DD, + 0x11B7, 0x11BB, 0x11DE, + 0x11B7, 0x11BC, 0x11E2, + 0x11B7, 0x11BE, 0x11E0, + 0x11B7, 0x11C2, 0x11E1, + 0x11B7, 0x11EB, 0x11DF, + 0x11B8, 0x11AF, 0x11E3, + 0x11B8, 0x11BA, 0x11B9, + 0x11B8, 0x11BC, 0x11E6, + 0x11B8, 0x11C1, 0x11E4, + 0x11B8, 0x11C2, 0x11E5, + 0x11BA, 0x11A8, 0x11E7, + 0x11BA, 0x11AE, 0x11E8, + 0x11BA, 0x11AF, 0x11E9, + 0x11BA, 0x11B8, 0x11EA, + 0x11BA, 0x11BA, 0x11BB, + 0x11BC, 0x11A8, 0x11EC, + 0x11BC, 0x11A9, 0x11ED, + 0x11BC, 0x11BC, 0x11EE, + 0x11BC, 0x11BF, 0x11EF, + 0x11C1, 0x11B8, 0x11F3, + 0x11C1, 0x11BC, 0x11F4, + 0x11C2, 0x11AB, 0x11F5, + 0x11C2, 0x11AF, 0x11F6, + 0x11C2, 0x11B7, 0x11F7, + 0x11C2, 0x11B8, 0x11F8, + 0x11CE, 0x11C2, 0x11CF, + 0x11DD, 0x11BA, 0x11DE, + 0x11EC, 0x11A8, 0x11ED, + 0x11F0, 0x11BA, 0x11F1, + 0x11F0, 0x11EB, 0x11F2, + 0x1FBF, FcitxKey_apostrophe, 0x1FCE, + 0x1FBF, FcitxKey_grave, 0x1FCD, + 0x1FBF, FcitxKey_asciitilde, 0x1FCF, + 0x1FBF, FcitxKey_acute, 0x1FCE, + 0x1FBF, FcitxKey_dead_grave, 0x1FCD, + 0x1FBF, FcitxKey_dead_acute, 0x1FCE, + 0x1FBF, FcitxKey_dead_tilde, 0x1FCF, + 0x1FFE, FcitxKey_apostrophe, 0x1FDE, + 0x1FFE, FcitxKey_grave, 0x1FDD, + 0x1FFE, FcitxKey_asciitilde, 0x1FDF, + 0x1FFE, FcitxKey_acute, 0x1FDE, + 0x1FFE, FcitxKey_dead_grave, 0x1FDD, + 0x1FFE, FcitxKey_dead_acute, 0x1FDE, + 0x1FFE, FcitxKey_dead_tilde, 0x1FDF, + 0x2203, 0x0338, 0x2204, + 0x2208, 0x0338, 0x2209, + 0x220B, 0x0338, 0x220C, + 0x2223, 0x0338, 0x2224, + 0x2225, 0x0338, 0x2226, + 0x223C, 0x0338, 0x2241, + 0x2243, 0x0338, 0x2244, + 0x2248, 0x0338, 0x2249, + 0x224D, 0x0338, 0x226D, + 0x2272, 0x0338, 0x2274, + 0x2273, 0x0338, 0x2275, + 0x2276, 0x0338, 0x2278, + 0x2277, 0x0338, 0x2279, + 0x227A, 0x0338, 0x2280, + 0x227B, 0x0338, 0x2281, + 0x227C, 0x0338, 0x22E0, + 0x227D, 0x0338, 0x22E1, + 0x2286, 0x0338, 0x2288, + 0x2287, 0x0338, 0x2289, + 0x2291, 0x0338, 0x22E2, + 0x2292, 0x0338, 0x22E3, + 0x22A8, 0x0338, 0x22AD, + 0x22A9, 0x0338, 0x22AE, + 0x22AB, 0x0338, 0x22AF, + 0x22B2, 0x0338, 0x22EA, + 0x22B3, 0x0338, 0x22EB, + 0x22B4, 0x0338, 0x22EC, + 0x22B5, 0x0338, 0x22ED, + 0x2ADD, 0x0338, 0x2ADC, + FcitxKey_KP_Divide, FcitxKey_D, 0x0110, + FcitxKey_KP_Divide, FcitxKey_G, 0x01E4, + FcitxKey_KP_Divide, FcitxKey_H, 0x0126, + FcitxKey_KP_Divide, FcitxKey_I, 0x0197, + FcitxKey_KP_Divide, FcitxKey_L, 0x0141, + FcitxKey_KP_Divide, FcitxKey_O, 0x00D8, + FcitxKey_KP_Divide, FcitxKey_T, 0x0166, + FcitxKey_KP_Divide, FcitxKey_Z, 0x01B5, + FcitxKey_KP_Divide, FcitxKey_b, 0x0180, + FcitxKey_KP_Divide, FcitxKey_d, 0x0111, + FcitxKey_KP_Divide, FcitxKey_g, 0x01E5, + FcitxKey_KP_Divide, FcitxKey_h, 0x0127, + FcitxKey_KP_Divide, FcitxKey_i, 0x0268, + FcitxKey_KP_Divide, FcitxKey_l, 0x0142, + FcitxKey_KP_Divide, FcitxKey_o, 0x00F8, + FcitxKey_KP_Divide, FcitxKey_t, 0x0167, + FcitxKey_KP_Divide, FcitxKey_z, 0x01B6, + FcitxKey_KP_Divide, 0x0294, 0x02A1, + FcitxKey_KP_Divide, 0x04AE, 0x04B0, + FcitxKey_KP_Divide, 0x04AF, 0x04B1, + FcitxKey_KP_Divide, FcitxKey_Cyrillic_ghe, 0x0493, + FcitxKey_KP_Divide, FcitxKey_Cyrillic_ka, 0x049F, + FcitxKey_KP_Divide, FcitxKey_Cyrillic_GHE, 0x0492, + FcitxKey_KP_Divide, FcitxKey_Cyrillic_KA, 0x049E, + FcitxKey_KP_Divide, FcitxKey_leftarrow, 0x219A, + FcitxKey_KP_Divide, FcitxKey_rightarrow, 0x219B, + FcitxKey_KP_Divide, 0x2194, 0x21AE, + FcitxKey_KP_Equal, 0x0338, 0x2260, + FcitxKey_exclam, FcitxKey_plus, FcitxKey_O, 0x1EE2, + FcitxKey_exclam, FcitxKey_plus, FcitxKey_U, 0x1EF0, + FcitxKey_exclam, FcitxKey_plus, FcitxKey_o, 0x1EE3, + FcitxKey_exclam, FcitxKey_plus, FcitxKey_u, 0x1EF1, + FcitxKey_exclam, FcitxKey_dead_horn, FcitxKey_O, 0x1EE2, + FcitxKey_exclam, FcitxKey_dead_horn, FcitxKey_U, 0x1EF0, + FcitxKey_exclam, FcitxKey_dead_horn, FcitxKey_o, 0x1EE3, + FcitxKey_exclam, FcitxKey_dead_horn, FcitxKey_u, 0x1EF1, + FcitxKey_quotedbl, FcitxKey_apostrophe, FcitxKey_space, 0x0385, + FcitxKey_quotedbl, FcitxKey_apostrophe, FcitxKey_Greek_iota, 0x0390, + FcitxKey_quotedbl, FcitxKey_apostrophe, FcitxKey_Greek_upsilon, 0x03B0, + FcitxKey_quotedbl, FcitxKey_underscore, FcitxKey_U, 0x1E7A, + FcitxKey_quotedbl, FcitxKey_underscore, FcitxKey_u, 0x1E7B, + FcitxKey_quotedbl, FcitxKey_asciitilde, FcitxKey_O, 0x1E4E, + FcitxKey_quotedbl, FcitxKey_asciitilde, FcitxKey_o, 0x1E4F, + FcitxKey_quotedbl, FcitxKey_macron, FcitxKey_U, 0x1E7A, + FcitxKey_quotedbl, FcitxKey_macron, FcitxKey_u, 0x1E7B, + FcitxKey_quotedbl, FcitxKey_dead_tilde, FcitxKey_O, 0x1E4E, + FcitxKey_quotedbl, FcitxKey_dead_tilde, FcitxKey_o, 0x1E4F, + FcitxKey_quotedbl, FcitxKey_dead_macron, FcitxKey_U, 0x1E7A, + FcitxKey_quotedbl, FcitxKey_dead_macron, FcitxKey_u, 0x1E7B, + FcitxKey_apostrophe, FcitxKey_quotedbl, FcitxKey_space, 0x0385, + FcitxKey_apostrophe, FcitxKey_quotedbl, FcitxKey_I, 0x1E2E, + FcitxKey_apostrophe, FcitxKey_quotedbl, FcitxKey_U, 0x01D7, + FcitxKey_apostrophe, FcitxKey_quotedbl, FcitxKey_i, 0x1E2F, + FcitxKey_apostrophe, FcitxKey_quotedbl, FcitxKey_u, 0x01D8, + FcitxKey_apostrophe, FcitxKey_quotedbl, FcitxKey_Greek_iota, 0x0390, + FcitxKey_apostrophe, FcitxKey_quotedbl, FcitxKey_Greek_upsilon, 0x03B0, + FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F0D, + FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_EPSILON, 0x1F1D, + FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F2D, + FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_IOTA, 0x1F3D, + FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_OMICRON, 0x1F4D, + FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_UPSILON, 0x1F5D, + FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1F6D, + FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F05, + FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_epsilon, 0x1F15, + FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F25, + FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_iota, 0x1F35, + FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_omicron, 0x1F45, + FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_upsilon, 0x1F55, + FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1F65, + FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F0C, + FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_EPSILON, 0x1F1C, + FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F2C, + FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_IOTA, 0x1F3C, + FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_OMICRON, 0x1F4C, + FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1F6C, + FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F04, + FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_epsilon, 0x1F14, + FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F24, + FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_iota, 0x1F34, + FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_omicron, 0x1F44, + FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_upsilon, 0x1F54, + FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1F64, + FcitxKey_apostrophe, FcitxKey_plus, FcitxKey_O, 0x1EDA, + FcitxKey_apostrophe, FcitxKey_plus, FcitxKey_U, 0x1EE8, + FcitxKey_apostrophe, FcitxKey_plus, FcitxKey_o, 0x1EDB, + FcitxKey_apostrophe, FcitxKey_plus, FcitxKey_u, 0x1EE9, + FcitxKey_apostrophe, FcitxKey_slash, FcitxKey_O, 0x01FE, + FcitxKey_apostrophe, FcitxKey_slash, FcitxKey_o, 0x01FF, + FcitxKey_apostrophe, FcitxKey_asciicircum, FcitxKey_A, 0x1EA4, + FcitxKey_apostrophe, FcitxKey_asciicircum, FcitxKey_E, 0x1EBE, + FcitxKey_apostrophe, FcitxKey_asciicircum, FcitxKey_O, 0x1ED0, + FcitxKey_apostrophe, FcitxKey_asciicircum, FcitxKey_a, 0x1EA5, + FcitxKey_apostrophe, FcitxKey_asciicircum, FcitxKey_e, 0x1EBF, + FcitxKey_apostrophe, FcitxKey_asciicircum, FcitxKey_o, 0x1ED1, + FcitxKey_apostrophe, FcitxKey_underscore, FcitxKey_E, 0x1E16, + FcitxKey_apostrophe, FcitxKey_underscore, FcitxKey_O, 0x1E52, + FcitxKey_apostrophe, FcitxKey_underscore, FcitxKey_e, 0x1E17, + FcitxKey_apostrophe, FcitxKey_underscore, FcitxKey_o, 0x1E53, + FcitxKey_apostrophe, FcitxKey_b, FcitxKey_A, 0x1EAE, + FcitxKey_apostrophe, FcitxKey_b, FcitxKey_a, 0x1EAF, + FcitxKey_apostrophe, FcitxKey_asciitilde, FcitxKey_O, 0x1E4C, + FcitxKey_apostrophe, FcitxKey_asciitilde, FcitxKey_U, 0x1E78, + FcitxKey_apostrophe, FcitxKey_asciitilde, FcitxKey_o, 0x1E4D, + FcitxKey_apostrophe, FcitxKey_asciitilde, FcitxKey_u, 0x1E79, + FcitxKey_apostrophe, FcitxKey_macron, FcitxKey_E, 0x1E16, + FcitxKey_apostrophe, FcitxKey_macron, FcitxKey_O, 0x1E52, + FcitxKey_apostrophe, FcitxKey_macron, FcitxKey_e, 0x1E17, + FcitxKey_apostrophe, FcitxKey_macron, FcitxKey_o, 0x1E53, + FcitxKey_apostrophe, FcitxKey_cedilla, FcitxKey_C, 0x1E08, + FcitxKey_apostrophe, FcitxKey_cedilla, FcitxKey_c, 0x1E09, + FcitxKey_apostrophe, FcitxKey_dead_circumflex, FcitxKey_A, 0x1EA4, + FcitxKey_apostrophe, FcitxKey_dead_circumflex, FcitxKey_E, 0x1EBE, + FcitxKey_apostrophe, FcitxKey_dead_circumflex, FcitxKey_O, 0x1ED0, + FcitxKey_apostrophe, FcitxKey_dead_circumflex, FcitxKey_a, 0x1EA5, + FcitxKey_apostrophe, FcitxKey_dead_circumflex, FcitxKey_e, 0x1EBF, + FcitxKey_apostrophe, FcitxKey_dead_circumflex, FcitxKey_o, 0x1ED1, + FcitxKey_apostrophe, FcitxKey_dead_tilde, FcitxKey_O, 0x1E4C, + FcitxKey_apostrophe, FcitxKey_dead_tilde, FcitxKey_U, 0x1E78, + FcitxKey_apostrophe, FcitxKey_dead_tilde, FcitxKey_o, 0x1E4D, + FcitxKey_apostrophe, FcitxKey_dead_tilde, FcitxKey_u, 0x1E79, + FcitxKey_apostrophe, FcitxKey_dead_macron, FcitxKey_E, 0x1E16, + FcitxKey_apostrophe, FcitxKey_dead_macron, FcitxKey_O, 0x1E52, + FcitxKey_apostrophe, FcitxKey_dead_macron, FcitxKey_e, 0x1E17, + FcitxKey_apostrophe, FcitxKey_dead_macron, FcitxKey_o, 0x1E53, + FcitxKey_apostrophe, FcitxKey_dead_breve, FcitxKey_A, 0x1EAE, + FcitxKey_apostrophe, FcitxKey_dead_breve, FcitxKey_a, 0x1EAF, + FcitxKey_apostrophe, FcitxKey_dead_diaeresis, FcitxKey_I, 0x1E2E, + FcitxKey_apostrophe, FcitxKey_dead_diaeresis, FcitxKey_U, 0x01D7, + FcitxKey_apostrophe, FcitxKey_dead_diaeresis, FcitxKey_i, 0x1E2F, + FcitxKey_apostrophe, FcitxKey_dead_diaeresis, FcitxKey_u, 0x01D8, + FcitxKey_apostrophe, FcitxKey_dead_diaeresis, FcitxKey_Greek_iota, 0x0390, + FcitxKey_apostrophe, FcitxKey_dead_diaeresis, FcitxKey_Greek_upsilon, 0x03B0, + FcitxKey_apostrophe, FcitxKey_dead_abovering, FcitxKey_A, 0x01FA, + FcitxKey_apostrophe, FcitxKey_dead_abovering, FcitxKey_a, 0x01FB, + FcitxKey_apostrophe, FcitxKey_dead_cedilla, FcitxKey_C, 0x1E08, + FcitxKey_apostrophe, FcitxKey_dead_cedilla, FcitxKey_c, 0x1E09, + FcitxKey_apostrophe, FcitxKey_dead_horn, FcitxKey_O, 0x1EDA, + FcitxKey_apostrophe, FcitxKey_dead_horn, FcitxKey_U, 0x1EE8, + FcitxKey_apostrophe, FcitxKey_dead_horn, FcitxKey_o, 0x1EDB, + FcitxKey_apostrophe, FcitxKey_dead_horn, FcitxKey_u, 0x1EE9, + FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F0C, + FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_EPSILON, 0x1F1C, + FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F2C, + FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_IOTA, 0x1F3C, + FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_OMICRON, 0x1F4C, + FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1F6C, + FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F04, + FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_epsilon, 0x1F14, + FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F24, + FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_iota, 0x1F34, + FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_omicron, 0x1F44, + FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_upsilon, 0x1F54, + FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1F64, + FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F0D, + FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_EPSILON, 0x1F1D, + FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F2D, + FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_IOTA, 0x1F3D, + FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_OMICRON, 0x1F4D, + FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_UPSILON, 0x1F5D, + FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1F6D, + FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F05, + FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_epsilon, 0x1F15, + FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F25, + FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_iota, 0x1F35, + FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_omicron, 0x1F45, + FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_upsilon, 0x1F55, + FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1F65, + FcitxKey_apostrophe, FcitxKey_KP_Divide, FcitxKey_O, 0x01FE, + FcitxKey_apostrophe, FcitxKey_KP_Divide, FcitxKey_o, 0x01FF, + FcitxKey_parenleft, FcitxKey_0, FcitxKey_parenright, 0x24EA, + FcitxKey_parenleft, FcitxKey_1, FcitxKey_parenright, 0x2460, + FcitxKey_parenleft, FcitxKey_2, FcitxKey_parenright, 0x2461, + FcitxKey_parenleft, FcitxKey_3, FcitxKey_parenright, 0x2462, + FcitxKey_parenleft, FcitxKey_4, FcitxKey_parenright, 0x2463, + FcitxKey_parenleft, FcitxKey_5, FcitxKey_parenright, 0x2464, + FcitxKey_parenleft, FcitxKey_6, FcitxKey_parenright, 0x2465, + FcitxKey_parenleft, FcitxKey_7, FcitxKey_parenright, 0x2466, + FcitxKey_parenleft, FcitxKey_8, FcitxKey_parenright, 0x2467, + FcitxKey_parenleft, FcitxKey_9, FcitxKey_parenright, 0x2468, + FcitxKey_parenleft, FcitxKey_A, FcitxKey_parenright, 0x24B6, + FcitxKey_parenleft, FcitxKey_B, FcitxKey_parenright, 0x24B7, + FcitxKey_parenleft, FcitxKey_C, FcitxKey_parenright, 0x24B8, + FcitxKey_parenleft, FcitxKey_D, FcitxKey_parenright, 0x24B9, + FcitxKey_parenleft, FcitxKey_E, FcitxKey_parenright, 0x24BA, + FcitxKey_parenleft, FcitxKey_F, FcitxKey_parenright, 0x24BB, + FcitxKey_parenleft, FcitxKey_G, FcitxKey_parenright, 0x24BC, + FcitxKey_parenleft, FcitxKey_H, FcitxKey_parenright, 0x24BD, + FcitxKey_parenleft, FcitxKey_I, FcitxKey_parenright, 0x24BE, + FcitxKey_parenleft, FcitxKey_J, FcitxKey_parenright, 0x24BF, + FcitxKey_parenleft, FcitxKey_K, FcitxKey_parenright, 0x24C0, + FcitxKey_parenleft, FcitxKey_L, FcitxKey_parenright, 0x24C1, + FcitxKey_parenleft, FcitxKey_M, FcitxKey_parenright, 0x24C2, + FcitxKey_parenleft, FcitxKey_N, FcitxKey_parenright, 0x24C3, + FcitxKey_parenleft, FcitxKey_O, FcitxKey_parenright, 0x24C4, + FcitxKey_parenleft, FcitxKey_P, FcitxKey_parenright, 0x24C5, + FcitxKey_parenleft, FcitxKey_Q, FcitxKey_parenright, 0x24C6, + FcitxKey_parenleft, FcitxKey_R, FcitxKey_parenright, 0x24C7, + FcitxKey_parenleft, FcitxKey_S, FcitxKey_parenright, 0x24C8, + FcitxKey_parenleft, FcitxKey_T, FcitxKey_parenright, 0x24C9, + FcitxKey_parenleft, FcitxKey_U, FcitxKey_parenright, 0x24CA, + FcitxKey_parenleft, FcitxKey_V, FcitxKey_parenright, 0x24CB, + FcitxKey_parenleft, FcitxKey_W, FcitxKey_parenright, 0x24CC, + FcitxKey_parenleft, FcitxKey_X, FcitxKey_parenright, 0x24CD, + FcitxKey_parenleft, FcitxKey_Y, FcitxKey_parenright, 0x24CE, + FcitxKey_parenleft, FcitxKey_Z, FcitxKey_parenright, 0x24CF, + FcitxKey_parenleft, FcitxKey_a, FcitxKey_parenright, 0x24D0, + FcitxKey_parenleft, FcitxKey_b, FcitxKey_parenright, 0x24D1, + FcitxKey_parenleft, FcitxKey_c, FcitxKey_parenright, 0x24D2, + FcitxKey_parenleft, FcitxKey_d, FcitxKey_parenright, 0x24D3, + FcitxKey_parenleft, FcitxKey_e, FcitxKey_parenright, 0x24D4, + FcitxKey_parenleft, FcitxKey_f, FcitxKey_parenright, 0x24D5, + FcitxKey_parenleft, FcitxKey_g, FcitxKey_parenright, 0x24D6, + FcitxKey_parenleft, FcitxKey_h, FcitxKey_parenright, 0x24D7, + FcitxKey_parenleft, FcitxKey_i, FcitxKey_parenright, 0x24D8, + FcitxKey_parenleft, FcitxKey_j, FcitxKey_parenright, 0x24D9, + FcitxKey_parenleft, FcitxKey_k, FcitxKey_parenright, 0x24DA, + FcitxKey_parenleft, FcitxKey_l, FcitxKey_parenright, 0x24DB, + FcitxKey_parenleft, FcitxKey_m, FcitxKey_parenright, 0x24DC, + FcitxKey_parenleft, FcitxKey_n, FcitxKey_parenright, 0x24DD, + FcitxKey_parenleft, FcitxKey_o, FcitxKey_parenright, 0x24DE, + FcitxKey_parenleft, FcitxKey_p, FcitxKey_parenright, 0x24DF, + FcitxKey_parenleft, FcitxKey_q, FcitxKey_parenright, 0x24E0, + FcitxKey_parenleft, FcitxKey_r, FcitxKey_parenright, 0x24E1, + FcitxKey_parenleft, FcitxKey_s, FcitxKey_parenright, 0x24E2, + FcitxKey_parenleft, FcitxKey_t, FcitxKey_parenright, 0x24E3, + FcitxKey_parenleft, FcitxKey_u, FcitxKey_parenright, 0x24E4, + FcitxKey_parenleft, FcitxKey_v, FcitxKey_parenright, 0x24E5, + FcitxKey_parenleft, FcitxKey_w, FcitxKey_parenright, 0x24E6, + FcitxKey_parenleft, FcitxKey_x, FcitxKey_parenright, 0x24E7, + FcitxKey_parenleft, FcitxKey_y, FcitxKey_parenright, 0x24E8, + FcitxKey_parenleft, FcitxKey_z, FcitxKey_parenright, 0x24E9, + FcitxKey_parenleft, FcitxKey_kana_WO, FcitxKey_parenright, 0x32FE, + FcitxKey_parenleft, FcitxKey_kana_A, FcitxKey_parenright, 0x32D0, + FcitxKey_parenleft, FcitxKey_kana_I, FcitxKey_parenright, 0x32D1, + FcitxKey_parenleft, FcitxKey_kana_U, FcitxKey_parenright, 0x32D2, + FcitxKey_parenleft, FcitxKey_kana_E, FcitxKey_parenright, 0x32D3, + FcitxKey_parenleft, FcitxKey_kana_O, FcitxKey_parenright, 0x32D4, + FcitxKey_parenleft, FcitxKey_kana_KA, FcitxKey_parenright, 0x32D5, + FcitxKey_parenleft, FcitxKey_kana_KI, FcitxKey_parenright, 0x32D6, + FcitxKey_parenleft, FcitxKey_kana_KU, FcitxKey_parenright, 0x32D7, + FcitxKey_parenleft, FcitxKey_kana_KE, FcitxKey_parenright, 0x32D8, + FcitxKey_parenleft, FcitxKey_kana_KO, FcitxKey_parenright, 0x32D9, + FcitxKey_parenleft, FcitxKey_kana_SA, FcitxKey_parenright, 0x32DA, + FcitxKey_parenleft, FcitxKey_kana_SHI, FcitxKey_parenright, 0x32DB, + FcitxKey_parenleft, FcitxKey_kana_SU, FcitxKey_parenright, 0x32DC, + FcitxKey_parenleft, FcitxKey_kana_SE, FcitxKey_parenright, 0x32DD, + FcitxKey_parenleft, FcitxKey_kana_SO, FcitxKey_parenright, 0x32DE, + FcitxKey_parenleft, FcitxKey_kana_TA, FcitxKey_parenright, 0x32DF, + FcitxKey_parenleft, FcitxKey_kana_CHI, FcitxKey_parenright, 0x32E0, + FcitxKey_parenleft, FcitxKey_kana_TSU, FcitxKey_parenright, 0x32E1, + FcitxKey_parenleft, FcitxKey_kana_TE, FcitxKey_parenright, 0x32E2, + FcitxKey_parenleft, FcitxKey_kana_TO, FcitxKey_parenright, 0x32E3, + FcitxKey_parenleft, FcitxKey_kana_NA, FcitxKey_parenright, 0x32E4, + FcitxKey_parenleft, FcitxKey_kana_NI, FcitxKey_parenright, 0x32E5, + FcitxKey_parenleft, FcitxKey_kana_NU, FcitxKey_parenright, 0x32E6, + FcitxKey_parenleft, FcitxKey_kana_NE, FcitxKey_parenright, 0x32E7, + FcitxKey_parenleft, FcitxKey_kana_NO, FcitxKey_parenright, 0x32E8, + FcitxKey_parenleft, FcitxKey_kana_HA, FcitxKey_parenright, 0x32E9, + FcitxKey_parenleft, FcitxKey_kana_HI, FcitxKey_parenright, 0x32EA, + FcitxKey_parenleft, FcitxKey_kana_FU, FcitxKey_parenright, 0x32EB, + FcitxKey_parenleft, FcitxKey_kana_HE, FcitxKey_parenright, 0x32EC, + FcitxKey_parenleft, FcitxKey_kana_HO, FcitxKey_parenright, 0x32ED, + FcitxKey_parenleft, FcitxKey_kana_MA, FcitxKey_parenright, 0x32EE, + FcitxKey_parenleft, FcitxKey_kana_MI, FcitxKey_parenright, 0x32EF, + FcitxKey_parenleft, FcitxKey_kana_MU, FcitxKey_parenright, 0x32F0, + FcitxKey_parenleft, FcitxKey_kana_ME, FcitxKey_parenright, 0x32F1, + FcitxKey_parenleft, FcitxKey_kana_MO, FcitxKey_parenright, 0x32F2, + FcitxKey_parenleft, FcitxKey_kana_YA, FcitxKey_parenright, 0x32F3, + FcitxKey_parenleft, FcitxKey_kana_YU, FcitxKey_parenright, 0x32F4, + FcitxKey_parenleft, FcitxKey_kana_YO, FcitxKey_parenright, 0x32F5, + FcitxKey_parenleft, FcitxKey_kana_RA, FcitxKey_parenright, 0x32F6, + FcitxKey_parenleft, FcitxKey_kana_RI, FcitxKey_parenright, 0x32F7, + FcitxKey_parenleft, FcitxKey_kana_RU, FcitxKey_parenright, 0x32F8, + FcitxKey_parenleft, FcitxKey_kana_RE, FcitxKey_parenright, 0x32F9, + FcitxKey_parenleft, FcitxKey_kana_RO, FcitxKey_parenright, 0x32FA, + FcitxKey_parenleft, FcitxKey_kana_WA, FcitxKey_parenright, 0x32FB, + FcitxKey_parenleft, 0x1100, FcitxKey_parenright, 0x3260, + FcitxKey_parenleft, 0x1102, FcitxKey_parenright, 0x3261, + FcitxKey_parenleft, 0x1103, FcitxKey_parenright, 0x3262, + FcitxKey_parenleft, 0x1105, FcitxKey_parenright, 0x3263, + FcitxKey_parenleft, 0x1106, FcitxKey_parenright, 0x3264, + FcitxKey_parenleft, 0x1107, FcitxKey_parenright, 0x3265, + FcitxKey_parenleft, 0x1109, FcitxKey_parenright, 0x3266, + FcitxKey_parenleft, 0x110B, FcitxKey_parenright, 0x3267, + FcitxKey_parenleft, 0x110C, FcitxKey_parenright, 0x3268, + FcitxKey_parenleft, 0x110E, FcitxKey_parenright, 0x3269, + FcitxKey_parenleft, 0x110F, FcitxKey_parenright, 0x326A, + FcitxKey_parenleft, 0x1110, FcitxKey_parenright, 0x326B, + FcitxKey_parenleft, 0x1111, FcitxKey_parenright, 0x326C, + FcitxKey_parenleft, 0x1112, FcitxKey_parenright, 0x326D, + FcitxKey_parenleft, 0x30F0, FcitxKey_parenright, 0x32FC, + FcitxKey_parenleft, 0x30F1, FcitxKey_parenright, 0x32FD, + FcitxKey_parenleft, 0x4E00, FcitxKey_parenright, 0x3280, + FcitxKey_parenleft, 0x4E03, FcitxKey_parenright, 0x3286, + FcitxKey_parenleft, 0x4E09, FcitxKey_parenright, 0x3282, + FcitxKey_parenleft, 0x4E0A, FcitxKey_parenright, 0x32A4, + FcitxKey_parenleft, 0x4E0B, FcitxKey_parenright, 0x32A6, + FcitxKey_parenleft, 0x4E2D, FcitxKey_parenright, 0x32A5, + FcitxKey_parenleft, 0x4E5D, FcitxKey_parenright, 0x3288, + FcitxKey_parenleft, 0x4E8C, FcitxKey_parenright, 0x3281, + FcitxKey_parenleft, 0x4E94, FcitxKey_parenright, 0x3284, + FcitxKey_parenleft, 0x4F01, FcitxKey_parenright, 0x32AD, + FcitxKey_parenleft, 0x4F11, FcitxKey_parenright, 0x32A1, + FcitxKey_parenleft, 0x512A, FcitxKey_parenright, 0x329D, + FcitxKey_parenleft, 0x516B, FcitxKey_parenright, 0x3287, + FcitxKey_parenleft, 0x516D, FcitxKey_parenright, 0x3285, + FcitxKey_parenleft, 0x5199, FcitxKey_parenright, 0x32A2, + FcitxKey_parenleft, 0x52B4, FcitxKey_parenright, 0x3298, + FcitxKey_parenleft, 0x533B, FcitxKey_parenright, 0x32A9, + FcitxKey_parenleft, 0x5341, FcitxKey_parenright, 0x3289, + FcitxKey_parenleft, 0x5354, FcitxKey_parenright, 0x32AF, + FcitxKey_parenleft, 0x5370, FcitxKey_parenright, 0x329E, + FcitxKey_parenleft, 0x53F3, FcitxKey_parenright, 0x32A8, + FcitxKey_parenleft, 0x540D, FcitxKey_parenright, 0x3294, + FcitxKey_parenleft, 0x56DB, FcitxKey_parenright, 0x3283, + FcitxKey_parenleft, 0x571F, FcitxKey_parenright, 0x328F, + FcitxKey_parenleft, 0x591C, FcitxKey_parenright, 0x32B0, + FcitxKey_parenleft, 0x5973, FcitxKey_parenright, 0x329B, + FcitxKey_parenleft, 0x5B66, FcitxKey_parenright, 0x32AB, + FcitxKey_parenleft, 0x5B97, FcitxKey_parenright, 0x32AA, + FcitxKey_parenleft, 0x5DE6, FcitxKey_parenright, 0x32A7, + FcitxKey_parenleft, 0x65E5, FcitxKey_parenright, 0x3290, + FcitxKey_parenleft, 0x6708, FcitxKey_parenright, 0x328A, + FcitxKey_parenleft, 0x6709, FcitxKey_parenright, 0x3292, + FcitxKey_parenleft, 0x6728, FcitxKey_parenright, 0x328D, + FcitxKey_parenleft, 0x682A, FcitxKey_parenright, 0x3291, + FcitxKey_parenleft, 0x6B63, FcitxKey_parenright, 0x32A3, + FcitxKey_parenleft, 0x6C34, FcitxKey_parenright, 0x328C, + FcitxKey_parenleft, 0x6CE8, FcitxKey_parenright, 0x329F, + FcitxKey_parenleft, 0x706B, FcitxKey_parenright, 0x328B, + FcitxKey_parenleft, 0x7279, FcitxKey_parenright, 0x3295, + FcitxKey_parenleft, 0x7537, FcitxKey_parenright, 0x329A, + FcitxKey_parenleft, 0x76E3, FcitxKey_parenright, 0x32AC, + FcitxKey_parenleft, 0x793E, FcitxKey_parenright, 0x3293, + FcitxKey_parenleft, 0x795D, FcitxKey_parenright, 0x3297, + FcitxKey_parenleft, 0x79D8, FcitxKey_parenright, 0x3299, + FcitxKey_parenleft, 0x8CA1, FcitxKey_parenright, 0x3296, + FcitxKey_parenleft, 0x8CC7, FcitxKey_parenright, 0x32AE, + FcitxKey_parenleft, 0x9069, FcitxKey_parenright, 0x329C, + FcitxKey_parenleft, 0x91D1, FcitxKey_parenright, 0x328E, + FcitxKey_parenleft, 0x9805, FcitxKey_parenright, 0x32A0, + FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_parenright, 0x2461, + FcitxKey_parenleft, FcitxKey_KP_0, FcitxKey_parenright, 0x24EA, + FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_parenright, 0x2460, + FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_parenright, 0x2461, + FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_parenright, 0x2462, + FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_parenright, 0x2463, + FcitxKey_parenleft, FcitxKey_KP_5, FcitxKey_parenright, 0x2464, + FcitxKey_parenleft, FcitxKey_KP_6, FcitxKey_parenright, 0x2465, + FcitxKey_parenleft, FcitxKey_KP_7, FcitxKey_parenright, 0x2466, + FcitxKey_parenleft, FcitxKey_KP_8, FcitxKey_parenright, 0x2467, + FcitxKey_parenleft, FcitxKey_KP_9, FcitxKey_parenright, 0x2468, + FcitxKey_minus, FcitxKey_minus, FcitxKey_space, 0x00AD, + FcitxKey_minus, FcitxKey_minus, FcitxKey_minus, 0x2014, + FcitxKey_minus, FcitxKey_minus, FcitxKey_period, 0x2013, + FcitxKey_period, FcitxKey_exclam, FcitxKey_S, 0x1E68, + FcitxKey_period, FcitxKey_exclam, FcitxKey_s, 0x1E69, + FcitxKey_period, FcitxKey_apostrophe, FcitxKey_S, 0x1E64, + FcitxKey_period, FcitxKey_apostrophe, FcitxKey_s, 0x1E65, + FcitxKey_period, FcitxKey_acute, FcitxKey_S, 0x1E64, + FcitxKey_period, FcitxKey_acute, FcitxKey_s, 0x1E65, + FcitxKey_period, FcitxKey_dead_acute, FcitxKey_S, 0x1E64, + FcitxKey_period, FcitxKey_dead_acute, FcitxKey_s, 0x1E65, + FcitxKey_period, FcitxKey_dead_caron, FcitxKey_S, 0x1E66, + FcitxKey_period, FcitxKey_dead_caron, FcitxKey_s, 0x1E67, + FcitxKey_period, FcitxKey_dead_belowdot, FcitxKey_S, 0x1E68, + FcitxKey_period, FcitxKey_dead_belowdot, FcitxKey_s, 0x1E69, + FcitxKey_question, FcitxKey_plus, FcitxKey_O, 0x1EDE, + FcitxKey_question, FcitxKey_plus, FcitxKey_U, 0x1EEC, + FcitxKey_question, FcitxKey_plus, FcitxKey_o, 0x1EDF, + FcitxKey_question, FcitxKey_plus, FcitxKey_u, 0x1EED, + FcitxKey_question, FcitxKey_asciicircum, FcitxKey_A, 0x1EA8, + FcitxKey_question, FcitxKey_asciicircum, FcitxKey_E, 0x1EC2, + FcitxKey_question, FcitxKey_asciicircum, FcitxKey_O, 0x1ED4, + FcitxKey_question, FcitxKey_asciicircum, FcitxKey_a, 0x1EA9, + FcitxKey_question, FcitxKey_asciicircum, FcitxKey_e, 0x1EC3, + FcitxKey_question, FcitxKey_asciicircum, FcitxKey_o, 0x1ED5, + FcitxKey_question, FcitxKey_b, FcitxKey_A, 0x1EB2, + FcitxKey_question, FcitxKey_b, FcitxKey_a, 0x1EB3, + FcitxKey_question, FcitxKey_dead_circumflex, FcitxKey_A, 0x1EA8, + FcitxKey_question, FcitxKey_dead_circumflex, FcitxKey_E, 0x1EC2, + FcitxKey_question, FcitxKey_dead_circumflex, FcitxKey_O, 0x1ED4, + FcitxKey_question, FcitxKey_dead_circumflex, FcitxKey_a, 0x1EA9, + FcitxKey_question, FcitxKey_dead_circumflex, FcitxKey_e, 0x1EC3, + FcitxKey_question, FcitxKey_dead_circumflex, FcitxKey_o, 0x1ED5, + FcitxKey_question, FcitxKey_dead_breve, FcitxKey_A, 0x1EB2, + FcitxKey_question, FcitxKey_dead_breve, FcitxKey_a, 0x1EB3, + FcitxKey_question, FcitxKey_dead_horn, FcitxKey_O, 0x1EDE, + FcitxKey_question, FcitxKey_dead_horn, FcitxKey_U, 0x1EEC, + FcitxKey_question, FcitxKey_dead_horn, FcitxKey_o, 0x1EDF, + FcitxKey_question, FcitxKey_dead_horn, FcitxKey_u, 0x1EED, + FcitxKey_U, FcitxKey_exclam, FcitxKey_A, 0x1EB6, + FcitxKey_U, FcitxKey_exclam, FcitxKey_a, 0x1EB7, + FcitxKey_U, FcitxKey_comma, FcitxKey_E, 0x1E1C, + FcitxKey_U, FcitxKey_comma, FcitxKey_e, 0x1E1D, + FcitxKey_U, FcitxKey_cedilla, FcitxKey_E, 0x1E1C, + FcitxKey_U, FcitxKey_cedilla, FcitxKey_e, 0x1E1D, + FcitxKey_U, FcitxKey_dead_cedilla, FcitxKey_E, 0x1E1C, + FcitxKey_U, FcitxKey_dead_cedilla, FcitxKey_e, 0x1E1D, + FcitxKey_U, FcitxKey_dead_belowdot, FcitxKey_A, 0x1EB6, + FcitxKey_U, FcitxKey_dead_belowdot, FcitxKey_a, 0x1EB7, + FcitxKey_asciicircum, FcitxKey_exclam, FcitxKey_A, 0x1EAC, + FcitxKey_asciicircum, FcitxKey_exclam, FcitxKey_E, 0x1EC6, + FcitxKey_asciicircum, FcitxKey_exclam, FcitxKey_O, 0x1ED8, + FcitxKey_asciicircum, FcitxKey_exclam, FcitxKey_a, 0x1EAD, + FcitxKey_asciicircum, FcitxKey_exclam, FcitxKey_e, 0x1EC7, + FcitxKey_asciicircum, FcitxKey_exclam, FcitxKey_o, 0x1ED9, + FcitxKey_asciicircum, FcitxKey_underscore, FcitxKey_a, 0x00AA, + FcitxKey_asciicircum, FcitxKey_underscore, FcitxKey_h, 0x02B0, + FcitxKey_asciicircum, FcitxKey_underscore, FcitxKey_i, 0x2071, + FcitxKey_asciicircum, FcitxKey_underscore, FcitxKey_j, 0x02B2, + FcitxKey_asciicircum, FcitxKey_underscore, FcitxKey_l, 0x02E1, + FcitxKey_asciicircum, FcitxKey_underscore, FcitxKey_n, 0x207F, + FcitxKey_asciicircum, FcitxKey_underscore, FcitxKey_o, 0x00BA, + FcitxKey_asciicircum, FcitxKey_underscore, FcitxKey_r, 0x02B3, + FcitxKey_asciicircum, FcitxKey_underscore, FcitxKey_s, 0x02E2, + FcitxKey_asciicircum, FcitxKey_underscore, FcitxKey_w, 0x02B7, + FcitxKey_asciicircum, FcitxKey_underscore, FcitxKey_x, 0x02E3, + FcitxKey_asciicircum, FcitxKey_underscore, FcitxKey_y, 0x02B8, + FcitxKey_asciicircum, FcitxKey_underscore, 0x0263, 0x02E0, + FcitxKey_asciicircum, FcitxKey_underscore, 0x0266, 0x02B1, + FcitxKey_asciicircum, FcitxKey_underscore, 0x0279, 0x02B4, + FcitxKey_asciicircum, FcitxKey_underscore, 0x027B, 0x02B5, + FcitxKey_asciicircum, FcitxKey_underscore, 0x0281, 0x02B6, + FcitxKey_asciicircum, FcitxKey_underscore, 0x0295, 0x02E4, + FcitxKey_asciicircum, FcitxKey_underbar, FcitxKey_a, 0x00AA, + FcitxKey_asciicircum, FcitxKey_underbar, FcitxKey_h, 0x02B0, + FcitxKey_asciicircum, FcitxKey_underbar, FcitxKey_i, 0x2071, + FcitxKey_asciicircum, FcitxKey_underbar, FcitxKey_j, 0x02B2, + FcitxKey_asciicircum, FcitxKey_underbar, FcitxKey_l, 0x02E1, + FcitxKey_asciicircum, FcitxKey_underbar, FcitxKey_n, 0x207F, + FcitxKey_asciicircum, FcitxKey_underbar, FcitxKey_o, 0x00BA, + FcitxKey_asciicircum, FcitxKey_underbar, FcitxKey_r, 0x02B3, + FcitxKey_asciicircum, FcitxKey_underbar, FcitxKey_s, 0x02E2, + FcitxKey_asciicircum, FcitxKey_underbar, FcitxKey_w, 0x02B7, + FcitxKey_asciicircum, FcitxKey_underbar, FcitxKey_x, 0x02E3, + FcitxKey_asciicircum, FcitxKey_underbar, FcitxKey_y, 0x02B8, + FcitxKey_asciicircum, FcitxKey_underbar, 0x0263, 0x02E0, + FcitxKey_asciicircum, FcitxKey_underbar, 0x0266, 0x02B1, + FcitxKey_asciicircum, FcitxKey_underbar, 0x0279, 0x02B4, + FcitxKey_asciicircum, FcitxKey_underbar, 0x027B, 0x02B5, + FcitxKey_asciicircum, FcitxKey_underbar, 0x0281, 0x02B6, + FcitxKey_asciicircum, FcitxKey_underbar, 0x0295, 0x02E4, + FcitxKey_asciicircum, FcitxKey_dead_belowdot, FcitxKey_A, 0x1EAC, + FcitxKey_asciicircum, FcitxKey_dead_belowdot, FcitxKey_E, 0x1EC6, + FcitxKey_asciicircum, FcitxKey_dead_belowdot, FcitxKey_O, 0x1ED8, + FcitxKey_asciicircum, FcitxKey_dead_belowdot, FcitxKey_a, 0x1EAD, + FcitxKey_asciicircum, FcitxKey_dead_belowdot, FcitxKey_e, 0x1EC7, + FcitxKey_asciicircum, FcitxKey_dead_belowdot, FcitxKey_o, 0x1ED9, + FcitxKey_underscore, FcitxKey_exclam, FcitxKey_L, 0x1E38, + FcitxKey_underscore, FcitxKey_exclam, FcitxKey_R, 0x1E5C, + FcitxKey_underscore, FcitxKey_exclam, FcitxKey_l, 0x1E39, + FcitxKey_underscore, FcitxKey_exclam, FcitxKey_r, 0x1E5D, + FcitxKey_underscore, FcitxKey_quotedbl, FcitxKey_A, 0x01DE, + FcitxKey_underscore, FcitxKey_quotedbl, FcitxKey_O, 0x022A, + FcitxKey_underscore, FcitxKey_quotedbl, FcitxKey_U, 0x01D5, + FcitxKey_underscore, FcitxKey_quotedbl, FcitxKey_a, 0x01DF, + FcitxKey_underscore, FcitxKey_quotedbl, FcitxKey_o, 0x022B, + FcitxKey_underscore, FcitxKey_quotedbl, FcitxKey_u, 0x01D6, + FcitxKey_underscore, FcitxKey_period, FcitxKey_A, 0x01E0, + FcitxKey_underscore, FcitxKey_period, FcitxKey_O, 0x0230, + FcitxKey_underscore, FcitxKey_period, FcitxKey_a, 0x01E1, + FcitxKey_underscore, FcitxKey_period, FcitxKey_o, 0x0231, + FcitxKey_underscore, FcitxKey_semicolon, FcitxKey_O, 0x01EC, + FcitxKey_underscore, FcitxKey_semicolon, FcitxKey_o, 0x01ED, + FcitxKey_underscore, FcitxKey_asciitilde, FcitxKey_O, 0x022C, + FcitxKey_underscore, FcitxKey_asciitilde, FcitxKey_o, 0x022D, + FcitxKey_underscore, FcitxKey_dead_tilde, FcitxKey_O, 0x022C, + FcitxKey_underscore, FcitxKey_dead_tilde, FcitxKey_o, 0x022D, + FcitxKey_underscore, FcitxKey_dead_abovedot, FcitxKey_A, 0x01E0, + FcitxKey_underscore, FcitxKey_dead_abovedot, FcitxKey_O, 0x0230, + FcitxKey_underscore, FcitxKey_dead_abovedot, FcitxKey_a, 0x01E1, + FcitxKey_underscore, FcitxKey_dead_abovedot, FcitxKey_o, 0x0231, + FcitxKey_underscore, FcitxKey_dead_diaeresis, FcitxKey_A, 0x01DE, + FcitxKey_underscore, FcitxKey_dead_diaeresis, FcitxKey_O, 0x022A, + FcitxKey_underscore, FcitxKey_dead_diaeresis, FcitxKey_U, 0x01D5, + FcitxKey_underscore, FcitxKey_dead_diaeresis, FcitxKey_a, 0x01DF, + FcitxKey_underscore, FcitxKey_dead_diaeresis, FcitxKey_o, 0x022B, + FcitxKey_underscore, FcitxKey_dead_diaeresis, FcitxKey_u, 0x01D6, + FcitxKey_underscore, FcitxKey_dead_ogonek, FcitxKey_O, 0x01EC, + FcitxKey_underscore, FcitxKey_dead_ogonek, FcitxKey_o, 0x01ED, + FcitxKey_underscore, FcitxKey_dead_belowdot, FcitxKey_L, 0x1E38, + FcitxKey_underscore, FcitxKey_dead_belowdot, FcitxKey_R, 0x1E5C, + FcitxKey_underscore, FcitxKey_dead_belowdot, FcitxKey_l, 0x1E39, + FcitxKey_underscore, FcitxKey_dead_belowdot, FcitxKey_r, 0x1E5D, + FcitxKey_grave, FcitxKey_quotedbl, FcitxKey_U, 0x01DB, + FcitxKey_grave, FcitxKey_quotedbl, FcitxKey_u, 0x01DC, + FcitxKey_grave, FcitxKey_quotedbl, FcitxKey_Greek_iota, 0x1FD2, + FcitxKey_grave, FcitxKey_quotedbl, FcitxKey_Greek_upsilon, 0x1FE2, + FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F0B, + FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_EPSILON, 0x1F1B, + FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F2B, + FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_IOTA, 0x1F3B, + FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_OMICRON, 0x1F4B, + FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_UPSILON, 0x1F5B, + FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1F6B, + FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F03, + FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_epsilon, 0x1F13, + FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F23, + FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_iota, 0x1F33, + FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_omicron, 0x1F43, + FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_upsilon, 0x1F53, + FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1F63, + FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F0A, + FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_EPSILON, 0x1F1A, + FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F2A, + FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_IOTA, 0x1F3A, + FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_OMICRON, 0x1F4A, + FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1F6A, + FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F02, + FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_epsilon, 0x1F12, + FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F22, + FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_iota, 0x1F32, + FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_omicron, 0x1F42, + FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_upsilon, 0x1F52, + FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1F62, + FcitxKey_grave, FcitxKey_plus, FcitxKey_O, 0x1EDC, + FcitxKey_grave, FcitxKey_plus, FcitxKey_U, 0x1EEA, + FcitxKey_grave, FcitxKey_plus, FcitxKey_o, 0x1EDD, + FcitxKey_grave, FcitxKey_plus, FcitxKey_u, 0x1EEB, + FcitxKey_grave, FcitxKey_asciicircum, FcitxKey_A, 0x1EA6, + FcitxKey_grave, FcitxKey_asciicircum, FcitxKey_E, 0x1EC0, + FcitxKey_grave, FcitxKey_asciicircum, FcitxKey_O, 0x1ED2, + FcitxKey_grave, FcitxKey_asciicircum, FcitxKey_a, 0x1EA7, + FcitxKey_grave, FcitxKey_asciicircum, FcitxKey_e, 0x1EC1, + FcitxKey_grave, FcitxKey_asciicircum, FcitxKey_o, 0x1ED3, + FcitxKey_grave, FcitxKey_underscore, FcitxKey_E, 0x1E14, + FcitxKey_grave, FcitxKey_underscore, FcitxKey_O, 0x1E50, + FcitxKey_grave, FcitxKey_underscore, FcitxKey_e, 0x1E15, + FcitxKey_grave, FcitxKey_underscore, FcitxKey_o, 0x1E51, + FcitxKey_grave, FcitxKey_b, FcitxKey_A, 0x1EB0, + FcitxKey_grave, FcitxKey_b, FcitxKey_a, 0x1EB1, + FcitxKey_grave, FcitxKey_macron, FcitxKey_E, 0x1E14, + FcitxKey_grave, FcitxKey_macron, FcitxKey_O, 0x1E50, + FcitxKey_grave, FcitxKey_macron, FcitxKey_e, 0x1E15, + FcitxKey_grave, FcitxKey_macron, FcitxKey_o, 0x1E51, + FcitxKey_grave, FcitxKey_dead_circumflex, FcitxKey_A, 0x1EA6, + FcitxKey_grave, FcitxKey_dead_circumflex, FcitxKey_E, 0x1EC0, + FcitxKey_grave, FcitxKey_dead_circumflex, FcitxKey_O, 0x1ED2, + FcitxKey_grave, FcitxKey_dead_circumflex, FcitxKey_a, 0x1EA7, + FcitxKey_grave, FcitxKey_dead_circumflex, FcitxKey_e, 0x1EC1, + FcitxKey_grave, FcitxKey_dead_circumflex, FcitxKey_o, 0x1ED3, + FcitxKey_grave, FcitxKey_dead_macron, FcitxKey_E, 0x1E14, + FcitxKey_grave, FcitxKey_dead_macron, FcitxKey_O, 0x1E50, + FcitxKey_grave, FcitxKey_dead_macron, FcitxKey_e, 0x1E15, + FcitxKey_grave, FcitxKey_dead_macron, FcitxKey_o, 0x1E51, + FcitxKey_grave, FcitxKey_dead_breve, FcitxKey_A, 0x1EB0, + FcitxKey_grave, FcitxKey_dead_breve, FcitxKey_a, 0x1EB1, + FcitxKey_grave, FcitxKey_dead_diaeresis, FcitxKey_U, 0x01DB, + FcitxKey_grave, FcitxKey_dead_diaeresis, FcitxKey_u, 0x01DC, + FcitxKey_grave, FcitxKey_dead_diaeresis, FcitxKey_Greek_iota, 0x1FD2, + FcitxKey_grave, FcitxKey_dead_diaeresis, FcitxKey_Greek_upsilon, 0x1FE2, + FcitxKey_grave, FcitxKey_dead_horn, FcitxKey_O, 0x1EDC, + FcitxKey_grave, FcitxKey_dead_horn, FcitxKey_U, 0x1EEA, + FcitxKey_grave, FcitxKey_dead_horn, FcitxKey_o, 0x1EDD, + FcitxKey_grave, FcitxKey_dead_horn, FcitxKey_u, 0x1EEB, + FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F0A, + FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_EPSILON, 0x1F1A, + FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F2A, + FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_IOTA, 0x1F3A, + FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_OMICRON, 0x1F4A, + FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1F6A, + FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F02, + FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_epsilon, 0x1F12, + FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F22, + FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_iota, 0x1F32, + FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_omicron, 0x1F42, + FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_upsilon, 0x1F52, + FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1F62, + FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F0B, + FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_EPSILON, 0x1F1B, + FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F2B, + FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_IOTA, 0x1F3B, + FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_OMICRON, 0x1F4B, + FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_UPSILON, 0x1F5B, + FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1F6B, + FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F03, + FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_epsilon, 0x1F13, + FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F23, + FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_iota, 0x1F33, + FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_omicron, 0x1F43, + FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_upsilon, 0x1F53, + FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1F63, + FcitxKey_b, FcitxKey_exclam, FcitxKey_A, 0x1EB6, + FcitxKey_b, FcitxKey_exclam, FcitxKey_a, 0x1EB7, + FcitxKey_b, FcitxKey_comma, FcitxKey_E, 0x1E1C, + FcitxKey_b, FcitxKey_comma, FcitxKey_e, 0x1E1D, + FcitxKey_b, FcitxKey_cedilla, FcitxKey_E, 0x1E1C, + FcitxKey_b, FcitxKey_cedilla, FcitxKey_e, 0x1E1D, + FcitxKey_b, FcitxKey_dead_cedilla, FcitxKey_E, 0x1E1C, + FcitxKey_b, FcitxKey_dead_cedilla, FcitxKey_e, 0x1E1D, + FcitxKey_b, FcitxKey_dead_belowdot, FcitxKey_A, 0x1EB6, + FcitxKey_b, FcitxKey_dead_belowdot, FcitxKey_a, 0x1EB7, + FcitxKey_c, FcitxKey_quotedbl, FcitxKey_U, 0x01D9, + FcitxKey_c, FcitxKey_quotedbl, FcitxKey_u, 0x01DA, + FcitxKey_c, FcitxKey_dead_diaeresis, FcitxKey_U, 0x01D9, + FcitxKey_c, FcitxKey_dead_diaeresis, FcitxKey_u, 0x01DA, + FcitxKey_o, FcitxKey_apostrophe, FcitxKey_A, 0x01FA, + FcitxKey_o, FcitxKey_apostrophe, FcitxKey_a, 0x01FB, + FcitxKey_asciitilde, FcitxKey_quotedbl, FcitxKey_Greek_iota, 0x1FD7, + FcitxKey_asciitilde, FcitxKey_quotedbl, FcitxKey_Greek_upsilon, 0x1FE7, + FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F0F, + FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F2F, + FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_IOTA, 0x1F3F, + FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_UPSILON, 0x1F5F, + FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1F6F, + FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F07, + FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F27, + FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_iota, 0x1F37, + FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_upsilon, 0x1F57, + FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1F67, + FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F0E, + FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F2E, + FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_IOTA, 0x1F3E, + FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1F6E, + FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F06, + FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F26, + FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_iota, 0x1F36, + FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_upsilon, 0x1F56, + FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1F66, + FcitxKey_asciitilde, FcitxKey_plus, FcitxKey_O, 0x1EE0, + FcitxKey_asciitilde, FcitxKey_plus, FcitxKey_U, 0x1EEE, + FcitxKey_asciitilde, FcitxKey_plus, FcitxKey_o, 0x1EE1, + FcitxKey_asciitilde, FcitxKey_plus, FcitxKey_u, 0x1EEF, + FcitxKey_asciitilde, FcitxKey_asciicircum, FcitxKey_A, 0x1EAA, + FcitxKey_asciitilde, FcitxKey_asciicircum, FcitxKey_E, 0x1EC4, + FcitxKey_asciitilde, FcitxKey_asciicircum, FcitxKey_O, 0x1ED6, + FcitxKey_asciitilde, FcitxKey_asciicircum, FcitxKey_a, 0x1EAB, + FcitxKey_asciitilde, FcitxKey_asciicircum, FcitxKey_e, 0x1EC5, + FcitxKey_asciitilde, FcitxKey_asciicircum, FcitxKey_o, 0x1ED7, + FcitxKey_asciitilde, FcitxKey_b, FcitxKey_A, 0x1EB4, + FcitxKey_asciitilde, FcitxKey_b, FcitxKey_a, 0x1EB5, + FcitxKey_asciitilde, FcitxKey_dead_circumflex, FcitxKey_A, 0x1EAA, + FcitxKey_asciitilde, FcitxKey_dead_circumflex, FcitxKey_E, 0x1EC4, + FcitxKey_asciitilde, FcitxKey_dead_circumflex, FcitxKey_O, 0x1ED6, + FcitxKey_asciitilde, FcitxKey_dead_circumflex, FcitxKey_a, 0x1EAB, + FcitxKey_asciitilde, FcitxKey_dead_circumflex, FcitxKey_e, 0x1EC5, + FcitxKey_asciitilde, FcitxKey_dead_circumflex, FcitxKey_o, 0x1ED7, + FcitxKey_asciitilde, FcitxKey_dead_breve, FcitxKey_A, 0x1EB4, + FcitxKey_asciitilde, FcitxKey_dead_breve, FcitxKey_a, 0x1EB5, + FcitxKey_asciitilde, FcitxKey_dead_diaeresis, FcitxKey_Greek_iota, 0x1FD7, + FcitxKey_asciitilde, FcitxKey_dead_diaeresis, FcitxKey_Greek_upsilon, 0x1FE7, + FcitxKey_asciitilde, FcitxKey_dead_horn, FcitxKey_O, 0x1EE0, + FcitxKey_asciitilde, FcitxKey_dead_horn, FcitxKey_U, 0x1EEE, + FcitxKey_asciitilde, FcitxKey_dead_horn, FcitxKey_o, 0x1EE1, + FcitxKey_asciitilde, FcitxKey_dead_horn, FcitxKey_u, 0x1EEF, + FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F0E, + FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F2E, + FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_IOTA, 0x1F3E, + FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1F6E, + FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F06, + FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F26, + FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_iota, 0x1F36, + FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_upsilon, 0x1F56, + FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1F66, + FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F0F, + FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F2F, + FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_IOTA, 0x1F3F, + FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_UPSILON, 0x1F5F, + FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1F6F, + FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F07, + FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F27, + FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_iota, 0x1F37, + FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_upsilon, 0x1F57, + FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1F67, + FcitxKey_macron, FcitxKey_exclam, FcitxKey_L, 0x1E38, + FcitxKey_macron, FcitxKey_exclam, FcitxKey_R, 0x1E5C, + FcitxKey_macron, FcitxKey_exclam, FcitxKey_l, 0x1E39, + FcitxKey_macron, FcitxKey_exclam, FcitxKey_r, 0x1E5D, + FcitxKey_macron, FcitxKey_quotedbl, FcitxKey_A, 0x01DE, + FcitxKey_macron, FcitxKey_quotedbl, FcitxKey_O, 0x022A, + FcitxKey_macron, FcitxKey_quotedbl, FcitxKey_U, 0x01D5, + FcitxKey_macron, FcitxKey_quotedbl, FcitxKey_a, 0x01DF, + FcitxKey_macron, FcitxKey_quotedbl, FcitxKey_o, 0x022B, + FcitxKey_macron, FcitxKey_quotedbl, FcitxKey_u, 0x01D6, + FcitxKey_macron, FcitxKey_period, FcitxKey_A, 0x01E0, + FcitxKey_macron, FcitxKey_period, FcitxKey_O, 0x0230, + FcitxKey_macron, FcitxKey_period, FcitxKey_a, 0x01E1, + FcitxKey_macron, FcitxKey_period, FcitxKey_o, 0x0231, + FcitxKey_macron, FcitxKey_semicolon, FcitxKey_O, 0x01EC, + FcitxKey_macron, FcitxKey_semicolon, FcitxKey_o, 0x01ED, + FcitxKey_macron, FcitxKey_asciitilde, FcitxKey_O, 0x022C, + FcitxKey_macron, FcitxKey_asciitilde, FcitxKey_o, 0x022D, + FcitxKey_macron, FcitxKey_dead_tilde, FcitxKey_O, 0x022C, + FcitxKey_macron, FcitxKey_dead_tilde, FcitxKey_o, 0x022D, + FcitxKey_macron, FcitxKey_dead_abovedot, FcitxKey_A, 0x01E0, + FcitxKey_macron, FcitxKey_dead_abovedot, FcitxKey_O, 0x0230, + FcitxKey_macron, FcitxKey_dead_abovedot, FcitxKey_a, 0x01E1, + FcitxKey_macron, FcitxKey_dead_abovedot, FcitxKey_o, 0x0231, + FcitxKey_macron, FcitxKey_dead_diaeresis, FcitxKey_A, 0x01DE, + FcitxKey_macron, FcitxKey_dead_diaeresis, FcitxKey_O, 0x022A, + FcitxKey_macron, FcitxKey_dead_diaeresis, FcitxKey_U, 0x01D5, + FcitxKey_macron, FcitxKey_dead_diaeresis, FcitxKey_a, 0x01DF, + FcitxKey_macron, FcitxKey_dead_diaeresis, FcitxKey_o, 0x022B, + FcitxKey_macron, FcitxKey_dead_diaeresis, FcitxKey_u, 0x01D6, + FcitxKey_macron, FcitxKey_dead_ogonek, FcitxKey_O, 0x01EC, + FcitxKey_macron, FcitxKey_dead_ogonek, FcitxKey_o, 0x01ED, + FcitxKey_macron, FcitxKey_dead_belowdot, FcitxKey_L, 0x1E38, + FcitxKey_macron, FcitxKey_dead_belowdot, FcitxKey_R, 0x1E5C, + FcitxKey_macron, FcitxKey_dead_belowdot, FcitxKey_l, 0x1E39, + FcitxKey_macron, FcitxKey_dead_belowdot, FcitxKey_r, 0x1E5D, + FcitxKey_acute, FcitxKey_quotedbl, FcitxKey_I, 0x1E2E, + FcitxKey_acute, FcitxKey_quotedbl, FcitxKey_U, 0x01D7, + FcitxKey_acute, FcitxKey_quotedbl, FcitxKey_i, 0x1E2F, + FcitxKey_acute, FcitxKey_quotedbl, FcitxKey_u, 0x01D8, + FcitxKey_acute, FcitxKey_quotedbl, FcitxKey_Greek_iota, 0x0390, + FcitxKey_acute, FcitxKey_quotedbl, FcitxKey_Greek_upsilon, 0x03B0, + FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F0D, + FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_EPSILON, 0x1F1D, + FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F2D, + FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_IOTA, 0x1F3D, + FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_OMICRON, 0x1F4D, + FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_UPSILON, 0x1F5D, + FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1F6D, + FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F05, + FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_epsilon, 0x1F15, + FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F25, + FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_iota, 0x1F35, + FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_omicron, 0x1F45, + FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_upsilon, 0x1F55, + FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1F65, + FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F0C, + FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_EPSILON, 0x1F1C, + FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F2C, + FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_IOTA, 0x1F3C, + FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_OMICRON, 0x1F4C, + FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1F6C, + FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F04, + FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_epsilon, 0x1F14, + FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F24, + FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_iota, 0x1F34, + FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_omicron, 0x1F44, + FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_upsilon, 0x1F54, + FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1F64, + FcitxKey_acute, FcitxKey_plus, FcitxKey_O, 0x1EDA, + FcitxKey_acute, FcitxKey_plus, FcitxKey_U, 0x1EE8, + FcitxKey_acute, FcitxKey_plus, FcitxKey_o, 0x1EDB, + FcitxKey_acute, FcitxKey_plus, FcitxKey_u, 0x1EE9, + FcitxKey_acute, FcitxKey_comma, FcitxKey_C, 0x1E08, + FcitxKey_acute, FcitxKey_comma, FcitxKey_c, 0x1E09, + FcitxKey_acute, FcitxKey_slash, FcitxKey_O, 0x01FE, + FcitxKey_acute, FcitxKey_slash, FcitxKey_o, 0x01FF, + FcitxKey_acute, FcitxKey_asciicircum, FcitxKey_A, 0x1EA4, + FcitxKey_acute, FcitxKey_asciicircum, FcitxKey_E, 0x1EBE, + FcitxKey_acute, FcitxKey_asciicircum, FcitxKey_O, 0x1ED0, + FcitxKey_acute, FcitxKey_asciicircum, FcitxKey_a, 0x1EA5, + FcitxKey_acute, FcitxKey_asciicircum, FcitxKey_e, 0x1EBF, + FcitxKey_acute, FcitxKey_asciicircum, FcitxKey_o, 0x1ED1, + FcitxKey_acute, FcitxKey_underscore, FcitxKey_E, 0x1E16, + FcitxKey_acute, FcitxKey_underscore, FcitxKey_O, 0x1E52, + FcitxKey_acute, FcitxKey_underscore, FcitxKey_e, 0x1E17, + FcitxKey_acute, FcitxKey_underscore, FcitxKey_o, 0x1E53, + FcitxKey_acute, FcitxKey_b, FcitxKey_A, 0x1EAE, + FcitxKey_acute, FcitxKey_b, FcitxKey_a, 0x1EAF, + FcitxKey_acute, FcitxKey_asciitilde, FcitxKey_O, 0x1E4C, + FcitxKey_acute, FcitxKey_asciitilde, FcitxKey_U, 0x1E78, + FcitxKey_acute, FcitxKey_asciitilde, FcitxKey_o, 0x1E4D, + FcitxKey_acute, FcitxKey_asciitilde, FcitxKey_u, 0x1E79, + FcitxKey_acute, FcitxKey_macron, FcitxKey_E, 0x1E16, + FcitxKey_acute, FcitxKey_macron, FcitxKey_O, 0x1E52, + FcitxKey_acute, FcitxKey_macron, FcitxKey_e, 0x1E17, + FcitxKey_acute, FcitxKey_macron, FcitxKey_o, 0x1E53, + FcitxKey_acute, FcitxKey_cedilla, FcitxKey_C, 0x1E08, + FcitxKey_acute, FcitxKey_cedilla, FcitxKey_c, 0x1E09, + FcitxKey_acute, FcitxKey_dead_circumflex, FcitxKey_A, 0x1EA4, + FcitxKey_acute, FcitxKey_dead_circumflex, FcitxKey_E, 0x1EBE, + FcitxKey_acute, FcitxKey_dead_circumflex, FcitxKey_O, 0x1ED0, + FcitxKey_acute, FcitxKey_dead_circumflex, FcitxKey_a, 0x1EA5, + FcitxKey_acute, FcitxKey_dead_circumflex, FcitxKey_e, 0x1EBF, + FcitxKey_acute, FcitxKey_dead_circumflex, FcitxKey_o, 0x1ED1, + FcitxKey_acute, FcitxKey_dead_tilde, FcitxKey_O, 0x1E4C, + FcitxKey_acute, FcitxKey_dead_tilde, FcitxKey_U, 0x1E78, + FcitxKey_acute, FcitxKey_dead_tilde, FcitxKey_o, 0x1E4D, + FcitxKey_acute, FcitxKey_dead_tilde, FcitxKey_u, 0x1E79, + FcitxKey_acute, FcitxKey_dead_macron, FcitxKey_E, 0x1E16, + FcitxKey_acute, FcitxKey_dead_macron, FcitxKey_O, 0x1E52, + FcitxKey_acute, FcitxKey_dead_macron, FcitxKey_e, 0x1E17, + FcitxKey_acute, FcitxKey_dead_macron, FcitxKey_o, 0x1E53, + FcitxKey_acute, FcitxKey_dead_breve, FcitxKey_A, 0x1EAE, + FcitxKey_acute, FcitxKey_dead_breve, FcitxKey_a, 0x1EAF, + FcitxKey_acute, FcitxKey_dead_diaeresis, FcitxKey_I, 0x1E2E, + FcitxKey_acute, FcitxKey_dead_diaeresis, FcitxKey_U, 0x01D7, + FcitxKey_acute, FcitxKey_dead_diaeresis, FcitxKey_i, 0x1E2F, + FcitxKey_acute, FcitxKey_dead_diaeresis, FcitxKey_u, 0x01D8, + FcitxKey_acute, FcitxKey_dead_diaeresis, FcitxKey_Greek_iota, 0x0390, + FcitxKey_acute, FcitxKey_dead_diaeresis, FcitxKey_Greek_upsilon, 0x03B0, + FcitxKey_acute, FcitxKey_dead_abovering, FcitxKey_A, 0x01FA, + FcitxKey_acute, FcitxKey_dead_abovering, FcitxKey_a, 0x01FB, + FcitxKey_acute, FcitxKey_dead_cedilla, FcitxKey_C, 0x1E08, + FcitxKey_acute, FcitxKey_dead_cedilla, FcitxKey_c, 0x1E09, + FcitxKey_acute, FcitxKey_dead_horn, FcitxKey_O, 0x1EDA, + FcitxKey_acute, FcitxKey_dead_horn, FcitxKey_U, 0x1EE8, + FcitxKey_acute, FcitxKey_dead_horn, FcitxKey_o, 0x1EDB, + FcitxKey_acute, FcitxKey_dead_horn, FcitxKey_u, 0x1EE9, + FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F0C, + FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_EPSILON, 0x1F1C, + FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F2C, + FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_IOTA, 0x1F3C, + FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_OMICRON, 0x1F4C, + FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1F6C, + FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F04, + FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_epsilon, 0x1F14, + FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F24, + FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_iota, 0x1F34, + FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_omicron, 0x1F44, + FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_upsilon, 0x1F54, + FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1F64, + FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F0D, + FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_EPSILON, 0x1F1D, + FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F2D, + FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_IOTA, 0x1F3D, + FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_OMICRON, 0x1F4D, + FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_UPSILON, 0x1F5D, + FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1F6D, + FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F05, + FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_epsilon, 0x1F15, + FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F25, + FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_iota, 0x1F35, + FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_omicron, 0x1F45, + FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_upsilon, 0x1F55, + FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1F65, + FcitxKey_acute, FcitxKey_KP_Divide, FcitxKey_O, 0x01FE, + FcitxKey_acute, FcitxKey_KP_Divide, FcitxKey_o, 0x01FF, + 0x05C1, 0x05BC, FcitxKey_hebrew_shin, 0xFB2C, + 0x05C2, 0x05BC, FcitxKey_hebrew_shin, 0xFB2D, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_Greek_alpha, 0x1FB4, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_Greek_eta, 0x1FC4, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_Greek_omega, 0x1FF4, + FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x1F00, 0x1F84, + FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x1F01, 0x1F85, + FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x1F08, 0x1F8C, + FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x1F09, 0x1F8D, + FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x1F20, 0x1F94, + FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x1F21, 0x1F95, + FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x1F28, 0x1F9C, + FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x1F29, 0x1F9D, + FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x1F60, 0x1FA4, + FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x1F61, 0x1FA5, + FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x1F68, 0x1FAC, + FcitxKey_Greek_iota, FcitxKey_apostrophe, 0x1F69, 0x1FAD, + FcitxKey_Greek_iota, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F89, + FcitxKey_Greek_iota, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F99, + FcitxKey_Greek_iota, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FA9, + FcitxKey_Greek_iota, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F81, + FcitxKey_Greek_iota, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F91, + FcitxKey_Greek_iota, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA1, + FcitxKey_Greek_iota, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F88, + FcitxKey_Greek_iota, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F98, + FcitxKey_Greek_iota, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FA8, + FcitxKey_Greek_iota, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F80, + FcitxKey_Greek_iota, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F90, + FcitxKey_Greek_iota, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA0, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_Greek_alpha, 0x1FB2, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_Greek_eta, 0x1FC2, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_Greek_omega, 0x1FF2, + FcitxKey_Greek_iota, FcitxKey_grave, 0x1F00, 0x1F82, + FcitxKey_Greek_iota, FcitxKey_grave, 0x1F01, 0x1F83, + FcitxKey_Greek_iota, FcitxKey_grave, 0x1F08, 0x1F8A, + FcitxKey_Greek_iota, FcitxKey_grave, 0x1F09, 0x1F8B, + FcitxKey_Greek_iota, FcitxKey_grave, 0x1F20, 0x1F92, + FcitxKey_Greek_iota, FcitxKey_grave, 0x1F21, 0x1F93, + FcitxKey_Greek_iota, FcitxKey_grave, 0x1F28, 0x1F9A, + FcitxKey_Greek_iota, FcitxKey_grave, 0x1F29, 0x1F9B, + FcitxKey_Greek_iota, FcitxKey_grave, 0x1F60, 0x1FA2, + FcitxKey_Greek_iota, FcitxKey_grave, 0x1F61, 0x1FA3, + FcitxKey_Greek_iota, FcitxKey_grave, 0x1F68, 0x1FAA, + FcitxKey_Greek_iota, FcitxKey_grave, 0x1F69, 0x1FAB, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_Greek_alpha, 0x1FB7, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_Greek_eta, 0x1FC7, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_Greek_omega, 0x1FF7, + FcitxKey_Greek_iota, FcitxKey_asciitilde, 0x1F00, 0x1F86, + FcitxKey_Greek_iota, FcitxKey_asciitilde, 0x1F01, 0x1F87, + FcitxKey_Greek_iota, FcitxKey_asciitilde, 0x1F08, 0x1F8E, + FcitxKey_Greek_iota, FcitxKey_asciitilde, 0x1F09, 0x1F8F, + FcitxKey_Greek_iota, FcitxKey_asciitilde, 0x1F20, 0x1F96, + FcitxKey_Greek_iota, FcitxKey_asciitilde, 0x1F21, 0x1F97, + FcitxKey_Greek_iota, FcitxKey_asciitilde, 0x1F28, 0x1F9E, + FcitxKey_Greek_iota, FcitxKey_asciitilde, 0x1F29, 0x1F9F, + FcitxKey_Greek_iota, FcitxKey_asciitilde, 0x1F60, 0x1FA6, + FcitxKey_Greek_iota, FcitxKey_asciitilde, 0x1F61, 0x1FA7, + FcitxKey_Greek_iota, FcitxKey_asciitilde, 0x1F68, 0x1FAE, + FcitxKey_Greek_iota, FcitxKey_asciitilde, 0x1F69, 0x1FAF, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_Greek_alpha, 0x1FB4, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_Greek_eta, 0x1FC4, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_Greek_omega, 0x1FF4, + FcitxKey_Greek_iota, FcitxKey_acute, 0x1F00, 0x1F84, + FcitxKey_Greek_iota, FcitxKey_acute, 0x1F01, 0x1F85, + FcitxKey_Greek_iota, FcitxKey_acute, 0x1F08, 0x1F8C, + FcitxKey_Greek_iota, FcitxKey_acute, 0x1F09, 0x1F8D, + FcitxKey_Greek_iota, FcitxKey_acute, 0x1F20, 0x1F94, + FcitxKey_Greek_iota, FcitxKey_acute, 0x1F21, 0x1F95, + FcitxKey_Greek_iota, FcitxKey_acute, 0x1F28, 0x1F9C, + FcitxKey_Greek_iota, FcitxKey_acute, 0x1F29, 0x1F9D, + FcitxKey_Greek_iota, FcitxKey_acute, 0x1F60, 0x1FA4, + FcitxKey_Greek_iota, FcitxKey_acute, 0x1F61, 0x1FA5, + FcitxKey_Greek_iota, FcitxKey_acute, 0x1F68, 0x1FAC, + FcitxKey_Greek_iota, FcitxKey_acute, 0x1F69, 0x1FAD, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_Greek_alpha, 0x1FB2, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_Greek_eta, 0x1FC2, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_Greek_omega, 0x1FF2, + FcitxKey_Greek_iota, FcitxKey_dead_grave, 0x1F00, 0x1F82, + FcitxKey_Greek_iota, FcitxKey_dead_grave, 0x1F01, 0x1F83, + FcitxKey_Greek_iota, FcitxKey_dead_grave, 0x1F08, 0x1F8A, + FcitxKey_Greek_iota, FcitxKey_dead_grave, 0x1F09, 0x1F8B, + FcitxKey_Greek_iota, FcitxKey_dead_grave, 0x1F20, 0x1F92, + FcitxKey_Greek_iota, FcitxKey_dead_grave, 0x1F21, 0x1F93, + FcitxKey_Greek_iota, FcitxKey_dead_grave, 0x1F28, 0x1F9A, + FcitxKey_Greek_iota, FcitxKey_dead_grave, 0x1F29, 0x1F9B, + FcitxKey_Greek_iota, FcitxKey_dead_grave, 0x1F60, 0x1FA2, + FcitxKey_Greek_iota, FcitxKey_dead_grave, 0x1F61, 0x1FA3, + FcitxKey_Greek_iota, FcitxKey_dead_grave, 0x1F68, 0x1FAA, + FcitxKey_Greek_iota, FcitxKey_dead_grave, 0x1F69, 0x1FAB, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_Greek_alpha, 0x1FB4, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_Greek_eta, 0x1FC4, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_Greek_omega, 0x1FF4, + FcitxKey_Greek_iota, FcitxKey_dead_acute, 0x1F00, 0x1F84, + FcitxKey_Greek_iota, FcitxKey_dead_acute, 0x1F01, 0x1F85, + FcitxKey_Greek_iota, FcitxKey_dead_acute, 0x1F08, 0x1F8C, + FcitxKey_Greek_iota, FcitxKey_dead_acute, 0x1F09, 0x1F8D, + FcitxKey_Greek_iota, FcitxKey_dead_acute, 0x1F20, 0x1F94, + FcitxKey_Greek_iota, FcitxKey_dead_acute, 0x1F21, 0x1F95, + FcitxKey_Greek_iota, FcitxKey_dead_acute, 0x1F28, 0x1F9C, + FcitxKey_Greek_iota, FcitxKey_dead_acute, 0x1F29, 0x1F9D, + FcitxKey_Greek_iota, FcitxKey_dead_acute, 0x1F60, 0x1FA4, + FcitxKey_Greek_iota, FcitxKey_dead_acute, 0x1F61, 0x1FA5, + FcitxKey_Greek_iota, FcitxKey_dead_acute, 0x1F68, 0x1FAC, + FcitxKey_Greek_iota, FcitxKey_dead_acute, 0x1F69, 0x1FAD, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_Greek_alpha, 0x1FB7, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_Greek_eta, 0x1FC7, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_Greek_omega, 0x1FF7, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, 0x1F00, 0x1F86, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, 0x1F01, 0x1F87, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, 0x1F08, 0x1F8E, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, 0x1F09, 0x1F8F, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, 0x1F20, 0x1F96, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, 0x1F21, 0x1F97, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, 0x1F28, 0x1F9E, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, 0x1F29, 0x1F9F, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, 0x1F60, 0x1FA6, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, 0x1F61, 0x1FA7, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, 0x1F68, 0x1FAE, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, 0x1F69, 0x1FAF, + FcitxKey_Greek_iota, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F88, + FcitxKey_Greek_iota, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F98, + FcitxKey_Greek_iota, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FA8, + FcitxKey_Greek_iota, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F80, + FcitxKey_Greek_iota, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F90, + FcitxKey_Greek_iota, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA0, + FcitxKey_Greek_iota, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F89, + FcitxKey_Greek_iota, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F99, + FcitxKey_Greek_iota, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FA9, + FcitxKey_Greek_iota, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F81, + FcitxKey_Greek_iota, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F91, + FcitxKey_Greek_iota, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA1, + FcitxKey_parenleft, FcitxKey_1, FcitxKey_0, FcitxKey_parenright, 0x2469, + FcitxKey_parenleft, FcitxKey_1, FcitxKey_1, FcitxKey_parenright, 0x246A, + FcitxKey_parenleft, FcitxKey_1, FcitxKey_2, FcitxKey_parenright, 0x246B, + FcitxKey_parenleft, FcitxKey_1, FcitxKey_3, FcitxKey_parenright, 0x246C, + FcitxKey_parenleft, FcitxKey_1, FcitxKey_4, FcitxKey_parenright, 0x246D, + FcitxKey_parenleft, FcitxKey_1, FcitxKey_5, FcitxKey_parenright, 0x246E, + FcitxKey_parenleft, FcitxKey_1, FcitxKey_6, FcitxKey_parenright, 0x246F, + FcitxKey_parenleft, FcitxKey_1, FcitxKey_7, FcitxKey_parenright, 0x2470, + FcitxKey_parenleft, FcitxKey_1, FcitxKey_8, FcitxKey_parenright, 0x2471, + FcitxKey_parenleft, FcitxKey_1, FcitxKey_9, FcitxKey_parenright, 0x2472, + FcitxKey_parenleft, FcitxKey_1, FcitxKey_KP_Space, FcitxKey_parenright, 0x246B, + FcitxKey_parenleft, FcitxKey_1, FcitxKey_KP_0, FcitxKey_parenright, 0x2469, + FcitxKey_parenleft, FcitxKey_1, FcitxKey_KP_1, FcitxKey_parenright, 0x246A, + FcitxKey_parenleft, FcitxKey_1, FcitxKey_KP_2, FcitxKey_parenright, 0x246B, + FcitxKey_parenleft, FcitxKey_1, FcitxKey_KP_3, FcitxKey_parenright, 0x246C, + FcitxKey_parenleft, FcitxKey_1, FcitxKey_KP_4, FcitxKey_parenright, 0x246D, + FcitxKey_parenleft, FcitxKey_1, FcitxKey_KP_5, FcitxKey_parenright, 0x246E, + FcitxKey_parenleft, FcitxKey_1, FcitxKey_KP_6, FcitxKey_parenright, 0x246F, + FcitxKey_parenleft, FcitxKey_1, FcitxKey_KP_7, FcitxKey_parenright, 0x2470, + FcitxKey_parenleft, FcitxKey_1, FcitxKey_KP_8, FcitxKey_parenright, 0x2471, + FcitxKey_parenleft, FcitxKey_1, FcitxKey_KP_9, FcitxKey_parenright, 0x2472, + FcitxKey_parenleft, FcitxKey_2, FcitxKey_0, FcitxKey_parenright, 0x2473, + FcitxKey_parenleft, FcitxKey_2, FcitxKey_1, FcitxKey_parenright, 0x3251, + FcitxKey_parenleft, FcitxKey_2, FcitxKey_2, FcitxKey_parenright, 0x3252, + FcitxKey_parenleft, FcitxKey_2, FcitxKey_3, FcitxKey_parenright, 0x3253, + FcitxKey_parenleft, FcitxKey_2, FcitxKey_4, FcitxKey_parenright, 0x3254, + FcitxKey_parenleft, FcitxKey_2, FcitxKey_5, FcitxKey_parenright, 0x3255, + FcitxKey_parenleft, FcitxKey_2, FcitxKey_6, FcitxKey_parenright, 0x3256, + FcitxKey_parenleft, FcitxKey_2, FcitxKey_7, FcitxKey_parenright, 0x3257, + FcitxKey_parenleft, FcitxKey_2, FcitxKey_8, FcitxKey_parenright, 0x3258, + FcitxKey_parenleft, FcitxKey_2, FcitxKey_9, FcitxKey_parenright, 0x3259, + FcitxKey_parenleft, FcitxKey_2, FcitxKey_KP_Space, FcitxKey_parenright, 0x3252, + FcitxKey_parenleft, FcitxKey_2, FcitxKey_KP_0, FcitxKey_parenright, 0x2473, + FcitxKey_parenleft, FcitxKey_2, FcitxKey_KP_1, FcitxKey_parenright, 0x3251, + FcitxKey_parenleft, FcitxKey_2, FcitxKey_KP_2, FcitxKey_parenright, 0x3252, + FcitxKey_parenleft, FcitxKey_2, FcitxKey_KP_3, FcitxKey_parenright, 0x3253, + FcitxKey_parenleft, FcitxKey_2, FcitxKey_KP_4, FcitxKey_parenright, 0x3254, + FcitxKey_parenleft, FcitxKey_2, FcitxKey_KP_5, FcitxKey_parenright, 0x3255, + FcitxKey_parenleft, FcitxKey_2, FcitxKey_KP_6, FcitxKey_parenright, 0x3256, + FcitxKey_parenleft, FcitxKey_2, FcitxKey_KP_7, FcitxKey_parenright, 0x3257, + FcitxKey_parenleft, FcitxKey_2, FcitxKey_KP_8, FcitxKey_parenright, 0x3258, + FcitxKey_parenleft, FcitxKey_2, FcitxKey_KP_9, FcitxKey_parenright, 0x3259, + FcitxKey_parenleft, FcitxKey_3, FcitxKey_0, FcitxKey_parenright, 0x325A, + FcitxKey_parenleft, FcitxKey_3, FcitxKey_1, FcitxKey_parenright, 0x325B, + FcitxKey_parenleft, FcitxKey_3, FcitxKey_2, FcitxKey_parenright, 0x325C, + FcitxKey_parenleft, FcitxKey_3, FcitxKey_3, FcitxKey_parenright, 0x325D, + FcitxKey_parenleft, FcitxKey_3, FcitxKey_4, FcitxKey_parenright, 0x325E, + FcitxKey_parenleft, FcitxKey_3, FcitxKey_5, FcitxKey_parenright, 0x325F, + FcitxKey_parenleft, FcitxKey_3, FcitxKey_6, FcitxKey_parenright, 0x32B1, + FcitxKey_parenleft, FcitxKey_3, FcitxKey_7, FcitxKey_parenright, 0x32B2, + FcitxKey_parenleft, FcitxKey_3, FcitxKey_8, FcitxKey_parenright, 0x32B3, + FcitxKey_parenleft, FcitxKey_3, FcitxKey_9, FcitxKey_parenright, 0x32B4, + FcitxKey_parenleft, FcitxKey_3, FcitxKey_KP_Space, FcitxKey_parenright, 0x325C, + FcitxKey_parenleft, FcitxKey_3, FcitxKey_KP_0, FcitxKey_parenright, 0x325A, + FcitxKey_parenleft, FcitxKey_3, FcitxKey_KP_1, FcitxKey_parenright, 0x325B, + FcitxKey_parenleft, FcitxKey_3, FcitxKey_KP_2, FcitxKey_parenright, 0x325C, + FcitxKey_parenleft, FcitxKey_3, FcitxKey_KP_3, FcitxKey_parenright, 0x325D, + FcitxKey_parenleft, FcitxKey_3, FcitxKey_KP_4, FcitxKey_parenright, 0x325E, + FcitxKey_parenleft, FcitxKey_3, FcitxKey_KP_5, FcitxKey_parenright, 0x325F, + FcitxKey_parenleft, FcitxKey_3, FcitxKey_KP_6, FcitxKey_parenright, 0x32B1, + FcitxKey_parenleft, FcitxKey_3, FcitxKey_KP_7, FcitxKey_parenright, 0x32B2, + FcitxKey_parenleft, FcitxKey_3, FcitxKey_KP_8, FcitxKey_parenright, 0x32B3, + FcitxKey_parenleft, FcitxKey_3, FcitxKey_KP_9, FcitxKey_parenright, 0x32B4, + FcitxKey_parenleft, FcitxKey_4, FcitxKey_0, FcitxKey_parenright, 0x32B5, + FcitxKey_parenleft, FcitxKey_4, FcitxKey_1, FcitxKey_parenright, 0x32B6, + FcitxKey_parenleft, FcitxKey_4, FcitxKey_2, FcitxKey_parenright, 0x32B7, + FcitxKey_parenleft, FcitxKey_4, FcitxKey_3, FcitxKey_parenright, 0x32B8, + FcitxKey_parenleft, FcitxKey_4, FcitxKey_4, FcitxKey_parenright, 0x32B9, + FcitxKey_parenleft, FcitxKey_4, FcitxKey_5, FcitxKey_parenright, 0x32BA, + FcitxKey_parenleft, FcitxKey_4, FcitxKey_6, FcitxKey_parenright, 0x32BB, + FcitxKey_parenleft, FcitxKey_4, FcitxKey_7, FcitxKey_parenright, 0x32BC, + FcitxKey_parenleft, FcitxKey_4, FcitxKey_8, FcitxKey_parenright, 0x32BD, + FcitxKey_parenleft, FcitxKey_4, FcitxKey_9, FcitxKey_parenright, 0x32BE, + FcitxKey_parenleft, FcitxKey_4, FcitxKey_KP_Space, FcitxKey_parenright, 0x32B7, + FcitxKey_parenleft, FcitxKey_4, FcitxKey_KP_0, FcitxKey_parenright, 0x32B5, + FcitxKey_parenleft, FcitxKey_4, FcitxKey_KP_1, FcitxKey_parenright, 0x32B6, + FcitxKey_parenleft, FcitxKey_4, FcitxKey_KP_2, FcitxKey_parenright, 0x32B7, + FcitxKey_parenleft, FcitxKey_4, FcitxKey_KP_3, FcitxKey_parenright, 0x32B8, + FcitxKey_parenleft, FcitxKey_4, FcitxKey_KP_4, FcitxKey_parenright, 0x32B9, + FcitxKey_parenleft, FcitxKey_4, FcitxKey_KP_5, FcitxKey_parenright, 0x32BA, + FcitxKey_parenleft, FcitxKey_4, FcitxKey_KP_6, FcitxKey_parenright, 0x32BB, + FcitxKey_parenleft, FcitxKey_4, FcitxKey_KP_7, FcitxKey_parenright, 0x32BC, + FcitxKey_parenleft, FcitxKey_4, FcitxKey_KP_8, FcitxKey_parenright, 0x32BD, + FcitxKey_parenleft, FcitxKey_4, FcitxKey_KP_9, FcitxKey_parenright, 0x32BE, + FcitxKey_parenleft, FcitxKey_5, FcitxKey_KP_0, FcitxKey_parenright, 0x32BF, + FcitxKey_parenleft, 0x1100, 0x1161, FcitxKey_parenright, 0x326E, + FcitxKey_parenleft, 0x1102, 0x1161, FcitxKey_parenright, 0x326F, + FcitxKey_parenleft, 0x1103, 0x1161, FcitxKey_parenright, 0x3270, + FcitxKey_parenleft, 0x1105, 0x1161, FcitxKey_parenright, 0x3271, + FcitxKey_parenleft, 0x1106, 0x1161, FcitxKey_parenright, 0x3272, + FcitxKey_parenleft, 0x1107, 0x1161, FcitxKey_parenright, 0x3273, + FcitxKey_parenleft, 0x1109, 0x1161, FcitxKey_parenright, 0x3274, + FcitxKey_parenleft, 0x110B, 0x1161, FcitxKey_parenright, 0x3275, + FcitxKey_parenleft, 0x110C, 0x1161, FcitxKey_parenright, 0x3276, + FcitxKey_parenleft, 0x110E, 0x1161, FcitxKey_parenright, 0x3277, + FcitxKey_parenleft, 0x110F, 0x1161, FcitxKey_parenright, 0x3278, + FcitxKey_parenleft, 0x1110, 0x1161, FcitxKey_parenright, 0x3279, + FcitxKey_parenleft, 0x1111, 0x1161, FcitxKey_parenright, 0x327A, + FcitxKey_parenleft, 0x1112, 0x1161, FcitxKey_parenright, 0x327B, + FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_0, FcitxKey_parenright, 0x2473, + FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_1, FcitxKey_parenright, 0x3251, + FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_2, FcitxKey_parenright, 0x3252, + FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_3, FcitxKey_parenright, 0x3253, + FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_4, FcitxKey_parenright, 0x3254, + FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_5, FcitxKey_parenright, 0x3255, + FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_6, FcitxKey_parenright, 0x3256, + FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_7, FcitxKey_parenright, 0x3257, + FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_8, FcitxKey_parenright, 0x3258, + FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_9, FcitxKey_parenright, 0x3259, + FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_KP_Space, FcitxKey_parenright, 0x3252, + FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_KP_0, FcitxKey_parenright, 0x2473, + FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_KP_1, FcitxKey_parenright, 0x3251, + FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_KP_2, FcitxKey_parenright, 0x3252, + FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_KP_3, FcitxKey_parenright, 0x3253, + FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_KP_4, FcitxKey_parenright, 0x3254, + FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_KP_5, FcitxKey_parenright, 0x3255, + FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_KP_6, FcitxKey_parenright, 0x3256, + FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_KP_7, FcitxKey_parenright, 0x3257, + FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_KP_8, FcitxKey_parenright, 0x3258, + FcitxKey_parenleft, FcitxKey_KP_Space, FcitxKey_KP_9, FcitxKey_parenright, 0x3259, + FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_0, FcitxKey_parenright, 0x2469, + FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_1, FcitxKey_parenright, 0x246A, + FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_2, FcitxKey_parenright, 0x246B, + FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_3, FcitxKey_parenright, 0x246C, + FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_4, FcitxKey_parenright, 0x246D, + FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_5, FcitxKey_parenright, 0x246E, + FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_6, FcitxKey_parenright, 0x246F, + FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_7, FcitxKey_parenright, 0x2470, + FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_8, FcitxKey_parenright, 0x2471, + FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_9, FcitxKey_parenright, 0x2472, + FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_KP_Space, FcitxKey_parenright, 0x246B, + FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_KP_0, FcitxKey_parenright, 0x2469, + FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_KP_1, FcitxKey_parenright, 0x246A, + FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_KP_2, FcitxKey_parenright, 0x246B, + FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_KP_3, FcitxKey_parenright, 0x246C, + FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_KP_4, FcitxKey_parenright, 0x246D, + FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_KP_5, FcitxKey_parenright, 0x246E, + FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_KP_6, FcitxKey_parenright, 0x246F, + FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_KP_7, FcitxKey_parenright, 0x2470, + FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_KP_8, FcitxKey_parenright, 0x2471, + FcitxKey_parenleft, FcitxKey_KP_1, FcitxKey_KP_9, FcitxKey_parenright, 0x2472, + FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_0, FcitxKey_parenright, 0x2473, + FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_1, FcitxKey_parenright, 0x3251, + FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_2, FcitxKey_parenright, 0x3252, + FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_3, FcitxKey_parenright, 0x3253, + FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_4, FcitxKey_parenright, 0x3254, + FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_5, FcitxKey_parenright, 0x3255, + FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_6, FcitxKey_parenright, 0x3256, + FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_7, FcitxKey_parenright, 0x3257, + FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_8, FcitxKey_parenright, 0x3258, + FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_9, FcitxKey_parenright, 0x3259, + FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_KP_Space, FcitxKey_parenright, 0x3252, + FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_KP_0, FcitxKey_parenright, 0x2473, + FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_KP_1, FcitxKey_parenright, 0x3251, + FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_KP_2, FcitxKey_parenright, 0x3252, + FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_KP_3, FcitxKey_parenright, 0x3253, + FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_KP_4, FcitxKey_parenright, 0x3254, + FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_KP_5, FcitxKey_parenright, 0x3255, + FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_KP_6, FcitxKey_parenright, 0x3256, + FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_KP_7, FcitxKey_parenright, 0x3257, + FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_KP_8, FcitxKey_parenright, 0x3258, + FcitxKey_parenleft, FcitxKey_KP_2, FcitxKey_KP_9, FcitxKey_parenright, 0x3259, + FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_0, FcitxKey_parenright, 0x325A, + FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_1, FcitxKey_parenright, 0x325B, + FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_2, FcitxKey_parenright, 0x325C, + FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_3, FcitxKey_parenright, 0x325D, + FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_4, FcitxKey_parenright, 0x325E, + FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_5, FcitxKey_parenright, 0x325F, + FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_6, FcitxKey_parenright, 0x32B1, + FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_7, FcitxKey_parenright, 0x32B2, + FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_8, FcitxKey_parenright, 0x32B3, + FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_9, FcitxKey_parenright, 0x32B4, + FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_KP_Space, FcitxKey_parenright, 0x325C, + FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_KP_0, FcitxKey_parenright, 0x325A, + FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_KP_1, FcitxKey_parenright, 0x325B, + FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_KP_2, FcitxKey_parenright, 0x325C, + FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_KP_3, FcitxKey_parenright, 0x325D, + FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_KP_4, FcitxKey_parenright, 0x325E, + FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_KP_5, FcitxKey_parenright, 0x325F, + FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_KP_6, FcitxKey_parenright, 0x32B1, + FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_KP_7, FcitxKey_parenright, 0x32B2, + FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_KP_8, FcitxKey_parenright, 0x32B3, + FcitxKey_parenleft, FcitxKey_KP_3, FcitxKey_KP_9, FcitxKey_parenright, 0x32B4, + FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_0, FcitxKey_parenright, 0x32B5, + FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_1, FcitxKey_parenright, 0x32B6, + FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_2, FcitxKey_parenright, 0x32B7, + FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_3, FcitxKey_parenright, 0x32B8, + FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_4, FcitxKey_parenright, 0x32B9, + FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_5, FcitxKey_parenright, 0x32BA, + FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_6, FcitxKey_parenright, 0x32BB, + FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_7, FcitxKey_parenright, 0x32BC, + FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_8, FcitxKey_parenright, 0x32BD, + FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_9, FcitxKey_parenright, 0x32BE, + FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_KP_Space, FcitxKey_parenright, 0x32B7, + FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_KP_0, FcitxKey_parenright, 0x32B5, + FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_KP_1, FcitxKey_parenright, 0x32B6, + FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_KP_2, FcitxKey_parenright, 0x32B7, + FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_KP_3, FcitxKey_parenright, 0x32B8, + FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_KP_4, FcitxKey_parenright, 0x32B9, + FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_KP_5, FcitxKey_parenright, 0x32BA, + FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_KP_6, FcitxKey_parenright, 0x32BB, + FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_KP_7, FcitxKey_parenright, 0x32BC, + FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_KP_8, FcitxKey_parenright, 0x32BD, + FcitxKey_parenleft, FcitxKey_KP_4, FcitxKey_KP_9, FcitxKey_parenright, 0x32BE, + FcitxKey_parenleft, FcitxKey_KP_5, FcitxKey_KP_0, FcitxKey_parenright, 0x32BF, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8D, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9D, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAD, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F85, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F95, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA5, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8C, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9C, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAC, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F84, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F94, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA4, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8C, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9C, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAC, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F84, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F94, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA4, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8D, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9D, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAD, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F85, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F95, + FcitxKey_Greek_iota, FcitxKey_apostrophe, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA5, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8B, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9B, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAB, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F83, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F93, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA3, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8A, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9A, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAA, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F82, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F92, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA2, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8A, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9A, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAA, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F82, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F92, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA2, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8B, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9B, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAB, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F83, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F93, + FcitxKey_Greek_iota, FcitxKey_grave, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA3, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8F, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9F, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAF, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F87, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F97, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA7, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8E, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9E, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAE, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F86, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F96, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA6, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8E, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9E, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAE, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F86, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F96, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA6, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8F, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9F, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAF, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F87, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F97, + FcitxKey_Greek_iota, FcitxKey_asciitilde, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA7, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8D, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9D, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAD, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F85, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F95, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA5, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8C, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9C, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAC, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F84, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F94, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA4, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8C, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9C, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAC, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F84, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F94, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA4, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8D, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9D, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAD, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F85, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F95, + FcitxKey_Greek_iota, FcitxKey_acute, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA5, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8B, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9B, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAB, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F83, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F93, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA3, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8A, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9A, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAA, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F82, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F92, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA2, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8A, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9A, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAA, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F82, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F92, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA2, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8B, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9B, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAB, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F83, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F93, + FcitxKey_Greek_iota, FcitxKey_dead_grave, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA3, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8D, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9D, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAD, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F85, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F95, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA5, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8C, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9C, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAC, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F84, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F94, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA4, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8C, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9C, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAC, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F84, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F94, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA4, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8D, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9D, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAD, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F85, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F95, + FcitxKey_Greek_iota, FcitxKey_dead_acute, FcitxKey_dead_dasia, FcitxKey_Greek_omega, 0x1FA5, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_parenleft, FcitxKey_Greek_ALPHA, 0x1F8F, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_parenleft, FcitxKey_Greek_ETA, 0x1F9F, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_parenleft, FcitxKey_Greek_OMEGA, 0x1FAF, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_parenleft, FcitxKey_Greek_alpha, 0x1F87, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_parenleft, FcitxKey_Greek_eta, 0x1F97, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_parenleft, FcitxKey_Greek_omega, 0x1FA7, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_parenright, FcitxKey_Greek_ALPHA, 0x1F8E, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_parenright, FcitxKey_Greek_ETA, 0x1F9E, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_parenright, FcitxKey_Greek_OMEGA, 0x1FAE, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_parenright, FcitxKey_Greek_alpha, 0x1F86, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_parenright, FcitxKey_Greek_eta, 0x1F96, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_parenright, FcitxKey_Greek_omega, 0x1FA6, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_dead_psili, FcitxKey_Greek_ALPHA, 0x1F8E, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_dead_psili, FcitxKey_Greek_ETA, 0x1F9E, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_dead_psili, FcitxKey_Greek_OMEGA, 0x1FAE, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_dead_psili, FcitxKey_Greek_alpha, 0x1F86, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_dead_psili, FcitxKey_Greek_eta, 0x1F96, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_dead_psili, FcitxKey_Greek_omega, 0x1FA6, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_dead_dasia, FcitxKey_Greek_ALPHA, 0x1F8F, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_dead_dasia, FcitxKey_Greek_ETA, 0x1F9F, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_dead_dasia, FcitxKey_Greek_OMEGA, 0x1FAF, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_dead_dasia, FcitxKey_Greek_alpha, 0x1F87, + FcitxKey_Greek_iota, FcitxKey_dead_tilde, FcitxKey_dead_dasia, FcitxKey_Greek_eta, 0x1F97, +}; + +#endif + + +// kate: indent-mode cstyle; space-indent on; indent-width 0; diff -Nru fcitx-4.2.2/src/im/keyboard/fcitx-keyboard.conf.in fcitx-4.2.4.1/src/im/keyboard/fcitx-keyboard.conf.in --- fcitx-4.2.2/src/im/keyboard/fcitx-keyboard.conf.in 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/im/keyboard/fcitx-keyboard.conf.in 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,10 @@ +[Addon] +Name=fcitx-keyboard +_GeneralName=Keyboard Input Method +_Comment=Use Keyboard Layout as Input Method +Category=InputMethod +Enabled=True +Library=fcitx-keyboard.so +Type=SharedLibrary +Dependency= +IMRegisterMethod=Self diff -Nru fcitx-4.2.2/src/im/keyboard/fcitx-keyboard.desc fcitx-4.2.4.1/src/im/keyboard/fcitx-keyboard.desc --- fcitx-4.2.2/src/im/keyboard/fcitx-keyboard.desc 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/im/keyboard/fcitx-keyboard.desc 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,46 @@ +[Keyboard/CommitWithExtraSpace] +Type=Boolean +DefaultValue=False +Description=Commit with extra space when choose candidate word + +[Keyboard/HotkeyToggleWordHint] +Type=Hotkey +DefaultValue=CTRL_ALT_H +Description=Toggle the word hint + +[Keyboard/EnableWordHint] +Type=Boolean +DefaultValue=False +Description=Enable word hint if available + +[Keyboard/MinimumHintLength] +Type=Integer +DefaultValue=1 +Description=Minimum Length to trigger word hint + +[Keyboard/UseEnterToCommit] +Type=Boolean +DefaultValue=True +Description=Use enter to commit the existing string + +[Keyboard/UsePresage] +Type=Boolean +DefaultValue=False +Description=Use presage to predict if possible. + +[Keyboard/PreferredEnchantProvider] +Type=Enum +DefaultValue=Myspell +EnumCount=3 +Enum0=Default +Enum1=Aspell +Enum2=Myspell +Description=Preferred Enchant Provider (Need Restart) + +[Keyboard/HotkeyAddToUserDict] +Type=Hotkey +DefaultValue=CTRL_ALT_N +Description=Add current input buffer to user dictionary + +[DescriptionFile] +LocaleDomain=fcitx diff -Nru fcitx-4.2.2/src/im/keyboard/isocodes.c fcitx-4.2.4.1/src/im/keyboard/isocodes.c --- fcitx-4.2.2/src/im/keyboard/isocodes.c 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/im/keyboard/isocodes.c 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,158 @@ +/*************************************************************************** + * Copyright (C) 2012~2012 by CSSlayer * + * wengxt@gmail.com * + * * + * This program is free software; you can 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include "config.h" + +#include + +#include + +#include +#include "isocodes.h" + +#define XMLCHAR_CAST (const char*) + +static void IsoCodes639HandlerStartElement(void *ctx, + const xmlChar *name, + const xmlChar **atts); +static void IsoCodes3166HandlerStartElement(void *ctx, + const xmlChar *name, + const xmlChar **atts); +static void FcitxIsoCodes639EntryFree(FcitxIsoCodes639Entry* entry); +static void FcitxIsoCodes3166EntryFree(FcitxIsoCodes3166Entry* entry); + +FcitxIsoCodes* FcitxXkbReadIsoCodes(const char* iso639, const char* iso3166) +{ + xmlSAXHandler handle; + memset(&handle, 0, sizeof(xmlSAXHandler)); + + xmlInitParser(); + + FcitxIsoCodes* isocodes = (FcitxIsoCodes*) fcitx_utils_malloc0(sizeof(FcitxIsoCodes)); + + handle.startElement = IsoCodes639HandlerStartElement; + xmlSAXUserParseFile(&handle, isocodes, iso639); + handle.startElement = IsoCodes3166HandlerStartElement; + xmlSAXUserParseFile(&handle, isocodes, iso3166); + xmlCleanupParser(); + + return isocodes; +} + +static void IsoCodes639HandlerStartElement(void *ctx, + const xmlChar *name, + const xmlChar **atts) +{ + FcitxIsoCodes* isocodes = ctx; + if (strcmp(XMLCHAR_CAST name, "iso_639_entry") == 0) { + FcitxIsoCodes639Entry* entry = fcitx_utils_malloc0(sizeof(FcitxIsoCodes639Entry)); + int i = 0; + while(atts && atts[i*2] != 0) { + if (strcmp(XMLCHAR_CAST atts[i * 2], "iso_639_2B_code") == 0) + entry->iso_639_2B_code = strdup(XMLCHAR_CAST atts[i * 2 + 1]); + else if (strcmp(XMLCHAR_CAST atts[i * 2], "iso_639_2T_code") == 0) + entry->iso_639_2T_code = strdup(XMLCHAR_CAST atts[i * 2 + 1]); + else if (strcmp(XMLCHAR_CAST atts[i * 2], "iso_639_1_code") == 0) + entry->iso_639_1_code = strdup(XMLCHAR_CAST atts[i * 2 + 1]); + else if (strcmp(XMLCHAR_CAST atts[i * 2], "name") == 0) + entry->name = strdup(XMLCHAR_CAST atts[i * 2 + 1]); + i++; + } + if (!entry->iso_639_2B_code || !entry->iso_639_2T_code || !entry->name) + FcitxIsoCodes639EntryFree(entry); + else { + HASH_ADD_KEYPTR(hh1, isocodes->iso6392B, entry->iso_639_2B_code, strlen(entry->iso_639_2B_code), entry); + HASH_ADD_KEYPTR(hh2, isocodes->iso6392T, entry->iso_639_2T_code, strlen(entry->iso_639_2T_code), entry); + } + } +} + +void FcitxIsoCodes639EntryFree(FcitxIsoCodes639Entry* entry) +{ + fcitx_utils_free(entry->iso_639_1_code); + fcitx_utils_free(entry->iso_639_2B_code); + fcitx_utils_free(entry->iso_639_2T_code); + fcitx_utils_free(entry->name); + free(entry); +} + +void FcitxIsoCodes3166EntryFree(FcitxIsoCodes3166Entry* entry) +{ + fcitx_utils_free(entry->alpha_2_code); + fcitx_utils_free(entry->name); + free(entry); +} + + +static void IsoCodes3166HandlerStartElement(void *ctx, + const xmlChar *name, + const xmlChar **atts) +{ + FcitxIsoCodes* isocodes = ctx; + if (strcmp(XMLCHAR_CAST name, "iso_3166_entry") == 0) { + FcitxIsoCodes3166Entry* entry = fcitx_utils_malloc0(sizeof(FcitxIsoCodes3166Entry)); + int i = 0; + while(atts && atts[i*2] != 0) { + if (strcmp(XMLCHAR_CAST atts[i * 2], "alpha_2_code") == 0) + entry->alpha_2_code = strdup(XMLCHAR_CAST atts[i * 2 + 1]); + else if (strcmp(XMLCHAR_CAST atts[i * 2], "name") == 0) + entry->name = strdup(XMLCHAR_CAST atts[i * 2 + 1]); + i++; + } + if (!entry->name || !entry->alpha_2_code) + FcitxIsoCodes3166EntryFree(entry); + else + HASH_ADD_KEYPTR(hh, isocodes->iso3166, entry->alpha_2_code, strlen(entry->alpha_2_code), entry); + } +} + +FcitxIsoCodes639Entry* FcitxIsoCodesGetEntry(FcitxIsoCodes* isocodes, const char* lang) +{ + FcitxIsoCodes639Entry *entry = NULL; + HASH_FIND(hh1,isocodes->iso6392B,lang,strlen(lang),entry); + if (!entry) { + HASH_FIND(hh2,isocodes->iso6392T,lang,strlen(lang),entry); + } + return entry; +} + +void FcitxIsoCodesFree(FcitxIsoCodes* isocodes) +{ + FcitxIsoCodes639Entry* isocodes639 = isocodes->iso6392B; + while (isocodes639) { + FcitxIsoCodes639Entry* curisocodes639 = isocodes639; + HASH_DELETE(hh1, isocodes639, curisocodes639); + } + + isocodes639 = isocodes->iso6392T; + while (isocodes639) { + FcitxIsoCodes639Entry* curisocodes639 = isocodes639; + HASH_DELETE(hh2, isocodes639, curisocodes639); + FcitxIsoCodes639EntryFree(curisocodes639); + } + FcitxIsoCodes3166Entry* isocodes3166 = isocodes->iso3166; + while (isocodes3166) { + FcitxIsoCodes3166Entry* curisocodes3166 = isocodes3166; + HASH_DEL(isocodes3166, curisocodes3166); + FcitxIsoCodes3166EntryFree(curisocodes3166); + } + + free(isocodes); +} diff -Nru fcitx-4.2.2/src/im/keyboard/isocodes.h fcitx-4.2.4.1/src/im/keyboard/isocodes.h --- fcitx-4.2.2/src/im/keyboard/isocodes.h 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/im/keyboard/isocodes.h 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,51 @@ +/*************************************************************************** + * Copyright (C) 2012~2012 by CSSlayer * + * wengxt@gmail.com * + * * + * This program is free software; you can 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#ifndef FCITX_ISOCODES_H +#define FCITX_ISOCODES_H + +#include "fcitx-utils/uthash.h" + +typedef struct _FcitxIsoCodes639Entry { + char* name; + char* iso_639_2B_code; + char* iso_639_2T_code; + char* iso_639_1_code; + UT_hash_handle hh1; + UT_hash_handle hh2; +} FcitxIsoCodes639Entry; + +typedef struct _FcitxIsoCodes3166Entry { + char* name; + char* alpha_2_code; + UT_hash_handle hh; +} FcitxIsoCodes3166Entry; + +typedef struct _FcitxIsoCodes { + FcitxIsoCodes639Entry* iso6392B; + FcitxIsoCodes639Entry* iso6392T; + FcitxIsoCodes3166Entry* iso3166; +} FcitxIsoCodes; + +FcitxIsoCodes* FcitxXkbReadIsoCodes(const char* iso639, const char* iso3166); +FcitxIsoCodes639Entry* FcitxIsoCodesGetEntry(FcitxIsoCodes* isocodes, const char* lang); +void FcitxIsoCodesFree(FcitxIsoCodes* isocodes); + +#endif diff -Nru fcitx-4.2.2/src/im/keyboard/keyboard.c fcitx-4.2.4.1/src/im/keyboard/keyboard.c --- fcitx-4.2.2/src/im/keyboard/keyboard.c 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/im/keyboard/keyboard.c 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,2777 @@ +/*************************************************************************** + * Copyright (C) 2012~2012 by CSSlayer * + * wengxt@gmail.com * + * * + * This program is free software; you can 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include "fcitx/fcitx.h" +#include "config.h" + +#include +#include +#include +#include + +#include + +#include + +#include "fcitx/ime.h" +#include "fcitx/instance.h" +#include "fcitx/context.h" +#include "fcitx/keys.h" +#include "fcitx/candidate.h" +#include "fcitx/module.h" +#include "fcitx/hook.h" +#include "fcitx-config/xdg.h" +#include "fcitx-utils/log.h" + +#include "xkb.h" +#include "keyboard.h" +#include "isocodes.h" +#include "fcitx-compose-data.h" + +#define INVALID_COMPOSE_RESULT 0xffffffff + +typedef struct _FcitxComposeTableCompact FcitxComposeTableCompact; +struct _FcitxComposeTableCompact { + const uint32_t *data; + int max_seq_len; + int n_index_size; + int n_index_stride; +}; + +static const FcitxComposeTableCompact fcitx_compose_table_compact = { + fcitx_compose_seqs_compact, + 5, + 23, + 6 +}; + +static void* FcitxKeyboardCreate(FcitxInstance* instance); +static boolean FcitxKeyboardInit(void *arg); +static void FcitxKeyboardResetIM(void *arg); +static INPUT_RETURN_VALUE FcitxKeyboardDoInput(void *arg, FcitxKeySym, unsigned int); +static void FcitxKeyboardSave(void *arg); +static void FcitxKeyboardReloadConfig(void *arg); +INPUT_RETURN_VALUE FcitxKeyboardGetCandWords(void* arg); +#ifdef PRESAGE_FOUND +INPUT_RETURN_VALUE FcitxKeyboardGetPresageCandWord (void* arg, FcitxCandidateWord* candWord); +#endif +INPUT_RETURN_VALUE FcitxKeyboardGetCandWord (void* arg, FcitxCandidateWord* candWord); +static void FcitxKeyboardLayoutCreate(FcitxKeyboard* keyboard, + const char* name, + const char* langCode, + const char* layoutString, + const char* variantString + ); +static boolean LoadKeyboardConfig(FcitxKeyboard* keyboard, FcitxKeyboardConfig* fs); +static void SaveKeyboardConfig(FcitxKeyboardConfig* fs); +static INPUT_RETURN_VALUE FcitxKeyboardHotkeyToggleWordHint(void* arg); +static inline boolean IsValidSym(FcitxKeySym keysym, unsigned int state); +static inline boolean IsValidChar(uint32_t c); +static uint32_t checkCompactTable(FcitxKeyboardLayout* layout, const FcitxComposeTableCompact *table); +static uint32_t checkAlgorithmically(FcitxKeyboardLayout* layout); +static uint32_t processCompose(FcitxKeyboardLayout* layout, uint32_t keyval, uint32_t state); + +static int fcitx_keyboard_strcmp0(const char* a, const char* b) +{ + if (a == NULL && b == NULL) + return 0; + if (a == NULL && b) + return -1; + if (a && b == NULL) + return 1; + return strcmp(a, b); +} + +static int +compare_seq_index(const void *key, const void *value) +{ + const uint32_t *keysyms = (const uint32_t *)key; + const uint32_t *seq = (const uint32_t *)value; + + if (keysyms[0] < seq[0]) + return -1; + else if (keysyms[0] > seq[0]) + return 1; + return 0; +} + +static int +compare_seq(const void *key, const void *value) +{ + int i = 0; + const uint32_t *keysyms = (const uint32_t *)key; + const uint32_t *seq = (const uint32_t *)value; + + while (keysyms[i]) { + if (keysyms[i] < seq[i]) + return -1; + else if (keysyms[i] > seq[i]) + return 1; + i++; + } + + return 0; +} + +static const uint32_t fcitx_compose_ignore[] = { + FcitxKey_Shift_L, + FcitxKey_Shift_R, + FcitxKey_Control_L, + FcitxKey_Control_R, + FcitxKey_Caps_Lock, + FcitxKey_Shift_Lock, + FcitxKey_Meta_L, + FcitxKey_Meta_R, + FcitxKey_Alt_L, + FcitxKey_Alt_R, + FcitxKey_Super_L, + FcitxKey_Super_R, + FcitxKey_Hyper_L, + FcitxKey_Hyper_R, + FcitxKey_Mode_switch, + FcitxKey_ISO_Level3_Shift, + FcitxKey_VoidSymbol +}; + +static inline +void Ucs4ToUtf8(iconv_t conv, uint32_t ucs4, char* utf8) +{ + size_t inbytes = sizeof(uint32_t); + size_t outbytes = UTF8_MAX_LENGTH; + IconvStr in = (IconvStr) &ucs4; + iconv(conv, &in, &inbytes, &utf8, &outbytes); +} + +CONFIG_DESC_DEFINE(GetKeyboardConfigDesc, "fcitx-keyboard.desc") + +FCITX_EXPORT_API +FcitxIMClass ime = { + FcitxKeyboardCreate, + NULL +}; + +FCITX_EXPORT_API +int ABI_VERSION = FCITX_ABI_VERSION; + +const char* FcitxKeyboardGetPastStream (void* arg) +{ + FcitxKeyboard* keyboard = arg; + /* buggy surrounding text will cause trouble */ +#if 0 + char* surrounding = NULL; + unsigned int cursor = 0, anchor = 0; + if (FcitxInstanceGetSurroundingText(keyboard->owner, FcitxInstanceGetCurrentIC(keyboard->owner), &surrounding, &cursor, &anchor)) { + int len = cursor + strlen(keyboard->buffer) + 1; + if (keyboard->lastLength < len) { + free(keyboard->tempBuffer); + while (keyboard->lastLength < len) + keyboard->lastLength *= 2; + keyboard->tempBuffer = fcitx_utils_malloc0(keyboard->lastLength); + } + + if (cursor) { + int i = 0; + while (surrounding[i] && i < cursor) { + keyboard->tempBuffer[i] = surrounding[i]; + i++; + } + keyboard->tempBuffer[i] = '\0'; + } + else { + keyboard->tempBuffer[0] = '\0'; + } + strcat(keyboard->tempBuffer, keyboard->buffer); + free(surrounding); + return keyboard->tempBuffer; + } + else +#endif + return keyboard->buffer; +} + +const char* FcitxKeyboardGetFutureStream (void* arg) +{ + const char* result = ""; +#if 0 + FcitxKeyboard* keyboard = arg; + char* surrounding = NULL; + unsigned int cursor = 0, anchor = 0; + do { + if (!FcitxInstanceGetSurroundingText(keyboard->owner, FcitxInstanceGetCurrentIC(keyboard->owner), &surrounding, &cursor, &anchor)) + break; + size_t surlen = strlen(surrounding); + if (surlen <= cursor) + break; + int len = surlen - cursor + 1; + if (keyboard->lastLength < len) { + free(keyboard->tempBuffer); + while (keyboard->lastLength < len) + keyboard->lastLength *= 2; + keyboard->tempBuffer = fcitx_utils_malloc0(keyboard->lastLength); + } + + strcpy(keyboard->tempBuffer, &surrounding[cursor]); + result = keyboard->tempBuffer; + } while(0); + + if (surrounding) + free(surrounding); +#endif + return result; +} + + +void FcitxKeyboardLayoutCreate(FcitxKeyboard* keyboard, + const char* name, + const char* langCode, + const char* layoutString, + const char* variantString) +{ + FcitxKeyboardLayout* layout = fcitx_utils_malloc0(sizeof(FcitxKeyboardLayout)); + + layout->layoutString = strdup(layoutString); + if (variantString) + layout->variantString = strdup(variantString); + layout->owner = keyboard; + + char* uniqueName; + if (variantString) + asprintf(&uniqueName, "fcitx-keyboard-%s-%s", layoutString, variantString); + else + asprintf(&uniqueName, "fcitx-keyboard-%s", layoutString); + + int iPriority = 100; + if (strcmp(keyboard->initialLayout, layoutString) == 0 + && fcitx_keyboard_strcmp0(keyboard->initialVariant, variantString) == 0) { + iPriority = PRIORITY_MAGIC_FIRST; + } + else { + boolean result = false; + FcitxModuleFunctionArg args; + args.args[0] = (void*) layoutString; + args.args[1] = (void*) variantString; + args.args[2] = &result; + InvokeFunction(keyboard->owner, FCITX_XKB, LAYOUTEXISTS, args); + if (result) + iPriority = 50; + } + + FcitxInstanceRegisterIM( + keyboard->owner, + layout, + uniqueName, + name, + "kbd", + FcitxKeyboardInit, + FcitxKeyboardResetIM, + FcitxKeyboardDoInput, + FcitxKeyboardGetCandWords, + NULL, + FcitxKeyboardSave, + FcitxKeyboardReloadConfig, + NULL, + iPriority, + langCode + ); + + free(uniqueName); +} + +void* FcitxKeyboardCreate(FcitxInstance* instance) +{ + FcitxKeyboard* keyboard = fcitx_utils_malloc0(sizeof(FcitxKeyboard)); + keyboard->owner = instance; + if (!LoadKeyboardConfig(keyboard, &keyboard->config)) + { + free(keyboard); + return NULL; + } + char* localepath = fcitx_utils_get_fcitx_path("localedir"); + bindtextdomain("xkeyboard-config", localepath); + free(localepath); + union { + short s; + unsigned char b[2]; + } endian; + + endian.s = 0x1234; + if (endian.b[0] == 0x12) + keyboard->iconv = iconv_open("utf-8", "ucs-4be"); + else + keyboard->iconv = iconv_open("utf-8", "ucs-4le"); + keyboard->broker = enchant_broker_init(); +#ifdef PRESAGE_FOUND + presage_new(FcitxKeyboardGetPastStream, keyboard, FcitxKeyboardGetFutureStream, keyboard, &keyboard->presage); +#endif + /* new option, since hunspell/myspell is really toooo slow */ + switch (keyboard->config.provider) { + case EP_Aspell: + enchant_broker_set_ordering(keyboard->broker, "*", "aspell,myspell,ispell"); + break; + case EP_Myspell: + enchant_broker_set_ordering(keyboard->broker, "*", "myspell,aspell,ispell"); + break; + case EP_Default: + default: + break; + } + keyboard->enchantLanguages = fcitx_utils_new_string_list(); + + FcitxHotkeyHook hk; + hk.arg = keyboard; + hk.hotkey = keyboard->config.hkToggleWordHint; + hk.hotkeyhandle = FcitxKeyboardHotkeyToggleWordHint; + + FcitxInstanceRegisterHotkeyFilter(instance, hk); + + FcitxModuleFunctionArg args; + FcitxXkbRules* rules = InvokeFunction(instance, FCITX_XKB, GETRULES, args); + keyboard->rules = rules; + FcitxIsoCodes* isocodes = FcitxXkbReadIsoCodes(ISOCODES_ISO639_XML, ISOCODES_ISO3166_XML); + + keyboard->initialLayout = NULL; + keyboard->initialVariant = NULL; + + args.args[0] = &keyboard->initialLayout; + args.args[1] = &keyboard->initialVariant; + InvokeFunction(instance, FCITX_XKB, GETCURRENTLAYOUT, args); + if (!keyboard->initialLayout) + keyboard->initialLayout = strdup("us"); + + if (rules) { + FcitxXkbLayoutInfo* layoutInfo; + for (layoutInfo = (FcitxXkbLayoutInfo*) utarray_front(rules->layoutInfos); + layoutInfo != NULL; + layoutInfo = (FcitxXkbLayoutInfo*) utarray_next(rules->layoutInfos, layoutInfo)) + { + { + char** plang = NULL; + plang = (char**) utarray_front(layoutInfo->languages); + char* lang = NULL; + if (plang) { + FcitxIsoCodes639Entry* entry = FcitxIsoCodesGetEntry(isocodes, *plang); + if (entry) { + lang = entry->iso_639_1_code; + } + } + char* description; + asprintf(&description, _("Keyboard - %s"), + dgettext("xkeyboard-config", layoutInfo->description)); + + FcitxKeyboardLayoutCreate(keyboard, description, lang, layoutInfo->name, NULL); + free(description); + } + FcitxXkbVariantInfo* variantInfo; + for (variantInfo = (FcitxXkbVariantInfo*) utarray_front(layoutInfo->variantInfos); + variantInfo != NULL; + variantInfo = (FcitxXkbVariantInfo*) utarray_next(layoutInfo->variantInfos, variantInfo)) + { + char** plang = NULL; + plang = (char**) utarray_front(variantInfo->languages); + if (!plang) + plang = (char**) utarray_front(layoutInfo->languages); + char* lang = NULL; + if (plang) { + FcitxIsoCodes639Entry* entry = FcitxIsoCodesGetEntry(isocodes, *plang); + if (entry) { + lang = entry->iso_639_1_code; + } + } + char* description; + asprintf(&description, _("Keyboard - %s - %s"), + dgettext("xkeyboard-config", layoutInfo->description), + dgettext("xkeyboard-config", variantInfo->description)); + + FcitxKeyboardLayoutCreate(keyboard, description, lang, layoutInfo->name, variantInfo->name); + free(description); + } + } + } + else { + char* description; + asprintf(&description, _("Keyboard - %s"), + dgettext("xkeyboard-config", "English (US)")); + + FcitxKeyboardLayoutCreate(keyboard, description, "en", "us", NULL); + free(description); + } + + FcitxIsoCodesFree(isocodes); + keyboard->lastLength = 10; + keyboard->tempBuffer = fcitx_utils_malloc0(keyboard->lastLength); + + return keyboard; +} + +boolean FcitxKeyboardInit(void *arg) +{ + FcitxKeyboardLayout* layout = (FcitxKeyboardLayout*) arg; + boolean flag = true; + FcitxInstanceSetContext(layout->owner->owner, CONTEXT_DISABLE_AUTOENG, &flag); + FcitxInstanceSetContext(layout->owner->owner, CONTEXT_DISABLE_QUICKPHRASE, &flag); + FcitxInstanceSetContext(layout->owner->owner, CONTEXT_DISABLE_FULLWIDTH, &flag); + if (layout->variantString) { + char* string; + asprintf(&string, "%s,%s", layout->layoutString, layout->variantString); + FcitxInstanceSetContext(layout->owner->owner, CONTEXT_IM_KEYBOARD_LAYOUT, string); + free(string); + } + else { + FcitxInstanceSetContext(layout->owner->owner, CONTEXT_IM_KEYBOARD_LAYOUT, layout->layoutString); + } + return true; +} + +void FcitxKeyboardResetIM(void *arg) +{ + FcitxKeyboardLayout* layout = (FcitxKeyboardLayout*) arg; + layout->owner->buffer[0] = '\0'; + layout->owner->cursorPos = 0; + layout->owner->composeBuffer[0] = 0; + layout->owner->n_compose = 0; +} + +boolean IsDictAvailable(FcitxKeyboard* keyboard) +{ + if (keyboard->dict) + return true; +#ifdef PRESAGE_FOUND + if (keyboard->config.bUsePresage && keyboard->presage && strcmp(keyboard->dictLang, "en") == 0) { + return true; + } +#endif + return false; +} + +INPUT_RETURN_VALUE FcitxKeyboardDoInput(void *arg, FcitxKeySym sym, unsigned int state) +{ + FcitxKeyboardLayout* layout = (FcitxKeyboardLayout*) arg; + FcitxKeyboard* keyboard = layout->owner; + FcitxInstance* instance = keyboard->owner; + const char* currentLang = FcitxInstanceGetContextString(instance, CONTEXT_IM_LANGUAGE); + if (currentLang == NULL) + currentLang = ""; + + if (sym == FcitxKey_Shift_L || sym == FcitxKey_Shift_R + || sym == FcitxKey_Alt_L || sym == FcitxKey_Alt_R + || sym == FcitxKey_Control_L || sym == FcitxKey_Control_R) + { + return IRV_TO_PROCESS; + } + + uint32_t result = processCompose(layout, sym, state); + if (result == INVALID_COMPOSE_RESULT) + return IRV_DO_NOTHING; + + if (result) { + sym = 0; + state = 0; + } + + /* performance seems not trouble here, so we only keep one dict */ + if (layout->owner->config.bEnableWordHint && strcmp(keyboard->dictLang, currentLang) != 0) { + if (keyboard->dict) { + enchant_broker_free_dict(keyboard->broker, keyboard->dict); + keyboard->dict = NULL; + } + + strncpy(keyboard->dictLang, currentLang, LANGCODE_LENGTH); + keyboard->dict = enchant_broker_request_dict(keyboard->broker, keyboard->dictLang); + } + + if (IsDictAvailable(keyboard) && layout->owner->config.bEnableWordHint) { + FcitxInputState *input = FcitxInstanceGetInputState(layout->owner->owner); + struct _FcitxCandidateWordList* candList = FcitxInputStateGetCandidateList(input); + + if (FcitxHotkeyIsHotKey(sym, state, layout->owner->config.hkAddToUserDict)) + { + size_t len = strlen(keyboard->buffer); + if (len != 0) { + enchant_dict_add_to_personal(keyboard->dict, keyboard->buffer, len); + return IRV_DO_NOTHING; + } + } + + if (IsValidChar(result) || FcitxHotkeyIsHotKeySimple(sym, state) || IsValidSym(sym, state)) + { + if (IsValidChar(result) || FcitxHotkeyIsHotKeyLAZ(sym, state) || FcitxHotkeyIsHotKeyUAZ(sym, state) || IsValidSym(sym, state)) { + char buf[UTF8_MAX_LENGTH + 1]; + memset(buf, 0, sizeof(buf)); + if (result) + Ucs4ToUtf8(layout->owner->iconv, result, buf); + else + Ucs4ToUtf8(layout->owner->iconv, FcitxKeySymToUnicode(sym), buf); + size_t charlen = strlen(buf); + + if (strlen(keyboard->buffer) >= FCITX_KEYBOARD_MAX_BUFFER) { + FcitxInstanceCommitString(instance, FcitxInstanceGetCurrentIC(instance), keyboard->buffer); + keyboard->cursorPos = 0; + keyboard->buffer[0] = '\0'; + } + size_t len = strlen(keyboard->buffer); + if (keyboard->buffer[keyboard->cursorPos] != 0) + { + memmove(keyboard->buffer + keyboard->cursorPos + charlen, keyboard->buffer + keyboard->cursorPos, len - keyboard->cursorPos); + } + keyboard->buffer[len + charlen] = 0; + strncpy(&keyboard->buffer[keyboard->cursorPos], buf, charlen); + keyboard->cursorPos += charlen; + + return IRV_DISPLAY_CANDWORDS; + } + if (FcitxHotkeyIsHotKeyDigit(sym, state) && FcitxCandidateWordGetListSize(candList) != 0) { + return IRV_TO_PROCESS; + } + } + else { + if (FcitxHotkeyIsHotKey(sym, state, FCITX_BACKSPACE)) + { + size_t slen = strlen(keyboard->buffer); + if (slen > 0) + { + if (keyboard->cursorPos > 0) { + size_t len = fcitx_utf8_strlen(keyboard->buffer); + char* pos = fcitx_utf8_get_nth_char(keyboard->buffer, len - 1); + keyboard->cursorPos = pos - keyboard->buffer; + memset(keyboard->buffer + keyboard->cursorPos, 0, sizeof(char) * (slen - keyboard->cursorPos)); + return IRV_DISPLAY_CANDWORDS; + } + else + return IRV_DO_NOTHING; + } + } + } + + if (strlen(keyboard->buffer) > 0) { + INPUT_RETURN_VALUE irv = IRV_FLAG_FORWARD_KEY; + if (layout->owner->config.bUseEnterToCommit && FcitxHotkeyIsHotKey(sym, state, FCITX_ENTER)) { + irv = 0; + } + strcpy(FcitxInputStateGetOutputString(input), keyboard->buffer); + + if (result) { + FcitxInputState *input = FcitxInstanceGetInputState(layout->owner->owner); + char buf[UTF8_MAX_LENGTH + 1]; + memset(buf, 0, sizeof(buf)); + Ucs4ToUtf8(layout->owner->iconv, result, buf); + strcat(FcitxInputStateGetOutputString(input), buf); + irv = 0; + } + irv |= IRV_COMMIT_STRING; + return irv; + } + } + else { + FcitxUICloseInputWindow(instance); + } + if (result) { + FcitxInputState *input = FcitxInstanceGetInputState(layout->owner->owner); + char buf[UTF8_MAX_LENGTH + 1]; + memset(buf, 0, sizeof(buf)); + Ucs4ToUtf8(layout->owner->iconv, result, buf); + strcpy(FcitxInputStateGetOutputString(input), buf); + return IRV_COMMIT_STRING; + } + return IRV_TO_PROCESS; +} + +INPUT_RETURN_VALUE FcitxKeyboardGetCandWords(void* arg) +{ + FcitxKeyboardLayout* layout = (FcitxKeyboardLayout*) arg; + FcitxKeyboard* keyboard = layout->owner; + FcitxInstance* instance = layout->owner->owner; + FcitxInputState* input = FcitxInstanceGetInputState(instance); + FcitxGlobalConfig* config = FcitxInstanceGetGlobalConfig(instance); + if (keyboard->buffer[0] == '\0') + return IRV_CLEAN; + FcitxCandidateWordSetPageSize(FcitxInputStateGetCandidateList(input), config->iMaxCandWord); + FcitxCandidateWordSetChoose(FcitxInputStateGetCandidateList(input), DIGIT_STR_CHOOSE); + size_t bufferlen = strlen(keyboard->buffer); + strcpy(FcitxInputStateGetRawInputBuffer(input), keyboard->buffer); + FcitxInputStateSetRawInputBufferSize(input, bufferlen); + FcitxMessagesAddMessageAtLast(FcitxInputStateGetClientPreedit(input), MSG_INPUT, "%s", keyboard->buffer); + FcitxMessagesAddMessageAtLast(FcitxInputStateGetPreedit(input), MSG_INPUT, "%s", keyboard->buffer); + FcitxInputStateSetClientCursorPos(input, keyboard->cursorPos); + FcitxInputStateSetCursorPos(input, keyboard->cursorPos); + + char **suggestions = NULL; + +#ifdef PRESAGE_FOUND + if (keyboard->config.bUsePresage && keyboard->presage && strcmp(keyboard->dictLang, "en") == 0) { + do { + char buf[20]; + sprintf(buf, "%d", config->iMaxCandWord); + presage_config_set(keyboard->presage, "Presage.Selector.SUGGESTIONS", buf); + presage_error_code_t error; + error = presage_predict(keyboard->presage, &suggestions); + if (error != PRESAGE_OK) { + break; + } + if (suggestions) { + int i = 0; + while(suggestions[i]) { + FcitxCandidateWord candWord; + candWord.callback = FcitxKeyboardGetPresageCandWord; + candWord.owner = layout; + candWord.priv = NULL; + candWord.strExtra = NULL; + candWord.strWord = strdup(suggestions[i]); + candWord.wordType = MSG_OTHER; + + FcitxCandidateWordAppend(FcitxInputStateGetCandidateList(input), &candWord); + i++; + } + presage_free_string_array(suggestions); + } + } while(0); + } + else +#endif + { + if (bufferlen < keyboard->config.minimumHintLength) + return IRV_DISPLAY_CANDWORDS; + size_t number = 0; + int count = 0; + suggestions = enchant_dict_suggest(keyboard->dict, keyboard->buffer, bufferlen, &number); + int i; + for (i = 0 ;i < number && count < config->iMaxCandWord; i ++) + { + FcitxCandidateWord candWord; + candWord.callback = FcitxKeyboardGetCandWord; + candWord.owner = layout; + candWord.priv = NULL; + candWord.strExtra = NULL; + candWord.strWord = strdup(suggestions[i]); + candWord.wordType = MSG_OTHER; + FcitxCandidateWordAppend(FcitxInputStateGetCandidateList(input), &candWord); + count ++; + } + + if (suggestions && number) + enchant_dict_free_string_list(keyboard->dict, suggestions); + } + return IRV_DISPLAY_CANDWORDS; +} + +INPUT_RETURN_VALUE FcitxKeyboardGetCandWord (void* arg, FcitxCandidateWord* candWord) +{ + FcitxKeyboardLayout* layout = (FcitxKeyboardLayout*) arg; + FcitxInstance* instance = layout->owner->owner; + FcitxInputState* input = FcitxInstanceGetInputState(instance); + char* strGet = FcitxInputStateGetOutputString(input); + strncpy(strGet, candWord->strWord, MAX_USER_INPUT); + strGet[MAX_USER_INPUT] = '\0'; + if (layout->owner->config.bCommitWithExtraSpace && strlen(strGet) < MAX_USER_INPUT) + strcat(strGet, " "); + return IRV_COMMIT_STRING; +} + +#ifdef PRESAGE_FOUND +INPUT_RETURN_VALUE FcitxKeyboardGetPresageCandWord(void* arg, FcitxCandidateWord* candWord) +{ + FcitxKeyboardLayout* layout = (FcitxKeyboardLayout*) arg; + FcitxKeyboard* keyboard = layout->owner; + char* result = NULL; + INPUT_RETURN_VALUE irv = IRV_DO_NOTHING; + do { + presage_error_code_t error = presage_completion(keyboard->presage, candWord->strWord, &result); + if (error != PRESAGE_OK) + break; + FcitxInputState* input = FcitxInstanceGetInputState(keyboard->owner); + char* strGet = FcitxInputStateGetOutputString(input); + char* nr = fcitx_utils_trim(result); + snprintf(strGet, MAX_USER_INPUT, "%s%s", keyboard->buffer, nr); + free(nr); + if (layout->owner->config.bCommitWithExtraSpace && strlen(strGet) < MAX_USER_INPUT) + strcat(strGet, " "); + + irv = IRV_COMMIT_STRING; + } while(0); + + if (result) + free(result); + + return irv; +} +#endif + + +void FcitxKeyboardSave(void *arg) +{ +} + +void FcitxKeyboardReloadConfig(void *arg) +{ + FcitxKeyboardLayout* layout = (FcitxKeyboardLayout*) arg; + LoadKeyboardConfig(layout->owner, &layout->owner->config); +} + +boolean LoadKeyboardConfig(FcitxKeyboard* keyboard, FcitxKeyboardConfig* fs) +{ + FcitxConfigFileDesc *configDesc = GetKeyboardConfigDesc(); + if (configDesc == NULL) + return false; + + FILE *fp = FcitxXDGGetFileUserWithPrefix("conf", "fcitx-keyboard.config", "r", NULL); + + if (!fp) + { + if (errno == ENOENT) + SaveKeyboardConfig(fs); + } + FcitxConfigFile *cfile = FcitxConfigParseConfigFileFp(fp, configDesc); + FcitxKeyboardConfigConfigBind(fs, cfile, configDesc); + FcitxConfigBindSync(&fs->gconfig); + + if (fp) + fclose(fp); + + return true; +} + +void SaveKeyboardConfig(FcitxKeyboardConfig* fs) +{ + FcitxConfigFileDesc *configDesc = GetKeyboardConfigDesc(); + FILE *fp = FcitxXDGGetFileUserWithPrefix("conf", "fcitx-keyboard.config", "w", NULL); + FcitxConfigSaveConfigFileFp(fp, &fs->gconfig, configDesc); + if (fp) + fclose(fp); +} + +INPUT_RETURN_VALUE FcitxKeyboardHotkeyToggleWordHint(void* arg) +{ + FcitxKeyboard* keyboard = (FcitxKeyboard*) arg; + FcitxIM* im = FcitxInstanceGetCurrentIM(keyboard->owner); + if (im && strncmp(im->uniqueName, "fcitx-keyboard", strlen("fcitx-keyboard")) == 0) { + keyboard->config.bEnableWordHint = !keyboard->config.bEnableWordHint; + if (!keyboard->config.bEnableWordHint) { + keyboard->dictLang[0] = 0; + if (keyboard->dict) { + enchant_broker_free_dict(keyboard->broker, keyboard->dict); + keyboard->dict = NULL; + } + } + SaveKeyboardConfig(&keyboard->config); + return IRV_DO_NOTHING; + } + else + return IRV_TO_PROCESS; +} + +static const uint32_t validSym[] = +{ +0x0041, +0x0042, +0x0043, +0x0044, +0x0045, +0x0046, +0x0047, +0x0048, +0x0049, +0x004a, +0x004b, +0x004c, +0x004d, +0x004e, +0x004f, +0x0050, +0x0051, +0x0052, +0x0053, +0x0054, +0x0055, +0x0056, +0x0057, +0x0058, +0x0059, +0x005a, +0x0061, +0x0062, +0x0063, +0x0064, +0x0065, +0x0066, +0x0067, +0x0068, +0x0069, +0x006a, +0x006b, +0x006c, +0x006d, +0x006e, +0x006f, +0x0070, +0x0071, +0x0072, +0x0073, +0x0074, +0x0075, +0x0076, +0x0077, +0x0078, +0x0079, +0x007a, +0x00c0, +0x00c1, +0x00c2, +0x00c3, +0x00c4, +0x00c5, +0x00c6, +0x00c7, +0x00c8, +0x00c9, +0x00ca, +0x00cb, +0x00cc, +0x00cd, +0x00ce, +0x00cf, +0x00d0, +0x00d1, +0x00d2, +0x00d3, +0x00d4, +0x00d5, +0x00d6, +0x00d8, +0x00d8, +0x00d9, +0x00da, +0x00db, +0x00dc, +0x00dd, +0x00de, +0x00df, +0x00e0, +0x00e1, +0x00e2, +0x00e3, +0x00e4, +0x00e5, +0x00e6, +0x00e7, +0x00e8, +0x00e9, +0x00ea, +0x00eb, +0x00ec, +0x00ed, +0x00ee, +0x00ef, +0x00f0, +0x00f1, +0x00f2, +0x00f3, +0x00f4, +0x00f5, +0x00f6, +0x00f8, +0x00f8, +0x00f9, +0x00fa, +0x00fb, +0x00fc, +0x00fd, +0x00fe, +0x00ff, +0x01a1, +0x01a3, +0x01a5, +0x01a6, +0x01a9, +0x01aa, +0x01ab, +0x01ac, +0x01ae, +0x01af, +0x01b1, +0x01b3, +0x01b5, +0x01b6, +0x01b9, +0x01ba, +0x01bb, +0x01bc, +0x01be, +0x01bf, +0x01c0, +0x01c3, +0x01c5, +0x01c6, +0x01c8, +0x01ca, +0x01cc, +0x01cf, +0x01d0, +0x01d1, +0x01d2, +0x01d5, +0x01d8, +0x01d9, +0x01db, +0x01de, +0x01e0, +0x01e3, +0x01e5, +0x01e6, +0x01e8, +0x01ea, +0x01ec, +0x01ef, +0x01f0, +0x01f1, +0x01f2, +0x01f5, +0x01f8, +0x01f9, +0x01fb, +0x01fe, +0x02a1, +0x02a6, +0x02a9, +0x02ab, +0x02ac, +0x02b1, +0x02b6, +0x02b9, +0x02bb, +0x02bc, +0x02c5, +0x02c6, +0x02d5, +0x02d8, +0x02dd, +0x02de, +0x02e5, +0x02e6, +0x02f5, +0x02f8, +0x02fd, +0x02fe, +0x03a2, +0x03a3, +0x03a5, +0x03a6, +0x03aa, +0x03ab, +0x03ac, +0x03b3, +0x03b5, +0x03b6, +0x03ba, +0x03bb, +0x03bc, +0x03bd, +0x03bf, +0x03c0, +0x03c7, +0x03cc, +0x03cf, +0x03d1, +0x03d2, +0x03d3, +0x03d9, +0x03dd, +0x03de, +0x03e0, +0x03e7, +0x03ec, +0x03ef, +0x03f1, +0x03f2, +0x03f3, +0x03f9, +0x03fd, +0x03fe, +0x04a6, +0x04a7, +0x04a8, +0x04a9, +0x04aa, +0x04ab, +0x04ac, +0x04ad, +0x04ae, +0x04af, +0x04b1, +0x04b2, +0x04b3, +0x04b4, +0x04b5, +0x04b6, +0x04b7, +0x04b8, +0x04b9, +0x04ba, +0x04bb, +0x04bc, +0x04bd, +0x04be, +0x04bf, +0x04c0, +0x04c1, +0x04c2, +0x04c3, +0x04c4, +0x04c5, +0x04c6, +0x04c7, +0x04c8, +0x04c9, +0x04ca, +0x04cb, +0x04cc, +0x04cd, +0x04ce, +0x04cf, +0x04d0, +0x04d1, +0x04d2, +0x04d3, +0x04d4, +0x04d5, +0x04d6, +0x04d7, +0x04d8, +0x04d9, +0x04da, +0x04db, +0x04dc, +0x04dd, +0x05c1, +0x05c2, +0x05c3, +0x05c4, +0x05c5, +0x05c6, +0x05c7, +0x05c8, +0x05c9, +0x05ca, +0x05cb, +0x05cc, +0x05cd, +0x05ce, +0x05cf, +0x05d0, +0x05d1, +0x05d2, +0x05d3, +0x05d4, +0x05d5, +0x05d6, +0x05d7, +0x05d8, +0x05d9, +0x05da, +0x05e1, +0x05e2, +0x05e3, +0x05e4, +0x05e5, +0x05e6, +0x05e7, +0x05e8, +0x05e9, +0x05ea, +0x06a1, +0x06a2, +0x06a3, +0x06a4, +0x06a5, +0x06a6, +0x06a7, +0x06a8, +0x06a9, +0x06aa, +0x06ab, +0x06ac, +0x06ad, +0x06ae, +0x06af, +0x06b1, +0x06b2, +0x06b3, +0x06b4, +0x06b5, +0x06b6, +0x06b7, +0x06b8, +0x06b9, +0x06ba, +0x06bb, +0x06bc, +0x06bd, +0x06be, +0x06bf, +0x06c0, +0x06c1, +0x06c2, +0x06c3, +0x06c4, +0x06c5, +0x06c6, +0x06c7, +0x06c8, +0x06c9, +0x06ca, +0x06cb, +0x06cc, +0x06cd, +0x06ce, +0x06cf, +0x06d0, +0x06d1, +0x06d2, +0x06d3, +0x06d4, +0x06d5, +0x06d6, +0x06d7, +0x06d8, +0x06d9, +0x06da, +0x06db, +0x06dc, +0x06dd, +0x06de, +0x06df, +0x06e0, +0x06e1, +0x06e2, +0x06e3, +0x06e4, +0x06e5, +0x06e6, +0x06e7, +0x06e8, +0x06e9, +0x06ea, +0x06eb, +0x06ec, +0x06ed, +0x06ee, +0x06ef, +0x06f0, +0x06f1, +0x06f2, +0x06f3, +0x06f4, +0x06f5, +0x06f6, +0x06f7, +0x06f8, +0x06f9, +0x06fa, +0x06fb, +0x06fc, +0x06fd, +0x06fe, +0x06ff, +0x07a1, +0x07a2, +0x07a3, +0x07a4, +0x07a5, +0x07a7, +0x07a8, +0x07a9, +0x07ab, +0x07b1, +0x07b2, +0x07b3, +0x07b4, +0x07b5, +0x07b6, +0x07b7, +0x07b8, +0x07b9, +0x07ba, +0x07bb, +0x07c1, +0x07c2, +0x07c3, +0x07c4, +0x07c5, +0x07c6, +0x07c7, +0x07c8, +0x07c9, +0x07ca, +0x07cb, +0x07cb, +0x07cc, +0x07cd, +0x07ce, +0x07cf, +0x07d0, +0x07d1, +0x07d2, +0x07d4, +0x07d5, +0x07d6, +0x07d7, +0x07d8, +0x07d9, +0x07e1, +0x07e2, +0x07e3, +0x07e4, +0x07e5, +0x07e6, +0x07e7, +0x07e8, +0x07e9, +0x07ea, +0x07eb, +0x07eb, +0x07ec, +0x07ed, +0x07ee, +0x07ef, +0x07f0, +0x07f1, +0x07f2, +0x07f3, +0x07f4, +0x07f5, +0x07f6, +0x07f7, +0x07f8, +0x07f9, +0x08f6, +0x0ce0, +0x0ce1, +0x0ce2, +0x0ce3, +0x0ce4, +0x0ce5, +0x0ce6, +0x0ce7, +0x0ce8, +0x0ce9, +0x0cea, +0x0ceb, +0x0cec, +0x0ced, +0x0cee, +0x0cef, +0x0cf0, +0x0cf1, +0x0cf2, +0x0cf3, +0x0cf4, +0x0cf5, +0x0cf6, +0x0cf7, +0x0cf8, +0x0cf9, +0x0cfa, +0x0da1, +0x0da2, +0x0da3, +0x0da4, +0x0da5, +0x0da6, +0x0da7, +0x0da8, +0x0da9, +0x0daa, +0x0dab, +0x0dac, +0x0dad, +0x0dae, +0x0daf, +0x0db0, +0x0db1, +0x0db2, +0x0db3, +0x0db4, +0x0db5, +0x0db6, +0x0db7, +0x0db8, +0x0db9, +0x0dba, +0x0dbb, +0x0dbc, +0x0dbd, +0x0dbe, +0x0dbf, +0x0dc0, +0x0dc1, +0x0dc2, +0x0dc3, +0x0dc4, +0x0dc5, +0x0dc6, +0x0dc7, +0x0dc8, +0x0dc9, +0x0dca, +0x0dcb, +0x0dcc, +0x0dcd, +0x0dce, +0x0dcf, +0x0dd0, +0x0dd1, +0x0dd2, +0x0dd3, +0x0dd4, +0x0dd5, +0x0dd6, +0x0dd7, +0x0dd8, +0x0dd9, +0x0dda, +0x0de0, +0x0de1, +0x0de2, +0x0de3, +0x0de4, +0x0de5, +0x0de6, +0x0de7, +0x0de8, +0x0de9, +0x0dea, +0x0deb, +0x0dec, +0x0ded, +0x13be, +0x100012c, +0x100012d, +0x1000174, +0x1000175, +0x1000176, +0x1000177, +0x100018f, +0x100019f, +0x10001a0, +0x10001a1, +0x10001af, +0x10001b0, +0x10001b5, +0x10001b6, +0x10001d1, +0x10001d2, +0x10001e6, +0x10001e7, +0x1000259, +0x1000275, +0x1000492, +0x1000493, +0x1000496, +0x1000497, +0x100049a, +0x100049b, +0x100049c, +0x100049d, +0x10004a2, +0x10004a3, +0x10004ae, +0x10004af, +0x10004b0, +0x10004b1, +0x10004b2, +0x10004b3, +0x10004b6, +0x10004b7, +0x10004b8, +0x10004b9, +0x10004ba, +0x10004bb, +0x10004d8, +0x10004d9, +0x10004e2, +0x10004e3, +0x10004e8, +0x10004e9, +0x10004ee, +0x10004ef, +0x1000531, +0x1000532, +0x1000533, +0x1000534, +0x1000535, +0x1000536, +0x1000537, +0x1000538, +0x1000539, +0x100053a, +0x100053b, +0x100053c, +0x100053d, +0x100053e, +0x100053f, +0x1000540, +0x1000541, +0x1000542, +0x1000543, +0x1000544, +0x1000545, +0x1000546, +0x1000547, +0x1000548, +0x1000549, +0x100054a, +0x100054b, +0x100054c, +0x100054d, +0x100054e, +0x100054f, +0x1000550, +0x1000551, +0x1000552, +0x1000553, +0x1000554, +0x1000555, +0x1000556, +0x1000561, +0x1000562, +0x1000563, +0x1000564, +0x1000565, +0x1000566, +0x1000567, +0x1000568, +0x1000569, +0x100056a, +0x100056b, +0x100056c, +0x100056d, +0x100056e, +0x100056f, +0x1000570, +0x1000571, +0x1000572, +0x1000573, +0x1000574, +0x1000575, +0x1000576, +0x1000577, +0x1000578, +0x1000579, +0x100057a, +0x100057b, +0x100057c, +0x100057d, +0x100057e, +0x100057f, +0x1000580, +0x1000581, +0x1000582, +0x1000583, +0x1000584, +0x1000585, +0x1000586, +0x1000670, +0x1000679, +0x100067e, +0x1000686, +0x1000688, +0x1000691, +0x1000698, +0x10006a4, +0x10006a9, +0x10006af, +0x10006ba, +0x10006be, +0x10006c1, +0x10006cc, +0x10006cc, +0x10006d2, +0x10010d0, +0x10010d1, +0x10010d2, +0x10010d3, +0x10010d4, +0x10010d5, +0x10010d6, +0x10010d7, +0x10010d8, +0x10010d9, +0x10010da, +0x10010db, +0x10010dc, +0x10010dd, +0x10010de, +0x10010df, +0x10010e0, +0x10010e1, +0x10010e2, +0x10010e3, +0x10010e4, +0x10010e5, +0x10010e6, +0x10010e7, +0x10010e8, +0x10010e9, +0x10010ea, +0x10010eb, +0x10010ec, +0x10010ed, +0x10010ee, +0x10010ef, +0x10010f0, +0x10010f1, +0x10010f2, +0x10010f3, +0x10010f4, +0x10010f5, +0x10010f6, +0x1001e02, +0x1001e03, +0x1001e0a, +0x1001e0b, +0x1001e1e, +0x1001e1f, +0x1001e36, +0x1001e37, +0x1001e40, +0x1001e41, +0x1001e56, +0x1001e57, +0x1001e60, +0x1001e61, +0x1001e6a, +0x1001e6b, +0x1001e80, +0x1001e81, +0x1001e82, +0x1001e83, +0x1001e84, +0x1001e85, +0x1001e8a, +0x1001e8b, +0x1001ea0, +0x1001ea1, +0x1001ea2, +0x1001ea3, +0x1001ea4, +0x1001ea5, +0x1001ea6, +0x1001ea7, +0x1001ea8, +0x1001ea9, +0x1001eaa, +0x1001eab, +0x1001eac, +0x1001ead, +0x1001eae, +0x1001eaf, +0x1001eb0, +0x1001eb1, +0x1001eb2, +0x1001eb3, +0x1001eb4, +0x1001eb5, +0x1001eb6, +0x1001eb7, +0x1001eb8, +0x1001eb9, +0x1001eba, +0x1001ebb, +0x1001ebc, +0x1001ebd, +0x1001ebe, +0x1001ebf, +0x1001ec0, +0x1001ec1, +0x1001ec2, +0x1001ec3, +0x1001ec4, +0x1001ec5, +0x1001ec6, +0x1001ec7, +0x1001ec8, +0x1001ec9, +0x1001eca, +0x1001ecb, +0x1001ecc, +0x1001ecd, +0x1001ece, +0x1001ecf, +0x1001ed0, +0x1001ed1, +0x1001ed2, +0x1001ed3, +0x1001ed4, +0x1001ed5, +0x1001ed6, +0x1001ed7, +0x1001ed8, +0x1001ed9, +0x1001eda, +0x1001edb, +0x1001edc, +0x1001edd, +0x1001ede, +0x1001edf, +0x1001ee0, +0x1001ee1, +0x1001ee2, +0x1001ee3, +0x1001ee4, +0x1001ee5, +0x1001ee6, +0x1001ee7, +0x1001ee8, +0x1001ee9, +0x1001eea, +0x1001eeb, +0x1001eec, +0x1001eed, +0x1001eee, +0x1001eef, +0x1001ef0, +0x1001ef1, +0x1001ef2, +0x1001ef3, +0x1001ef4, +0x1001ef5, +0x1001ef6, +0x1001ef7, +0x1001ef8, +0x1001ef9 +}; + +static const uint16_t validChar[] = +{ +0x0041, +0x0042, +0x0043, +0x0044, +0x0045, +0x0046, +0x0047, +0x0048, +0x0049, +0x004a, +0x004b, +0x004c, +0x004d, +0x004e, +0x004f, +0x0050, +0x0051, +0x0052, +0x0053, +0x0054, +0x0055, +0x0056, +0x0057, +0x0058, +0x0059, +0x005a, +0x0061, +0x0062, +0x0063, +0x0064, +0x0065, +0x0066, +0x0067, +0x0068, +0x0069, +0x006a, +0x006b, +0x006c, +0x006d, +0x006e, +0x006f, +0x0070, +0x0071, +0x0072, +0x0073, +0x0074, +0x0075, +0x0076, +0x0077, +0x0078, +0x0079, +0x007a, +0x00c0, +0x00c1, +0x00c2, +0x00c3, +0x00c4, +0x00c5, +0x00c6, +0x00c7, +0x00c8, +0x00c9, +0x00ca, +0x00cb, +0x00cc, +0x00cd, +0x00ce, +0x00cf, +0x00d0, +0x00d1, +0x00d2, +0x00d3, +0x00d4, +0x00d5, +0x00d6, +0x00d8, +0x00d8, +0x00d9, +0x00da, +0x00db, +0x00dc, +0x00dd, +0x00de, +0x00df, +0x00e0, +0x00e1, +0x00e2, +0x00e3, +0x00e4, +0x00e5, +0x00e6, +0x00e7, +0x00e8, +0x00e9, +0x00ea, +0x00eb, +0x00ec, +0x00ed, +0x00ee, +0x00ef, +0x00f0, +0x00f1, +0x00f2, +0x00f3, +0x00f4, +0x00f5, +0x00f6, +0x00f8, +0x00f8, +0x00f9, +0x00fa, +0x00fb, +0x00fc, +0x00fd, +0x00fe, +0x00ff, +0x0100, +0x0101, +0x0102, +0x0103, +0x0104, +0x0105, +0x0106, +0x0107, +0x0108, +0x0109, +0x010a, +0x010b, +0x010c, +0x010d, +0x010e, +0x010f, +0x0110, +0x0111, +0x0112, +0x0113, +0x0116, +0x0117, +0x0118, +0x0119, +0x011a, +0x011b, +0x011c, +0x011d, +0x011e, +0x011f, +0x0120, +0x0121, +0x0122, +0x0123, +0x0124, +0x0125, +0x0126, +0x0127, +0x0128, +0x0129, +0x012a, +0x012b, +0x012c, +0x012d, +0x012e, +0x012f, +0x0130, +0x0131, +0x0134, +0x0135, +0x0136, +0x0137, +0x0138, +0x0139, +0x013a, +0x013b, +0x013c, +0x013d, +0x013e, +0x0141, +0x0142, +0x0143, +0x0144, +0x0145, +0x0146, +0x0147, +0x0148, +0x014a, +0x014b, +0x014c, +0x014d, +0x0150, +0x0151, +0x0154, +0x0155, +0x0156, +0x0157, +0x0158, +0x0159, +0x015a, +0x015b, +0x015c, +0x015d, +0x015e, +0x015f, +0x0160, +0x0161, +0x0162, +0x0163, +0x0164, +0x0165, +0x0166, +0x0167, +0x0168, +0x0169, +0x016a, +0x016b, +0x016c, +0x016d, +0x016e, +0x016f, +0x0170, +0x0171, +0x0172, +0x0173, +0x0174, +0x0175, +0x0176, +0x0177, +0x0178, +0x0179, +0x017a, +0x017b, +0x017c, +0x017d, +0x017e, +0x018f, +0x0192, +0x019f, +0x01a0, +0x01a1, +0x01af, +0x01b0, +0x01b5, +0x01b6, +0x01d2, +0x01d2, +0x01e6, +0x01e7, +0x0259, +0x0275, +0x0386, +0x0388, +0x0389, +0x038a, +0x038c, +0x038e, +0x038f, +0x0390, +0x0391, +0x0392, +0x0393, +0x0394, +0x0395, +0x0396, +0x0397, +0x0398, +0x0399, +0x039a, +0x039b, +0x039b, +0x039c, +0x039d, +0x039e, +0x039f, +0x03a0, +0x03a1, +0x03a3, +0x03a4, +0x03a5, +0x03a6, +0x03a7, +0x03a8, +0x03a9, +0x03aa, +0x03ab, +0x03ac, +0x03ad, +0x03ae, +0x03af, +0x03b0, +0x03b1, +0x03b2, +0x03b3, +0x03b4, +0x03b5, +0x03b6, +0x03b7, +0x03b8, +0x03b9, +0x03ba, +0x03bb, +0x03bb, +0x03bc, +0x03bd, +0x03be, +0x03bf, +0x03c0, +0x03c1, +0x03c2, +0x03c3, +0x03c4, +0x03c5, +0x03c6, +0x03c7, +0x03c8, +0x03c9, +0x03ca, +0x03cb, +0x03cc, +0x03cd, +0x03ce, +0x0401, +0x0402, +0x0403, +0x0404, +0x0405, +0x0406, +0x0407, +0x0408, +0x0409, +0x040a, +0x040b, +0x040c, +0x040e, +0x040f, +0x0410, +0x0411, +0x0412, +0x0413, +0x0414, +0x0415, +0x0416, +0x0417, +0x0418, +0x0419, +0x041a, +0x041b, +0x041c, +0x041d, +0x041e, +0x041f, +0x0420, +0x0421, +0x0422, +0x0423, +0x0424, +0x0425, +0x0426, +0x0427, +0x0428, +0x0429, +0x042a, +0x042b, +0x042c, +0x042d, +0x042e, +0x042f, +0x0430, +0x0431, +0x0432, +0x0433, +0x0434, +0x0435, +0x0436, +0x0437, +0x0438, +0x0439, +0x043a, +0x043b, +0x043c, +0x043d, +0x043e, +0x043f, +0x0440, +0x0441, +0x0442, +0x0443, +0x0444, +0x0445, +0x0446, +0x0447, +0x0448, +0x0449, +0x044a, +0x044b, +0x044c, +0x044d, +0x044e, +0x044f, +0x0451, +0x0452, +0x0453, +0x0454, +0x0455, +0x0456, +0x0457, +0x0458, +0x0459, +0x045a, +0x045b, +0x045c, +0x045e, +0x045f, +0x0490, +0x0491, +0x0492, +0x0493, +0x0496, +0x0497, +0x049a, +0x049b, +0x049c, +0x049d, +0x04a2, +0x04a3, +0x04ae, +0x04af, +0x04b0, +0x04b1, +0x04b2, +0x04b3, +0x04b6, +0x04b7, +0x04b8, +0x04b9, +0x04ba, +0x04bb, +0x04d8, +0x04d9, +0x04e2, +0x04e3, +0x04e8, +0x04e9, +0x04ee, +0x04ef, +0x0531, +0x0532, +0x0533, +0x0534, +0x0535, +0x0536, +0x0537, +0x0538, +0x0539, +0x053a, +0x053b, +0x053c, +0x053d, +0x053e, +0x053f, +0x0540, +0x0541, +0x0542, +0x0543, +0x0544, +0x0545, +0x0546, +0x0547, +0x0548, +0x0549, +0x054a, +0x054b, +0x054c, +0x054d, +0x054e, +0x054f, +0x0550, +0x0551, +0x0552, +0x0553, +0x0554, +0x0555, +0x0556, +0x0561, +0x0562, +0x0563, +0x0564, +0x0565, +0x0566, +0x0567, +0x0568, +0x0569, +0x056a, +0x056b, +0x056c, +0x056d, +0x056e, +0x056f, +0x0570, +0x0571, +0x0572, +0x0573, +0x0574, +0x0575, +0x0576, +0x0577, +0x0578, +0x0579, +0x057a, +0x057b, +0x057c, +0x057d, +0x057e, +0x057f, +0x0580, +0x0581, +0x0582, +0x0583, +0x0584, +0x0585, +0x0586, +0x05d0, +0x05d1, +0x05d2, +0x05d3, +0x05d4, +0x05d5, +0x05d6, +0x05d7, +0x05d8, +0x05d9, +0x05da, +0x05db, +0x05dc, +0x05dd, +0x05de, +0x05df, +0x05e0, +0x05e1, +0x05e2, +0x05e3, +0x05e4, +0x05e5, +0x05e6, +0x05e7, +0x05e8, +0x05e9, +0x05ea, +0x0621, +0x0622, +0x0623, +0x0624, +0x0625, +0x0626, +0x0627, +0x0628, +0x0629, +0x062a, +0x062b, +0x062c, +0x062d, +0x062e, +0x062f, +0x0630, +0x0631, +0x0632, +0x0633, +0x0634, +0x0635, +0x0636, +0x0637, +0x0638, +0x0639, +0x063a, +0x0641, +0x0642, +0x0643, +0x0644, +0x0645, +0x0646, +0x0647, +0x0648, +0x0649, +0x064a, +0x0670, +0x0679, +0x067e, +0x0686, +0x0688, +0x0691, +0x0698, +0x06a4, +0x06a9, +0x06af, +0x06ba, +0x06be, +0x06c1, +0x06cc, +0x06cc, +0x06d2, +0x0e01, +0x0e02, +0x0e03, +0x0e04, +0x0e05, +0x0e06, +0x0e07, +0x0e08, +0x0e09, +0x0e0a, +0x0e0b, +0x0e0c, +0x0e0d, +0x0e0e, +0x0e0f, +0x0e10, +0x0e11, +0x0e12, +0x0e13, +0x0e14, +0x0e15, +0x0e16, +0x0e17, +0x0e18, +0x0e19, +0x0e1a, +0x0e1b, +0x0e1c, +0x0e1d, +0x0e1e, +0x0e1f, +0x0e20, +0x0e21, +0x0e22, +0x0e23, +0x0e24, +0x0e25, +0x0e26, +0x0e27, +0x0e28, +0x0e29, +0x0e2a, +0x0e2b, +0x0e2c, +0x0e2d, +0x0e2e, +0x0e2f, +0x0e30, +0x0e31, +0x0e32, +0x0e33, +0x0e34, +0x0e35, +0x0e36, +0x0e37, +0x0e38, +0x0e39, +0x0e3a, +0x0e40, +0x0e41, +0x0e42, +0x0e43, +0x0e44, +0x0e45, +0x0e46, +0x0e47, +0x0e48, +0x0e49, +0x0e4a, +0x0e4b, +0x0e4c, +0x0e4d, +0x10d0, +0x10d1, +0x10d2, +0x10d3, +0x10d4, +0x10d5, +0x10d6, +0x10d7, +0x10d8, +0x10d9, +0x10da, +0x10db, +0x10dc, +0x10dd, +0x10de, +0x10df, +0x10e0, +0x10e1, +0x10e2, +0x10e3, +0x10e4, +0x10e5, +0x10e6, +0x10e7, +0x10e8, +0x10e9, +0x10ea, +0x10eb, +0x10ec, +0x10ed, +0x10ee, +0x10ef, +0x10f0, +0x10f1, +0x10f2, +0x10f3, +0x10f4, +0x10f5, +0x10f6, +0x1e02, +0x1e03, +0x1e0a, +0x1e0b, +0x1e1e, +0x1e1f, +0x1e36, +0x1e37, +0x1e40, +0x1e41, +0x1e56, +0x1e57, +0x1e60, +0x1e61, +0x1e6a, +0x1e6b, +0x1e80, +0x1e81, +0x1e82, +0x1e83, +0x1e84, +0x1e85, +0x1e8a, +0x1e8b, +0x1ea0, +0x1ea1, +0x1ea2, +0x1ea3, +0x1ea4, +0x1ea5, +0x1ea6, +0x1ea7, +0x1ea8, +0x1ea9, +0x1eaa, +0x1eab, +0x1eac, +0x1ead, +0x1eae, +0x1eaf, +0x1eb0, +0x1eb1, +0x1eb2, +0x1eb3, +0x1eb4, +0x1eb5, +0x1eb6, +0x1eb7, +0x1eb8, +0x1eb9, +0x1eba, +0x1ebb, +0x1ebc, +0x1ebd, +0x1ebe, +0x1ebf, +0x1ec0, +0x1ec1, +0x1ec2, +0x1ec3, +0x1ec4, +0x1ec5, +0x1ec6, +0x1ec7, +0x1ec8, +0x1ec9, +0x1eca, +0x1ecb, +0x1ecc, +0x1ecd, +0x1ece, +0x1ecf, +0x1ed0, +0x1ed1, +0x1ed2, +0x1ed3, +0x1ed4, +0x1ed5, +0x1ed6, +0x1ed7, +0x1ed8, +0x1ed9, +0x1eda, +0x1edb, +0x1edc, +0x1edd, +0x1ede, +0x1edf, +0x1ee0, +0x1ee1, +0x1ee2, +0x1ee3, +0x1ee4, +0x1ee5, +0x1ee6, +0x1ee7, +0x1ee8, +0x1ee9, +0x1eea, +0x1eeb, +0x1eec, +0x1eed, +0x1eee, +0x1eef, +0x1ef0, +0x1ef1, +0x1ef2, +0x1ef3, +0x1ef4, +0x1ef5, +0x1ef6, +0x1ef7, +0x1ef8, +0x1ef9, +0x30a1, +0x30a2, +0x30a3, +0x30a4, +0x30a5, +0x30a6, +0x30a7, +0x30a8, +0x30a9, +0x30aa, +0x30ab, +0x30ad, +0x30af, +0x30b1, +0x30b3, +0x30b5, +0x30b7, +0x30b9, +0x30bb, +0x30bd, +0x30bf, +0x30c1, +0x30c3, +0x30c4, +0x30c6, +0x30c8, +0x30ca, +0x30cb, +0x30cc, +0x30cd, +0x30ce, +0x30cf, +0x30d2, +0x30d5, +0x30d8, +0x30db, +0x30de, +0x30df, +0x30e0, +0x30e1, +0x30e2, +0x30e3, +0x30e4, +0x30e5, +0x30e6, +0x30e7, +0x30e8, +0x30e9, +0x30ea, +0x30eb, +0x30ec, +0x30ed, +0x30ef, +0x30f2, +0x30f3 +}; + +inline +boolean IsValidSym(FcitxKeySym keysym, unsigned int state) { + if (state != 0) + return false; + int min = 0; + int max = sizeof (validSym) / sizeof(validSym[0]) - 1; + int mid; + /* binary search in table */ + while (max >= min) { + mid = (min + max) / 2; + if (validSym[mid] < keysym) + min = mid + 1; + else if (validSym[mid] > keysym) + max = mid - 1; + else { + /* found it */ + return true; + } + } + return false; +} + +inline +boolean IsValidChar(uint32_t c) { + if (c == 0 || c == INVALID_COMPOSE_RESULT) + return false; + + int min = 0; + int max = sizeof (validChar) / sizeof(validChar[0]) - 1; + int mid; + /* binary search in table */ + while (max >= min) { + mid = (min + max) / 2; + if (validChar[mid] < c) + min = mid + 1; + else if (validChar[mid] > c) + max = mid - 1; + else { + /* found it */ + return true; + } + } + return false; +} + +uint32_t +processCompose(FcitxKeyboardLayout* layout, uint32_t keyval, uint32_t state) +{ + int i; + FcitxKeyboard* keyboard = layout->owner; + + for (i = 0; fcitx_compose_ignore[i] != FcitxKey_VoidSymbol; i++) { + if (keyval == fcitx_compose_ignore[i]) + return 0; + } + + keyboard->composeBuffer[keyboard->n_compose ++] = keyval; + keyboard->composeBuffer[keyboard->n_compose] = 0; + + uint32_t result; + if ((result = checkCompactTable(layout, &fcitx_compose_table_compact))) { + // qDebug () << "checkCompactTable ->true"; + return result; + } + + if ((result = checkAlgorithmically(layout))) { + // qDebug () << "checkAlgorithmically ->true"; + return result; + } + + if (keyboard->n_compose > 1) { + keyboard->composeBuffer[0] = 0; + keyboard->n_compose = 0; + return INVALID_COMPOSE_RESULT; + } else { + keyboard->composeBuffer[0] = 0; + keyboard->n_compose = 0; + return 0; + } +} + +uint32_t +checkCompactTable(FcitxKeyboardLayout* layout, const FcitxComposeTableCompact *table) +{ + int row_stride; + const uint32_t *seq_index; + const uint32_t *seq; + int i; + FcitxKeyboard* keyboard = layout->owner; + + /* Will never match, if the sequence in the compose buffer is longer + * than the sequences in the table. Further, compare_seq (key, val) + * will overrun val if key is longer than val. */ + if (keyboard->n_compose > table->max_seq_len) + return 0; + + seq_index = (const uint32_t *)bsearch(keyboard->composeBuffer, + table->data, table->n_index_size, + sizeof(uint32_t) * table->n_index_stride, + compare_seq_index); + + if (!seq_index) { + return 0; + } + + if (seq_index && keyboard->n_compose == 1) { + return INVALID_COMPOSE_RESULT; + } + + seq = NULL; + for (i = keyboard->n_compose - 1; i < table->max_seq_len; i++) { + row_stride = i + 1; + + if (seq_index[i + 1] - seq_index[i] > 0) { + seq = (const uint32_t *) bsearch(keyboard->composeBuffer + 1, + table->data + seq_index[i], (seq_index[i + 1] - seq_index[i]) / row_stride, + sizeof(uint32_t) * row_stride, + compare_seq); + if (seq) { + if (i == keyboard->n_compose - 1) + break; + else { + return INVALID_COMPOSE_RESULT; + } + } + } + } + + if (!seq) { + return 0; + } else { + uint32_t value; + value = seq[row_stride - 1]; + keyboard->composeBuffer[0] = 0; + keyboard->n_compose = 0; + return value; + } + return 0; +} + +#define IS_DEAD_KEY(k) \ + ((k) >= FcitxKey_dead_grave && (k) <= (FcitxKey_dead_dasia+1)) + +uint32_t +checkAlgorithmically(FcitxKeyboardLayout* layout) +{ + int i; + UChar combination_buffer[FCITX_MAX_COMPOSE_LEN]; + FcitxKeyboard* keyboard = layout->owner; + + if (keyboard->n_compose >= FCITX_MAX_COMPOSE_LEN) + return 0; + + for (i = 0; i < keyboard->n_compose && IS_DEAD_KEY(keyboard->composeBuffer[i]); i++); + if (i == keyboard->n_compose) + return INVALID_COMPOSE_RESULT; + + if (i > 0 && i == keyboard->n_compose - 1) { + combination_buffer[0] = FcitxKeySymToUnicode((FcitxKeySym) keyboard->composeBuffer[i]); + combination_buffer[keyboard->n_compose] = 0; + i--; + while (i >= 0) { + switch (keyboard->composeBuffer[i]) { +#define CASE(keysym, unicode) \ +case FcitxKey_dead_##keysym: combination_buffer[i + 1] = unicode; break + CASE(grave, 0x0300); + CASE(acute, 0x0301); + CASE(circumflex, 0x0302); + CASE(tilde, 0x0303); /* Also used with perispomeni, 0x342. */ + CASE(macron, 0x0304); + CASE(breve, 0x0306); + CASE(abovedot, 0x0307); + CASE(diaeresis, 0x0308); + CASE(hook, 0x0309); + CASE(abovering, 0x030A); + CASE(doubleacute, 0x030B); + CASE(caron, 0x030C); + CASE(abovecomma, 0x0313); /* Equivalent to psili */ + CASE(abovereversedcomma, 0x0314); /* Equivalent to dasia */ + CASE(horn, 0x031B); /* Legacy use for psili, 0x313 (or 0x343). */ + CASE(belowdot, 0x0323); + CASE(cedilla, 0x0327); + CASE(ogonek, 0x0328); /* Legacy use for dasia, 0x314.*/ + CASE(iota, 0x0345); + CASE(voiced_sound, 0x3099); /* Per Markus Kuhn keysyms.txt file. */ + CASE(semivoiced_sound, 0x309A); /* Per Markus Kuhn keysyms.txt file. */ + /* The following cases are to be removed once xkeyboard-config, + * xorg are fully updated. + **/ + /* Workaround for typo in 1.4.x xserver-xorg */ + case 0xfe66: + combination_buffer[i + 1] = 0x314; + break; + /* CASE (dasia, 0x314); */ + /* CASE (perispomeni, 0x342); */ + /* CASE (psili, 0x343); */ +#undef CASE + default: + combination_buffer[i + 1] = FcitxKeySymToUnicode((FcitxKeySym) keyboard->composeBuffer[i]); + } + i--; + } + + /* If the buffer normalizes to a single character, + * then modify the order of combination_buffer accordingly, if necessary, + * and return TRUE. + **/ +#if 0 + if (check_normalize_nfc(combination_buffer, keyboard->n_compose)) { + gunichar value; + combination_utf8 = g_ucs4_to_utf8(combination_buffer, -1, NULL, NULL, NULL); + nfc = g_utf8_normalize(combination_utf8, -1, G_NORMALIZE_NFC); + + value = g_utf8_get_char(nfc); + gtk_im_context_simple_commit_char(GTK_IM_CONTEXT(context_simple), value); + context_simple->compose_buffer[0] = 0; + + g_free(combination_utf8); + g_free(nfc); + + return TRUE; + } +#endif + UErrorCode state = U_ZERO_ERROR; + UChar result[FCITX_MAX_COMPOSE_LEN + 1]; + i = unorm_normalize(combination_buffer, keyboard->n_compose, UNORM_NFC, 0, result, FCITX_MAX_COMPOSE_LEN + 1, &state); + + // qDebug () << "combination_buffer = " << QString::fromUtf16(combination_buffer) << "keyboard->n_compose" << keyboard->n_compose; + // qDebug () << "result = " << QString::fromUtf16(result) << "i = " << i << state; + + if (i == 1) { + keyboard->composeBuffer[0] = 0; + keyboard->n_compose = 0; + return result[0]; + } + } + return 0; +} diff -Nru fcitx-4.2.2/src/im/keyboard/keyboardconfig.c fcitx-4.2.4.1/src/im/keyboard/keyboardconfig.c --- fcitx-4.2.2/src/im/keyboard/keyboardconfig.c 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/im/keyboard/keyboardconfig.c 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,31 @@ +/*************************************************************************** + * Copyright (C) 2012~2012 by CSSlayer * + * wengxt@gmail.com * + * * + * This program is free software; you can 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ +#include "keyboard.h" + +CONFIG_BINDING_BEGIN(FcitxKeyboardConfig); +CONFIG_BINDING_REGISTER("Keyboard", "CommitWithExtraSpace", bCommitWithExtraSpace); +CONFIG_BINDING_REGISTER("Keyboard", "HotkeyToggleWordHint", hkToggleWordHint); +CONFIG_BINDING_REGISTER("Keyboard", "EnableWordHint", bEnableWordHint); +CONFIG_BINDING_REGISTER("Keyboard", "MinimumHintLength", minimumHintLength); +CONFIG_BINDING_REGISTER("Keyboard", "UsePresage", bUsePresage); +CONFIG_BINDING_REGISTER("Keyboard", "UseEnterToCommit", bUseEnterToCommit); +CONFIG_BINDING_REGISTER("Keyboard", "HotkeyAddToUserDict", hkAddToUserDict); +CONFIG_BINDING_REGISTER("Keyboard", "PreferredEnchantProvider", provider); +CONFIG_BINDING_END(); diff -Nru fcitx-4.2.2/src/im/keyboard/keyboard.h fcitx-4.2.4.1/src/im/keyboard/keyboard.h --- fcitx-4.2.2/src/im/keyboard/keyboard.h 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/im/keyboard/keyboard.h 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,87 @@ +/*************************************************************************** + * Copyright (C) 2012~2012 by CSSlayer * + * wengxt@gmail.com * + * * + * This program is free software; you can 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#ifndef FCITX_KEYBOARD_H +#define FCITX_KEYBOARD_H + +#include "config.h" + +#include +#include +#include +#include +#include +#ifdef PRESAGE_FOUND +#include +#endif +#include "rules.h" + +#define FCITX_KEYBOARD_MAX_BUFFER 20 +#define FCITX_MAX_COMPOSE_LEN 7 + +typedef enum _EnchantProvider { + EP_Default = 0, + EP_Aspell = 1, + EP_Myspell = 2 +} EnchantProvider; + +typedef struct _FcitxKeyboardConfig { + FcitxGenericConfig gconfig; + boolean bCommitWithExtraSpace; + boolean bEnableWordHint; + boolean bUseEnterToCommit; + boolean bUsePresage; + FcitxHotkey hkToggleWordHint[2]; + FcitxHotkey hkAddToUserDict[2]; + int minimumHintLength; + EnchantProvider provider; +} FcitxKeyboardConfig; + +typedef struct _FcitxKeyboard { + struct _FcitxInstance* owner; + EnchantBroker* broker; + UT_array* enchantLanguages; + FcitxKeyboardConfig config; + FcitxXkbRules* rules; + char dictLang[6]; + EnchantDict* dict; + iconv_t iconv; + char* initialLayout; + char* initialVariant; +#ifdef PRESAGE_FOUND + presage_t presage; +#endif + char buffer[FCITX_KEYBOARD_MAX_BUFFER + UTF8_MAX_LENGTH + 1]; + int cursorPos; + uint composeBuffer[FCITX_MAX_COMPOSE_LEN + 1]; + int n_compose; + char* tempBuffer; + int lastLength; +} FcitxKeyboard; + +typedef struct _FcitxKeyboardLayout { + FcitxKeyboard* owner; + char* layoutString; + char* variantString; +} FcitxKeyboardLayout; + +CONFIG_BINDING_DECLARE(FcitxKeyboardConfig); + +#endif diff -Nru fcitx-4.2.2/src/im/pinyin/fcitx-pinyin.desc fcitx-4.2.4.1/src/im/pinyin/fcitx-pinyin.desc --- fcitx-4.2.2/src/im/pinyin/fcitx-pinyin.desc 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/im/pinyin/fcitx-pinyin.desc 2012-06-10 14:34:48.000000000 +0000 @@ -11,6 +11,11 @@ DefaultValue=Ziranma Description=Default Shuangpin Schema +[Pinyin/FixCursorAtHead] +Type=Boolean +DefaultValue=False +Description=Fix preedit cursor at head + [Pinyin/UseCompletePinyin] Type=Boolean DefaultValue=False diff -Nru fcitx-4.2.2/src/im/pinyin/py.c fcitx-4.2.4.1/src/im/pinyin/py.c --- fcitx-4.2.2/src/im/pinyin/py.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/im/pinyin/py.c 2012-06-10 14:34:48.000000000 +0000 @@ -92,6 +92,7 @@ InitMHPY(&pystate->pyconfig.MHPY_C, MHPY_C_TEMPLATE); InitMHPY(&pystate->pyconfig.MHPY_S, MHPY_S_TEMPLATE); InitPYTable(&pystate->pyconfig); + InitPYSplitData(&pystate->pyconfig); if (!LoadPYConfig(&pystate->pyconfig)) { free(pystate->pyconfig.MHPY_C); free(pystate->pyconfig.MHPY_S); @@ -101,7 +102,7 @@ } PinyinMigration(); - + pystate->pool = fcitx_memory_pool_create(); FcitxInstanceRegisterIM(instance, @@ -257,25 +258,25 @@ for (k = 0; k < count; k++) { if (!isSystem) phrase = (PyPhrase *) fcitx_utils_malloc0(sizeof(PyUsrPhrase)); - + fread(&iLen, sizeof(int), 1, fp); - + if (isSystem) phrase->strMap = (char* ) fcitx_memory_pool_alloc(pystate->pool, sizeof(char) * (iLen + 1)); else phrase->strMap = (char *) fcitx_utils_malloc0(sizeof(char) * (iLen + 1)); fread(phrase->strMap, sizeof(char) * iLen, 1, fp); phrase->strMap[iLen] = '\0'; - + fread(&iLen, sizeof(int), 1, fp); - + if (isSystem) phrase->strPhrase = (char* ) fcitx_memory_pool_alloc(pystate->pool, sizeof(char) * (iLen + 1)); else phrase->strPhrase = (char *) fcitx_utils_malloc0(sizeof(char) * (iLen + 1)); fread(phrase->strPhrase, sizeof(char) * iLen, 1, fp); phrase->strPhrase[iLen] = '\0'; - + fread(&iLen, sizeof(unsigned int), 1, fp); phrase->iIndex = iLen; if (iLen > pystate->iCounter) @@ -364,13 +365,13 @@ FcitxStringHashSet *curStr = sset; while (curStr) { char *filename; - + if (strcmp(curStr->name, PY_PHRASE_FILE) != 0 && strcmp(curStr->name, PY_USERPHRASE_FILE) != 0 && strcmp(curStr->name, PY_SYMBOL_FILE) != 0 - && strcmp(curStr->name, PY_BASE_FILE) != 0 + && strcmp(curStr->name, PY_BASE_FILE) != 0 && strcmp(curStr->name, PY_FREQ_FILE) != 0) { - + fp = FcitxXDGGetFileWithPrefix("pinyin", curStr->name, "r", &filename); FcitxLog(INFO, _("Load extra dict: %s"), filename); free(filename); @@ -379,7 +380,7 @@ } curStr = curStr->hh.next; } - + fcitx_utils_free_string_hash_set(sset); pystate->iOrigCounter = pystate->iCounter; @@ -623,12 +624,13 @@ for (i = 0; i < pystate->iPYSelected; i++) val += fcitx_utf8_strlen(pystate->pySelected[i].strHZ); + retVal = IRV_DISPLAY_CANDWORDS; if (pystate->findMap.iHZCount > (MAX_WORDS_USER_INPUT - val)) { UpdateFindString(pystate, val); ParsePY(&pystate->pyconfig, pystate->strFindString, &pystate->findMap, PY_PARSE_INPUT_USER, pystate->bSP); + retVal = IRV_DO_NOTHING; } - retVal = IRV_DISPLAY_CANDWORDS; } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_BACKSPACE)) { if (pystate->iPYSelected) { char strTemp[MAX_USER_INPUT + 1]; @@ -708,7 +710,7 @@ } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_LEFT)) { if (!FcitxInputStateGetRawInputBufferSize(input)) return IRV_TO_PROCESS; - if (pystate->iPYInsertPoint < 2) { + if (pystate->iPYInsertPoint <= 0) { if (pystate->iPYSelected) { char strTemp[MAX_USER_INPUT + 1]; @@ -721,9 +723,6 @@ ParsePY(&pystate->pyconfig, pystate->strFindString, &pystate->findMap, PY_PARSE_INPUT_USER, pystate->bSP); retVal = IRV_DISPLAY_CANDWORDS; - } else if (pystate->iPYInsertPoint) { - pystate->iPYInsertPoint--; - retVal = IRV_DISPLAY_CANDWORDS; } else retVal = IRV_DO_NOTHING; } else { @@ -936,10 +935,13 @@ FcitxInputState* input = FcitxInstanceGetInputState(pystate->owner); int iCursorPos = 0; + int hzLen = 0; for (i = 0; i < pystate->iPYSelected; i++) iCursorPos += strlen(pystate->pySelected[i].strHZ); + hzLen = iCursorPos; + if (pystate->iPYInsertPoint > strlen(pystate->strFindString)) pystate->iPYInsertPoint = strlen(pystate->strFindString); iTemp = pystate->iPYInsertPoint; @@ -955,7 +957,11 @@ iTemp -= strlen(pystate->findMap.strPYParsed[i]); } FcitxInputStateSetCursorPos(input, iCursorPos); - FcitxInputStateSetClientCursorPos(input, 0); + + if (pystate->pyconfig.bFixCursorAtHead) + FcitxInputStateSetClientCursorPos(input, 0); + else + FcitxInputStateSetClientCursorPos(input, hzLen); } /* diff -Nru fcitx-4.2.2/src/im/pinyin/pyconfig.c fcitx-4.2.4.1/src/im/pinyin/pyconfig.c --- fcitx-4.2.2/src/im/pinyin/pyconfig.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/im/pinyin/pyconfig.c 2012-06-10 14:34:48.000000000 +0000 @@ -36,6 +36,7 @@ CONFIG_BINDING_BEGIN(FcitxPinyinConfig) CONFIG_BINDING_REGISTER("Pinyin", "DefaultShuangpinSchema", spscheme) +CONFIG_BINDING_REGISTER("Pinyin", "FixCursorAtHead", bFixCursorAtHead) CONFIG_BINDING_REGISTER("Pinyin", "UseCompletePinyin", bFullPY) CONFIG_BINDING_REGISTER("Pinyin", "AutoCreatePhrase", bPYCreateAuto) CONFIG_BINDING_REGISTER("Pinyin", "SaveAutoPhrase", bPYSaveAutoAsPhrase) diff -Nru fcitx-4.2.2/src/im/pinyin/pyconfig.h fcitx-4.2.4.1/src/im/pinyin/pyconfig.h --- fcitx-4.2.2/src/im/pinyin/pyconfig.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/im/pinyin/pyconfig.h 2012-06-10 14:34:48.000000000 +0000 @@ -42,6 +42,8 @@ SP_USERDEFINE } SHUANGPINSCHEME; +typedef struct _PYMappedSplitData PYMappedSplitData; + typedef struct _FcitxPinyinConfig { FcitxGenericConfig gconfig; @@ -49,6 +51,7 @@ boolean bFullPY; boolean bPYCreateAuto; boolean bPYSaveAutoAsPhrase; + boolean bFixCursorAtHead; ADJUSTORDER baseOrder; ADJUSTORDER phraseOrder; ADJUSTORDER freqOrder; @@ -64,6 +67,8 @@ char cNonS; SP_C SPMap_C[31]; SP_S SPMap_S[4]; + + PYMappedSplitData* splitData; } FcitxPinyinConfig; CONFIG_BINDING_DECLARE(FcitxPinyinConfig); diff -Nru fcitx-4.2.2/src/im/pinyin/PYFA.c fcitx-4.2.4.1/src/im/pinyin/PYFA.c --- fcitx-4.2.2/src/im/pinyin/PYFA.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/im/pinyin/PYFA.c 2012-06-10 14:34:48.000000000 +0000 @@ -1231,7 +1231,6 @@ void InitPYTable(FcitxPinyinConfig* pyconfig) { - int iBaseCount = 0; while (PYTable_template[iBaseCount].strPY[0] != '\0') diff -Nru fcitx-4.2.2/src/im/pinyin/py.h fcitx-4.2.4.1/src/im/pinyin/py.h --- fcitx-4.2.2/src/im/pinyin/py.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/im/pinyin/py.h 2012-06-10 14:34:48.000000000 +0000 @@ -129,7 +129,7 @@ int iLength; } PYRemindCandWord; -typedef union { +typedef union _PCand { PYFreqCandWord sym; PYFreqCandWord freq; PYBaseCandWord base; @@ -192,9 +192,9 @@ boolean bSP_UseSemicolon; boolean bSP; - + FcitxMemoryPool* pool; - + struct _FcitxInstance *owner; } FcitxPinyinState; diff -Nru fcitx-4.2.2/src/im/pinyin/pyParser.c fcitx-4.2.4.1/src/im/pinyin/pyParser.c --- fcitx-4.2.2/src/im/pinyin/pyParser.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/im/pinyin/pyParser.c 2012-06-10 14:34:48.000000000 +0000 @@ -22,18 +22,21 @@ #include #include "fcitx/fcitx.h" +#include "fcitx/ime.h" +#include "fcitx-utils/log.h" #include "pyMapTable.h" #include "PYFA.h" #include "sp.h" #include "pyParser.h" #include "pyconfig.h" -#include "fcitx/ime.h" #include "py.h" extern const ConsonantMap consonantMapTable[]; extern const SyllabaryMap syllabaryMapTable[]; +static double LookupPYFreq(FcitxPinyinConfig* pyconfig, int index1, int index2); + int IsSyllabary(const char *strPY, boolean bMode) { register int i; @@ -164,23 +167,68 @@ strTemp[0] = pyconfig->PYTable[iIndex].strPY[lIndex - 1]; iTemp = -1; - if (strTemp[0] == 'g' || strTemp[0] == 'n') { + /* + * if the end of pinyin is 'g', 'n', 'e' + * there might be another possbility, for example "wanan" can be "wa nan" and "wan an" + * try resolve these problem here + */ + if (strTemp[0] == 'g' || strTemp[0] == 'n' || strTemp[0] == 'e' || strTemp[0] == 'a') { strncpy(strTemp, strP, lIndex - 1); strTemp[lIndex - 1] = '\0'; + /* for example we have "wan", so we try to check "wa" is valid or not, with exact match */ iTemp = FindPYFAIndex(pyconfig, strTemp, 0); + /* if "wa" is valid */ if (iTemp != -1) { + /* also check "nan" is valid or not */ + int firstIndex; + firstIndex = iTemp; iTemp = FindPYFAIndex(pyconfig, strP + strlen(pyconfig->PYTable[iTemp].strPY), 1); + /* if still is valid */ if (iTemp != -1) { + /* + * length 1 split is what we must avoid, + * for example, "nin" can be "ni n", but no separator can for "nin" if we split here + * + * and "ying" can be also "yi ng", for just the same case" + */ if (strlen(pyconfig->PYTable[iTemp].strPY) == 1 || !strcmp("ng", pyconfig->PYTable[iTemp].strPY)) iTemp = -1; } if (iTemp != -1) { - strncpy(strTemp, strP, lIndex - 1); - strTemp[lIndex - 1] = '\0'; + /* check the general frequency that this shoud split or not */ + int index2 = FindPYFAIndex(pyconfig, strP + strlen(pyconfig->PYTable[iIndex].strPY), 1); + + boolean resplit = false; + do { + /* prefer longer */ + if (index2 == -1) { + resplit = true; + break; + } + + size_t length1 = strlen(pyconfig->PYTable[iIndex].strPY) + strlen(pyconfig->PYTable[index2].strPY); + size_t length2 = strlen(pyconfig->PYTable[firstIndex].strPY) + strlen(pyconfig->PYTable[iTemp].strPY); + if (length1 != length2) { + resplit = (length1 < length2); + break; + } + + double freq1 = LookupPYFreq(pyconfig, iIndex, index2); + double freq2 = LookupPYFreq(pyconfig, firstIndex, iTemp); + + resplit = (freq1 <= freq2); + } while(0); + + if (resplit) { + strncpy(strTemp, strP, lIndex - 1); + strTemp[lIndex - 1] = '\0'; + } + else + iTemp = -1; } } } @@ -473,4 +521,42 @@ return 0; } +#include "pysplitdata.h" + +struct _PYMappedSplitData { + char py[MAX_PY_LENGTH * 2 + 2]; + float freq; + UT_hash_handle hh; +}; + +const UT_icd splitData_icd = { sizeof(PYMappedSplitData), 0, 0, 0 }; + +void InitPYSplitData(FcitxPinyinConfig* pyconfig) +{ + size_t size = sizeof(pySplitData) / sizeof(pySplitData[0]); + int i = 0; + for (i = 0; i < size; i ++) { + PYMappedSplitData* data = fcitx_utils_malloc0(sizeof(PYMappedSplitData)); + sprintf(data->py, "%s %s", pySplitData[i].py1, pySplitData[i].py2); + data->freq = pySplitData[i].freq; + HASH_ADD_STR(pyconfig->splitData, py, data); + } +} + +double LookupPYFreq(FcitxPinyinConfig* pyconfig, int index1, int index2) +{ + char py[MAX_PY_LENGTH * 2 + 2]; + if (index1 < 0 || index2 < 0) + return 0; + + sprintf(py, "%s %s", pyconfig->PYTable[index1].strPY, pyconfig->PYTable[index2].strPY); + + PYMappedSplitData* s = NULL; + HASH_FIND_STR(pyconfig->splitData, py, s); + + if (s == NULL) + return 0; + return s->freq; +} + // kate: indent-mode cstyle; space-indent on; indent-width 0; diff -Nru fcitx-4.2.2/src/im/pinyin/pyParser.h fcitx-4.2.4.1/src/im/pinyin/pyParser.h --- fcitx-4.2.2/src/im/pinyin/pyParser.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/im/pinyin/pyParser.h 2012-06-10 14:34:48.000000000 +0000 @@ -53,12 +53,12 @@ int IsConsonant(const char *strPY, boolean bMode); int FindPYFAIndex(struct _FcitxPinyinConfig* pyconfig, const char *strPY, boolean bMode); void ParsePY(struct _FcitxPinyinConfig* pyconfig, const char* strPY, ParsePYStruct* parsePY, PYPARSEINPUTMODE mode, boolean bSP); -boolean MapPY(struct _FcitxPinyinConfig* pyconfig, const char* strPYorigin, char strMap[3], PYPARSEINPUTMODE mode); - -boolean MapToPY(char strMap[3], char *strPY); +boolean MapPY(struct _FcitxPinyinConfig* pyconfig, const char* strPYorigin, char strMap[3], PYPARSEINPUTMODE mode); +boolean MapToPY(char strMap[3], char *strPY); int CmpMap(struct _FcitxPinyinConfig* pyconfig, char* strMap1, char* strMap2, int* iMatchedLength, boolean bSP); -int Cmp1Map(struct _FcitxPinyinConfig* pyconfig, char map1, char map2, boolean b, boolean bUseMH, boolean bSP); +int Cmp1Map(struct _FcitxPinyinConfig* pyconfig, char map1, char map2, boolean b, boolean bUseMH, boolean bSP); int Cmp2Map(struct _FcitxPinyinConfig* pyconfig, char map1[3], char map2[3], boolean bSP); +void InitPYSplitData(struct _FcitxPinyinConfig* pyconfig); #endif diff -Nru fcitx-4.2.2/src/im/pinyin/pysplitdata.h fcitx-4.2.4.1/src/im/pinyin/pysplitdata.h --- fcitx-4.2.2/src/im/pinyin/pysplitdata.h 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/im/pinyin/pysplitdata.h 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,3089 @@ +typedef struct _PYSplitData { + const char* py1; + const char* py2; + double freq; +} PYSplitData; + +const PYSplitData pySplitData[] = { +{"a", "er", 1075.13}, +{"a", "ni", 112.625}, +{"a", "nuo", 109.853}, +{"ai", "e", 123.813}, +{"ai", "er", 958.756}, +{"ai", "neng", 152.647}, +{"ai", "ni", 3976.28}, +{"ai", "nu", 263.145}, +{"an", "an", 97888.5}, +{"ang", "ang", 985.401}, +{"ao", "er", 131.445}, +{"ao", "nao", 238.771}, +{"ao", "ni", 304.071}, +{"ba", "er", 331.008}, +{"ba", "na", 647.405}, +{"ba", "neng", 168.65}, +{"ba", "ni", 3892.93}, +{"ba", "nian", 861.827}, +{"bai", "e", 152.838}, +{"bai", "nao", 189.845}, +{"bai", "nei", 216.384}, +{"bai", "nen", 143.784}, +{"bai", "nian", 2462.53}, +{"bai", "nong", 274.876}, +{"ban", "an", 824.018}, +{"ban", "er", 202.05}, +{"bao", "e", 449.129}, +{"bao", "en", 114.75}, +{"bao", "er", 576.589}, +{"bao", "nao", 168.44}, +{"bao", "neng", 197.323}, +{"bao", "nian", 157.478}, +{"bao", "nu", 228.011}, +{"bao", "nuan", 349.614}, +{"bei", "er", 521.573}, +{"bei", "nan", 238.03}, +{"bei", "ni", 1276.14}, +{"bei", "nian", 316.047}, +{"ben", "an", 657.626}, +{"ben", "er", 324.427}, +{"bi", "er", 634.017}, +{"bi", "nan", 203.313}, +{"bi", "ni", 3067.61}, +{"bi", "nian", 123.351}, +{"biao", "neng", 123.968}, +{"bie", "ba", 382.433}, +{"bie", "bie", 82535.1}, +{"bie", "bu", 109.579}, +{"bie", "cha", 110.815}, +{"bie", "chu", 602.708}, +{"bie", "da", 165.114}, +{"bie", "dang", 124.898}, +{"bie", "de", 9728.83}, +{"bie", "dong", 333.191}, +{"bie", "ji", 597.457}, +{"bie", "jia", 191.986}, +{"bie", "jiao", 154.561}, +{"bie", "ju", 235.963}, +{"bie", "kan", 546.866}, +{"bie", "ke", 531.398}, +{"bie", "ku", 274.876}, +{"bie", "lai", 187.728}, +{"bie", "li", 239.366}, +{"bie", "mai", 168.02}, +{"bie", "ming", 292.913}, +{"bie", "na", 140.946}, +{"bie", "niu", 943.904}, +{"bie", "pa", 214.505}, +{"bie", "qu", 483.009}, +{"bie", "rang", 714.886}, +{"bie", "ren", 40576.9}, +{"bie", "shi", 110.953}, +{"bie", "shu", 2575.62}, +{"bie", "shuo", 1815.77}, +{"bie", "si", 162.866}, +{"bie", "tai", 297.326}, +{"bie", "ti", 431.034}, +{"bie", "wan", 1116.84}, +{"bie", "wang", 864.902}, +{"bie", "wen", 249.812}, +{"bie", "wu", 274.099}, +{"bie", "xiang", 562.767}, +{"bie", "yang", 356.211}, +{"bie", "yi", 343.568}, +{"bie", "yong", 217.466}, +{"bie", "you", 615.211}, +{"bie", "zai", 856.802}, +{"bie", "zhe", 205.606}, +{"bie", "zhi", 365.656}, +{"bie", "zhu", 199.548}, +{"bie", "zou", 203.821}, +{"bin", "er", 2767.23}, +{"bing", "an", 248.794}, +{"bing", "er", 144.323}, +{"bo", "er", 264.583}, +{"bo", "nong", 107.953}, +{"bu", "e", 414.7}, +{"bu", "er", 1733.77}, +{"bu", "na", 401.733}, +{"bu", "nai", 691.43}, +{"bu", "nan", 2116.08}, +{"bu", "neng", 86205.1}, +{"bu", "nian", 254.121}, +{"cai", "na", 2056.74}, +{"cai", "neng", 21114.2}, +{"cai", "nian", 211.321}, +{"cai", "niao", 1344.71}, +{"cai", "nong", 114.18}, +{"cai", "nuan", 274.534}, +{"cai", "nv", 459.89}, +{"can", "an", 201.046}, +{"can", "ao", 264.789}, +{"cao", "ni", 213.438}, +{"ce", "bi", 860.754}, +{"ce", "bian", 116.044}, +{"ce", "biao", 140.595}, +{"ce", "bu", 107.953}, +{"ce", "ce", 81990.9}, +{"ce", "chi", 158.068}, +{"ce", "chu", 161.855}, +{"ce", "chuan", 139.374}, +{"ce", "da", 191.747}, +{"ce", "de", 146.132}, +{"ce", "ding", 1607.02}, +{"ce", "fei", 159.254}, +{"ce", "hua", 4065.86}, +{"ce", "hui", 1355.5}, +{"ce", "ji", 378.869}, +{"ce", "jia", 266.444}, +{"ce", "jian", 170.127}, +{"ce", "jiao", 327.721}, +{"ce", "jing", 136.793}, +{"ce", "kong", 217.195}, +{"ce", "li", 128.69}, +{"ce", "liang", 2841.9}, +{"ce", "lue", 5629.71}, +{"ce", "mian", 1359.88}, +{"ce", "ming", 241.765}, +{"ce", "mou", 181.969}, +{"ce", "mu", 119.567}, +{"ce", "neng", 121.218}, +{"ce", "ping", 774.242}, +{"ce", "shen", 192.705}, +{"ce", "shi", 25739.5}, +{"ce", "shou", 416.9}, +{"ce", "si", 318.419}, +{"ce", "su", 181.969}, +{"ce", "suan", 688.658}, +{"ce", "suo", 3524.83}, +{"ce", "tu", 123.198}, +{"ce", "xiao", 340.416}, +{"ce", "xu", 107.953}, +{"ce", "yan", 396.507}, +{"ce", "ye", 237.288}, +{"ce", "yong", 369.78}, +{"ce", "yuan", 113.612}, +{"ce", "zhen", 260.859}, +{"ce", "zheng", 246.634}, +{"ce", "zhong", 749.456}, +{"ce", "zi", 455.784}, +{"ceng", "er", 167.185}, +{"cha", "e", 529.431}, +{"cha", "er", 848.484}, +{"cha", "na", 634.535}, +{"chang", "an", 1608.76}, +{"chang", "e", 750.493}, +{"chang", "er", 186.097}, +{"chao", "e", 457.033}, +{"chao", "nan", 109.99}, +{"chao", "nao", 262.817}, +{"chao", "neng", 499.214}, +{"chao", "nong", 162.664}, +{"chao", "nv", 1647.58}, +{"che", "ban", 131.118}, +{"che", "bao", 301.43}, +{"che", "ben", 313.302}, +{"che", "biao", 126.78}, +{"che", "chan", 262.673}, +{"che", "che", 81198.4}, +{"che", "chen", 167.811}, +{"che", "cheng", 310.194}, +{"che", "chu", 377.697}, +{"che", "chuang", 562.94}, +{"che", "ci", 235.814}, +{"che", "dan", 1076.35}, +{"che", "dao", 676.969}, +{"che", "deng", 161.251}, +{"che", "di", 7069.02}, +{"che", "diao", 143.605}, +{"che", "ding", 586.621}, +{"che", "dong", 2136.92}, +{"che", "dui", 1296.98}, +{"che", "fang", 142.891}, +{"che", "fei", 627.211}, +{"che", "feng", 108.628}, +{"che", "fu", 164.703}, +{"che", "hai", 291.519}, +{"che", "hang", 167.185}, +{"che", "hou", 150.382}, +{"che", "hu", 296.216}, +{"che", "hua", 205.095}, +{"che", "hui", 239.964}, +{"che", "huo", 1803.66}, +{"che", "ji", 353.435}, +{"che", "jia", 1029.18}, +{"che", "jian", 1409.92}, +{"che", "jiao", 1947.23}, +{"che", "jing", 144.323}, +{"che", "jun", 186.794}, +{"che", "kai", 106.218}, +{"che", "ke", 114.18}, +{"che", "kou", 214.505}, +{"che", "ku", 461.037}, +{"che", "kuang", 110.953}, +{"che", "li", 1195.01}, +{"che", "liang", 5629.31}, +{"che", "liu", 207.408}, +{"che", "lun", 893.97}, +{"che", "ma", 225.714}, +{"che", "me", 120.015}, +{"che", "men", 627.211}, +{"che", "mi", 188.901}, +{"che", "mian", 108.088}, +{"che", "mo", 290.731}, +{"che", "nei", 780.053}, +{"che", "nian", 217.737}, +{"che", "pai", 653.797}, +{"che", "pi", 175.074}, +{"che", "piao", 1062.53}, +{"che", "pin", 317.231}, +{"che", "ping", 117.5}, +{"che", "pu", 144.863}, +{"che", "qi", 192.946}, +{"che", "qian", 128.69}, +{"che", "shan", 239.964}, +{"che", "shang", 2217.77}, +{"che", "shen", 1152.18}, +{"che", "shi", 610.249}, +{"che", "shou", 1140.36}, +{"che", "shui", 119.419}, +{"che", "su", 449.129}, +{"che", "tan", 122.432}, +{"che", "ti", 209.747}, +{"che", "ting", 156.11}, +{"che", "tong", 286.773}, +{"che", "tou", 634.016}, +{"che", "tui", 601.941}, +{"che", "tuo", 1773.28}, +{"che", "wai", 126.149}, +{"che", "wei", 630.781}, +{"che", "wu", 281.156}, +{"che", "xi", 423.579}, +{"che", "xia", 115.467}, +{"che", "xian", 254.121}, +{"che", "xiang", 1005.43}, +{"che", "xiao", 1421.38}, +{"che", "xing", 6059.66}, +{"che", "ye", 456.582}, +{"che", "yong", 756.741}, +{"che", "you", 519.528}, +{"che", "zai", 496.212}, +{"che", "zhan", 2963.3}, +{"che", "zhe", 160.249}, +{"che", "zhen", 278.323}, +{"che", "zhi", 153.41}, +{"che", "zhong", 234.422}, +{"che", "zhou", 112.625}, +{"che", "zhu", 1577.26}, +{"che", "zhuang", 110.539}, +{"che", "zi", 3253.89}, +{"che", "zu", 1873.2}, +{"chen", "ai", 743.515}, +{"chi", "nai", 249.105}, +{"chi", "neng", 264.13}, +{"chong", "ai", 532.077}, +{"chong", "er", 217.737}, +{"chou", "e", 391.596}, +{"chou", "nv", 320.809}, +{"chu", "er", 373.95}, +{"chu", "na", 320.809}, +{"chu", "nan", 587.124}, +{"chu", "neng", 786.887}, +{"chu", "nian", 344.198}, +{"chu", "nv", 2680.11}, +{"chui", "niu", 694.692}, +{"chun", "ai", 114.607}, +{"ci", "er", 3754.2}, +{"ci", "nai", 184.711}, +{"ci", "nian", 214.772}, +{"ci", "nv", 129.656}, +{"cong", "er", 9095.69}, +{"da", "e", 467.882}, +{"da", "er", 1983.98}, +{"da", "na", 3572.18}, +{"da", "nai", 108.357}, +{"da", "nan", 949.309}, +{"da", "nao", 2601.12}, +{"da", "nei", 235.52}, +{"da", "neng", 731.706}, +{"da", "niang", 288.925}, +{"da", "niao", 195.365}, +{"da", "niu", 640.728}, +{"da", "nu", 230.583}, +{"da", "nv", 117.353}, +{"dai", "e", 145.044}, +{"dai", "er", 2377.58}, +{"dai", "ni", 1394.2}, +{"dang", "an", 4516.92}, +{"dao", "na", 1496.19}, +{"dao", "nan", 207.925}, +{"dao", "nei", 402.481}, +{"dao", "ni", 876.995}, +{"dao", "nian", 375.819}, +{"dao", "nin", 129.656}, +{"de", "ai", 1808.99}, +{"de", "an", 189.845}, +{"de", "bai", 161.05}, +{"de", "bang", 458.174}, +{"de", "bao", 254.121}, +{"de", "bi", 622.007}, +{"de", "bian", 565.579}, +{"de", "bing", 264.13}, +{"de", "bo", 3265.63}, +{"de", "bu", 7823.99}, +{"de", "cha", 395.069}, +{"de", "chang", 1136.28}, +{"de", "cheng", 305.971}, +{"de", "chu", 2321.01}, +{"de", "da", 16818.4}, +{"de", "dai", 167.811}, +{"de", "dang", 313.302}, +{"de", "dao", 30249.3}, +{"de", "de", 732766}, +{"de", "di", 2238.63}, +{"de", "duan", 846.096}, +{"de", "dui", 298.812}, +{"de", "duo", 15866.3}, +{"de", "fa", 115.611}, +{"de", "fen", 2008.62}, +{"de", "feng", 736.337}, +{"de", "han", 117.646}, +{"de", "hao", 18069.9}, +{"de", "hei", 173.77}, +{"de", "hen", 3263.95}, +{"de", "hong", 288.565}, +{"de", "hou", 555.105}, +{"de", "hua", 30702.6}, +{"de", "huo", 333.029}, +{"de", "ji", 5907.57}, +{"de", "jia", 1499.09}, +{"de", "jian", 1593.11}, +{"de", "jiang", 389.164}, +{"de", "jie", 699.905}, +{"de", "jing", 1418.84}, +{"de", "jiu", 138.508}, +{"de", "ju", 283.006}, +{"de", "jue", 462.188}, +{"de", "jun", 324.023}, +{"de", "ke", 708.728}, +{"de", "kong", 138.508}, +{"de", "kuai", 1064.02}, +{"de", "la", 399.49}, +{"de", "lai", 982.353}, +{"de", "lao", 636.66}, +{"de", "le", 3091.39}, +{"de", "leng", 327.677}, +{"de", "li", 632.734}, +{"de", "lian", 2973.14}, +{"de", "liang", 377.697}, +{"de", "liao", 125.522}, +{"de", "liu", 288.565}, +{"de", "long", 197.815}, +{"de", "lu", 2007.75}, +{"de", "luo", 565.963}, +{"de", "ma", 2268.79}, +{"de", "man", 336.785}, +{"de", "me", 1042.86}, +{"de", "men", 431.571}, +{"de", "ming", 325.642}, +{"de", "nai", 115.611}, +{"de", "ni", 271.81}, +{"de", "nian", 1151.5}, +{"de", "nong", 490.067}, +{"de", "nuan", 250.038}, +{"de", "pa", 188.196}, +{"de", "pian", 313.302}, +{"de", "piao", 124.277}, +{"de", "qi", 469.151}, +{"de", "qian", 3898.31}, +{"de", "qiao", 247.557}, +{"de", "qin", 336.245}, +{"de", "qu", 463.696}, +{"de", "quan", 115.611}, +{"de", "ran", 402.983}, +{"de", "ren", 51436.5}, +{"de", "sha", 273.85}, +{"de", "shang", 354.882}, +{"de", "shao", 220.467}, +{"de", "shen", 538.749}, +{"de", "sheng", 130.629}, +{"de", "shi", 15967.4}, +{"de", "shou", 2747.24}, +{"de", "shu", 1913.33}, +{"de", "shuo", 7273.89}, +{"de", "si", 106.483}, +{"de", "ti", 321.609}, +{"de", "tian", 501.902}, +{"de", "tiao", 384.344}, +{"de", "ting", 1285.26}, +{"de", "tong", 150.194}, +{"de", "tou", 177.933}, +{"de", "wan", 652.727}, +{"de", "wen", 313.302}, +{"de", "wo", 2056.74}, +{"de", "xi", 2224.5}, +{"de", "xia", 623.315}, +{"de", "xian", 627.211}, +{"de", "xiang", 117.061}, +{"de", "xiao", 4054.91}, +{"de", "xin", 10681.5}, +{"de", "xing", 645.466}, +{"de", "yang", 291.82}, +{"de", "yao", 744.902}, +{"de", "ye", 478.6}, +{"de", "yi", 12121.8}, +{"de", "ying", 196.586}, +{"de", "yong", 163.476}, +{"de", "you", 1421.74}, +{"de", "yu", 1172.07}, +{"de", "yuan", 166.769}, +{"de", "zao", 645.448}, +{"de", "zhe", 933.377}, +{"de", "zhen", 1797.75}, +{"de", "zhi", 3103.9}, +{"de", "zhong", 4708.26}, +{"de", "zhou", 361.578}, +{"de", "zhu", 1690.22}, +{"de", "zou", 411.611}, +{"de", "zu", 435.352}, +{"de", "zui", 1197.56}, +{"de", "zuo", 153.41}, +{"di", "er", 31203.1}, +{"di", "nan", 400.406}, +{"di", "neng", 133.426}, +{"di", "ni", 204.584}, +{"di", "nian", 271.472}, +{"di", "nuan", 193.186}, +{"dian", "er", 1761.07}, +{"diao", "nan", 211.321}, +{"die", "dai", 302.559}, +{"die", "dang", 152.457}, +{"die", "dao", 956.21}, +{"die", "de", 139.027}, +{"die", "die", 17735.4}, +{"die", "fu", 981.082}, +{"die", "jia", 742.936}, +{"die", "luo", 299.931}, +{"die", "ma", 245.102}, +{"die", "niang", 205.863}, +{"die", "pian", 293.278}, +{"die", "po", 768.475}, +{"die", "ru", 156.5}, +{"die", "shi", 221.017}, +{"die", "ting", 1715.43}, +{"die", "wu", 132.762}, +{"die", "yan", 124.432}, +{"die", "yi", 114.75}, +{"die", "zhi", 305.971}, +{"die", "zi", 362.029}, +{"ding", "a", 189.845}, +{"ding", "ai", 200.046}, +{"ding", "e", 451.373}, +{"dong", "an", 223.879}, +{"dong", "ao", 123.198}, +{"dong", "ou", 318.816}, +{"dou", "na", 159.85}, +{"dou", "nan", 250.038}, +{"dou", "neng", 6586.64}, +{"dou", "ni", 115.9}, +{"dou", "niu", 123.198}, +{"du", "er", 324.831}, +{"du", "nan", 226.031}, +{"du", "nang", 159.055}, +{"du", "nian", 742.057}, +{"du", "nong", 124.742}, +{"duan", "er", 419.377}, +{"dui", "e", 140.595}, +{"dui", "nei", 332.884}, +{"dui", "ni", 4604.72}, +{"dui", "nian", 139.2}, +{"dui", "nin", 220.467}, +{"dui", "ning", 170.339}, +{"dui", "niu", 106.351}, +{"dun", "er", 552.275}, +{"duo", "er", 375.195}, +{"duo", "na", 564.875}, +{"duo", "nan", 140.07}, +{"duo", "nian", 9454.06}, +{"e", "ba", 210.795}, +{"e", "bao", 352.238}, +{"e", "bu", 149.261}, +{"e", "chang", 1152.18}, +{"e", "chou", 145.406}, +{"e", "de", 132.432}, +{"e", "ding", 210.009}, +{"e", "du", 2070.8}, +{"e", "fang", 143.784}, +{"e", "hao", 195.853}, +{"e", "hen", 253.805}, +{"e", "hua", 1237}, +{"e", "hun", 264.863}, +{"e", "jiao", 210.009}, +{"e", "jun", 130.304}, +{"e", "kou", 185.172}, +{"e", "lang", 179.94}, +{"e", "lie", 2926.45}, +{"e", "ling", 106.218}, +{"e", "luo", 5581.77}, +{"e", "mei", 594.931}, +{"e", "meng", 1106.51}, +{"e", "mi", 296.216}, +{"e", "mo", 1918.11}, +{"e", "nuo", 111.786}, +{"e", "ran", 169.07}, +{"e", "ren", 406.513}, +{"e", "run", 153.219}, +{"e", "sha", 354.44}, +{"e", "shi", 196.097}, +{"e", "shou", 1317.99}, +{"e", "si", 924.118}, +{"e", "su", 199.797}, +{"e", "tian", 144.683}, +{"e", "tou", 1063.5}, +{"e", "wai", 1449.11}, +{"e", "wen", 107.015}, +{"e", "xi", 195.853}, +{"e", "xiao", 128.69}, +{"e", "xin", 5089.03}, +{"e", "xing", 1510.91}, +{"e", "ye", 426.226}, +{"e", "yi", 2697.84}, +{"e", "yu", 892.633}, +{"e", "yun", 507.468}, +{"e", "zhe", 192.465}, +{"e", "zhi", 1137.76}, +{"e", "zi", 533.76}, +{"e", "zuo", 356.655}, +{"en", "a", 191.27}, +{"en", "ai", 344.425}, +{"en", "en", 8884.06}, +{"er", "er", 148974}, +{"fa", "er", 167.185}, +{"fa", "nan", 124.898}, +{"fa", "neng", 478.004}, +{"fa", "nu", 199.3}, +{"fan", "an", 117.5}, +{"fan", "er", 6036.42}, +{"fang", "ai", 816.862}, +{"fang", "an", 14482.4}, +{"fei", "e", 113.47}, +{"fei", "er", 527.69}, +{"fei", "nao", 125.835}, +{"fei", "niao", 388.195}, +{"fei", "nong", 119.121}, +{"fen", "an", 349.179}, +{"fen", "e", 1915.72}, +{"fen", "er", 351.414}, +{"feng", "er", 181.969}, +{"fu", "er", 1761}, +{"fu", "nian", 225.749}, +{"fu", "nin", 134.595}, +{"fu", "nv", 3984.29}, +{"gai", "er", 173.553}, +{"gai", "nian", 9841.11}, +{"gan", "ai", 355.767}, +{"gan", "en", 1167.61}, +{"gang", "ao", 743.633}, +{"gao", "e", 648.673}, +{"gao", "er", 1714.47}, +{"gao", "nan", 226.031}, +{"gao", "neng", 124.898}, +{"gao", "nian", 136.452}, +{"gao", "nong", 124.742}, +{"ge", "an", 498.692}, +{"ge", "ban", 300.309}, +{"ge", "ben", 106.351}, +{"ge", "bi", 1995.42}, +{"ge", "bie", 2671.98}, +{"ge", "bo", 1276.14}, +{"ge", "bu", 477.153}, +{"ge", "cai", 107.818}, +{"ge", "chang", 2205.77}, +{"ge", "cheng", 201.547}, +{"ge", "chu", 421.779}, +{"ge", "ci", 3076.02}, +{"ge", "cun", 304.811}, +{"ge", "da", 4067.27}, +{"ge", "de", 240.242}, +{"ge", "di", 5395.99}, +{"ge", "diao", 486.769}, +{"ge", "dou", 489.456}, +{"ge", "du", 365.2}, +{"ge", "duan", 336.946}, +{"ge", "dui", 109.853}, +{"ge", "duo", 362.397}, +{"ge", "fang", 1749.14}, +{"ge", "hai", 150.194}, +{"ge", "hang", 686.279}, +{"ge", "he", 253.805}, +{"ge", "hou", 131.118}, +{"ge", "hua", 313.018}, +{"ge", "hui", 1026.24}, +{"ge", "huo", 128.21}, +{"ge", "ji", 9092.54}, +{"ge", "jia", 1343.49}, +{"ge", "jian", 756.169}, +{"ge", "jiao", 156.89}, +{"ge", "jie", 3057.15}, +{"ge", "jin", 330.224}, +{"ge", "ju", 3608.21}, +{"ge", "jue", 221.845}, +{"ge", "jun", 193.91}, +{"ge", "kai", 650.011}, +{"ge", "kao", 115.756}, +{"ge", "ke", 349.996}, +{"ge", "la", 399.152}, +{"ge", "lan", 271.24}, +{"ge", "le", 616.363}, +{"ge", "lei", 5818.89}, +{"ge", "li", 2086.67}, +{"ge", "liang", 5490.12}, +{"ge", "lie", 164.293}, +{"ge", "lin", 460.807}, +{"ge", "lou", 338.047}, +{"ge", "lu", 677.14}, +{"ge", "lun", 366.568}, +{"ge", "luo", 409.954}, +{"ge", "ma", 127.255}, +{"ge", "mai", 135.267}, +{"ge", "me", 119.717}, +{"ge", "men", 3709.68}, +{"ge", "mi", 1957.77}, +{"ge", "ming", 4624.83}, +{"ge", "mo", 138.508}, +{"ge", "na", 145.587}, +{"ge", "ni", 257.308}, +{"ge", "nv", 274.876}, +{"ge", "pai", 129.979}, +{"ge", "pi", 160.449}, +{"ge", "piao", 331.153}, +{"ge", "pin", 833.376}, +{"ge", "qi", 180.839}, +{"ge", "qian", 257.95}, +{"ge", "qu", 5716.93}, +{"ge", "re", 232.024}, +{"ge", "ren", 40587}, +{"ge", "rong", 120.615}, +{"ge", "rou", 768.03}, +{"ge", "san", 1415.16}, +{"ge", "se", 305.59}, +{"ge", "shan", 142.004}, +{"ge", "shang", 107.282}, +{"ge", "she", 244.187}, +{"ge", "sheng", 2306.67}, +{"ge", "shi", 18685.9}, +{"ge", "shou", 6292.43}, +{"ge", "shu", 654.356}, +{"ge", "shuai", 145.044}, +{"ge", "shui", 337.626}, +{"ge", "si", 260.534}, +{"ge", "song", 339.313}, +{"ge", "tan", 470.322}, +{"ge", "te", 146.68}, +{"ge", "ti", 2644.39}, +{"ge", "tian", 274.534}, +{"ge", "tiao", 118.529}, +{"ge", "ting", 179.716}, +{"ge", "tou", 633.495}, +{"ge", "wai", 1341.37}, +{"ge", "wei", 10246.4}, +{"ge", "wen", 154.754}, +{"ge", "wu", 625.547}, +{"ge", "xi", 893.542}, +{"ge", "xia", 506.205}, +{"ge", "xian", 270.122}, +{"ge", "xiang", 5895.37}, +{"ge", "xiao", 151.51}, +{"ge", "xin", 469.736}, +{"ge", "xing", 8173.95}, +{"ge", "xue", 211.321}, +{"ge", "yan", 226.595}, +{"ge", "yang", 163.68}, +{"ge", "yao", 194.152}, +{"ge", "ye", 442.522}, +{"ge", "yi", 3718.84}, +{"ge", "yin", 263.473}, +{"ge", "you", 2908.76}, +{"ge", "yu", 223.789}, +{"ge", "yuan", 419.9}, +{"ge", "yue", 6603.06}, +{"ge", "zhan", 150.194}, +{"ge", "zhao", 374.417}, +{"ge", "zhe", 830.332}, +{"ge", "zhen", 130.466}, +{"ge", "zheng", 107.282}, +{"ge", "zhi", 1163.45}, +{"ge", "zhong", 23714.2}, +{"ge", "zhou", 372.972}, +{"ge", "zhu", 167.811}, +{"ge", "zi", 7642.98}, +{"ge", "zu", 472.726}, +{"gei", "ni", 31707.6}, +{"gei", "nin", 1682.85}, +{"geng", "ai", 184.481}, +{"geng", "an", 186.794}, +{"gong", "an", 7589.51}, +{"gong", "er", 108.357}, +{"gou", "neng", 680.129}, +{"gou", "nian", 129.656}, +{"gu", "er", 922.765}, +{"gu", "nian", 274.876}, +{"gu", "niang", 4566.15}, +{"gua", "nian", 247.249}, +{"guai", "ni", 227.727}, +{"guan", "ai", 1140.75}, +{"guan", "an", 2273.51}, +{"guang", "an", 142.891}, +{"gui", "na", 834.351}, +{"gui", "neng", 184.022}, +{"gui", "nv", 359.332}, +{"gun", "er", 111.369}, +{"guo", "nei", 30491}, +{"guo", "neng", 534.215}, +{"guo", "ni", 303.314}, +{"guo", "nian", 2441.4}, +{"guo", "nong", 125.992}, +{"ha", "er", 2938.63}, +{"ha", "ni", 176.828}, +{"hai", "er", 1578.86}, +{"hai", "nan", 5668.75}, +{"hai", "nei", 748.589}, +{"hai", "neng", 8938.38}, +{"hai", "ning", 312.522}, +{"hai", "nv", 1726.09}, +{"hao", "e", 250.038}, +{"hao", "nan", 1804.75}, +{"hao", "ne", 633.495}, +{"hao", "neng", 313.222}, +{"hao", "nv", 327.043}, +{"he", "ai", 223.51}, +{"he", "an", 145.769}, +{"he", "bao", 175.511}, +{"he", "bei", 3874.91}, +{"he", "ben", 253.796}, +{"he", "bi", 2059.31}, +{"he", "bian", 643.039}, +{"he", "bing", 3419.72}, +{"he", "bu", 381.957}, +{"he", "cai", 388.195}, +{"he", "ceng", 109.853}, +{"he", "cha", 1800.64}, +{"he", "chang", 1239.59}, +{"he", "cheng", 2445.72}, +{"he", "chi", 120.315}, +{"he", "chu", 1457.27}, +{"he", "chuang", 174.856}, +{"he", "dai", 321.209}, +{"he", "dan", 218.28}, +{"he", "dao", 940.127}, +{"he", "de", 464.2}, +{"he", "deng", 496.212}, +{"he", "di", 170.764}, +{"he", "dian", 1143.05}, +{"he", "ding", 1300.14}, +{"he", "dong", 1257.02}, +{"he", "du", 105.427}, +{"he", "duan", 137.476}, +{"he", "dui", 1309.98}, +{"he", "duo", 709}, +{"he", "fa", 7296.6}, +{"he", "fan", 502.434}, +{"he", "fang", 663.816}, +{"he", "fei", 2421.8}, +{"he", "fou", 253.489}, +{"he", "fu", 433.819}, +{"he", "hao", 366.379}, +{"he", "he", 749029}, +{"he", "hu", 1272.93}, +{"he", "hua", 555.105}, +{"he", "huan", 309.232}, +{"he", "huang", 125.522}, +{"he", "hui", 443.567}, +{"he", "huo", 1027.92}, +{"he", "ji", 4044.7}, +{"he", "jian", 718.463}, +{"he", "jiao", 284.991}, +{"he", "jie", 2182.35}, +{"he", "jin", 784.928}, +{"he", "jiong", 149.634}, +{"he", "jiu", 4734.18}, +{"he", "ka", 758.708}, +{"he", "kai", 159.452}, +{"he", "ke", 480.991}, +{"he", "kou", 221.845}, +{"he", "ku", 373.485}, +{"he", "kuang", 1894.35}, +{"he", "lai", 287.13}, +{"he", "lan", 2122.08}, +{"he", "li", 10927.9}, +{"he", "lie", 154.754}, +{"he", "liu", 982.305}, +{"he", "long", 144.323}, +{"he", "lue", 199.3}, +{"he", "lun", 1159.38}, +{"he", "luo", 117.207}, +{"he", "ma", 556.308}, +{"he", "mai", 235.277}, +{"he", "mao", 271.134}, +{"he", "mi", 403.988}, +{"he", "mou", 254.382}, +{"he", "mu", 353.117}, +{"he", "nai", 119.419}, +{"he", "nan", 5946.58}, +{"he", "nei", 160.849}, +{"he", "neng", 196.097}, +{"he", "ni", 5525.28}, +{"he", "niu", 208.704}, +{"he", "pai", 208.185}, +{"he", "pan", 393.567}, +{"he", "pi", 147.046}, +{"he", "ping", 3995.83}, +{"he", "qi", 849.944}, +{"he", "qian", 212.113}, +{"he", "qie", 162.461}, +{"he", "qing", 347.539}, +{"he", "qu", 506.977}, +{"he", "ran", 398.488}, +{"he", "ren", 995.556}, +{"he", "ri", 111.369}, +{"he", "ru", 1732.4}, +{"he", "run", 110.127}, +{"he", "se", 385.303}, +{"he", "shan", 285.861}, +{"he", "shang", 1832.38}, +{"he", "she", 142.004}, +{"he", "shen", 129.656}, +{"he", "sheng", 142.358}, +{"he", "shi", 14658.5}, +{"he", "shu", 105.296}, +{"he", "shui", 2448.55}, +{"he", "suan", 1734.95}, +{"he", "sui", 275.562}, +{"he", "ta", 5780.86}, +{"he", "tang", 227.16}, +{"he", "tao", 470.322}, +{"he", "ti", 183.793}, +{"he", "tian", 125.679}, +{"he", "tong", 12406.1}, +{"he", "wai", 141.827}, +{"he", "wan", 409.564}, +{"he", "wei", 581.495}, +{"he", "wen", 147.597}, +{"he", "wo", 4757.84}, +{"he", "wu", 900.11}, +{"he", "xi", 360.678}, +{"he", "xia", 185.866}, +{"he", "xian", 368.635}, +{"he", "xiao", 530.907}, +{"he", "xie", 8590.76}, +{"he", "xin", 9348.45}, +{"he", "xu", 132.267}, +{"he", "xun", 644.644}, +{"he", "yang", 155.334}, +{"he", "ye", 431.035}, +{"he", "yi", 1789.89}, +{"he", "yin", 162.461}, +{"he", "ying", 1202.68}, +{"he", "yong", 325.269}, +{"he", "you", 3590.03}, +{"he", "yu", 160.249}, +{"he", "yuan", 451.814}, +{"he", "yue", 1547.92}, +{"he", "zai", 1208.97}, +{"he", "ze", 205.606}, +{"he", "zhao", 282.516}, +{"he", "zhe", 348.744}, +{"he", "zhi", 286.773}, +{"he", "zhong", 1104.18}, +{"he", "zhou", 172.906}, +{"he", "zhuang", 528.93}, +{"he", "zhun", 752.366}, +{"he", "zi", 4212.97}, +{"he", "zu", 896.889}, +{"he", "zui", 605.387}, +{"he", "zuo", 24266.3}, +{"hei", "ni", 317.231}, +{"hen", "ai", 624.655}, +{"hou", "nao", 130.304}, +{"hou", "nian", 1334.63}, +{"hou", "niao", 204.584}, +{"hu", "er", 121.975}, +{"hu", "nan", 6990.99}, +{"hu", "nao", 175.949}, +{"hu", "nong", 334.693}, +{"hua", "er", 1480.83}, +{"hua", "na", 259.239}, +{"hua", "nan", 1544.85}, +{"hua", "neng", 605.328}, +{"hua", "ni", 294.743}, +{"hua", "nian", 355.767}, +{"hua", "niao", 112.906}, +{"hua", "nong", 111.508}, +{"hua", "nuan", 172.475}, +{"huai", "nan", 366.43}, +{"huai", "nian", 2629.04}, +{"huai", "nv", 105.558}, +{"huan", "er", 481.591}, +{"huang", "an", 175.73}, +{"huang", "er", 154.369}, +{"hui", "er", 855.407}, +{"hui", "nao", 344.599}, +{"hui", "niang", 105.558}, +{"hui", "nong", 143.069}, +{"hui", "nuan", 238.771}, +{"hun", "an", 377.227}, +{"huo", "er", 521.183}, +{"huo", "ni", 113.47}, +{"huo", "nian", 134.092}, +{"ji", "e", 639.045}, +{"ji", "er", 1452.51}, +{"ji", "nan", 3596.96}, +{"ji", "nei", 200.046}, +{"ji", "neng", 10984.2}, +{"ji", "ni", 1203.03}, +{"ji", "nian", 14451.6}, +{"ji", "ning", 286.416}, +{"ji", "nu", 299.931}, +{"ji", "nv", 1218.64}, +{"jia", "na", 3990.97}, +{"jia", "nei", 181.969}, +{"jia", "neng", 1353.12}, +{"jia", "nian", 355.767}, +{"jia", "niang", 105.558}, +{"jia", "nong", 111.786}, +{"jian", "an", 179.269}, +{"jian", "ao", 627.993}, +{"jian", "er", 921.092}, +{"jiang", "an", 127.572}, +{"jiang", "ao", 211.585}, +{"jiao", "na", 2882.49}, +{"jiao", "nan", 183.793}, +{"jiao", "nang", 836.433}, +{"jiao", "nen", 189.845}, +{"jiao", "ni", 1613.04}, +{"jiao", "nian", 178.377}, +{"jie", "ai", 124.432}, +{"jie", "an", 398.432}, +{"jie", "ba", 978.458}, +{"jie", "bai", 710.39}, +{"jie", "ban", 867.084}, +{"jie", "bei", 226.878}, +{"jie", "bi", 308.652}, +{"jie", "bian", 513.235}, +{"jie", "bie", 223.951}, +{"jie", "bing", 170.977}, +{"jie", "bu", 133.426}, +{"jie", "ce", 174.856}, +{"jie", "ceng", 1551.92}, +{"jie", "cha", 595.151}, +{"jie", "chan", 1349.63}, +{"jie", "chang", 143.784}, +{"jie", "cheng", 641.165}, +{"jie", "chi", 357.991}, +{"jie", "chu", 11678.2}, +{"jie", "chuan", 277.284}, +{"jie", "ci", 810.725}, +{"jie", "da", 2444.96}, +{"jie", "dai", 2984.79}, +{"jie", "dan", 1209.15}, +{"jie", "dao", 8302.38}, +{"jie", "de", 129.333}, +{"jie", "di", 1848.22}, +{"jie", "dian", 3827.9}, +{"jie", "diao", 150.569}, +{"jie", "die", 180.614}, +{"jie", "ding", 1111.52}, +{"jie", "dong", 506.283}, +{"jie", "du", 2292.67}, +{"jie", "duan", 12267.8}, +{"jie", "dui", 136.113}, +{"jie", "fa", 754.74}, +{"jie", "fang", 4628.42}, +{"jie", "fei", 243.883}, +{"jie", "feng", 197.569}, +{"jie", "fu", 1069.13}, +{"jie", "he", 12511.4}, +{"jie", "hou", 599.695}, +{"jie", "hu", 253.805}, +{"jie", "hua", 296.216}, +{"jie", "hui", 1430.67}, +{"jie", "hun", 16844.8}, +{"jie", "huo", 522.322}, +{"jie", "ji", 3543.71}, +{"jie", "jia", 1123.17}, +{"jie", "jian", 2926.97}, +{"jie", "jiang", 132.928}, +{"jie", "jiao", 562.433}, +{"jie", "jie", 356099}, +{"jie", "jin", 6814.34}, +{"jie", "jing", 1581.38}, +{"jie", "jiu", 990.939}, +{"jie", "ju", 3741.45}, +{"jie", "jue", 34682.9}, +{"jie", "jun", 290.731}, +{"jie", "kai", 2022.79}, +{"jie", "ke", 2832.33}, +{"jie", "kou", 10547}, +{"jie", "kuan", 1277.66}, +{"jie", "la", 227.444}, +{"jie", "lai", 267.776}, +{"jie", "le", 1072.13}, +{"jie", "li", 1368.94}, +{"jie", "lian", 1490.5}, +{"jie", "liao", 350.487}, +{"jie", "liu", 938.498}, +{"jie", "long", 109.443}, +{"jie", "lu", 853.278}, +{"jie", "lun", 4487.69}, +{"jie", "luo", 387.129}, +{"jie", "lv", 200.795}, +{"jie", "ma", 1060.64}, +{"jie", "man", 374.974}, +{"jie", "mao", 733.208}, +{"jie", "me", 196.586}, +{"jie", "mei", 2198.29}, +{"jie", "men", 288.119}, +{"jie", "meng", 284.991}, +{"jie", "mi", 1862.02}, +{"jie", "mian", 6545.73}, +{"jie", "ming", 386.928}, +{"jie", "mo", 154.754}, +{"jie", "mu", 9449.38}, +{"jie", "na", 588.589}, +{"jie", "nan", 161.452}, +{"jie", "neng", 3254.03}, +{"jie", "ni", 197.569}, +{"jie", "nian", 234.561}, +{"jie", "pai", 482.993}, +{"jie", "pan", 177.712}, +{"jie", "pi", 179.492}, +{"jie", "pin", 496.121}, +{"jie", "ping", 222.122}, +{"jie", "pou", 543.469}, +{"jie", "qi", 433.461}, +{"jie", "qia", 184.711}, +{"jie", "qian", 1671.96}, +{"jie", "qin", 659.599}, +{"jie", "qing", 1535.28}, +{"jie", "qiu", 905.043}, +{"jie", "qu", 783.242}, +{"jie", "quan", 109.035}, +{"jie", "ran", 1121.52}, +{"jie", "rang", 151.699}, +{"jie", "re", 133.426}, +{"jie", "ren", 2367.23}, +{"jie", "ri", 3705.9}, +{"jie", "rong", 1636.64}, +{"jie", "ru", 4401.97}, +{"jie", "ruo", 211.585}, +{"jie", "san", 2191.72}, +{"jie", "shan", 147.781}, +{"jie", "shang", 2336.15}, +{"jie", "shao", 27605.2}, +{"jie", "shen", 153.601}, +{"jie", "sheng", 2216.88}, +{"jie", "shi", 24671.2}, +{"jie", "shou", 27390.9}, +{"jie", "shu", 16716.6}, +{"jie", "shui", 528.772}, +{"jie", "shuo", 1270.42}, +{"jie", "si", 743.074}, +{"jie", "song", 483.395}, +{"jie", "su", 235.227}, +{"jie", "suan", 2613.09}, +{"jie", "suo", 749.959}, +{"jie", "tao", 535.403}, +{"jie", "ti", 1583.99}, +{"jie", "tiao", 476.066}, +{"jie", "ting", 747.693}, +{"jie", "tong", 1165.68}, +{"jie", "tou", 2838.63}, +{"jie", "tu", 2457.94}, +{"jie", "tuo", 1062.53}, +{"jie", "wei", 2412.45}, +{"jie", "wen", 780.619}, +{"jie", "wu", 1228.15}, +{"jie", "xi", 2759.24}, +{"jie", "xia", 4529.12}, +{"jie", "xian", 1331.4}, +{"jie", "xiang", 344.624}, +{"jie", "xiao", 1476.31}, +{"jie", "xin", 539.883}, +{"jie", "xing", 519.847}, +{"jie", "xu", 139.374}, +{"jie", "xuan", 119.27}, +{"jie", "xue", 273.535}, +{"jie", "xun", 140.77}, +{"jie", "ya", 1826.7}, +{"jie", "yan", 746.667}, +{"jie", "yang", 246.68}, +{"jie", "yao", 136.113}, +{"jie", "ye", 1588.46}, +{"jie", "yi", 7130.75}, +{"jie", "yin", 105.69}, +{"jie", "ying", 832.948}, +{"jie", "yong", 942.729}, +{"jie", "you", 804.247}, +{"jie", "yu", 768.635}, +{"jie", "yuan", 256.492}, +{"jie", "yue", 2753.63}, +{"jie", "zai", 198.803}, +{"jie", "zha", 136.793}, +{"jie", "zhan", 390.622}, +{"jie", "zhang", 554.864}, +{"jie", "zhe", 5835.44}, +{"jie", "zhi", 7165.92}, +{"jie", "zhong", 826.685}, +{"jie", "zhu", 2546.09}, +{"jie", "zhuan", 212.907}, +{"jie", "zou", 2623.87}, +{"jie", "zu", 284.991}, +{"jie", "zuo", 698.176}, +{"jin", "ai", 121.369}, +{"jin", "e", 4969.95}, +{"jin", "er", 3051.75}, +{"jing", "ai", 214.238}, +{"jing", "an", 1019.34}, +{"jing", "e", 290.143}, +{"jing", "er", 230.382}, +{"jiu", "er", 580.082}, +{"jiu", "na", 629.56}, +{"jiu", "nan", 145.769}, +{"jiu", "neng", 8422.14}, +{"jiu", "nian", 414.7}, +{"ju", "e", 1205.05}, +{"ju", "er", 296.216}, +{"ju", "ni", 189.373}, +{"juan", "er", 131.281}, +{"jue", "ban", 208.964}, +{"jue", "bu", 4786.36}, +{"jue", "ce", 3923.72}, +{"jue", "cha", 286.416}, +{"jue", "chen", 124.122}, +{"jue", "chu", 270.514}, +{"jue", "da", 3434.77}, +{"jue", "dai", 211.646}, +{"jue", "de", 88200.9}, +{"jue", "di", 395.859}, +{"jue", "ding", 26939.1}, +{"jue", "dou", 338.047}, +{"jue", "duan", 184.251}, +{"jue", "dui", 16336.6}, +{"jue", "fei", 497.45}, +{"jue", "hao", 146.863}, +{"jue", "he", 298.812}, +{"jue", "huo", 144.143}, +{"jue", "ji", 1562.69}, +{"jue", "jia", 502.425}, +{"jue", "jiang", 557.185}, +{"jue", "jiao", 121.824}, +{"jue", "jin", 368.859}, +{"jue", "jing", 165.939}, +{"jue", "ju", 160.249}, +{"jue", "jue", 140811}, +{"jue", "lie", 158.462}, +{"jue", "lu", 114.465}, +{"jue", "lue", 125.054}, +{"jue", "lun", 180.614}, +{"jue", "me", 196.586}, +{"jue", "mei", 182.196}, +{"jue", "mi", 202.302}, +{"jue", "miao", 222.676}, +{"jue", "nv", 179.94}, +{"jue", "pei", 155.721}, +{"jue", "qi", 1662.01}, +{"jue", "qiao", 256.987}, +{"jue", "qing", 240.263}, +{"jue", "qu", 122.891}, +{"jue", "ran", 402.983}, +{"jue", "sai", 2464.08}, +{"jue", "se", 7190.91}, +{"jue", "sha", 190.082}, +{"jue", "shan", 147.781}, +{"jue", "shen", 226.031}, +{"jue", "shi", 1710.62}, +{"jue", "suan", 170.127}, +{"jue", "tao", 213.705}, +{"jue", "ti", 282.868}, +{"jue", "wang", 2077.35}, +{"jue", "wu", 1189.94}, +{"jue", "xin", 2753.1}, +{"jue", "xing", 469.736}, +{"jue", "yi", 1469.86}, +{"jue", "you", 194.394}, +{"jue", "yu", 203.06}, +{"jue", "yuan", 609.264}, +{"jue", "ze", 574.101}, +{"jue", "zhan", 530.753}, +{"jue", "zhao", 368.4}, +{"jue", "zhe", 332.2}, +{"jue", "zheng", 204.839}, +{"jue", "zhi", 1276.14}, +{"jue", "zhong", 1108.47}, +{"jue", "zhu", 2994.69}, +{"jue", "zi", 108.628}, +{"ka", "en", 118.973}, +{"ka", "er", 775.725}, +{"ka", "na", 132.102}, +{"ka", "neng", 158.265}, +{"ka", "ni", 168.44}, +{"kai", "en", 107.149}, +{"kai", "er", 238.473}, +{"kai", "nuan", 172.475}, +{"kan", "a", 272.149}, +{"kang", "ai", 239.964}, +{"ke", "ai", 10576}, +{"ke", "an", 261.185}, +{"ke", "ba", 420.948}, +{"ke", "ban", 112.345}, +{"ke", "bei", 777.142}, +{"ke", "ben", 835.392}, +{"ke", "bi", 1592.55}, +{"ke", "bian", 473.45}, +{"ke", "biao", 335.591}, +{"ke", "bie", 462.188}, +{"ke", "bo", 3980.26}, +{"ke", "bu", 7233.77}, +{"ke", "cai", 238.473}, +{"ke", "cao", 271.472}, +{"ke", "ceng", 158.462}, +{"ke", "cha", 144.503}, +{"ke", "chan", 364.746}, +{"ke", "chang", 1027.38}, +{"ke", "che", 806.745}, +{"ke", "cheng", 6616.47}, +{"ke", "chi", 1149.48}, +{"ke", "chu", 483.887}, +{"ke", "chuan", 378.168}, +{"ke", "ci", 370.703}, +{"ke", "cong", 253.805}, +{"ke", "da", 2417.8}, +{"ke", "dai", 337.271}, +{"ke", "dang", 127.096}, +{"ke", "dao", 220.193}, +{"ke", "de", 432.109}, +{"ke", "di", 159.651}, +{"ke", "dou", 156.695}, +{"ke", "du", 313.419}, +{"ke", "dui", 300.928}, +{"ke", "duo", 244.597}, +{"ke", "fang", 556.491}, +{"ke", "fen", 709.055}, +{"ke", "fou", 1115.45}, +{"ke", "fu", 5630.69}, +{"ke", "hao", 440.262}, +{"ke", "hen", 343.14}, +{"ke", "hou", 480.563}, +{"ke", "hu", 37315.6}, +{"ke", "hua", 652.259}, +{"ke", "huan", 691.221}, +{"ke", "hui", 291.093}, +{"ke", "huo", 497.732}, +{"ke", "ji", 15670.5}, +{"ke", "jia", 540.667}, +{"ke", "jian", 5260.03}, +{"ke", "jiang", 574.101}, +{"ke", "jiao", 352.9}, +{"ke", "jie", 348.078}, +{"ke", "jing", 700.878}, +{"ke", "jiu", 617.534}, +{"ke", "ju", 188.196}, +{"ke", "kai", 146.68}, +{"ke", "kan", 175.074}, +{"ke", "kao", 3779.19}, +{"ke", "ke", 189199}, +{"ke", "kong", 247.866}, +{"ke", "kou", 1714.8}, +{"ke", "ku", 466.819}, +{"ke", "kuo", 227.103}, +{"ke", "la", 4344.92}, +{"ke", "lai", 558.811}, +{"ke", "lan", 440.594}, +{"ke", "lang", 411.835}, +{"ke", "le", 1476.45}, +{"ke", "lei", 118.381}, +{"ke", "li", 2319.28}, +{"ke", "lian", 8450.93}, +{"ke", "lin", 1225.64}, +{"ke", "liu", 604.973}, +{"ke", "long", 1256.26}, +{"ke", "lu", 2252.86}, +{"ke", "luo", 346.832}, +{"ke", "mao", 109.307}, +{"ke", "me", 1054.62}, +{"ke", "mei", 338.89}, +{"ke", "men", 167.393}, +{"ke", "ming", 155.334}, +{"ke", "mu", 1447.31}, +{"ke", "na", 124.898}, +{"ke", "nan", 615.595}, +{"ke", "neng", 106489}, +{"ke", "ni", 119.121}, +{"ke", "nuo", 280.412}, +{"ke", "pa", 3648.66}, +{"ke", "pan", 314.868}, +{"ke", "pei", 190.794}, +{"ke", "piao", 115.611}, +{"ke", "pu", 701.652}, +{"ke", "qi", 4610.22}, +{"ke", "qian", 118.381}, +{"ke", "qin", 107.684}, +{"ke", "qiu", 512.411}, +{"ke", "qu", 361.578}, +{"ke", "quan", 2004.24}, +{"ke", "ran", 332.614}, +{"ke", "rang", 125.679}, +{"ke", "ren", 5291.44}, +{"ke", "ri", 155.334}, +{"ke", "sai", 293.644}, +{"ke", "shang", 845.058}, +{"ke", "shen", 137.991}, +{"ke", "sheng", 421.442}, +{"ke", "shi", 39912.5}, +{"ke", "shou", 367.151}, +{"ke", "shu", 225.188}, +{"ke", "shui", 428.356}, +{"ke", "shuo", 695.558}, +{"ke", "si", 1682.43}, +{"ke", "sou", 1397.68}, +{"ke", "su", 114.465}, +{"ke", "suan", 171.832}, +{"ke", "suo", 143.605}, +{"ke", "ta", 439.167}, +{"ke", "tang", 2302.06}, +{"ke", "tao", 132.102}, +{"ke", "te", 219.049}, +{"ke", "ti", 3492.85}, +{"ke", "tiao", 236.402}, +{"ke", "ting", 1814.85}, +{"ke", "tou", 200.296}, +{"ke", "wai", 286.059}, +{"ke", "wang", 3420.5}, +{"ke", "wei", 3155.28}, +{"ke", "wen", 956.223}, +{"ke", "wo", 1311.61}, +{"ke", "wu", 1292.82}, +{"ke", "xi", 11300.4}, +{"ke", "xian", 146.132}, +{"ke", "xiang", 1096.04}, +{"ke", "xiao", 1481.98}, +{"ke", "xie", 397.166}, +{"ke", "xin", 953.497}, +{"ke", "xing", 2592.28}, +{"ke", "xiu", 435.018}, +{"ke", "xuan", 1148.67}, +{"ke", "xue", 16274.2}, +{"ke", "xun", 276.035}, +{"ke", "yan", 4594.86}, +{"ke", "yao", 503.061}, +{"ke", "ye", 785.074}, +{"ke", "yi", 340329}, +{"ke", "yong", 3430.4}, +{"ke", "you", 2187.87}, +{"ke", "yu", 847.632}, +{"ke", "yuan", 439.51}, +{"ke", "yun", 1126}, +{"ke", "zai", 1578.78}, +{"ke", "zhan", 611.01}, +{"ke", "zhang", 1055.87}, +{"ke", "zhe", 313.783}, +{"ke", "zhen", 633.495}, +{"ke", "zheng", 560.121}, +{"ke", "zhi", 2495.19}, +{"ke", "zhuan", 163.069}, +{"ke", "zhuo", 162.664}, +{"ke", "zi", 199.3}, +{"ke", "zuo", 554.529}, +{"ken", "en", 153.41}, +{"ku", "er", 136.793}, +{"ku", "nan", 971.35}, +{"ku", "nao", 1101.3}, +{"kuai", "neng", 119.121}, +{"kuai", "nian", 343.996}, +{"kuan", "e", 145.044}, +{"kuan", "er", 163.884}, +{"la", "na", 145.587}, +{"la", "nei", 301.805}, +{"la", "ni", 112.065}, +{"lai", "en", 803.735}, +{"lai", "er", 179.716}, +{"lai", "na", 372.711}, +{"lai", "ne", 145.587}, +{"lai", "nian", 6858.74}, +{"lan", "er", 598.202}, +{"lao", "er", 1033.98}, +{"lao", "na", 163.476}, +{"lao", "nai", 180.839}, +{"lao", "nan", 341.434}, +{"lao", "nian", 6806.5}, +{"lao", "niang", 800.736}, +{"lao", "niao", 129.333}, +{"lao", "niu", 457.033}, +{"lao", "nong", 157.282}, +{"lao", "nv", 349.26}, +{"le", "bai", 462.764}, +{"le", "bang", 243.579}, +{"le", "bao", 425.165}, +{"le", "bu", 582.645}, +{"le", "chu", 461.037}, +{"le", "ci", 223.232}, +{"le", "cuo", 534.736}, +{"le", "dan", 169.915}, +{"le", "de", 588.288}, +{"le", "dong", 329.315}, +{"le", "duo", 851.031}, +{"le", "fan", 184.711}, +{"le", "feng", 132.597}, +{"le", "he", 370.559}, +{"le", "hui", 199.548}, +{"le", "hun", 187.494}, +{"le", "jia", 237.88}, +{"le", "jian", 130.629}, +{"le", "jin", 281.813}, +{"le", "jiu", 527.456}, +{"le", "ju", 161.251}, +{"le", "kang", 123.659}, +{"le", "kou", 554.414}, +{"le", "ku", 151.888}, +{"le", "kuai", 1099.54}, +{"le", "lai", 307.117}, +{"le", "lang", 307.117}, +{"le", "le", 409639}, +{"le", "lian", 106.882}, +{"le", "liao", 166.146}, +{"le", "ling", 162.461}, +{"le", "ma", 5178.59}, +{"le", "mao", 320.809}, +{"le", "ni", 166.769}, +{"le", "nian", 343.996}, +{"le", "nu", 263.145}, +{"le", "pu", 148.89}, +{"le", "qian", 219.371}, +{"le", "qiu", 260.859}, +{"le", "qu", 2826.1}, +{"le", "ri", 1569.02}, +{"le", "rong", 250.662}, +{"le", "shan", 356.211}, +{"le", "shang", 770.384}, +{"le", "shao", 627.993}, +{"le", "shi", 285.748}, +{"le", "suo", 255.391}, +{"le", "te", 476.814}, +{"le", "tian", 483.831}, +{"le", "tuo", 140.42}, +{"le", "wan", 853.278}, +{"le", "wang", 113.754}, +{"le", "wen", 132.928}, +{"le", "wo", 313.693}, +{"le", "xian", 224.347}, +{"le", "xie", 948.621}, +{"le", "xin", 1474.62}, +{"le", "xue", 110.127}, +{"le", "yi", 4407.86}, +{"le", "you", 910.402}, +{"le", "yu", 1054.79}, +{"le", "yuan", 948.621}, +{"le", "zai", 386.455}, +{"le", "zen", 177.49}, +{"le", "zhe", 113.47}, +{"le", "zi", 162.664}, +{"le", "zou", 597.906}, +{"le", "zui", 222.954}, +{"lei", "nuo", 296.956}, +{"li", "na", 2853.54}, +{"li", "nan", 125.522}, +{"li", "nao", 387.229}, +{"li", "neng", 761.043}, +{"li", "ni", 603.643}, +{"li", "nian", 5528.79}, +{"li", "niao", 150.569}, +{"li", "ning", 406.007}, +{"lian", "ai", 4200.01}, +{"lian", "er", 197.569}, +{"liang", "an", 2526.75}, +{"liang", "ao", 125.679}, +{"liao", "ning", 3007.89}, +{"lie", "bao", 131.609}, +{"lie", "biao", 5146.75}, +{"lie", "che", 1682.85}, +{"lie", "chu", 1454.54}, +{"lie", "da", 322.502}, +{"lie", "dui", 112.485}, +{"lie", "fang", 112.205}, +{"lie", "feng", 533.405}, +{"lie", "hen", 204.839}, +{"lie", "hong", 937.134}, +{"lie", "hu", 105.164}, +{"lie", "huo", 401.979}, +{"lie", "jian", 157.478}, +{"lie", "jie", 131.773}, +{"lie", "ju", 752.366}, +{"lie", "kai", 206.634}, +{"lie", "lie", 53668.6}, +{"lie", "mao", 187.728}, +{"lie", "ming", 109.307}, +{"lie", "ning", 323.619}, +{"lie", "pan", 107.55}, +{"lie", "pin", 139.027}, +{"lie", "qi", 143.248}, +{"lie", "qiang", 362.608}, +{"lie", "ren", 3118.47}, +{"lie", "ri", 340.159}, +{"lie", "ru", 1729.63}, +{"lie", "se", 1672.4}, +{"lie", "sha", 126.307}, +{"lie", "sheng", 137.134}, +{"lie", "shi", 1220.6}, +{"lie", "shou", 185.634}, +{"lie", "tou", 619.443}, +{"lie", "wei", 1103.01}, +{"lie", "wen", 260.859}, +{"lie", "wu", 331.373}, +{"lie", "xi", 4450.22}, +{"lie", "xin", 173.77}, +{"lie", "yan", 529.794}, +{"lie", "yi", 660.089}, +{"lie", "zheng", 369.78}, +{"lie", "zhi", 631.178}, +{"lie", "zhuan", 110.264}, +{"lie", "zui", 112.205}, +{"lin", "an", 233.474}, +{"ling", "ai", 486.416}, +{"ling", "er", 282.868}, +{"liu", "nian", 1902.72}, +{"lu", "nei", 119.717}, +{"lu", "neng", 692.099}, +{"lu", "ni", 551.29}, +{"lue", "ce", 150.569}, +{"lue", "dai", 426.758}, +{"lue", "di", 105.164}, +{"lue", "duo", 503.688}, +{"lue", "jia", 105.954}, +{"lue", "li", 111.23}, +{"lue", "lue", 22437.1}, +{"lue", "pai", 174.638}, +{"lue", "wei", 483.997}, +{"lue", "xian", 457.603}, +{"lue", "xiao", 193.186}, +{"lue", "ye", 112.625}, +{"lue", "you", 875.903}, +{"lue", "zhan", 781.025}, +{"lue", "zi", 239.068}, +{"lun", "er", 513.832}, +{"luo", "e", 152.838}, +{"luo", "er", 151.699}, +{"luo", "na", 843.657}, +{"luo", "ni", 181.29}, +{"luo", "nv", 109.035}, +{"ma", "er", 1623.72}, +{"ma", "na", 173.553}, +{"ma", "nao", 242.67}, +{"ma", "ni", 112.065}, +{"ma", "niang", 124.587}, +{"mai", "nong", 230.583}, +{"man", "er", 149.82}, +{"mao", "er", 175.074}, +{"mao", "nang", 162.057}, +{"mao", "ni", 226.878}, +{"mao", "niu", 162.664}, +{"me", "dao", 123.198}, +{"me", "huan", 126.78}, +{"me", "me", 716403}, +{"me", "ming", 151.888}, +{"me", "shen", 86337.1}, +{"me", "sheng", 362.48}, +{"me", "shi", 524.18}, +{"me", "suan", 260.859}, +{"me", "yang", 392.573}, +{"me", "yao", 324.831}, +{"me", "you", 6348.62}, +{"me", "zen", 2974.19}, +{"me", "zuo", 301.673}, +{"mei", "er", 172.475}, +{"mei", "na", 142.891}, +{"mei", "nan", 244.796}, +{"mei", "neng", 1879.83}, +{"mei", "ni", 148.704}, +{"mei", "nian", 9050.46}, +{"mei", "nv", 17045.2}, +{"men", "an", 928.318}, +{"meng", "er", 336.785}, +{"mi", "er", 168.44}, +{"mi", "ni", 783.951}, +{"mian", "ao", 191.27}, +{"mian", "e", 114.465}, +{"miao", "nei", 127.731}, +{"mie", "diao", 122.432}, +{"mie", "fei", 137.476}, +{"mie", "huo", 501.669}, +{"mie", "jue", 463.919}, +{"mie", "jun", 176.828}, +{"mie", "le", 394.535}, +{"mie", "mie", 6026.24}, +{"mie", "sheng", 112.485}, +{"mie", "shi", 298.439}, +{"mie", "wang", 534.736}, +{"min", "an", 114.18}, +{"ming", "an", 333.476}, +{"ming", "e", 1082.58}, +{"ming", "er", 665.638}, +{"mo", "er", 702.029}, +{"mo", "na", 145.587}, +{"mo", "nan", 409.054}, +{"mo", "neng", 119.121}, +{"mo", "ni", 5094.27}, +{"mo", "nian", 341.142}, +{"mo", "nv", 652.814}, +{"mu", "er", 339.653}, +{"mu", "nai", 252.228}, +{"mu", "nao", 159.85}, +{"mu", "ne", 172.69}, +{"mu", "ni", 317.231}, +{"mu", "niu", 251.914}, +{"mu", "nv", 427.29}, +{"na", "er", 8308.04}, +{"na", "na", 36504.3}, +{"na", "nan", 125.679}, +{"na", "ne", 180.839}, +{"na", "neng", 1309.98}, +{"na", "nian", 892.429}, +{"na", "nie", 156.11}, +{"na", "nin", 145.044}, +{"na", "nv", 478.833}, +{"nai", "er", 126.622}, +{"nai", "nai", 21720.4}, +{"nai", "niu", 956.397}, +{"nan", "an", 210.533}, +{"nan", "ao", 216.384}, +{"nan", "er", 443.014}, +{"nao", "nao", 51317}, +{"nao", "nu", 192.705}, +{"ne", "me", 2194.43}, +{"ne", "ne", 4601.38}, +{"ne", "zha", 116.189}, +{"nei", "nei", 64872.8}, +{"nei", "ni", 236.402}, +{"nei", "nian", 1057.49}, +{"ni", "er", 379.47}, +{"ni", "nan", 176.388}, +{"ni", "neng", 3671.47}, +{"ni", "ni", 157895}, +{"ni", "ning", 192.705}, +{"niao", "er", 456.464}, +{"niao", "niao", 6410.7}, +{"nie", "le", 126.464}, +{"nie", "nie", 1428.25}, +{"nie", "pan", 179.269}, +{"nie", "zao", 235.227}, +{"nie", "zhe", 204.839}, +{"niu", "nai", 2897.42}, +{"niu", "niu", 17956.4}, +{"nu", "nu", 4461.18}, +{"nue", "dai", 824.018}, +{"nue", "ji", 124.432}, +{"nue", "nue", 673.598}, +{"nuo", "nuo", 6769.18}, +{"nv", "er", 9656.36}, +{"ou", "er", 4939.08}, +{"pai", "niao", 173.337}, +{"pao", "niu", 747.693}, +{"pei", "e", 565.579}, +{"pei", "neng", 242.67}, +{"pei", "ni", 1922.89}, +{"pi", "er", 737.777}, +{"pian", "ai", 452.5}, +{"pie", "jian", 113.754}, +{"pie", "kai", 188.196}, +{"pie", "pie", 158.857}, +{"ping", "an", 2654.78}, +{"po", "niang", 353.557}, +{"pu", "er", 658.761}, +{"qi", "e", 518.333}, +{"qi", "er", 1640.61}, +{"qi", "nang", 203.567}, +{"qi", "nei", 1275.22}, +{"qi", "neng", 321.609}, +{"qi", "ni", 784.928}, +{"qi", "nian", 2341.33}, +{"qi", "ning", 205.863}, +{"qian", "e", 125.835}, +{"qie", "bu", 435.685}, +{"qie", "cheng", 644.644}, +{"qie", "chu", 840.985}, +{"qie", "cuo", 371.628}, +{"qie", "dao", 138.681}, +{"qie", "duan", 510.64}, +{"qie", "he", 236.402}, +{"qie", "huan", 2491.55}, +{"qie", "ji", 816.123}, +{"qie", "kai", 266.113}, +{"qie", "kou", 220.742}, +{"qie", "mo", 129.333}, +{"qie", "ni", 105.69}, +{"qie", "nuo", 108.763}, +{"qie", "pian", 358.884}, +{"qie", "qie", 114267}, +{"qie", "qu", 287.13}, +{"qie", "ru", 717.373}, +{"qie", "shen", 596.172}, +{"qie", "shi", 3671.8}, +{"qie", "sui", 149.261}, +{"qie", "ting", 160.649}, +{"qie", "wu", 299.931}, +{"qie", "xi", 144.863}, +{"qie", "xiao", 205.35}, +{"qie", "ya", 219.918}, +{"qie", "yi", 1187.27}, +{"qie", "you", 283.221}, +{"qie", "zei", 108.222}, +{"qie", "zhen", 221.355}, +{"qie", "zi", 602.691}, +{"qin", "ai", 3541.15}, +{"qing", "ai", 303.314}, +{"qing", "an", 272.409}, +{"qing", "er", 296.216}, +{"qiu", "er", 246.634}, +{"qiu", "ni", 353.557}, +{"qu", "er", 298.439}, +{"qu", "na", 3851.95}, +{"qu", "nan", 293.657}, +{"qu", "nei", 884.679}, +{"qu", "neng", 192.705}, +{"qu", "ni", 492.009}, +{"qu", "nian", 14080.7}, +{"qu", "ning", 123.968}, +{"qu", "nuan", 375.819}, +{"quan", "an", 186.794}, +{"quan", "e", 595.97}, +{"que", "ba", 268.444}, +{"que", "ban", 210.795}, +{"que", "bao", 7036.35}, +{"que", "bei", 1112.67}, +{"que", "bu", 3041.78}, +{"que", "chao", 246.634}, +{"que", "de", 400.844}, +{"que", "dian", 3114.59}, +{"que", "ding", 19143.8}, +{"que", "fa", 7268.07}, +{"que", "fou", 227.727}, +{"que", "hai", 267.776}, +{"que", "han", 247.249}, +{"que", "hen", 490.067}, +{"que", "huo", 398.488}, +{"que", "jian", 183.335}, +{"que", "ke", 901.224}, +{"que", "kou", 1200.55}, +{"que", "li", 1874.27}, +{"que", "lian", 121.067}, +{"que", "mei", 2235.23}, +{"que", "neng", 626.576}, +{"que", "qian", 416.253}, +{"que", "qie", 1214.09}, +{"que", "que", 51329.4}, +{"que", "rang", 383.866}, +{"que", "ren", 13543}, +{"que", "reng", 187.027}, +{"que", "shao", 3217.16}, +{"que", "sheng", 396.013}, +{"que", "shi", 25962.5}, +{"que", "shui", 424.636}, +{"que", "shuo", 444.674}, +{"que", "sun", 223.789}, +{"que", "ta", 174.421}, +{"que", "wei", 172.69}, +{"que", "wu", 148.704}, +{"que", "xi", 550.284}, +{"que", "xian", 2590.02}, +{"que", "xin", 467.984}, +{"que", "xue", 290.598}, +{"que", "yang", 515.756}, +{"que", "yao", 443.567}, +{"que", "ye", 692.962}, +{"que", "yi", 463.083}, +{"que", "yin", 242.066}, +{"que", "you", 3890.67}, +{"que", "yue", 133.259}, +{"que", "zai", 1212.58}, +{"que", "zhen", 692.2}, +{"qun", "ou", 224.907}, +{"ran", "er", 5807.68}, +{"rang", "ai", 137.991}, +{"re", "ai", 2384.46}, +{"re", "bo", 357.991}, +{"re", "chao", 1106.46}, +{"re", "chen", 256.028}, +{"re", "cheng", 142.535}, +{"re", "chu", 201.296}, +{"re", "ci", 163.273}, +{"re", "dai", 785.857}, +{"re", "de", 372.792}, +{"re", "dian", 3180.34}, +{"re", "du", 328.086}, +{"re", "feng", 121.369}, +{"re", "huo", 576.849}, +{"re", "ji", 115.037}, +{"re", "jian", 148.519}, +{"re", "la", 136.622}, +{"re", "lai", 138.508}, +{"re", "lang", 167.185}, +{"re", "lei", 378.888}, +{"re", "li", 369.926}, +{"re", "lian", 316.047}, +{"re", "liang", 1454.54}, +{"re", "liao", 106.882}, +{"re", "lie", 2308.55}, +{"re", "mai", 396.013}, +{"re", "men", 1839.02}, +{"re", "nao", 3156.2}, +{"re", "neng", 233.766}, +{"re", "qi", 420.424}, +{"re", "qian", 337.205}, +{"re", "qie", 308.652}, +{"re", "qing", 5935.57}, +{"re", "re", 18049.3}, +{"re", "ren", 296.586}, +{"re", "shen", 743.99}, +{"re", "shi", 127.255}, +{"re", "shou", 181.517}, +{"re", "shui", 1819.67}, +{"re", "tu", 121.52}, +{"re", "wen", 121.672}, +{"re", "wu", 385.435}, +{"re", "xian", 1598.72}, +{"re", "xiao", 610.249}, +{"re", "xin", 1505.43}, +{"re", "xue", 1086.03}, +{"re", "yi", 218.28}, +{"re", "yuan", 106.749}, +{"re", "zha", 111.508}, +{"re", "zhong", 814.828}, +{"ren", "a", 743.048}, +{"ren", "ai", 147.965}, +{"ren", "er", 413.547}, +{"ri", "nei", 1245.96}, +{"ri", "nian", 352.238}, +{"rou", "nen", 110.127}, +{"rou", "niu", 109.853}, +{"ru", "er", 124.587}, +{"ru", "nei", 155.916}, +{"ru", "neng", 224.068}, +{"ru", "ni", 187.962}, +{"ru", "nin", 194.879}, +{"rui", "nei", 301.805}, +{"ruo", "neng", 305.209}, +{"sa", "er", 305.209}, +{"sa", "niao", 203.821}, +{"sai", "er", 481.946}, +{"san", "er", 316.69}, +{"se", "bai", 290.367}, +{"se", "ban", 329.725}, +{"se", "cai", 5089.03}, +{"se", "cha", 232.603}, +{"se", "diao", 694.692}, +{"se", "dong", 227.444}, +{"se", "fang", 141.827}, +{"se", "fei", 172.475}, +{"se", "hong", 811.453}, +{"se", "huang", 466.788}, +{"se", "hui", 125.366}, +{"se", "ji", 231.882}, +{"se", "jie", 271.134}, +{"se", "jing", 118.087}, +{"se", "ju", 319.821}, +{"se", "lan", 302.094}, +{"se", "lang", 883.577}, +{"se", "mang", 130.141}, +{"se", "me", 160.849}, +{"se", "mo", 114.322}, +{"se", "po", 257.308}, +{"se", "pu", 123.044}, +{"se", "qing", 2306.59}, +{"se", "se", 97575}, +{"se", "sheng", 152.838}, +{"se", "su", 535.403}, +{"se", "tong", 130.792}, +{"se", "xi", 125.522}, +{"se", "xiang", 164.703}, +{"se", "xing", 622.712}, +{"se", "yan", 760.386}, +{"se", "yi", 243.276}, +{"se", "you", 122.585}, +{"se", "ze", 525.488}, +{"se", "zu", 130.629}, +{"sen", "er", 116.334}, +{"sha", "na", 114.893}, +{"shan", "an", 262.817}, +{"shan", "e", 335.528}, +{"shang", "an", 291.456}, +{"shang", "er", 128.85}, +{"shao", "er", 415.217}, +{"shao", "nan", 398.257}, +{"shao", "nao", 130.304}, +{"shao", "nian", 3843.17}, +{"shao", "nv", 3034.2}, +{"she", "an", 555.911}, +{"she", "ban", 2188.97}, +{"she", "bao", 1672.88}, +{"she", "bei", 16338.1}, +{"she", "ben", 207.149}, +{"she", "bu", 1850.03}, +{"she", "cha", 105.954}, +{"she", "chan", 244.491}, +{"she", "cheng", 1748.85}, +{"she", "chi", 1725.83}, +{"she", "chu", 1954.76}, +{"she", "ci", 159.85}, +{"she", "dai", 485.81}, +{"she", "de", 1318.17}, +{"she", "di", 256.348}, +{"she", "dian", 247.186}, +{"she", "diao", 205.095}, +{"she", "ding", 4138.04}, +{"she", "dong", 140.77}, +{"she", "du", 396.507}, +{"she", "fa", 884.534}, +{"she", "fang", 604.622}, +{"she", "feng", 239.964}, +{"she", "fu", 364.365}, +{"she", "hua", 3125.76}, +{"she", "hui", 51206.2}, +{"she", "ji", 52485.3}, +{"she", "jian", 1042.61}, +{"she", "jiao", 668.367}, +{"she", "jin", 211.058}, +{"she", "jing", 441.361}, +{"she", "kan", 112.345}, +{"she", "kang", 137.819}, +{"she", "ke", 492.107}, +{"she", "kou", 196.831}, +{"she", "kuai", 171.19}, +{"she", "lei", 496.212}, +{"she", "li", 5282.67}, +{"she", "lian", 307.421}, +{"she", "liao", 157.478}, +{"she", "lie", 142.535}, +{"she", "liu", 146.497}, +{"she", "lu", 319.682}, +{"she", "lun", 187.261}, +{"she", "luo", 475.849}, +{"she", "men", 970.14}, +{"she", "mian", 367.138}, +{"she", "ming", 198.803}, +{"she", "mu", 699.208}, +{"she", "nei", 200.046}, +{"she", "nong", 192.226}, +{"she", "pai", 158.265}, +{"she", "pin", 641.152}, +{"she", "qi", 646.141}, +{"she", "qiu", 165.32}, +{"she", "qu", 11510.6}, +{"she", "qun", 147.229}, +{"she", "ru", 736.28}, +{"she", "sha", 295.364}, +{"she", "she", 71629.9}, +{"she", "shen", 422.472}, +{"she", "sheng", 260.056}, +{"she", "shi", 5778.35}, +{"she", "shou", 1081.98}, +{"she", "shu", 142.535}, +{"she", "tai", 307.067}, +{"she", "tao", 483.723}, +{"she", "tong", 351.721}, +{"she", "tou", 1495.61}, +{"she", "tuan", 1061.21}, +{"she", "wa", 198.556}, +{"she", "wai", 394.044}, +{"she", "wang", 524.18}, +{"she", "wei", 576.251}, +{"she", "wu", 497.789}, +{"she", "xi", 504.945}, +{"she", "xia", 116.915}, +{"she", "xian", 2165.45}, +{"she", "xiang", 6241.72}, +{"she", "xiao", 192.946}, +{"she", "xie", 1780.59}, +{"she", "xin", 1154.14}, +{"she", "xing", 2246.17}, +{"she", "xu", 282.164}, +{"she", "xue", 125.21}, +{"she", "xun", 172.046}, +{"she", "ya", 256.987}, +{"she", "yang", 112.485}, +{"she", "ye", 924.666}, +{"she", "yi", 181.517}, +{"she", "ying", 4907.17}, +{"she", "yong", 283.928}, +{"she", "you", 1505.91}, +{"she", "yuan", 263.801}, +{"she", "zai", 903.62}, +{"she", "zhan", 446.882}, +{"she", "zhang", 557.185}, +{"she", "zheng", 118.234}, +{"she", "zhi", 21782.5}, +{"she", "zhong", 136.963}, +{"she", "zhu", 301.054}, +{"she", "zhuang", 289.907}, +{"she", "zi", 181.743}, +{"she", "zu", 558.575}, +{"she", "zuo", 476.22}, +{"shei", "neng", 476.814}, +{"shen", "ai", 659.267}, +{"shen", "an", 135.774}, +{"shen", "ao", 559.119}, +{"sheng", "ai", 140.245}, +{"sheng", "er", 109.035}, +{"shi", "er", 7890}, +{"shi", "nai", 115.611}, +{"shi", "nan", 1009.77}, +{"shi", "nao", 111.786}, +{"shi", "nei", 5701.69}, +{"shi", "neng", 658.897}, +{"shi", "ni", 4737.59}, +{"shi", "nian", 5552.53}, +{"shi", "nin", 437.767}, +{"shi", "ning", 367.483}, +{"shi", "niu", 235.227}, +{"shi", "nv", 170.764}, +{"shou", "er", 314.084}, +{"shou", "na", 355.838}, +{"shou", "nan", 161.05}, +{"shou", "nao", 456.184}, +{"shou", "neng", 1263.58}, +{"shou", "nian", 150.757}, +{"shou", "nue", 122.891}, +{"shu", "e", 1066.51}, +{"shu", "nian", 540.767}, +{"shu", "niao", 117.353}, +{"shu", "niu", 434.81}, +{"shu", "nuo", 121.975}, +{"shu", "nv", 1194.48}, +{"shuang", "a", 154.177}, +{"shui", "e", 198.062}, +{"shui", "na", 123.659}, +{"shui", "ne", 243.276}, +{"shui", "neng", 1493.11}, +{"shui", "ni", 2211.85}, +{"shui", "niu", 139.722}, +{"shuo", "na", 170.977}, +{"shuo", "nan", 472.672}, +{"shuo", "ne", 479.196}, +{"shuo", "ni", 409.564}, +{"si", "e", 152.838}, +{"si", "en", 107.149}, +{"si", "er", 1201.7}, +{"si", "na", 261.456}, +{"si", "nao", 126.464}, +{"si", "ni", 1039.41}, +{"si", "nian", 5201.29}, +{"si", "nue", 296.586}, +{"si", "nuo", 399.83}, +{"su", "nan", 205.35}, +{"su", "ning", 1062.34}, +{"sui", "er", 137.648}, +{"sui", "na", 220.467}, +{"sui", "ni", 576.969}, +{"sui", "ning", 115.037}, +{"suo", "er", 124.742}, +{"suo", "neng", 1235.46}, +{"suo", "ni", 1971.42}, +{"ta", "niang", 262.163}, +{"tai", "er", 1179.79}, +{"tai", "nan", 1081.04}, +{"tang", "er", 154.369}, +{"tao", "er", 225.188}, +{"te", "an", 174.421}, +{"te", "ao", 229.982}, +{"te", "ben", 158.068}, +{"te", "bie", 33816.1}, +{"te", "bo", 344.425}, +{"te", "chan", 578.409}, +{"te", "chang", 745.831}, +{"te", "ci", 493.745}, +{"te", "da", 887.689}, +{"te", "di", 1081.23}, +{"te", "dian", 10575.6}, +{"te", "ding", 3277.86}, +{"te", "duo", 129.656}, +{"te", "fang", 141.827}, +{"te", "fei", 615.595}, +{"te", "he", 281.462}, +{"te", "hui", 198.556}, +{"te", "ji", 1025.68}, +{"te", "jia", 1704.57}, +{"te", "jing", 248.175}, +{"te", "ju", 319.821}, +{"te", "kan", 133.259}, +{"te", "kuai", 233.474}, +{"te", "kun", 292.913}, +{"te", "la", 313.382}, +{"te", "lan", 224.907}, +{"te", "li", 1274.75}, +{"te", "luo", 122.28}, +{"te", "ma", 139.2}, +{"te", "mai", 136.452}, +{"te", "nei", 181.969}, +{"te", "pai", 190.082}, +{"te", "qu", 655.172}, +{"te", "quan", 838.521}, +{"te", "sa", 242.973}, +{"te", "se", 6822.26}, +{"te", "she", 118.234}, +{"te", "shi", 139.374}, +{"te", "shou", 106.218}, +{"te", "shu", 9386.15}, +{"te", "si", 138.163}, +{"te", "te", 15716.7}, +{"te", "tu", 138.336}, +{"te", "wei", 225.188}, +{"te", "wu", 433.188}, +{"te", "xiao", 1075.86}, +{"te", "xie", 465.077}, +{"te", "xing", 3878.4}, +{"te", "xu", 601.706}, +{"te", "ya", 175.73}, +{"te", "yao", 616.506}, +{"te", "yi", 2423.65}, +{"te", "you", 1443.7}, +{"te", "yue", 542.792}, +{"te", "zha", 258.916}, +{"te", "zheng", 5615.52}, +{"te", "zhi", 1271.44}, +{"te", "zhong", 1355.47}, +{"te", "zu", 130.629}, +{"teng", "ai", 457.033}, +{"ti", "nan", 374.991}, +{"ti", "nei", 2658.69}, +{"ti", "neng", 498.07}, +{"ti", "ni", 674.847}, +{"ti", "nin", 546.185}, +{"tian", "a", 318.419}, +{"tian", "an", 650.825}, +{"tian", "e", 448.011}, +{"tian", "er", 4470.43}, +{"tiao", "er", 919.063}, +{"tie", "ba", 714.891}, +{"tie", "ban", 171.19}, +{"tie", "chu", 406.007}, +{"tie", "chui", 132.762}, +{"tie", "dao", 988.912}, +{"tie", "ding", 419.809}, +{"tie", "du", 128.05}, +{"tie", "he", 118.381}, +{"tie", "jia", 110.953}, +{"tie", "jiang", 354.44}, +{"tie", "jin", 912.674}, +{"tie", "kuang", 775.8}, +{"tie", "lian", 135.605}, +{"tie", "ling", 142.535}, +{"tie", "lu", 4256.3}, +{"tie", "men", 419.622}, +{"tie", "mo", 283.574}, +{"tie", "pai", 179.492}, +{"tie", "pi", 235.814}, +{"tie", "pian", 175.949}, +{"tie", "qi", 112.345}, +{"tie", "qie", 438.62}, +{"tie", "ren", 143.248}, +{"tie", "san", 150.194}, +{"tie", "shang", 638.249}, +{"tie", "shen", 480.392}, +{"tie", "si", 189.137}, +{"tie", "su", 120.916}, +{"tie", "ta", 181.517}, +{"tie", "tie", 31949.6}, +{"tie", "tong", 685.234}, +{"tie", "tou", 259.239}, +{"tie", "tu", 1024.82}, +{"tie", "xi", 178.822}, +{"tie", "xian", 139.722}, +{"tie", "xin", 491.29}, +{"tie", "xue", 300.679}, +{"tie", "zai", 726.566}, +{"tie", "zang", 346.146}, +{"tie", "zhe", 466.237}, +{"tie", "zheng", 121.52}, +{"tie", "zhi", 287.13}, +{"tie", "zi", 15436.4}, +{"ting", "an", 144.683}, +{"tong", "er", 181.743}, +{"tou", "er", 206.891}, +{"tou", "nao", 2111.28}, +{"tou", "niu", 118.529}, +{"tu", "er", 852.215}, +{"tu", "ni", 133.925}, +{"tu", "ning", 1107.14}, +{"tui", "na", 158.66}, +{"tuo", "ni", 245.407}, +{"tuo", "niao", 205.606}, +{"wa", "er", 426.582}, +{"wa", "na", 132.102}, +{"wa", "nei", 196.586}, +{"wai", "nei", 3592.19}, +{"wan", "an", 6425.71}, +{"wan", "e", 426.226}, +{"wan", "er", 1103.92}, +{"wan", "ou", 222.399}, +{"wang", "an", 135.267}, +{"wang", "er", 287.831}, +{"wei", "e", 513.192}, +{"wei", "er", 1793.76}, +{"wei", "na", 146.132}, +{"wei", "nai", 266.777}, +{"wei", "nan", 1785.95}, +{"wei", "nei", 301.805}, +{"wei", "neng", 3533.53}, +{"wei", "ni", 3186.68}, +{"wei", "nin", 2608.47}, +{"wen", "an", 360.228}, +{"wen", "er", 159.254}, +{"wo", "en", 191.986}, +{"wo", "er", 1440.76}, +{"wo", "na", 755.585}, +{"wo", "nang", 242.67}, +{"wo", "neng", 1831.67}, +{"wo", "niu", 717.568}, +{"wu", "er", 154.177}, +{"wu", "nai", 5450.06}, +{"wu", "nei", 389.649}, +{"wu", "neng", 1184.46}, +{"wu", "ni", 247.557}, +{"wu", "nian", 3264.9}, +{"wu", "nin", 134.595}, +{"wu", "nong", 151.51}, +{"wu", "nv", 127.89}, +{"xi", "er", 1701.43}, +{"xi", "na", 703.403}, +{"xi", "nan", 1974.18}, +{"xi", "nao", 575.404}, +{"xi", "nen", 145.406}, +{"xi", "ni", 2100.28}, +{"xi", "ning", 431.034}, +{"xi", "niu", 183.564}, +{"xi", "nong", 166.146}, +{"xi", "nu", 263.145}, +{"xi", "nv", 113.047}, +{"xia", "nian", 184.251}, +{"xian", "ai", 536.938}, +{"xian", "an", 211.848}, +{"xian", "e", 898.22}, +{"xian", "er", 414.183}, +{"xiang", "a", 184.711}, +{"xiang", "ai", 1425.83}, +{"xiao", "e", 482.249}, +{"xiao", "er", 1608.35}, +{"xiao", "nan", 1256.79}, +{"xiao", "nei", 1240.09}, +{"xiao", "neng", 616.363}, +{"xiao", "ni", 194.394}, +{"xiao", "niao", 795.762}, +{"xiao", "ning", 153.793}, +{"xiao", "niu", 1320.83}, +{"xiao", "nong", 111.647}, +{"xiao", "nv", 3120.31}, +{"xie", "ba", 107.416}, +{"xie", "ban", 265.12}, +{"xie", "bo", 565.457}, +{"xie", "cha", 322.412}, +{"xie", "chang", 1061.71}, +{"xie", "chen", 790.819}, +{"xie", "cheng", 2019.94}, +{"xie", "chi", 440.962}, +{"xie", "chu", 2284.43}, +{"xie", "cuo", 389.649}, +{"xie", "dai", 2218.81}, +{"xie", "dao", 1636.83}, +{"xie", "de", 7313.91}, +{"xie", "di", 198.803}, +{"xie", "dian", 598.874}, +{"xie", "diao", 117.94}, +{"xie", "ding", 494.977}, +{"xie", "dong", 298.812}, +{"xie", "du", 314.475}, +{"xie", "dui", 108.899}, +{"xie", "fa", 468.567}, +{"xie", "fang", 114.322}, +{"xie", "hao", 809.767}, +{"xie", "he", 261.185}, +{"xie", "hou", 504.316}, +{"xie", "hui", 5912.14}, +{"xie", "ji", 301.805}, +{"xie", "jia", 105.558}, +{"xie", "jian", 718.463}, +{"xie", "jiao", 201.547}, +{"xie", "jin", 469.698}, +{"xie", "jue", 317.626}, +{"xie", "la", 211.585}, +{"xie", "le", 3201.16}, +{"xie", "lei", 118.973}, +{"xie", "li", 119.567}, +{"xie", "liao", 494.36}, +{"xie", "lou", 949.122}, +{"xie", "lu", 488.238}, +{"xie", "lun", 246.326}, +{"xie", "man", 203.821}, +{"xie", "me", 439.228}, +{"xie", "men", 149.261}, +{"xie", "mi", 226.878}, +{"xie", "miao", 209.747}, +{"xie", "min", 145.225}, +{"xie", "ming", 357.545}, +{"xie", "mu", 206.119}, +{"xie", "na", 265.12}, +{"xie", "pang", 106.086}, +{"xie", "po", 462.396}, +{"xie", "qi", 333.324}, +{"xie", "qian", 125.366}, +{"xie", "ren", 178.6}, +{"xie", "ri", 192.705}, +{"xie", "ru", 1136.49}, +{"xie", "shang", 3027.97}, +{"xie", "she", 142.004}, +{"xie", "shen", 2368.92}, +{"xie", "sheng", 166.354}, +{"xie", "shi", 1093.36}, +{"xie", "shou", 1718.37}, +{"xie", "shu", 209.486}, +{"xie", "si", 269.786}, +{"xie", "tian", 230.647}, +{"xie", "tiao", 6749.5}, +{"xie", "ting", 670.034}, +{"xie", "tong", 1098.89}, +{"xie", "wan", 1132.25}, +{"xie", "wen", 545.051}, +{"xie", "xi", 381.957}, +{"xie", "xia", 1660.37}, +{"xie", "xiao", 216.924}, +{"xie", "xie", 409844}, +{"xie", "xin", 1312.5}, +{"xie", "xu", 714.891}, +{"xie", "ya", 140.245}, +{"xie", "yang", 381.36}, +{"xie", "ye", 1184.16}, +{"xie", "yi", 10921}, +{"xie", "yin", 250.662}, +{"xie", "you", 1231.02}, +{"xie", "zai", 2571.46}, +{"xie", "zha", 230.583}, +{"xie", "zhao", 289.285}, +{"xie", "zhe", 1618.46}, +{"xie", "zhen", 1564.1}, +{"xie", "zheng", 402.758}, +{"xie", "zhi", 154.561}, +{"xie", "zhu", 3888.08}, +{"xie", "zhuang", 215.04}, +{"xie", "zi", 5062.68}, +{"xie", "zou", 124.432}, +{"xie", "zui", 116.479}, +{"xie", "zuo", 4847.97}, +{"xin", "ai", 1206.06}, +{"xin", "an", 470.055}, +{"xin", "ao", 125.679}, +{"xin", "e", 232.378}, +{"xing", "ai", 1571.38}, +{"xing", "er", 256.581}, +{"xiong", "e", 132.432}, +{"xiu", "nv", 155.14}, +{"xu", "ni", 5691.66}, +{"xu", "nuo", 330.548}, +{"xue", "an", 182.651}, +{"xue", "bai", 543.469}, +{"xue", "ban", 373.633}, +{"xue", "bao", 396.013}, +{"xue", "bei", 109.035}, +{"xue", "ben", 122.585}, +{"xue", "beng", 125.21}, +{"xue", "bi", 340.971}, +{"xue", "bo", 121.672}, +{"xue", "chang", 124.432}, +{"xue", "che", 643.841}, +{"xue", "cheng", 482.033}, +{"xue", "chu", 329.846}, +{"xue", "chuan", 300.856}, +{"xue", "chuang", 106.483}, +{"xue", "da", 1438.23}, +{"xue", "dai", 307.942}, +{"xue", "dan", 515.114}, +{"xue", "dao", 2215.12}, +{"xue", "de", 358.437}, +{"xue", "deng", 519.358}, +{"xue", "di", 497.614}, +{"xue", "dian", 614.602}, +{"xue", "dong", 168.02}, +{"xue", "fa", 262.112}, +{"xue", "fan", 1228.06}, +{"xue", "fei", 2208.15}, +{"xue", "fen", 553.034}, +{"xue", "feng", 541.151}, +{"xue", "fo", 410.14}, +{"xue", "fu", 393.529}, +{"xue", "hai", 107.55}, +{"xue", "han", 811.512}, +{"xue", "hao", 1704.13}, +{"xue", "hong", 291.053}, +{"xue", "hua", 2272.11}, +{"xue", "huai", 131.773}, +{"xue", "hui", 7586.13}, +{"xue", "ji", 4759.62}, +{"xue", "jia", 1069.74}, +{"xue", "jian", 630.996}, +{"xue", "jiang", 745.871}, +{"xue", "jiao", 119.717}, +{"xue", "jie", 705.377}, +{"xue", "jin", 119.27}, +{"xue", "jing", 2086.27}, +{"xue", "kai", 224.347}, +{"xue", "ke", 3360.78}, +{"xue", "kun", 167.811}, +{"xue", "lei", 316.098}, +{"xue", "li", 6665.97}, +{"xue", "lian", 180.164}, +{"xue", "liang", 365.947}, +{"xue", "lin", 341.597}, +{"xue", "liu", 492.528}, +{"xue", "long", 107.149}, +{"xue", "lu", 116.334}, +{"xue", "lun", 153.793}, +{"xue", "mai", 403.485}, +{"xue", "mei", 365.631}, +{"xue", "men", 199.051}, +{"xue", "min", 132.928}, +{"xue", "ming", 270.945}, +{"xue", "nan", 495.03}, +{"xue", "nian", 494.471}, +{"xue", "niao", 108.357}, +{"xue", "pai", 522.761}, +{"xue", "pin", 150.194}, +{"xue", "po", 135.267}, +{"xue", "qi", 2544.28}, +{"xue", "qiao", 111.369}, +{"xue", "qing", 658.446}, +{"xue", "qu", 123.968}, +{"xue", "ran", 332.614}, +{"xue", "ren", 368.034}, +{"xue", "rong", 134.092}, +{"xue", "rou", 214.505}, +{"xue", "ruo", 625.649}, +{"xue", "se", 988.445}, +{"xue", "shan", 1061.42}, +{"xue", "shang", 782.49}, +{"xue", "shen", 252.228}, +{"xue", "sheng", 36342.7}, +{"xue", "shi", 2631.66}, +{"xue", "shu", 4848.15}, +{"xue", "shuan", 204.584}, +{"xue", "shuo", 591.53}, +{"xue", "si", 156.11}, +{"xue", "song", 112.906}, +{"xue", "tai", 142.713}, +{"xue", "tang", 1257.96}, +{"xue", "tian", 124.742}, +{"xue", "tie", 226.878}, +{"xue", "tong", 1532.27}, +{"xue", "tou", 342.712}, +{"xue", "tu", 229.723}, +{"xue", "wang", 149.447}, +{"xue", "wei", 1977.17}, +{"xue", "wen", 1577.5}, +{"xue", "wu", 640.238}, +{"xue", "xi", 34459}, +{"xue", "xiao", 39784}, +{"xue", "xin", 175.074}, +{"xue", "xing", 1623.59}, +{"xue", "xiu", 113.047}, +{"xue", "xue", 175755}, +{"xue", "xun", 150.757}, +{"xue", "ya", 778.111}, +{"xue", "yan", 835.419}, +{"xue", "yang", 630.197}, +{"xue", "ye", 5537.33}, +{"xue", "yi", 571.978}, +{"xue", "ying", 499.812}, +{"xue", "you", 328.905}, +{"xue", "yu", 1300.27}, +{"xue", "yuan", 10174.3}, +{"xue", "yue", 246.941}, +{"xue", "za", 163.476}, +{"xue", "zai", 147.229}, +{"xue", "zhan", 262.5}, +{"xue", "zhang", 577.689}, +{"xue", "zhe", 4171.88}, +{"xue", "zhen", 483.997}, +{"xue", "zheng", 172.475}, +{"xue", "zhi", 565.826}, +{"xue", "zhong", 557.362}, +{"xue", "zhu", 361.125}, +{"xue", "zi", 1184}, +{"ya", "er", 182.424}, +{"ya", "nan", 1070.51}, +{"ya", "ni", 230.296}, +{"yan", "an", 988.642}, +{"yan", "er", 174.856}, +{"yang", "er", 116.189}, +{"yao", "na", 242.973}, +{"yao", "neng", 157.871}, +{"yao", "ni", 617.901}, +{"yao", "nie", 149.075}, +{"ye", "an", 230.296}, +{"ye", "ba", 1040.2}, +{"ye", "ban", 999.047}, +{"ye", "bei", 1833.96}, +{"ye", "ben", 145.769}, +{"ye", "bi", 1199.02}, +{"ye", "bie", 458.745}, +{"ye", "bu", 23998.5}, +{"ye", "cai", 363.704}, +{"ye", "cao", 200.296}, +{"ye", "ceng", 1226.25}, +{"ye", "cha", 121.369}, +{"ye", "chan", 1119.63}, +{"ye", "chang", 158.66}, +{"ye", "che", 1174.79}, +{"ye", "cheng", 305.59}, +{"ye", "cong", 373.485}, +{"ye", "da", 257.495}, +{"ye", "dai", 537.819}, +{"ye", "dao", 184.022}, +{"ye", "de", 1108.52}, +{"ye", "dei", 871.547}, +{"ye", "di", 715.782}, +{"ye", "dian", 1327.15}, +{"ye", "dong", 133.758}, +{"ye", "dou", 2299.4}, +{"ye", "duan", 185.403}, +{"ye", "dui", 643.841}, +{"ye", "duo", 373.95}, +{"ye", "fa", 270.41}, +{"ye", "fang", 106.086}, +{"ye", "fei", 114.75}, +{"ye", "feng", 137.305}, +{"ye", "fu", 383.361}, +{"ye", "hai", 309.422}, +{"ye", "hang", 1335.63}, +{"ye", "hao", 4594.69}, +{"ye", "he", 176.388}, +{"ye", "hen", 4560.46}, +{"ye", "hu", 113.329}, +{"ye", "hua", 1300.75}, +{"ye", "hui", 11593.3}, +{"ye", "ji", 5739.89}, +{"ye", "jian", 1972.75}, +{"ye", "jiang", 2695.39}, +{"ye", "jiao", 921.709}, +{"ye", "jie", 1861.59}, +{"ye", "jin", 488.272}, +{"ye", "jing", 4206.7}, +{"ye", "jiu", 14189.6}, +{"ye", "ju", 330.111}, +{"ye", "kai", 108.357}, +{"ye", "ke", 2965.78}, +{"ye", "kong", 629.94}, +{"ye", "kou", 309.037}, +{"ye", "kuai", 426.758}, +{"ye", "lai", 434.81}, +{"ye", "lan", 170.339}, +{"ye", "lang", 107.953}, +{"ye", "le", 107.684}, +{"ye", "li", 2152.84}, +{"ye", "lian", 266.777}, +{"ye", "liang", 507.468}, +{"ye", "liu", 317.085}, +{"ye", "lu", 403.555}, +{"ye", "lv", 116.334}, +{"ye", "ma", 477.925}, +{"ye", "man", 1063.81}, +{"ye", "mao", 484.754}, +{"ye", "mei", 8059.81}, +{"ye", "men", 388.679}, +{"ye", "mian", 11312.2}, +{"ye", "ming", 286.416}, +{"ye", "mu", 869.428}, +{"ye", "nan", 282.868}, +{"ye", "nei", 2954.52}, +{"ye", "neng", 5178.59}, +{"ye", "pa", 142.358}, +{"ye", "pian", 601.941}, +{"ye", "pin", 112.766}, +{"ye", "qi", 2576.8}, +{"ye", "qing", 264.789}, +{"ye", "qu", 782.204}, +{"ye", "quan", 108.628}, +{"ye", "rang", 940.382}, +{"ye", "ren", 655.552}, +{"ye", "ri", 375.137}, +{"ye", "rong", 715.872}, +{"ye", "san", 364.746}, +{"ye", "se", 926.306}, +{"ye", "shan", 249.105}, +{"ye", "shang", 161.653}, +{"ye", "shao", 212.113}, +{"ye", "she", 373.485}, +{"ye", "shen", 392.93}, +{"ye", "sheng", 1409.34}, +{"ye", "shi", 64479.7}, +{"ye", "shou", 1547.08}, +{"ye", "shu", 178.822}, +{"ye", "shuo", 567.698}, +{"ye", "si", 383.001}, +{"ye", "su", 818.9}, +{"ye", "suan", 2358.64}, +{"ye", "suo", 113.612}, +{"ye", "ta", 176.828}, +{"ye", "tai", 1474.48}, +{"ye", "tan", 231.295}, +{"ye", "ti", 1543.14}, +{"ye", "tian", 285.347}, +{"ye", "tie", 519.57}, +{"ye", "ting", 615.595}, +{"ye", "tong", 199.3}, +{"ye", "tou", 769.433}, +{"ye", "wai", 932.215}, +{"ye", "wan", 2180.8}, +{"ye", "wei", 1584.56}, +{"ye", "wu", 30677.9}, +{"ye", "xi", 330.548}, +{"ye", "xia", 169.915}, +{"ye", "xian", 344.425}, +{"ye", "xiang", 1723.64}, +{"ye", "xiao", 2967.71}, +{"ye", "xie", 250.431}, +{"ye", "xin", 1548.59}, +{"ye", "xing", 4090.97}, +{"ye", "xu", 21545.1}, +{"ye", "xue", 1065.14}, +{"ye", "ya", 475.627}, +{"ye", "yan", 147.229}, +{"ye", "yang", 275.219}, +{"ye", "yao", 10800.7}, +{"ye", "ye", 385709}, +{"ye", "yi", 3012.21}, +{"ye", "yin", 651.818}, +{"ye", "ying", 3122.04}, +{"ye", "yong", 407.568}, +{"ye", "you", 21792.6}, +{"ye", "yu", 2114.6}, +{"ye", "zai", 4865.77}, +{"ye", "zao", 1820.4}, +{"ye", "zhan", 608.875}, +{"ye", "zhe", 238.771}, +{"ye", "zhen", 358.884}, +{"ye", "zheng", 529.348}, +{"ye", "zhi", 1325.82}, +{"ye", "zhong", 485.851}, +{"ye", "zhu", 6311.82}, +{"ye", "zhuan", 580.647}, +{"ye", "zi", 3353.92}, +{"ye", "zong", 448.569}, +{"ye", "zu", 141.827}, +{"ye", "zuo", 426.394}, +{"yi", "er", 1658.11}, +{"yi", "nai", 252.228}, +{"yi", "nan", 1458.16}, +{"yi", "nao", 154.754}, +{"yi", "nei", 1764.46}, +{"yi", "neng", 264.685}, +{"yi", "ni", 246.941}, +{"yi", "nian", 20112.8}, +{"yi", "nv", 241.464}, +{"yin", "an", 670.87}, +{"yin", "er", 2975.99}, +{"ying", "an", 313.693}, +{"ying", "ao", 179.045}, +{"ying", "er", 2448.77}, +{"yong", "an", 228.011}, +{"you", "er", 3877.7}, +{"you", "na", 266.645}, +{"you", "nan", 479.54}, +{"you", "nao", 256.503}, +{"you", "neng", 1691.24}, +{"you", "ni", 1055.27}, +{"you", "nian", 231.735}, +{"you", "nv", 595.045}, +{"yu", "e", 1272.97}, +{"yu", "er", 824.406}, +{"yu", "na", 568.406}, +{"yu", "nan", 927.512}, +{"yu", "ni", 953.956}, +{"yu", "nian", 276.594}, +{"yu", "nin", 377.697}, +{"yu", "nong", 232.893}, +{"yu", "nv", 258.916}, +{"yuan", "an", 128.85}, +{"yuan", "er", 2588.22}, +{"yue", "bao", 269.786}, +{"yue", "bing", 1969.68}, +{"yue", "cai", 128.21}, +{"yue", "can", 162.259}, +{"yue", "chang", 283.574}, +{"yue", "chu", 1326.62}, +{"yue", "da", 1587.12}, +{"yue", "dan", 212.377}, +{"yue", "di", 3490.4}, +{"yue", "dian", 219.644}, +{"yue", "ding", 2801.55}, +{"yue", "dong", 199.548}, +{"yue", "du", 7185.14}, +{"yue", "dui", 2172.67}, +{"yue", "duo", 2232.02}, +{"yue", "fa", 760.851}, +{"yue", "fei", 336.366}, +{"yue", "fen", 9152.54}, +{"yue", "fu", 307.883}, +{"yue", "han", 917.161}, +{"yue", "hao", 2230.67}, +{"yue", "he", 105.822}, +{"yue", "hua", 386.661}, +{"yue", "hui", 1777.7}, +{"yue", "ji", 168.02}, +{"yue", "jian", 308.811}, +{"yue", "jie", 136.282}, +{"yue", "jin", 286.328}, +{"yue", "jing", 2284.75}, +{"yue", "jiu", 135.267}, +{"yue", "ju", 337.329}, +{"yue", "juan", 251.914}, +{"yue", "ka", 239.665}, +{"yue", "kan", 605.158}, +{"yue", "ke", 110.677}, +{"yue", "kuai", 353.117}, +{"yue", "lai", 34382.5}, +{"yue", "lan", 276.126}, +{"yue", "li", 415.217}, +{"yue", "liang", 2615.97}, +{"yue", "mi", 183.564}, +{"yue", "ming", 181.969}, +{"yue", "mo", 397.992}, +{"yue", "mu", 311.744}, +{"yue", "nan", 2098.16}, +{"yue", "piao", 179.492}, +{"yue", "pu", 123.968}, +{"yue", "qi", 989.102}, +{"yue", "qian", 387.229}, +{"yue", "qiang", 162.259}, +{"yue", "qing", 150.757}, +{"yue", "qiu", 1153.62}, +{"yue", "qu", 441.911}, +{"yue", "ru", 182.424}, +{"yue", "sao", 110.677}, +{"yue", "se", 419.441}, +{"yue", "shang", 354.703}, +{"yue", "shao", 318.816}, +{"yue", "shen", 225.468}, +{"yue", "sheng", 251.475}, +{"yue", "shi", 1562.25}, +{"yue", "shou", 527.421}, +{"yue", "shu", 2438.05}, +{"yue", "shuo", 186.097}, +{"yue", "tan", 575.533}, +{"yue", "tuan", 503.688}, +{"yue", "wei", 1321.44}, +{"yue", "xi", 529.431}, +{"yue", "xia", 448.011}, +{"yue", "xiang", 680.842}, +{"yue", "xiao", 314.868}, +{"yue", "xin", 1227.81}, +{"yue", "xing", 366.568}, +{"yue", "xiu", 255.245}, +{"yue", "ya", 132.102}, +{"yue", "yang", 332.2}, +{"yue", "ye", 979.79}, +{"yue", "yi", 916.43}, +{"yue", "yin", 934.69}, +{"yue", "ying", 198.803}, +{"yue", "you", 630.998}, +{"yue", "yu", 2463.67}, +{"yue", "yuan", 577.969}, +{"yue", "yue", 112467}, +{"yue", "zai", 156.11}, +{"yue", "zao", 211.058}, +{"yue", "zhan", 709.582}, +{"yue", "zhang", 284.282}, +{"yue", "zhen", 173.121}, +{"yue", "zhong", 931.854}, +{"yue", "zi", 143.426}, +{"yue", "zou", 279.017}, +{"yue", "zu", 434.646}, +{"yue", "zuo", 200.545}, +{"yun", "ao", 179.045}, +{"yun", "er", 145.769}, +{"za", "nian", 136.793}, +{"zai", "er", 252.713}, +{"zai", "na", 4873.81}, +{"zai", "nan", 1955.8}, +{"zai", "nei", 2586.79}, +{"zai", "ni", 547.677}, +{"zai", "nin", 105.822}, +{"zang", "ao", 306.353}, +{"zao", "nian", 584.933}, +{"zao", "nie", 159.055}, +{"ze", "bei", 320.01}, +{"ze", "ben", 536.07}, +{"ze", "bian", 134.427}, +{"ze", "biao", 435.895}, +{"ze", "bu", 233.766}, +{"ze", "chang", 267.109}, +{"ze", "cheng", 186.097}, +{"ze", "cong", 111.23}, +{"ze", "dai", 173.986}, +{"ze", "dan", 448.569}, +{"ze", "fu", 748.625}, +{"ze", "he", 228.58}, +{"ze", "hui", 1095.86}, +{"ze", "ji", 261.663}, +{"ze", "jia", 332.2}, +{"ze", "jiang", 242.368}, +{"ze", "jiu", 434.269}, +{"ze", "ke", 749.44}, +{"ze", "ling", 757.068}, +{"ze", "lv", 1753.5}, +{"ze", "ma", 140.245}, +{"ze", "min", 165.526}, +{"ze", "nan", 116.479}, +{"ze", "neng", 167.185}, +{"ze", "ou", 153.41}, +{"ze", "ren", 14836.9}, +{"ze", "shen", 133.925}, +{"ze", "shi", 5293.18}, +{"ze", "shuo", 109.307}, +{"ze", "wei", 714.507}, +{"ze", "wen", 107.818}, +{"ze", "wu", 136.622}, +{"ze", "xi", 447.453}, +{"ze", "xian", 111.786}, +{"ze", "xiao", 107.282}, +{"ze", "xing", 232.313}, +{"ze", "xu", 119.717}, +{"ze", "xuan", 696.09}, +{"ze", "yao", 564.347}, +{"ze", "ye", 173.77}, +{"ze", "yi", 1823.83}, +{"ze", "ying", 229.151}, +{"ze", "yong", 107.953}, +{"ze", "you", 1042.66}, +{"ze", "yue", 131.609}, +{"ze", "zai", 511.277}, +{"ze", "ze", 120146}, +{"ze", "zhen", 154.369}, +{"ze", "zhi", 106.086}, +{"ze", "zuo", 164.703}, +{"zhang", "ai", 3408.88}, +{"zhang", "an", 134.93}, +{"zhang", "er", 631.918}, +{"zhao", "ni", 3302.46}, +{"zhe", "ba", 367.941}, +{"zhe", "bai", 408.004}, +{"zhe", "ban", 670.034}, +{"zhe", "bang", 816.862}, +{"zhe", "bao", 1440.11}, +{"zhe", "ben", 947.44}, +{"zhe", "bi", 1101.66}, +{"zhe", "bian", 15142.2}, +{"zhe", "biao", 164.293}, +{"zhe", "bo", 119.27}, +{"zhe", "bu", 6567.12}, +{"zhe", "cai", 2373.02}, +{"zhe", "cang", 105.69}, +{"zhe", "ce", 347.01}, +{"zhe", "ceng", 161.855}, +{"zhe", "cha", 107.015}, +{"zhe", "chan", 333.444}, +{"zhe", "chang", 2763.41}, +{"zhe", "che", 298.812}, +{"zhe", "chi", 524.18}, +{"zhe", "chu", 193.668}, +{"zhe", "ci", 22768.5}, +{"zhe", "cun", 264.789}, +{"zhe", "da", 920.786}, +{"zhe", "dai", 139.027}, +{"zhe", "dang", 304.071}, +{"zhe", "dao", 1612.86}, +{"zhe", "de", 230.583}, +{"zhe", "deng", 136.452}, +{"zhe", "dian", 3825.6}, +{"zhe", "die", 1050.99}, +{"zhe", "ding", 106.218}, +{"zhe", "dong", 1992.59}, +{"zhe", "dou", 1128.69}, +{"zhe", "duan", 5470.43}, +{"zhe", "dui", 2064.93}, +{"zhe", "fa", 657.71}, +{"zhe", "fan", 199.3}, +{"zhe", "fang", 1322.49}, +{"zhe", "fei", 11411.3}, +{"zhe", "fen", 2753.1}, +{"zhe", "feng", 221.017}, +{"zhe", "fu", 786.161}, +{"zhe", "hai", 1430.13}, +{"zhe", "hang", 423.579}, +{"zhe", "hao", 1718.88}, +{"zhe", "he", 513.158}, +{"zhe", "hu", 123.659}, +{"zhe", "hua", 2013.63}, +{"zhe", "huan", 106.218}, +{"zhe", "hui", 3143.75}, +{"zhe", "huo", 113.047}, +{"zhe", "ji", 10457.1}, +{"zhe", "jia", 4255.85}, +{"zhe", "jian", 4977.67}, +{"zhe", "jiang", 9155.56}, +{"zhe", "jiao", 1131.26}, +{"zhe", "jie", 1190.51}, +{"zhe", "jiu", 6057.38}, +{"zhe", "ju", 5212.47}, +{"zhe", "kan", 482.793}, +{"zhe", "ke", 1025.77}, +{"zhe", "kou", 1795.29}, +{"zhe", "kuai", 2318.12}, +{"zhe", "kuan", 5185.05}, +{"zhe", "lai", 173.121}, +{"zhe", "lan", 132.762}, +{"zhe", "lang", 105.296}, +{"zhe", "lei", 3811.32}, +{"zhe", "li", 59288.1}, +{"zhe", "lia", 186.562}, +{"zhe", "lian", 375.819}, +{"zhe", "liang", 9435.58}, +{"zhe", "lue", 192.226}, +{"zhe", "lun", 157.674}, +{"zhe", "mai", 267.776}, +{"zhe", "me", 88198.9}, +{"zhe", "mei", 132.597}, +{"zhe", "men", 328.905}, +{"zhe", "mian", 197.323}, +{"zhe", "ming", 1315.63}, +{"zhe", "mo", 2116.55}, +{"zhe", "nan", 238.176}, +{"zhe", "ne", 753.304}, +{"zhe", "pan", 183.793}, +{"zhe", "pi", 767.518}, +{"zhe", "pian", 4213.99}, +{"zhe", "pin", 350.487}, +{"zhe", "qi", 713.81}, +{"zhe", "qian", 183.564}, +{"zhe", "qin", 113.329}, +{"zhe", "qing", 370.949}, +{"zhe", "qiu", 155.14}, +{"zhe", "quan", 119.717}, +{"zhe", "qun", 682.677}, +{"zhe", "ran", 266.444}, +{"zhe", "rang", 699.034}, +{"zhe", "ren", 1771.38}, +{"zhe", "sai", 225.188}, +{"zhe", "san", 1745.18}, +{"zhe", "shang", 184.941}, +{"zhe", "she", 795.231}, +{"zhe", "shen", 152.647}, +{"zhe", "shi", 59720.2}, +{"zhe", "shou", 3370.81}, +{"zhe", "shu", 131.937}, +{"zhe", "shuang", 193.91}, +{"zhe", "si", 359.523}, +{"zhe", "song", 108.357}, +{"zhe", "sou", 110.953}, +{"zhe", "su", 3327.24}, +{"zhe", "suan", 444.963}, +{"zhe", "sui", 166.561}, +{"zhe", "suo", 125.054}, +{"zhe", "tai", 856.474}, +{"zhe", "tang", 279.056}, +{"zhe", "tao", 1290.54}, +{"zhe", "teng", 2652.07}, +{"zhe", "tian", 741.199}, +{"zhe", "tiao", 3071.35}, +{"zhe", "tie", 239.068}, +{"zhe", "tou", 238.473}, +{"zhe", "tuo", 204.584}, +{"zhe", "wang", 115.467}, +{"zhe", "wei", 12164.8}, +{"zhe", "wen", 364.43}, +{"zhe", "xi", 371.353}, +{"zhe", "xia", 1485.68}, +{"zhe", "xiang", 2596.48}, +{"zhe", "xie", 69012.4}, +{"zhe", "xin", 227.727}, +{"zhe", "xing", 434.685}, +{"zhe", "xue", 4031.24}, +{"zhe", "yan", 900.275}, +{"zhe", "yang", 134791}, +{"zhe", "yao", 151.888}, +{"zhe", "ye", 7732.77}, +{"zhe", "yi", 25242.3}, +{"zhe", "ying", 1787.18}, +{"zhe", "yong", 1163.72}, +{"zhe", "you", 1728.51}, +{"zhe", "yu", 1373.04}, +{"zhe", "yuan", 1861.59}, +{"zhe", "zai", 1080.52}, +{"zhe", "zao", 315.723}, +{"zhe", "ze", 227.16}, +{"zhe", "zhang", 3939.28}, +{"zhe", "zhao", 335.111}, +{"zhe", "zhe", 342767}, +{"zhe", "zhen", 118.234}, +{"zhe", "zheng", 370.241}, +{"zhe", "zhi", 3858.7}, +{"zhe", "zhong", 58627.7}, +{"zhe", "zhou", 2254.21}, +{"zhe", "zhu", 642.71}, +{"zhe", "zhuang", 107.416}, +{"zhe", "zi", 8242.91}, +{"zhe", "zu", 303.692}, +{"zhe", "zuo", 3197.08}, +{"zhen", "ai", 1192.06}, +{"zhen", "e", 116.334}, +{"zheng", "er", 116.77}, +{"zhi", "en", 108.763}, +{"zhi", "er", 1557.59}, +{"zhi", "na", 310.443}, +{"zhi", "nan", 1838.84}, +{"zhi", "nao", 111.786}, +{"zhi", "nei", 2707.1}, +{"zhi", "nen", 356.211}, +{"zhi", "neng", 40374}, +{"zhi", "niu", 138.681}, +{"zhi", "nong", 242.368}, +{"zhi", "nv", 949.593}, +{"zhong", "ai", 326.862}, +{"zhong", "e", 515.756}, +{"zhong", "er", 538.078}, +{"zhong", "ou", 401.979}, +{"zhou", "en", 803.735}, +{"zhou", "er", 1505.79}, +{"zhou", "nei", 128.85}, +{"zhou", "nian", 1478.48}, +{"zhu", "er", 126.78}, +{"zhu", "na", 136.282}, +{"zhu", "nei", 260.464}, +{"zhu", "ni", 2248.2}, +{"zhu", "nian", 1021.05}, +{"zhu", "nin", 451.185}, +{"zhu", "nv", 179.94}, +{"zhuan", "an", 469.564}, +{"zhuan", "er", 496.831}, +{"zhuo", "nao", 144.143}, +{"zhuo", "nong", 230.009}, +{"zi", "er", 340.098}, +{"zi", "nan", 286.068}, +{"zi", "nao", 207.408}, +{"zi", "neng", 168.65}, +{"zi", "ni", 194.394}, +{"zi", "nian", 238.473}, +{"zi", "niang", 131.937}, +{"zi", "nue", 254.121}, +{"zi", "nv", 3018.22}, +{"zong", "ai", 143.963}, +{"zong", "e", 1555.79}, +{"zong", "er", 174.856}, +{"zu", "e", 284.636}, +{"zu", "nao", 318.816}, +{"zu", "ni", 154.947}, +{"zui", "e", 899.995}, +{"zui", "nan", 638.249}, +{"zui", "nei", 235.52}, +{"zui", "neng", 580.576}, +{"zui", "nie", 118.087}, +{"zui", "niu", 310.968}, +{"zuo", "e", 137.648}, +{"zuo", "er", 237.447}, +{"zuo", "neng", 346.578}, +{"zuo", "nie", 313.693}, +{"zuo", "niu", 253.489}, +{"zuo", "nv", 681.897}, +}; \ No newline at end of file diff -Nru fcitx-4.2.2/src/im/table/table.c fcitx-4.2.4.1/src/im/table/table.c --- fcitx-4.2.2/src/im/table/table.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/im/table/table.c 2012-06-10 14:34:48.000000000 +0000 @@ -44,6 +44,8 @@ #include "module/punc/punc.h" #include "tablepinyinwrapper.h" +#define MAX_TABLE_INPUT 50 + static void FreeTableConfig(void *v); const UT_icd table_icd = {sizeof(TableMetaData), NULL , NULL, FreeTableConfig}; const UT_icd tableCand_icd = {sizeof(TABLECANDWORD*), NULL, NULL, NULL }; @@ -53,6 +55,7 @@ static void *TableCreate(FcitxInstance* instance); static int TableCandCmp(const void* a, const void* b, void* arg); +static INPUT_RETURN_VALUE TableKeyBlocker(void* arg, FcitxKeySym sym, unsigned int state); FCITX_EXPORT_API FcitxIMClass ime = { @@ -84,8 +87,8 @@ TableGetCandWords, TablePhraseTips, SaveTableIM, - NULL, - NULL, + ReloadTableConfig, + TableKeyBlocker, table->iPriority, table->langCode ); @@ -158,6 +161,7 @@ FcitxConfigBindSync((FcitxGenericConfig*)t); FcitxLog(DEBUG, _("Table Config %s is %s"), string->name, (t->bEnabled) ? "Enabled" : "Disabled"); if (t->bEnabled) { + t->confName = strdup(string->name); t->owner = tbl; tbl->iTableCount ++; } @@ -186,6 +190,10 @@ boolean flag = true; FcitxInstanceSetContext(tbl->owner, CONTEXT_IM_KEYBOARD_LAYOUT, table->kbdlayout); FcitxInstanceSetContext(tbl->owner, CONTEXT_SHOW_REMIND_STATUS, &flag); + if (table->bUseAlternativePageKey) { + FcitxInstanceSetContext(tbl->owner, CONTEXT_ALTERNATIVE_PREVPAGE_KEY, table->hkAlternativePrevPage); + FcitxInstanceSetContext(tbl->owner, CONTEXT_ALTERNATIVE_NEXTPAGE_KEY, table->hkAlternativeNextPage); + } FcitxAddon* pyaddon = FcitxAddonsGetAddonByName(FcitxInstanceGetAddons(tbl->owner), "fcitx-pinyin"); tbl->pyaddon = pyaddon; if (pyaddon == NULL) @@ -217,9 +225,10 @@ FcitxInputState *input = FcitxInstanceGetInputState(instance); FcitxGlobalConfig* config = FcitxInstanceGetGlobalConfig(instance); char* strCodeInput = FcitxInputStateGetRawInputBuffer(input); + FcitxCandidateWordList* candList = FcitxInputStateGetCandidateList(input); - FcitxCandidateWordSetChoose(FcitxInputStateGetCandidateList(input), table->strChoose); - FcitxCandidateWordSetPageSize(FcitxInputStateGetCandidateList(input), config->iMaxCandWord); + FcitxCandidateWordSetChoose(candList, table->strChoose); + FcitxCandidateWordSetPageSize(candList, config->iMaxCandWord); tbl->iTableIMIndex = utarray_eltidx(tbl->table, table); if (tbl->iTableIMIndex != tbl->iCurrentTableLoaded) { @@ -253,13 +262,13 @@ if (state == FcitxKeyState_None && (IsInputKey(table->tableDict, sym) || IsEndKey(table, sym) - || sym == table->cMatchingKey - || sym == table->cPinyin + || (table->bUseMatchingKey && sym == table->cMatchingKey) + || (table->bUsePY && sym == table->cPinyin) || (strCodeInput[0] == table->cPinyin && table->bUsePY && sym == FcitxKey_apostrophe) ) ) { if (FcitxInputStateGetIsInRemind(input)) - FcitxCandidateWordReset(FcitxInputStateGetCandidateList(input)); + FcitxCandidateWordReset(candList); FcitxInputStateSetIsInRemind(input, false); /* it's not in special state */ @@ -275,7 +284,14 @@ retVal = IRV_DO_NOTHING; } else { /* length is not too large */ - if ((FcitxInputStateGetRawInputBufferSize(input) < table->tableDict->iCodeLength) || (table->tableDict->bHasPinyin && FcitxInputStateGetRawInputBufferSize(input) < table->tableDict->iPYCodeLength)) { + if (((FcitxInputStateGetRawInputBufferSize(input) < table->tableDict->iCodeLength) + || (table->tableDict->bHasPinyin && FcitxInputStateGetRawInputBufferSize(input) < table->tableDict->iPYCodeLength) + || (((FcitxCandidateWordPageCount(candList) == 0 + && table->bNoMatchDontCommit) || !table->bUseAutoSend) + && FcitxInputStateGetRawInputBufferSize(input) >= table->tableDict->iCodeLength + )) + && FcitxInputStateGetRawInputBufferSize(input) <= MAX_TABLE_INPUT + ) { strCodeInput[FcitxInputStateGetRawInputBufferSize(input)] = (char) sym; strCodeInput[FcitxInputStateGetRawInputBufferSize(input) + 1] = '\0'; FcitxInputStateSetRawInputBufferSize(input, FcitxInputStateGetRawInputBufferSize(input) + 1); @@ -286,14 +302,14 @@ char *strTemp; char *strLastFirstCand; CANDTYPE lastFirstCandType; - int lastPageCount = FcitxCandidateWordPageCount(FcitxInputStateGetCandidateList(input)); + int lastPageCount = FcitxCandidateWordPageCount(candList); strLastFirstCand = (char *)NULL; lastFirstCandType = CT_AUTOPHRASE; - if (FcitxCandidateWordPageCount(FcitxInputStateGetCandidateList(input)) != 0) { + if (FcitxCandidateWordPageCount(candList) != 0) { // to realize auto-sending HZ to client FcitxCandidateWord *candWord = NULL; - candWord = FcitxCandidateWordGetCurrentWindow(FcitxInputStateGetCandidateList(input)); + candWord = FcitxCandidateWordGetCurrentWindow(candList); if (candWord->owner == table) { TABLECANDWORD* tableCandWord = candWord->priv; lastFirstCandType = tableCandWord->flag; @@ -307,27 +323,35 @@ FcitxModuleFunctionArg farg; int key = FcitxInputStateGetRawInputBuffer(input)[0]; farg.args[0] = &key; - strTemp = InvokeFunction(instance, FCITX_PUNC, GETPUNC, farg); + if (!table->bIgnorePunc) + strTemp = InvokeFunction(instance, FCITX_PUNC, GETPUNC, farg); + else + strTemp = NULL; if (IsEndKey(table, sym)) { if (FcitxInputStateGetRawInputBufferSize(input) == 1) return IRV_TO_PROCESS; - if (FcitxCandidateWordPageCount(FcitxInputStateGetCandidateList(input)) == 0) { + if (FcitxCandidateWordPageCount(candList) == 0) { FcitxInputStateSetRawInputBufferSize(input, 0); return IRV_CLEAN; } - if (FcitxCandidateWordGetCurrentWindowSize(FcitxInputStateGetCandidateList(input)) == 1) { - retVal = FcitxCandidateWordChooseByIndex(FcitxInputStateGetCandidateList(input), 0); + if (FcitxCandidateWordGetCurrentWindowSize(candList) == 1) { + retVal = FcitxCandidateWordChooseByIndex(candList, 0); return retVal; } return IRV_DISPLAY_CANDWORDS; - } else if (table->iTableAutoSendToClientWhenNone - && (FcitxInputStateGetRawInputBufferSize(input) == (table->iTableAutoSendToClientWhenNone + 1)) - && FcitxCandidateWordPageCount(FcitxInputStateGetCandidateList(input)) == 0) { + } else if (table->bUseAutoSend + && table->iTableAutoSendToClientWhenNone + && (!(retVal & IRV_FLAG_PENDING_COMMIT_STRING)) + && (FcitxInputStateGetRawInputBufferSize(input) >= (table->iTableAutoSendToClientWhenNone + 1)) + && FcitxCandidateWordPageCount(candList) == 0) { if (strLastFirstCand && (lastFirstCandType != CT_AUTOPHRASE)) { FcitxInstanceCommitString(instance, FcitxInstanceGetCurrentIC(instance), strLastFirstCand); + } else if (table->bSendRawPreedit) { + strCodeInput[FcitxInputStateGetRawInputBufferSize(input) - 1] = '\0'; + FcitxInstanceCommitString(instance, FcitxInstanceGetCurrentIC(instance), strCodeInput); } retVal = IRV_DISPLAY_CANDWORDS; FcitxInputStateSetRawInputBufferSize(input, 1); @@ -339,20 +363,21 @@ } } } else { - if (table->iTableAutoSendToClient) { + if (table->bUseAutoSend && table->iTableAutoSendToClient) { retVal = IRV_DISPLAY_CANDWORDS; - if (FcitxCandidateWordPageCount(FcitxInputStateGetCandidateList(input))) { - FcitxCandidateWord* candWord = FcitxCandidateWordGetCurrentWindow(FcitxInputStateGetCandidateList(input)); + if (FcitxCandidateWordPageCount(candList)) { + FcitxCandidateWord* candWord = FcitxCandidateWordGetCurrentWindow(candList); if (candWord->owner == table) { TABLECANDWORD* tableCandWord = candWord->priv; if (tableCandWord->flag != CT_AUTOPHRASE) { INPUT_RETURN_VALUE ret = TableGetCandWord(table, candWord); if (ret & IRV_FLAG_PENDING_COMMIT_STRING) { FcitxInstanceCommitString(instance, FcitxInstanceGetCurrentIC(instance), FcitxInputStateGetOutputString(input)); - FcitxInstanceIncreateInputCharacterCount(instance, fcitx_utf8_strlen(FcitxInputStateGetOutputString(input))); } } } + } else if (table->bSendRawPreedit) { + FcitxInstanceCommitString(instance, FcitxInstanceGetCurrentIC(instance), strCodeInput); } FcitxInputStateSetRawInputBufferSize(input, 1); @@ -454,13 +479,13 @@ int iKey; iKey = FcitxHotkeyCheckChooseKey(sym, state, table->strChoose); - if (FcitxCandidateWordPageCount(FcitxInputStateGetCandidateList(input)) == 0) + if (FcitxCandidateWordPageCount(candList) == 0) return IRV_TO_PROCESS; - if (FcitxCandidateWordGetByIndex(FcitxInputStateGetCandidateList(input), iKey) == NULL) + if (FcitxCandidateWordGetByIndex(candList, iKey) == NULL) return IRV_DO_NOTHING; else { - FcitxCandidateWord* candWord = FcitxCandidateWordGetByIndex(FcitxInputStateGetCandidateList(input), iKey); + FcitxCandidateWord* candWord = FcitxCandidateWordGetByIndex(candList, iKey); if (candWord->owner == table && tbl->bIsTableDelPhrase) { TableDelPhraseByIndex(table, candWord->priv); tbl->bIsTableDelPhrase = false; @@ -474,7 +499,7 @@ } } else if (!tbl->bIsTableDelPhrase && !tbl->bIsTableAdjustOrder) { if (FcitxHotkeyIsHotKey(sym, state, tbl->hkTableAdjustOrder)) { - if (FcitxCandidateWordGetListSize(FcitxInputStateGetCandidateList(input)) < 2 || FcitxInputStateGetIsInRemind(input)) + if (FcitxCandidateWordGetListSize(candList) < 2 || FcitxInputStateGetIsInRemind(input)) return IRV_DO_NOTHING; tbl->bIsTableAdjustOrder = true; @@ -482,7 +507,7 @@ FcitxMessagesAddMessageAtLast(FcitxInputStateGetAuxUp(input), MSG_TIPS, _("Choose the phrase to be put in the front, Press Escape to Cancel")); retVal = IRV_DISPLAY_MESSAGE; } else if (FcitxHotkeyIsHotKey(sym, state, tbl->hkTableDelPhrase)) { - if (!FcitxCandidateWordPageCount(FcitxInputStateGetCandidateList(input)) || FcitxInputStateGetIsInRemind(input)) + if (!FcitxCandidateWordPageCount(candList) || FcitxInputStateGetIsInRemind(input)) return IRV_DO_NOTHING; tbl->bIsTableDelPhrase = true; @@ -499,19 +524,30 @@ strCodeInput[FcitxInputStateGetRawInputBufferSize(input)] = '\0'; if (FcitxInputStateGetRawInputBufferSize(input) == 1 && strCodeInput[0] == table->cPinyin && table->bUsePY) { - FcitxCandidateWordReset(FcitxInputStateGetCandidateList(input)); + FcitxCandidateWordReset(candList); retVal = IRV_DISPLAY_LAST; } else if (FcitxInputStateGetRawInputBufferSize(input)) retVal = IRV_DISPLAY_CANDWORDS; else retVal = IRV_CLEAN; - } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_SPACE)) { + } else if (FcitxHotkeyIsHotKey(sym, state, table->hkCommitKey)) { if (FcitxInputStateGetRawInputBufferSize(input) == 1 && strCodeInput[0] == table->cPinyin && table->bUsePY) retVal = IRV_COMMIT_STRING; else { - retVal = FcitxCandidateWordChooseByIndex(FcitxInputStateGetCandidateList(input), 0); - if (retVal == IRV_TO_PROCESS) + if (FcitxCandidateWordPageCount(candList) == 0 && table->bCommitKeyCommitWhenNoMatch) { + FcitxInstanceCommitString(instance, FcitxInstanceGetCurrentIC(instance), FcitxInputStateGetRawInputBuffer(input)); + FcitxInputStateSetRawInputBufferSize(input, 0); + FcitxInputStateGetRawInputBuffer(input)[0] = '\0'; + FcitxInputStateSetIsInRemind(input, false); + FcitxInstanceCleanInputWindow(instance); + FcitxUIUpdateInputWindow(instance); retVal = IRV_DO_NOTHING; + } + else { + retVal = FcitxCandidateWordChooseByIndex(candList, 0); + if (retVal == IRV_TO_PROCESS) + retVal = IRV_DO_NOTHING; + } } } else { return IRV_TO_PROCESS; @@ -548,7 +584,7 @@ UpdateHZLastInput(table, FcitxInputStateGetOutputString(input)); if (tbl->pCurCandRecord) - TableUpdateHitFrequency(table->tableDict, tbl->pCurCandRecord); + TableUpdateHitFrequency(table, tbl->pCurCandRecord); } return retVal; @@ -577,7 +613,6 @@ else tbl->pCurCandRecord = (RECORD *)NULL; - table->tableDict->iTableChanged++; if (table->tableDict->iTableChanged >= TABLE_AUTO_SAVE_AFTER) SaveTableDict(table); @@ -700,6 +735,7 @@ RECORD *recTemp; FcitxInstance *instance = tbl->owner; FcitxInputState *input = FcitxInstanceGetInputState(instance); + FcitxCandidateWordList* candList = FcitxInputStateGetCandidateList(input); if (FcitxInputStateGetRawInputBuffer(input)[0] == '\0') return IRV_TO_PROCESS; @@ -718,7 +754,10 @@ FcitxMessagesSetMessageCount(FcitxInputStateGetPreedit(input), 0); FcitxMessagesSetMessageCount(FcitxInputStateGetClientPreedit(input), 0); FcitxMessagesAddMessageAtLast(FcitxInputStateGetPreedit(input), MSG_INPUT, "%s", FcitxInputStateGetRawInputBuffer(input)); - FcitxMessagesAddMessageAtLast(FcitxInputStateGetClientPreedit(input), MSG_INPUT | MSG_DONOT_COMMIT_WHEN_UNFOCUS, "%s", FcitxInputStateGetRawInputBuffer(input)); + FcitxMessageType type = MSG_INPUT; + if (!table->bSendRawPreedit) + type |= MSG_DONOT_COMMIT_WHEN_UNFOCUS; + FcitxMessagesAddMessageAtLast(FcitxInputStateGetClientPreedit(input), type, "%s", FcitxInputStateGetRawInputBuffer(input)); FcitxInputStateSetCursorPos(input, strlen(FcitxInputStateGetRawInputBuffer(input))); FcitxInputStateSetClientCursorPos(input, 0); } @@ -805,7 +844,7 @@ candWord.extraType = MSG_CODE; } - FcitxCandidateWordAppend(FcitxInputStateGetCandidateList(input), &candWord); + FcitxCandidateWordAppend(candList, &candWord); } utarray_clear(&candTemp); @@ -833,34 +872,45 @@ candWord.strExtra = NULL; candWord.wordType = MSG_USERPHR; - FcitxCandidateWordAppend(FcitxInputStateGetCandidateList(input), &candWord); + FcitxCandidateWordAppend(candList, &candWord); } utarray_done(&candTemp); - if (FcitxInputStateGetRawInputBufferSize(input)) { - FcitxMessagesSetMessageCount(FcitxInputStateGetPreedit(input), 0); - FcitxMessagesSetMessageCount(FcitxInputStateGetClientPreedit(input), 0); - FcitxMessagesAddMessageAtLast(FcitxInputStateGetPreedit(input), MSG_INPUT, "%s", FcitxInputStateGetRawInputBuffer(input)); - FcitxMessagesAddMessageAtLast(FcitxInputStateGetClientPreedit(input), MSG_INPUT | MSG_DONOT_COMMIT_WHEN_UNFOCUS, "%s", FcitxInputStateGetRawInputBuffer(input)); - FcitxInputStateSetCursorPos(input, strlen(FcitxInputStateGetRawInputBuffer(input))); - FcitxInputStateSetClientCursorPos(input, 0); - } - INPUT_RETURN_VALUE retVal = IRV_DISPLAY_CANDWORDS; - if (table->iTableAutoSendToClient && (FcitxInputStateGetRawInputBufferSize(input) >= table->iTableAutoSendToClient)) { - if (FcitxCandidateWordGetCurrentWindowSize(FcitxInputStateGetCandidateList(input)) == 1) { //如果只有一个候选词,则送到客户程序中 - FcitxCandidateWord* candWord = FcitxCandidateWordGetCurrentWindow(FcitxInputStateGetCandidateList(input)); + if (table->bUseAutoSend && table->iTableAutoSendToClient && (FcitxInputStateGetRawInputBufferSize(input) >= table->iTableAutoSendToClient)) { + if (FcitxCandidateWordGetCurrentWindowSize(candList) == 1) { //如果只有一个候选词,则送到客户程序中 + FcitxCandidateWord* candWord = FcitxCandidateWordGetCurrentWindow(candList); if (candWord->owner == table) { TABLECANDWORD* tableCandWord = candWord->priv; if (tableCandWord->flag != CT_AUTOPHRASE || (tableCandWord->flag == CT_AUTOPHRASE && !table->iSaveAutoPhraseAfter)) if (!(tableCandWord->flag == CT_NORMAL && tableCandWord->candWord.record->type == RECORDTYPE_PINYIN)) - retVal = FcitxCandidateWordChooseByIndex(FcitxInputStateGetCandidateList(input), 0); + retVal = FcitxCandidateWordChooseByIndex(candList, 0); } } } + if (FcitxInputStateGetRawInputBufferSize(input)) { + FcitxMessagesSetMessageCount(FcitxInputStateGetPreedit(input), 0); + FcitxMessagesAddMessageAtLast(FcitxInputStateGetPreedit(input), MSG_INPUT, "%s", FcitxInputStateGetRawInputBuffer(input)); + FcitxInputStateSetCursorPos(input, strlen(FcitxInputStateGetRawInputBuffer(input))); + FcitxCandidateWord* candWord = NULL; + if (table->bFirstCandidateAsPreedit && (candWord = FcitxCandidateWordGetFirst(candList))) { + FcitxMessagesSetMessageCount(FcitxInputStateGetClientPreedit(input), 0); + FcitxMessagesAddMessageAtLast(FcitxInputStateGetClientPreedit(input), MSG_INPUT, "%s", candWord->strWord); + FcitxInputStateSetClientCursorPos(input, 0); + } + else { + FcitxMessagesSetMessageCount(FcitxInputStateGetClientPreedit(input), 0); + FcitxMessageType type = MSG_INPUT; + if (!table->bSendRawPreedit) + type |= MSG_DONOT_COMMIT_WHEN_UNFOCUS; + FcitxMessagesAddMessageAtLast(FcitxInputStateGetClientPreedit(input), type, "%s", FcitxInputStateGetRawInputBuffer(input)); + FcitxInputStateSetClientCursorPos(input, 0); + } + } + return retVal; } @@ -1148,6 +1198,8 @@ if (!table) return; FcitxConfigFreeConfigFile(table->config.configFile); + FcitxHotkeyFree(table->hkAlternativePrevPage); + FcitxHotkeyFree(table->hkAlternativeNextPage); free(table->strPath); free(table->strSymbolFile); free(table->uniqueName); @@ -1156,6 +1208,7 @@ free(table->strEndCode); free(table->strSymbol); free(table->strChoose); + fcitx_utils_free(table->confName); } int TableCandCmp(const void* a, const void* b, void *arg) @@ -1185,4 +1238,71 @@ return 0; } +INPUT_RETURN_VALUE TableKeyBlocker(void* arg, FcitxKeySym sym, unsigned int state) +{ + TableMetaData* table = arg; + FcitxInstance* instance = table->owner->owner; + FcitxInputState* input = FcitxInstanceGetInputState(instance); + + do { + if (!table->bCommitAndPassByInvalidKey) + break; + if (!FcitxHotkeyIsHotKeySimple(sym, state)) + break; + + if (FcitxCandidateWordPageCount(FcitxInputStateGetCandidateList(input))) { + FcitxCandidateWord* candWord = FcitxCandidateWordGetCurrentWindow(FcitxInputStateGetCandidateList(input)); + if (candWord->owner != table) + break; + TABLECANDWORD* tableCandWord = candWord->priv; + if (tableCandWord->flag == CT_AUTOPHRASE) + break; + INPUT_RETURN_VALUE ret = TableGetCandWord(table, candWord); + if (!(ret & IRV_FLAG_PENDING_COMMIT_STRING)) + break; + FcitxInstanceCommitString(instance, FcitxInstanceGetCurrentIC(instance), FcitxInputStateGetOutputString(input)); + } + else if (table->bSendRawPreedit) { + FcitxInstanceCommitString(instance, FcitxInstanceGetCurrentIC(instance), FcitxInputStateGetRawInputBuffer(input)); + } + FcitxInputStateSetRawInputBufferSize(input, 0); + FcitxInputStateGetRawInputBuffer(input)[0] = '\0'; + FcitxInputStateSetIsInRemind(input, false); + FcitxInstanceCleanInputWindow(instance); + FcitxUIUpdateInputWindow(instance); + return IRV_FLAG_FORWARD_KEY; + } while (0); + return FcitxStandardKeyBlocker(input, sym, state); +} + +/* we should try not to break the existing on even if the config file is not exist anymore */ +void ReloadTableConfig(void* arg) +{ + TableMetaData* table = arg; + size_t len = 0; + int i = 0; + char** tablePath = FcitxXDGGetPathWithPrefix(&len, "table"); + + char **paths = fcitx_utils_malloc0(sizeof(char*) * len); + for (i = 0; i < len ; i ++) + paths[i] = NULL; + + for (i = len - 1; i >= 0; i--) { + asprintf(&paths[i], "%s/%s", tablePath[len - i - 1], table->confName); + FcitxLog(DEBUG, "Load Table Config File:%s", paths[i]); + } + FcitxConfigFile* cfile = FcitxConfigParseMultiConfigFile(paths, len, GetTableConfigDesc()); + if (cfile) { + TableMetaDataConfigBind(table, cfile, GetTableConfigDesc()); + FcitxConfigBindSync((FcitxGenericConfig*)table); + } + for (i = 0; i < len ; i ++) { + free(paths[i]); + paths[i] = NULL; + } + + free(paths); + FcitxXDGFreePath(tablePath); +} + // kate: indent-mode cstyle; space-indent on; indent-width 0; diff -Nru fcitx-4.2.2/src/im/table/tableconfig.c fcitx-4.2.4.1/src/im/table/tableconfig.c --- fcitx-4.2.2/src/im/table/tableconfig.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/im/table/tableconfig.c 2012-06-10 14:34:48.000000000 +0000 @@ -31,12 +31,15 @@ CONFIG_BINDING_REGISTER("CodeTable", "Priority", iPriority) CONFIG_BINDING_REGISTER("CodeTable", "UsePY", bUsePY) CONFIG_BINDING_REGISTER("CodeTable", "PYKey", cPinyin) +CONFIG_BINDING_REGISTER("CodeTable", "UseAutoSend", bUseAutoSend) CONFIG_BINDING_REGISTER("CodeTable", "AutoSend", iTableAutoSendToClient) CONFIG_BINDING_REGISTER("CodeTable", "NoneMatchAutoSend", iTableAutoSendToClientWhenNone) +CONFIG_BINDING_REGISTER("CodeTable", "SendRawPreedit", bSendRawPreedit) CONFIG_BINDING_REGISTER("CodeTable", "EndKey", strEndCode) CONFIG_BINDING_REGISTER("CodeTable", "UseMatchingKey", bUseMatchingKey) CONFIG_BINDING_REGISTER("CodeTable", "MatchingKey", cMatchingKey) CONFIG_BINDING_REGISTER("CodeTable", "ExactMatch", bTableExactMatch) +CONFIG_BINDING_REGISTER("CodeTable", "NoMatchDontCommit", bNoMatchDontCommit) CONFIG_BINDING_REGISTER("CodeTable", "AutoPhrase", bAutoPhrase) CONFIG_BINDING_REGISTER("CodeTable", "AutoPhraseLength", iAutoPhraseLength) CONFIG_BINDING_REGISTER("CodeTable", "AutoPhrasePhrase", bAutoPhrasePhrase) @@ -48,6 +51,14 @@ CONFIG_BINDING_REGISTER("CodeTable", "LangCode", langCode) CONFIG_BINDING_REGISTER("CodeTable", "KeyboardLayout", kbdlayout) CONFIG_BINDING_REGISTER("CodeTable", "UseCustomPrompt", customPrompt) +CONFIG_BINDING_REGISTER("CodeTable", "UseAlternativePageKey", bUseAlternativePageKey) +CONFIG_BINDING_REGISTER("CodeTable", "AlternativePrevPage", hkAlternativePrevPage) +CONFIG_BINDING_REGISTER("CodeTable", "AlternativeNextPage", hkAlternativeNextPage) +CONFIG_BINDING_REGISTER("CodeTable", "FirstCandidateAsPreedit", bFirstCandidateAsPreedit) +CONFIG_BINDING_REGISTER("CodeTable", "CommitAndPassByInvalidKey", bCommitAndPassByInvalidKey) +CONFIG_BINDING_REGISTER("CodeTable", "CommitKey", hkCommitKey) +CONFIG_BINDING_REGISTER("CodeTable", "CommitKeyCommitWhenNoMatch", bCommitKeyCommitWhenNoMatch) +CONFIG_BINDING_REGISTER("CodeTable", "IgnorePunc", bIgnorePunc) CONFIG_BINDING_REGISTER("CodeTable", "Enabled", bEnabled) CONFIG_BINDING_END() diff -Nru fcitx-4.2.2/src/im/table/table.desc fcitx-4.2.4.1/src/im/table/table.desc --- fcitx-4.2.2/src/im/table/table.desc 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/im/table/table.desc 2012-06-10 14:34:48.000000000 +0000 @@ -37,18 +37,28 @@ [CodeTable/PYKey] Description=Pinyin Key Type=Char -DefaultValue=@ +DefaultValue= + +[CodeTable/UseAutoSend] +Description=Auto Send Candidate Word +Type=Boolean +DefaultValue=True [CodeTable/AutoSend] -Description=Auto Send Candidate Word to Client +Description=Minimum length trigger auto send candidate word when only one candidate Type=Integer DefaultValue=-1 [CodeTable/NoneMatchAutoSend] -Description=Auto Send Candidate Word if no match in Code Table +Description=Minimum length trigger auto send candidate when there will be no candidate Type=Integer DefaultValue=-1 +[CodeTable/SendRawPreedit] +Description=Send Raw Preedit +Type=Boolean +DefaultValue=False + [CodeTable/EndKey] Description=End Key Type=String @@ -73,6 +83,11 @@ Type=Boolean DefaultValue=True +[CodeTable/NoMatchDontCommit] +Description=Keep current buffer when there is no match item and input length is equal code length +Type=Boolean +DefaultValue=False + [CodeTable/AutoPhraseLength] Description=Auto Phrase Length Type=Integer @@ -127,5 +142,45 @@ Type=String DefaultValue=us +[CodeTable/UseAlternativePageKey] +Description=Alternative Prev Page Key +Type=Boolean +DefaultValue=False + +[CodeTable/AlternativePrevPage] +Description=Alternative Prev Page Key +Type=Hotkey +DefaultValue= + +[CodeTable/AlternativeNextPage] +Description=Alternative Next Page Key +Type=Hotkey +DefaultValue= + +[CodeTable/FirstCandidateAsPreedit] +Description=First Candidate Display as Preedit +Type=Boolean +DefaultValue=True + +[CodeTable/CommitAndPassByInvalidKey] +Description=Commit and pass when invalid key of this table pressed +Type=Boolean +DefaultValue=False + +[CodeTable/CommitKey] +Description=Commit key for select first candidate +Type=Hotkey +DefaultValue=SPACE + +[CodeTable/CommitKeyCommitWhenNoMatch] +Description=Commit string when there is no match +Type=Boolean +DefaultValue=False + +[CodeTable/IgnorePunc] +Description=Ignore Punctuation +Type=Boolean +DefaultValue=False + [DescriptionFile] LocaleDomain=fcitx diff -Nru fcitx-4.2.2/src/im/table/tabledict.c fcitx-4.2.4.1/src/im/table/tabledict.c --- fcitx-4.2.2/src/im/table/tabledict.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/im/table/tabledict.c 2012-06-10 14:34:48.000000000 +0000 @@ -16,7 +16,7 @@ boolean LoadTableDict(TableMetaData* tableMetaData) { char strCode[MAX_CODE_LENGTH + 1]; - char strHZ[PHRASE_MAX_LENGTH * UTF8_MAX_LENGTH + 1]; + char *strHZ = 0; FILE *fpDict; RECORD *recTemp; unsigned int i = 0; @@ -101,9 +101,14 @@ } iRecordIndex = 0; + size_t bufSize = 0; for (i = 0; i < tableDict->iRecordCount; i++) { fread(strCode, sizeof(char), tableDict->iPYCodeLength + 1, fpDict); fread(&iTemp, sizeof(unsigned int), 1, fpDict); + if (iTemp > bufSize) { + bufSize = iTemp; + strHZ = realloc(strHZ, bufSize); + } fread(strHZ, sizeof(char), iTemp, fpDict); recTemp = (RECORD *) fcitx_memory_pool_alloc(tableDict->pool, sizeof(RECORD)); recTemp->strCode = (char *) fcitx_memory_pool_alloc(tableDict->pool, sizeof(char) * (tableDict->iPYCodeLength + 1)); @@ -138,7 +143,7 @@ tableSingleHZ = tableDict->tableSingleHZ; else if (recTemp->type == RECORDTYPE_CONSTRUCT) tableSingleHZ = tableDict->tableSingleHZCons; - + if (tableSingleHZ) { iTemp = CalHZIndex(recTemp->strHZ); if (iTemp < SINGLE_HZ_COUNT) { @@ -153,14 +158,16 @@ if (recTemp->type == RECORDTYPE_PINYIN) tableDict->bHasPinyin = true; - + if (recTemp->type == RECORDTYPE_PROMPT && strlen(recTemp->strCode) == 1) tableDict->promptCode[(uint8_t) recTemp->strCode[0]] = recTemp; - + tableDict->currentRecord->next = recTemp; recTemp->prev = tableDict->currentRecord; tableDict->currentRecord = recTemp; } + if (strHZ) + free(strHZ); tableDict->currentRecord->next = tableDict->recordHead; tableDict->recordHead->prev = tableDict->currentRecord; @@ -457,6 +464,7 @@ tableDict->insertPoint->iSelected = 0; tableDict->insertPoint = tableDict->insertPoint->next; } + tableDict->iTableChanged++; _next: continue; @@ -489,7 +497,7 @@ if (tableDict->rule[i].iWords == i2 && tableDict->rule[i].iFlag == i1) break; } - + if (i == tableDict->iCodeLength - 1) return true; @@ -507,7 +515,7 @@ } int hzIndex = CalHZIndex(strTemp); - + if (tableDict->tableSingleHZ[hzIndex]) { if (tableDict->tableSingleHZCons[hzIndex]) recTemp = tableDict->tableSingleHZCons[hzIndex]; @@ -577,6 +585,7 @@ dictNew->next = insertPoint; tableDict->iRecordCount++; + tableDict->iTableChanged++; } /* @@ -603,12 +612,16 @@ */ tableDict->iRecordCount--; + tableDict->iTableChanged++; } -void TableUpdateHitFrequency(TableDict* tableDict, RECORD * record) +void TableUpdateHitFrequency(TableMetaData* tableMetaData, RECORD * record) { - record->iHit++; - record->iIndex = ++tableDict->iTableIndex; + if (tableMetaData->tableOrder != AD_NO) { + tableMetaData->tableDict->iTableChanged++; + record->iHit++; + record->iIndex = ++tableMetaData->tableDict->iTableIndex; + } } int TableCompareCode(const TableMetaData* tableMetaData, const char *strUser, const char *strDict) diff -Nru fcitx-4.2.2/src/im/table/tabledict.h fcitx-4.2.4.1/src/im/table/tabledict.h --- fcitx-4.2.2/src/im/table/tabledict.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/im/table/tabledict.h 2012-06-10 14:34:48.000000000 +0000 @@ -1,9 +1,10 @@ #ifndef TABLEDICT_H #define TABLEDICT_H -#include -#include -#include +#include "fcitx-utils/utf8.h" +#include "fcitx-config/fcitx-config.h" +#include "fcitx-config/hotkey.h" +#include "fcitx-utils/memory.h" #define MAX_CODE_LENGTH 30 #define PHRASE_MAX_LENGTH 10 @@ -80,6 +81,7 @@ char cPinyin; //输入该键后,表示进入临时拼音状态 int iTableAutoSendToClient; //自动上屏 int iTableAutoSendToClientWhenNone; //空码自动上屏 + boolean bSendRawPreedit; char *strEndCode; //中止键,按下该键相当于输入该键后再按一个空格 boolean bUseMatchingKey; //是否模糊匹配 char cMatchingKey; @@ -89,16 +91,27 @@ int iAutoPhraseLength; //自动造词长度 int iSaveAutoPhraseAfter; //选择N次后保存自动词组,0-不保存,1-立即保存 boolean bPromptTableCode; //输入完毕后是否提示编码 + boolean bNoMatchDontCommit; char *strSymbol; char *strSymbolFile; char *strChoose; //设置选择键 char *langCode; char *kbdlayout; boolean customPrompt; + boolean bUseAlternativePageKey; + boolean bFirstCandidateAsPreedit; + boolean bCommitAndPassByInvalidKey; + boolean bCommitKeyCommitWhenNoMatch; + boolean bIgnorePunc; + FcitxHotkey hkAlternativePrevPage[2]; + FcitxHotkey hkAlternativeNextPage[2]; + FcitxHotkey hkCommitKey[2]; boolean bEnabled; struct _FcitxTableState* owner; struct _TableDict* tableDict; + boolean bUseAutoSend; + char* confName; } TableMetaData; typedef struct _TableDict { @@ -141,7 +154,7 @@ RECORD *TableHasPhrase(const TableDict* tableDict, const char *strCode, const char *strHZ); void TableDelPhraseByHZ(TableDict* tableDict, const char *strHZ); void TableDelPhrase(TableDict* tableDict, RECORD * record); -void TableUpdateHitFrequency(TableDict* tableDict, RECORD * record); +void TableUpdateHitFrequency(TableMetaData* tableMetaData, RECORD * record); int TableCompareCode(const TableMetaData* tableMetaData, const char *strUser, const char *strDict); int TableFindFirstMatchCode(TableMetaData* tableMetaData, const char* strCodeInput); void TableResetFlags(TableDict* tableDict); diff -Nru fcitx-4.2.2/src/im/table/table.h fcitx-4.2.4.1/src/im/table/table.h --- fcitx-4.2.2/src/im/table/table.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/im/table/table.h 2012-06-10 14:34:48.000000000 +0000 @@ -79,8 +79,9 @@ } FcitxTableState; void LoadTableInfo(FcitxTableState* tbl); -boolean TableInit(void* arg); +boolean TableInit(void* arg); void SaveTableIM(void* arg); +void ReloadTableConfig(void* arg); INPUT_RETURN_VALUE DoTableInput(void* arg, FcitxKeySym sym, unsigned int state); INPUT_RETURN_VALUE TableGetCandWords(void* arg); @@ -99,7 +100,6 @@ INPUT_RETURN_VALUE _TableGetCandWord(TableMetaData* table, TABLECANDWORD* tableCandWord, boolean _bRemind); INPUT_RETURN_VALUE TableGetCandWord(void* arg, FcitxCandidateWord* candWord); boolean TablePhraseTips(void* arg); -void TableSetCandWordsFlag(TableMetaData* table, int iCount, boolean flag); void UpdateHZLastInput(TableMetaData* table, char* str); diff -Nru fcitx-4.2.2/src/lib/CMakeLists.txt fcitx-4.2.4.1/src/lib/CMakeLists.txt --- fcitx-4.2.2/src/lib/CMakeLists.txt 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/CMakeLists.txt 2012-06-10 14:34:48.000000000 +0000 @@ -1,3 +1,11 @@ add_subdirectory(fcitx-config) add_subdirectory(fcitx-utils) + + +if (_ENABLE_DBUS) + PKG_CHECK_MODULES(GIO2 "gio-2.0 >= 2.26") + if (GIO2_FOUND) + add_subdirectory(fcitx-gclient) + endif (GIO2_FOUND) +endif (_ENABLE_DBUS) add_subdirectory(fcitx) \ No newline at end of file diff -Nru fcitx-4.2.2/src/lib/fcitx/addon.c fcitx-4.2.4.1/src/lib/fcitx/addon.c --- fcitx-4.2.2/src/lib/fcitx/addon.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/addon.c 2012-06-10 14:34:48.000000000 +0000 @@ -51,6 +51,7 @@ CONFIG_BINDING_REGISTER("Addon", "IMRegisterMethod", registerMethod) CONFIG_BINDING_REGISTER("Addon", "IMRegisterArgument", registerArgument) CONFIG_BINDING_REGISTER("Addon", "UIFallback", uifallback) +CONFIG_BINDING_REGISTER("Addon", "Advance", advance) CONFIG_BINDING_END() static const UT_icd function_icd = {sizeof(void*), 0, 0 , 0}; @@ -127,28 +128,23 @@ UT_array* addons = &instance->addons; boolean remove = true; FcitxAddon *addon; - FcitxAddon *uiaddon = NULL; + FcitxAddon *uiaddon = NULL, *uifallbackaddon = NULL; /* choose ui */ - boolean founduiflag = false; for (addon = (FcitxAddon *) utarray_front(addons); addon != NULL; addon = (FcitxAddon *) utarray_next(addons, addon)) { if (addon->category == AC_UI) { if (instance->uiname == NULL) { if (addon->bEnabled) { - if (!founduiflag) { - uiaddon = addon; - founduiflag = true; - } else - addon->bEnabled = false; + uiaddon = addon; + break; } } else { - if (strcmp(instance->uiname, addon->name) != 0) - addon->bEnabled = false; - else { - uiaddon = addon; + if (strcmp(instance->uiname, addon->name) == 0) { addon->bEnabled = true; + uiaddon = addon; + break; } } } @@ -158,8 +154,7 @@ for (addon = (FcitxAddon *) utarray_front(addons); addon != NULL; addon = (FcitxAddon *) utarray_next(addons, addon)) { - if (addon->category == AC_UI && strcmp(uiaddon->uifallback, addon->name) == 0) { - addon->bEnabled = true; + if (addon->category == AC_UI && addon->bEnabled && strcmp(uiaddon->uifallback, addon->name) == 0) { FcitxAddon temp; int uiidx = utarray_eltidx(addons, uiaddon); int fallbackidx = utarray_eltidx(addons, addon); @@ -167,12 +162,27 @@ temp = *uiaddon; *uiaddon = *addon; *addon = temp; + + /* they swapped, addon is normal ui, and ui addon is fallback */ + uifallbackaddon = uiaddon; + uiaddon = addon; + } + else { + uifallbackaddon = addon; } break; } } } + for (addon = (FcitxAddon *) utarray_front(addons); + addon != NULL; + addon = (FcitxAddon *) utarray_next(addons, addon)) { + if (addon->category == AC_UI && addon != uiaddon && addon != uifallbackaddon) { + addon->bEnabled = false; + } + } + while (remove) { remove = false; for (addon = (FcitxAddon *) utarray_front(addons); diff -Nru fcitx-4.2.2/src/lib/fcitx/addon.h fcitx-4.2.4.1/src/lib/fcitx/addon.h --- fcitx-4.2.2/src/lib/fcitx/addon.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/addon.h 2012-06-10 14:34:48.000000000 +0000 @@ -106,8 +106,12 @@ char* registerArgument; /**< extra argument for register, unused for now */ char* uifallback; /**< if's a user interface addon, the fallback UI addon name */ struct _FcitxInstance* owner; /**< upper pointer to instance */ + union { + boolean advance; /**< a hint for GUI */ + void* dummy; + }; - void* padding[9]; /**< padding */ + void* padding[8]; /**< padding */ } FcitxAddon; /** diff -Nru fcitx-4.2.2/src/lib/fcitx/candidate.c fcitx-4.2.4.1/src/lib/fcitx/candidate.c --- fcitx-4.2.2/src/lib/fcitx/candidate.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/candidate.c 2012-06-10 14:34:48.000000000 +0000 @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2011~2011 by CSSlayer * + * Copyright (C) 2011~2012 by CSSlayer * * wengxt@gmail.com * * * * This program is free software; you can redistribute it and/or modify * diff -Nru fcitx-4.2.2/src/lib/fcitx/candidate.h fcitx-4.2.4.1/src/lib/fcitx/candidate.h --- fcitx-4.2.2/src/lib/fcitx/candidate.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/candidate.h 2012-06-10 14:34:48.000000000 +0000 @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2011~2011 by CSSlayer * + * Copyright (C) 2011~2012 by CSSlayer * * wengxt@gmail.com * * * * This program is free software; you can redistribute it and/or modify * @@ -25,7 +25,7 @@ /** * @file candidate.h - * + * * Fcitx candidate word list related definition and function */ @@ -44,7 +44,7 @@ struct _FcitxCandidateWord; struct _FcitxCandidateWordList; - + /** fcitx candidate workd list */ typedef struct _FcitxCandidateWordList FcitxCandidateWordList; @@ -118,19 +118,19 @@ * @param candList candidate word list * @param candWord candidate word * @return void - * + * * @since 4.2 **/ void FcitxCandidateWordRemove(struct _FcitxCandidateWordList* candList, FcitxCandidateWord* candWord); - - + + /** * set page by index * * @param candList candidate word list * @param index candidate word * @return void - * + * * @since 4.2.1 **/ void FcitxCandidateWordSetFocus(struct _FcitxCandidateWordList* candList, int index); @@ -234,7 +234,7 @@ * @return void **/ void FcitxCandidateWordSetChoose(struct _FcitxCandidateWordList* candList, const char* strChoose); - + /** * set the select key string, length up to 10, usually "1234567890" * @@ -252,8 +252,8 @@ * @return void **/ const char* FcitxCandidateWordGetChoose(struct _FcitxCandidateWordList* candList); - - + + /** * get select key state * diff -Nru fcitx-4.2.2/src/lib/fcitx/configfile.c fcitx-4.2.4.1/src/lib/fcitx/configfile.c --- fcitx-4.2.2/src/lib/fcitx/configfile.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/configfile.c 2012-06-10 14:34:48.000000000 +0000 @@ -31,16 +31,12 @@ #include "instance.h" static FcitxConfigFileDesc* GetConfigDesc(); -static void FilterSwitchKey(FcitxGenericConfig* config, FcitxConfigGroup *group, FcitxConfigOption *option, void* value, FcitxConfigSync sync, void* arg); static void Filter2nd3rdKey(FcitxGenericConfig* config, FcitxConfigGroup* group, FcitxConfigOption* option, void* value, FcitxConfigSync sync, void* arg); -static void FilterFirstAsInactive(FcitxGenericConfig* config, FcitxConfigGroup* group, FcitxConfigOption* option, void* value, FcitxConfigSync sync, void* arg); CONFIG_BINDING_BEGIN(FcitxGlobalConfig) CONFIG_BINDING_REGISTER("Program", "DelayStart", iDelayStart) -CONFIG_BINDING_REGISTER("Program", "FirstRun", bFirstRun) CONFIG_BINDING_REGISTER("Program", "ShareStateAmongWindow", shareState) CONFIG_BINDING_REGISTER("Program", "DefaultInputMethodState", _defaultIMState) -CONFIG_BINDING_REGISTER_WITH_FILTER("Program", "FirstAsInactive", firstAsInactive, FilterFirstAsInactive) CONFIG_BINDING_REGISTER("Output", "HalfPuncAfterNumber", bEngPuncAfterNumber) CONFIG_BINDING_REGISTER("Output", "EnterAction", enterToDo) CONFIG_BINDING_REGISTER("Output", "RemindModeDisablePaging", bDisablePagingInRemind) @@ -49,14 +45,16 @@ CONFIG_BINDING_REGISTER("Output", "PhraseTips", bPhraseTips) CONFIG_BINDING_REGISTER("Output", "DontCommitPreeditWhenUnfocus", bDontCommitPreeditWhenUnfocus) CONFIG_BINDING_REGISTER("Appearance", "ShowInputWindowAfterTriggering", bShowInputWindowTriggering) -CONFIG_BINDING_REGISTER("Appearance", "ShowPointAfterIndex", bPointAfterNumber) CONFIG_BINDING_REGISTER("Appearance", "ShowInputSpeed", bShowUserSpeed) CONFIG_BINDING_REGISTER("Appearance", "ShowVersion", bShowVersion) CONFIG_BINDING_REGISTER("Appearance", "HideInputWindowWhenOnlyPreeditString", bHideInputWindowWhenOnlyPreeditString); CONFIG_BINDING_REGISTER("Appearance", "HideInputWindowWhenOnlyOneCandidate", bHideInputWindowWhenOnlyOneCandidate); CONFIG_BINDING_REGISTER("Hotkey", "TriggerKey", hkTrigger) +CONFIG_BINDING_REGISTER("Hotkey", "ActivateKey", hkActivate) +CONFIG_BINDING_REGISTER("Hotkey", "InactivateKey", hkInactivate) CONFIG_BINDING_REGISTER("Hotkey", "IMSwitchKey", bIMSwitchKey) -CONFIG_BINDING_REGISTER_WITH_FILTER("Hotkey", "SwitchKey", iSwitchKey, FilterSwitchKey) +CONFIG_BINDING_REGISTER("Hotkey", "IMSwitchHotkey", iIMSwitchKey) +CONFIG_BINDING_REGISTER("Hotkey", "SwitchKey", iSwitchKey) CONFIG_BINDING_REGISTER("Hotkey", "DoubleSwitchKey", bDoubleSwitchKey) CONFIG_BINDING_REGISTER("Hotkey", "TimeInterval", iTimeInterval) CONFIG_BINDING_REGISTER("Hotkey", "VKSwitchKey", hkVK) @@ -112,58 +110,6 @@ } } -void FilterSwitchKey(FcitxGenericConfig* config, FcitxConfigGroup* group, FcitxConfigOption* option, void* value, FcitxConfigSync sync, void* arg) -{ - FCITX_UNUSED(group); - FCITX_UNUSED(option); - FCITX_UNUSED(arg); - FcitxGlobalConfig* fc = (FcitxGlobalConfig*) config; - FcitxHotkey* hkey = NULL; - if (sync == Raw2Value) { - FcitxSwitchKey *s = (FcitxSwitchKey*)value; - switch (*s) { - case SWITCHKEY_R_CTRL: - hkey = FCITX_RCTRL; - break; - case SWITCHKEY_R_SHIFT: - hkey = FCITX_RSHIFT; - break; - case SWITCHKEY_L_SHIFT: - hkey = FCITX_LSHIFT; - break; - case SWITCHKEY_L_CTRL: - hkey = FCITX_LCTRL; - break; - case SWITCHKEY_ALT_L_SHIFT: - hkey = FCITX_ALT_LSHIFT; - break; - case SWITCHKEY_ALT_R_SHIFT: - hkey = FCITX_ALT_RSHIFT; - break; - case SWITCHKEY_None: - hkey = FCITX_NONE_KEY; - } - } - if (hkey != NULL) { - fc->switchKey[0] = hkey[0]; - fc->switchKey[1] = hkey[1]; - } -} - -void FilterFirstAsInactive(FcitxGenericConfig* config, FcitxConfigGroup* group, FcitxConfigOption* option, void* value, FcitxConfigSync sync, void* arg) -{ - FCITX_UNUSED(group); - FCITX_UNUSED(option); - FCITX_UNUSED(arg); - FcitxGlobalConfig* fc = (FcitxGlobalConfig*) config; - if (sync == Raw2Value) { - fc->defaultIMState = fc->_defaultIMState; - boolean firstAsInactive = *(boolean*) value; - if (firstAsInactive && fc->defaultIMState == IS_CLOSED) - fc->defaultIMState = IS_INACTIVE; - } -} - FCITX_EXPORT_API boolean FcitxGlobalConfigLoad(FcitxGlobalConfig* fc) { @@ -172,6 +118,9 @@ if (configDesc == NULL) return false; + /* removed option */ + fc->bPointAfterNumber = true; + FILE *fp; char *file; boolean newconfig = false; @@ -188,6 +137,11 @@ FcitxGlobalConfigConfigBind(fc, cfile, configDesc); FcitxConfigBindSync((FcitxGenericConfig*)fc); + if (fc->_defaultIMState == 0) { + fc->defaultIMState = IS_INACTIVE; + } + else + fc->defaultIMState = IS_ACTIVE; if (newconfig) { char *p = fcitx_utils_get_current_langcode(); diff -Nru fcitx-4.2.2/src/lib/fcitx/configfile.h fcitx-4.2.4.1/src/lib/fcitx/configfile.h --- fcitx-4.2.2/src/lib/fcitx/configfile.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/configfile.h 2012-06-10 14:34:48.000000000 +0000 @@ -35,6 +35,7 @@ extern "C" { #endif + /** switch key for active/inactive */ typedef enum _FcitxSwitchKey { SWITCHKEY_R_CTRL = 0, SWITCHKEY_R_SHIFT = 1, @@ -42,15 +43,25 @@ SWITCHKEY_L_CTRL = 3, SWITCHKEY_ALT_L_SHIFT = 4, SWITCHKEY_ALT_R_SHIFT = 5, - SWITCHKEY_None = 6 + SWITCHKEY_CTRL_BOTH = 6, + SWITCHKEY_SHIFT_BOTH = 7, + SWITCHKEY_None = 8 } FcitxSwitchKey; + /** switch key for change current input method */ + typedef enum _FcitxIMSwitchKey { + IMSWITCHKEY_CTRL_SHIFT = 0, + IMSWITCHKEY_ALT_SHIFT = 1 + } FcitxIMSwitchKey; + + /** action after press enter */ typedef enum _FcitxEnterAcion { K_ENTER_NOTHING = 0, K_ENTER_CLEAN = 1, K_ENTER_SEND = 2 } FcitxEnterAcion; + /** policy of how input method state is shared */ typedef enum _FcitxShareState { ShareState_None = 0, ShareState_All = 1, @@ -61,164 +72,56 @@ * struct opposite to ~/.config/fcitx/config **/ typedef struct _FcitxConfig { - /** - * derives FcitxGenericConfig - **/ - FcitxGenericConfig gconfig; - /* program config */ - /** - * delay start seconds - **/ - int iDelayStart; - /** - * is the first run - **/ - boolean bFirstRun; - - /* output config */ - /** - * input eng punc after input number - **/ - boolean bEngPuncAfterNumber; - /** - * enter key action - **/ - FcitxEnterAcion enterToDo; - /** - * Remind mode can has multipage - **/ - boolean bDisablePagingInRemind; - /** - * switch to english with switch key commit string or not - **/ - boolean bSendTextWhenSwitchEng; - /** - * max candidate word number - **/ - int iMaxCandWord; - /** - * phrase tips - **/ - boolean bPhraseTips; - - /* appearance config */ - /** - * show input window after trigger on - **/ - boolean bShowInputWindowTriggering; - /** - * index number follow with a '.' - **/ - boolean bPointAfterNumber; - /** - * show user input speed - **/ - boolean bShowUserSpeed; - /** - * show fcitx version - **/ - boolean bShowVersion; - - /* hotkey config */ - /** - * trigger key - **/ - FcitxHotkey hkTrigger[2]; - /** - * switch key - **/ - FcitxSwitchKey iSwitchKey; - /** - * hotkey format of switch key - **/ - FcitxHotkey switchKey[2]; - /** - * enable double press switch action - **/ - boolean bDoubleSwitchKey; - /** - * key hit interval - **/ - int iTimeInterval; - /** - * hotkey for switch VK - **/ - FcitxHotkey hkVK[2]; - /** - * hotkey for switch remind mode - **/ - FcitxHotkey hkRemind[2]; - /** - * hotkey for switch full width char - **/ - FcitxHotkey hkFullWidthChar[2]; - /** - * hotkey for switch punc - **/ - FcitxHotkey hkPunc[2]; - /** - * prev page - **/ - FcitxHotkey hkPrevPage[2]; - /** - * next page - **/ - FcitxHotkey hkNextPage[2]; - /** - * 2nd 3rd candidate select key - **/ - FcitxHotkey str2nd3rdCand[2]; - /** - * save all key - **/ - FcitxHotkey hkSaveAll[2]; - - /** - * hotkey format for 2nd select key - **/ - FcitxHotkey i2ndSelectKey[2]; - /** - * hotkey format for 3rd select key - **/ - FcitxHotkey i3rdSelectKey[2]; - - /** - * hide input window when there is only preedit string - **/ - boolean bHideInputWindowWhenOnlyPreeditString; - - /** - * hide input window when there is only one candidate word - **/ - boolean bHideInputWindowWhenOnlyOneCandidate; - - /** - * switch the preedit should show in client window or not - **/ - FcitxHotkey hkSwitchEmbeddedPreedit[2]; - - /** - * Input method use global shared state - **/ - FcitxShareState shareState; - - /** - * Input method enable by default - **/ - FcitxContextState defaultIMState; - - /** - * Enable Left Ctrl + Left Shift to Switch Between Input Method - **/ - boolean bIMSwitchKey; - - boolean firstAsInactive; /**< use first input method as inactive state */ - - FcitxContextState _defaultIMState; /**< default input method state */ + FcitxGenericConfig gconfig; /**< derives FcitxGenericConfig */ + int iDelayStart; /**< delay start seconds*/ + boolean dummy3; /**< dummy */ + boolean bEngPuncAfterNumber; /**< input eng punc after input number */ + FcitxEnterAcion enterToDo; /**< enter key action */ + boolean bDisablePagingInRemind; /**< Remind mode can has multipage */ + boolean bSendTextWhenSwitchEng; /**< switch to english with switch key commit string or not */ + int iMaxCandWord;/**< max candidate word number */ + boolean bPhraseTips;/**< phrase tips*/ + boolean bShowInputWindowTriggering;/**< show input window after trigger on*/ + boolean bPointAfterNumber;/**< index number follow with a '.'*/ + boolean bShowUserSpeed;/**< show user input speed*/ + boolean bShowVersion;/**< show fcitx version*/ + FcitxHotkey hkTrigger[2];/**< trigger key*/ + FcitxSwitchKey iSwitchKey;/**< switch key*/ + FcitxHotkey dummykey[2];/**< hotkey format of switch key*/ + boolean bDoubleSwitchKey;/**< enable double press switch action*/ + int iTimeInterval;/**< key hit interval*/ + FcitxHotkey hkVK[2];/**< hotkey for switch VK*/ + FcitxHotkey hkRemind[2];/**< hotkey for switch remind mode*/ + FcitxHotkey hkFullWidthChar[2];/**< hotkey for switch full width char*/ + FcitxHotkey hkPunc[2];/**< hotkey for switch punc*/ + FcitxHotkey hkPrevPage[2];/**< prev page*/ + FcitxHotkey hkNextPage[2];/**< next page*/ + FcitxHotkey str2nd3rdCand[2];/**< 2nd 3rd candidate select key*/ + FcitxHotkey hkSaveAll[2];/**< save all key*/ + FcitxHotkey i2ndSelectKey[2];/**< hotkey format for 2nd select key*/ + FcitxHotkey i3rdSelectKey[2];/**< hotkey format for 3rd select key*/ + boolean bHideInputWindowWhenOnlyPreeditString;/**< hide input window when there is only preedit string*/ + boolean bHideInputWindowWhenOnlyOneCandidate;/**< hide input window when there is only one candidate word*/ + FcitxHotkey hkSwitchEmbeddedPreedit[2];/**< switch the preedit should show in client window or not*/ + FcitxShareState shareState; /**< Input method use global shared state*/ + FcitxContextState defaultIMState; /**< Input method enable by default */ + boolean bIMSwitchKey; /**< Enable Left Ctrl + Left Shift to Switch Between Input Method */ + boolean dummy; /**< dummy */ + int _defaultIMState; /**< default input method state */ boolean bDontCommitPreeditWhenUnfocus; /**< commit preedit when unfocus or not */ + int iIMSwitchKey; /**< the type of input method switch key */ - int padding[60]; /**< padding */ + union { + FcitxHotkey hkActivate[2]; + int dummy1[8]; + }; + + union { + FcitxHotkey hkInactivate[2]; + int dummy2[8]; + }; + int padding[43]; /**< padding */ } FcitxGlobalConfig; /** @@ -228,6 +131,7 @@ * @return boolean load success or not **/ boolean FcitxGlobalConfigLoad(FcitxGlobalConfig* fc); + /** * save config * diff -Nru fcitx-4.2.2/src/lib/fcitx/context.c fcitx-4.2.4.1/src/lib/fcitx/context.c --- fcitx-4.2.2/src/lib/fcitx/context.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/context.c 2012-06-10 14:34:48.000000000 +0000 @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2010~2011 by CSSlayer * + * Copyright (C) 2010~2012 by CSSlayer * * wengxt@gmail.com * * * * This program is free software; you can redistribute it and/or modify * diff -Nru fcitx-4.2.2/src/lib/fcitx/context.h fcitx-4.2.4.1/src/lib/fcitx/context.h --- fcitx-4.2.2/src/lib/fcitx/context.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/context.h 2012-06-10 14:34:48.000000000 +0000 @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2010~2011 by CSSlayer * + * Copyright (C) 2010~2012 by CSSlayer * * wengxt@gmail.com * * * * This program is free software; you can redistribute it and/or modify * @@ -32,15 +32,19 @@ extern "C" { #endif + /** context callback function prototype */ typedef void (*FcitxContextCallback)(void* arg, const void* value); + /** fcitx context type */ typedef struct _FcitxContext FcitxContext; + /** fcitx context flag */ typedef enum _FcitxContextFlag { FCF_None = 0, FCF_ResetOnInputMethodChange = (1 << 0) } FcitxContextFlag; + /** fcitx context value type */ typedef enum _FcitxContextType { FCT_Hotkey, FCT_String, @@ -48,19 +52,79 @@ FCT_Boolean } FcitxContextType; + /** alternative prevpage key, if this input method requires different key for paging */ #define CONTEXT_ALTERNATIVE_PREVPAGE_KEY "CONTEXT_ALTERNATIVE_PREVPAGE_KEY" + /** alternative nextpage key, if this input method requires different key for paging */ #define CONTEXT_ALTERNATIVE_NEXTPAGE_KEY "CONTEXT_ALTERNATIVE_NEXTPAGE_KEY" + /** current input method language */ #define CONTEXT_IM_LANGUAGE "CONTEXT_IM_LANGUAGE" + /** current input method prefered layout, requires fcitx-xkb to really works */ #define CONTEXT_IM_KEYBOARD_LAYOUT "CONTEXT_IM_KEYBOARD_LAYOUT" + /** disable built-in autoeng module */ #define CONTEXT_DISABLE_AUTOENG "CONTEXT_DISABLE_AUTOENG" + /** disable built-in quichphrase module */ #define CONTEXT_DISABLE_QUICKPHRASE "CONTEXT_DISABLE_QUICKPHRASE" + /** show a built-in remind button or not */ #define CONTEXT_SHOW_REMIND_STATUS "CONTEXT_SHOW_REMIND_STATUS" - + /** disable auto first candidate highlight */ + #define CONTEXT_DISABLE_AUTO_FIRST_CANDIDATE_HIGHTLIGHT "CONTEXT_DISABLE_AUTO_FIRST_CANDIDATE_HIGHTLIGHT" + /** disable auto first candidate highlight */ + #define CONTEXT_DISABLE_FULLWIDTH "CONTEXT_DISABLE_FULLWIDTH" + + /** + * @brief register a new global context variable + * + * @param instance fcitx instance + * @param key context name + * @param type contex value type + * @param flag context flag + * @return void + **/ void FcitxInstanceRegisterWatchableContext(FcitxInstance* instance, const char* key, FcitxContextType type, unsigned int flag ); + + /** + * @brief bind a callback function to this context, callback will be called when context value changed. + * + * @param instance fcitx instance + * @param key context name + * @param callback callback function + * @param arg extra argument to the callback + * @return void + **/ void FcitxInstanceWatchContext(FcitxInstance* instance, const char* key, FcitxContextCallback callback, void* arg); + + /** + * @brief update the value of a context + * + * @param instance instance + * @param key context name + * @param value context value + * @return void + **/ void FcitxInstanceSetContext(FcitxInstance* instance, const char* key, const void* value); + /** + * @brief get string type context value + * + * @param instance fcitx instance + * @param key contex name + * @return const char* + **/ const char* FcitxInstanceGetContextString(FcitxInstance* instance, const char* key); + /** + * @brief get boolean type context value + * + * @param instance fcitx instance + * @param key context name + * @return boolean + **/ boolean FcitxInstanceGetContextBoolean(FcitxInstance* instance, const char* key); + /** + * @brief get hotkey type context value + * + * @param instance fcitx instance + * @param key key + * @return const FcitxHotkey* + **/ const FcitxHotkey* FcitxInstanceGetContextHotkey(FcitxInstance* instance, const char* key); #ifdef __cplusplus diff -Nru fcitx-4.2.2/src/lib/fcitx/context-internal.h fcitx-4.2.4.1/src/lib/fcitx/context-internal.h --- fcitx-4.2.2/src/lib/fcitx/context-internal.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/context-internal.h 2012-06-10 14:34:48.000000000 +0000 @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2010~2011 by CSSlayer * + * Copyright (C) 2010~2012 by CSSlayer * * wengxt@gmail.com * * * * This program is free software; you can redistribute it and/or modify * diff -Nru fcitx-4.2.2/src/lib/fcitx/fcitx.h fcitx-4.2.4.1/src/lib/fcitx/fcitx.h --- fcitx-4.2.2/src/lib/fcitx/fcitx.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/fcitx.h 2012-06-10 14:34:48.000000000 +0000 @@ -18,11 +18,6 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ -/** - * @addtogroup Fcitx - * @{ - */ - #ifndef _FCITX_H_ #define _FCITX_H_ @@ -35,11 +30,17 @@ /** * @defgroup Fcitx Fcitx - * + * * All fcitx core related function, including addon process, mainloop, * user interface, and all misc stuff needed by fcitx. */ + +/** + * @addtogroup Fcitx + * @{ + */ + /** * @file fcitx.h * @author CS Slayer @@ -52,7 +53,7 @@ #if defined(FCITX_HAVE_CONFIG_H) #define _(msgid) gettext(msgid) -#define __(msgid) (msgid) +#define N_(msgid) (msgid) #endif /** export the symbol */ diff -Nru fcitx-4.2.2/src/lib/fcitx/fcitx-internal.h fcitx-4.2.4.1/src/lib/fcitx/fcitx-internal.h --- fcitx-4.2.2/src/lib/fcitx/fcitx-internal.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/fcitx-internal.h 2012-06-10 14:34:48.000000000 +0000 @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2011~2011 by CSSlayer * + * Copyright (C) 2011~2012 by CSSlayer * * wengxt@gmail.com * * * * This program is free software; you can redistribute it and/or modify * diff -Nru fcitx-4.2.2/src/lib/fcitx/frontend.c fcitx-4.2.4.1/src/lib/fcitx/frontend.c --- fcitx-4.2.2/src/lib/fcitx/frontend.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/frontend.c 2012-06-10 14:34:48.000000000 +0000 @@ -36,6 +36,7 @@ #include "addon-internal.h" static const UT_icd frontend_icd = {sizeof(FcitxAddon*), NULL, NULL, NULL }; +static void FcitxInstanceCleanUpIC(FcitxInstance* instance); FCITX_EXPORT_API void FcitxFrontendsInit(UT_array* frontends) @@ -46,6 +47,8 @@ FCITX_EXPORT_API FcitxInputContext* FcitxInstanceCreateIC(FcitxInstance* instance, int frontendid, void * priv) { + /* clean up invalid ic here */ + FcitxInstanceCleanUpIC(instance); UT_array* frontends = &instance->frontends; FcitxAddon** pfrontend = (FcitxAddon**) utarray_eltptr(frontends, frontendid); if (pfrontend == NULL) @@ -57,9 +60,9 @@ rec = instance->free_list; instance->free_list = instance->free_list->next; } else - rec = malloc(sizeof(FcitxInputContext)); + rec = malloc(sizeof(FcitxInputContext2)); - memset(rec, 0, sizeof(FcitxInputContext)); + memset(rec, 0, sizeof(FcitxInputContext2)); rec->frontendid = frontendid; rec->offset_x = -1; rec->offset_y = -1; @@ -82,6 +85,40 @@ return rec; } +void FcitxInstanceCleanUpIC(FcitxInstance* instance) +{ + UT_array* frontends = &instance->frontends; + FcitxInputContext *rec = instance->ic_list, *last = NULL, *todel; + + while (rec) { + FcitxAddon** pfrontend = (FcitxAddon**) utarray_eltptr(frontends, rec->frontendid); + FcitxFrontend* frontend = (*pfrontend)->frontend; + pid_t pid = 0; + if (frontend->GetPid) + pid = frontend->GetPid((*pfrontend)->addonInstance, rec); + if (pid && !fcitx_utils_pid_exists(pid)) { + if (last != NULL) + last->next = rec->next; + else + instance->ic_list = rec->next; + todel = rec; + rec = rec->next; + todel->next = instance->free_list; + instance->free_list = todel; + frontend->DestroyIC((*pfrontend)->addonInstance, todel); + if (todel == instance->CurrentIC) { + instance->CurrentIC = NULL; + FcitxUICloseInputWindow(instance); + FcitxUIOnInputUnFocus(instance); + FcitxInstanceSetCurrentIC(instance, NULL); + } + } + else { + last = rec; + rec = rec->next; + } + } +} FCITX_EXPORT_API FcitxInputContext* FcitxInstanceFindIC(FcitxInstance* instance, int frontendid, void *filter) @@ -169,7 +206,7 @@ FcitxContextState FcitxInstanceGetCurrentStatev2(FcitxInstance* instance) { if (instance->CurrentIC) { - if (instance->config->firstAsInactive && instance->CurrentIC->state == IS_INACTIVE) + if (instance->CurrentIC->state == IS_INACTIVE) return IS_ACTIVE; return instance->CurrentIC->state; } @@ -207,11 +244,54 @@ FcitxFrontend* frontend = (*pfrontend)->frontend; frontend->CommitString((*pfrontend)->addonInstance, ic, str); + FcitxInputState* input = instance->input; + fcitx_utf8_strncpy(input->strLastCommit, str, MAX_USER_INPUT); + input->strLastCommit[MAX_USER_INPUT] = '\0'; + instance->iHZInputed += (int)(fcitx_utf8_strlen(str)); + if (pstr) free(pstr); } FCITX_EXPORT_API +boolean FcitxInstanceGetSurroundingText(FcitxInstance* instance, FcitxInputContext* ic, char** str, unsigned int* cursor, unsigned int* anchor) +{ + if (ic == NULL) + return false; + + if (!(ic->contextCaps & CAPACITY_SURROUNDING_TEXT)) + return false; + + UT_array* frontends = &instance->frontends; + FcitxAddon** pfrontend = (FcitxAddon**) utarray_eltptr(frontends, ic->frontendid); + if (pfrontend == NULL) + return false; + + FcitxFrontend* frontend = (*pfrontend)->frontend; + if (frontend->GetSurroundingPreedit) { + return frontend->GetSurroundingPreedit((*pfrontend)->addonInstance, ic, str, cursor, anchor); + } + return false; +} + +FCITX_EXPORT_API +void FcitxInstanceDeleteSurroundingText(FcitxInstance* instance, FcitxInputContext* ic, int offset, unsigned int size) +{ + if (ic == NULL) + return; + + UT_array* frontends = &instance->frontends; + + FcitxAddon** pfrontend = (FcitxAddon**) utarray_eltptr(frontends, ic->frontendid); + if (pfrontend == NULL) + return; + FcitxFrontend* frontend = (*pfrontend)->frontend; + if (frontend->DeleteSurroundingText) { + frontend->DeleteSurroundingText((*pfrontend)->addonInstance, ic, offset, size); + } +} + +FCITX_EXPORT_API void FcitxInstanceUpdatePreedit(FcitxInstance* instance, FcitxInputContext* ic) { if (!instance->profile->bUsePreedit) @@ -274,8 +354,28 @@ if (pfrontend == NULL) return; FcitxFrontend* frontend = (*pfrontend)->frontend; - if (frontend->GetWindowPosition) - frontend->GetWindowPosition((*pfrontend)->addonInstance, ic, x, y); + int rx, ry, rw, rh; + if (frontend->GetWindowRect) { + frontend->GetWindowRect((*pfrontend)->addonInstance, ic, &rx, &ry, &rw, &rh); + *x = rx; + *y = ry + rh; + } +} + +FCITX_EXPORT_API +void FcitxInstanceGetWindowRect(FcitxInstance* instance, FcitxInputContext* ic, int* x, int* y, int* w, int* h) +{ + if (ic == NULL) + return; + + UT_array* frontends = &instance->frontends; + FcitxAddon** pfrontend = (FcitxAddon**) utarray_eltptr(frontends, ic->frontendid); + if (pfrontend == NULL) + return; + FcitxFrontend* frontend = (*pfrontend)->frontend; + if (frontend->GetWindowRect) { + frontend->GetWindowRect((*pfrontend)->addonInstance, ic, x, y, w, h); + } } FCITX_EXPORT_API @@ -339,4 +439,5 @@ } return true; } + // kate: indent-mode cstyle; space-indent on; indent-width 0; diff -Nru fcitx-4.2.2/src/lib/fcitx/frontend.h fcitx-4.2.4.1/src/lib/fcitx/frontend.h --- fcitx-4.2.2/src/lib/fcitx/frontend.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/frontend.h 2012-06-10 14:34:48.000000000 +0000 @@ -47,6 +47,7 @@ IS_ENG = IS_INACTIVE /* backward compatible */ } FcitxContextState; + /** fcitx input context capacity flags */ typedef enum _FcitxCapacityFlags { CAPACITY_NONE = 0, CAPACITY_CLIENT_SIDE_UI = (1 << 0), @@ -54,6 +55,16 @@ CAPACITY_CLIENT_SIDE_CONTROL_STATE = (1 << 2), CAPACITY_PASSWORD = (1 << 3), CAPACITY_FORMATTED_PREEDIT = (1 << 4), + CAPACITY_CLIENT_UNFOCUS_COMMIT = (1 << 5), + CAPACITY_SURROUNDING_TEXT = (1 << 6), + CAPACITY_EMAIL = (1 << 7), + CAPACITY_DIGIT = (1 << 8), + CAPACITY_UPPERCASE = (1 << 9), + CAPACITY_LOWERCASE = (1 << 10), + CAPACITY_NOAUTOUPPERCASE = (1 << 11), + CAPACITY_URL = (1 << 12), + CAPACITY_DIALABLE = (1 << 13), + CAPACITY_NUMBER = (1 << 14), } FcitxCapacityFlags; /** @@ -69,6 +80,12 @@ struct _FcitxInputContext* next; /**< next input context */ } FcitxInputContext; + typedef struct _FcitxInputContext2 { + FcitxInputContext inputContext; + char* imname; + void* padding[16]; + } FcitxInputContext2; + /** * Program IM Module Frontend **/ @@ -83,12 +100,14 @@ void (*CommitString)(void* arg, FcitxInputContext* arg1, const char* arg2); /**< frontend commit string callback */ void (*ForwardKey)(void* arg, FcitxInputContext* arg1, FcitxKeyEventType event, FcitxKeySym sym, unsigned int state); /**< frontend forward key callback */ void (*SetWindowOffset)(void* arg, FcitxInputContext* ic, int x, int y); /**< frontend set window offset callback */ - void (*GetWindowPosition)(void* arg, FcitxInputContext* ic, int* x, int* y); /**< frontend get window position callback */ + void (*GetWindowRect)(void* arg, FcitxInputContext* ic, int* x, int* y, int* w, int* h); /**< frontend get window position callback */ void (*UpdatePreedit)(void* arg, FcitxInputContext* ic); /**< frontend update preedit callback */ void (*UpdateClientSideUI)(void* arg, FcitxInputContext* ic); /**< frontend update client side user interface callback */ void (*ReloadConfig)(void* arg); /**< frontend reload config callback */ boolean(*CheckICFromSameApplication)(void* arg, FcitxInputContext* icToCheck, FcitxInputContext* ic); /**< frontend check input context from same application callback */ - void (*padding4)(); /**< padding */ + pid_t (*GetPid)(void* arg, FcitxInputContext* arg1); /**< get pid for ic, zero for unknown */ + void (*DeleteSurroundingText)(void* addonInstance, FcitxInputContext* ic, int offset, unsigned int size); + boolean (*GetSurroundingPreedit)(void* addonInstance, FcitxInputContext* ic, char** str, unsigned int* cursor, unsigned int* anchor); } FcitxFrontend; /** @@ -140,7 +159,7 @@ /** * Commit String to Client * - * @param instance + * @param instance fcitx instance * @param ic input context * @param str String to commit * @return void @@ -148,6 +167,29 @@ void FcitxInstanceCommitString(struct _FcitxInstance* instance, FcitxInputContext* ic, const char* str); /** + * Get surrounding text for an ic + * + * @param instance fcitx instance + * @param ic input context + * @param str surrounding text + * @param cursor cursor of surrounding text + * @param anchor selection anchor of surrounding text + * @return boolean + **/ + boolean FcitxInstanceGetSurroundingText(struct _FcitxInstance* instance, FcitxInputContext* ic, char** str, unsigned int* cursor, unsigned int* anchor); + + /** + * Delete client surrounding text + * + * @param instance fcitx instance + * @param ic input conext + * @param offset offset + * @param size size + * @return void + **/ + void FcitxInstanceDeleteSurroundingText(struct _FcitxInstance* instance, FcitxInputContext* ic, int offset, unsigned int size); + + /** * Set Cursor Position * * @param instance fcitx instance @@ -161,13 +203,26 @@ /** * Get Cursor Position * - * @param ... + * @param instance fcitx instance + * @param ic input context + * @param x xpos + * @param y ypos + * @return void + **/ + void FcitxInstanceGetWindowPosition(struct _FcitxInstance* instance, FcitxInputContext *ic, int* x, int* y); + + /** + * Get Cursor Rect + * + * @param instance fcitx instance * @param ic input context * @param x xpos * @param y ypos + * @param w width + * @param h height * @return void **/ - void FcitxInstanceGetWindowPosition(struct _FcitxInstance*, FcitxInputContext *ic, int* x, int* y); + void FcitxInstanceGetWindowRect(struct _FcitxInstance* instance, FcitxInputContext* ic, int* x, int* y, int* w, int* h); /** * Update preedit text to client window diff -Nru fcitx-4.2.2/src/lib/fcitx/hook.c fcitx-4.2.4.1/src/lib/fcitx/hook.c --- fcitx-4.2.2/src/lib/fcitx/hook.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/hook.c 2012-06-10 14:34:48.000000000 +0000 @@ -114,7 +114,7 @@ HookStack* stack = GetUpdateCandidateWordHook(instance); stack = stack->next; while (stack) { - stack->eventhook.func(stack->keyfilter.arg); + stack->eventhook.func(stack->eventhook.arg); stack = stack->next; } } diff -Nru fcitx-4.2.2/src/lib/fcitx/ime.c fcitx-4.2.4.1/src/lib/fcitx/ime.c --- fcitx-4.2.2/src/lib/fcitx/ime.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/ime.c 2012-06-10 14:34:48.000000000 +0000 @@ -52,7 +52,60 @@ #include "addon-internal.h" #include "context-internal.h" -static const char* GetStateName(INPUT_RETURN_VALUE retVal); + +static const FcitxHotkey* switchKey1[] = { + FCITX_RCTRL, + FCITX_RSHIFT, + FCITX_LSHIFT, + FCITX_LCTRL, + FCITX_ALT_LSHIFT, + FCITX_ALT_RSHIFT, + FCITX_RCTRL, + FCITX_RSHIFT, + FCITX_NONE_KEY, +}; + +static const FcitxHotkey* switchKey2[] = { + FCITX_NONE_KEY, + FCITX_NONE_KEY, + FCITX_NONE_KEY, + FCITX_NONE_KEY, + FCITX_NONE_KEY, + FCITX_NONE_KEY, + FCITX_LCTRL, + FCITX_LSHIFT, + FCITX_NONE_KEY +}; + +static const FcitxHotkey* imSWNextKey1[] = { + FCITX_LCTRL_LSHIFT, + FCITX_LALT_LSHIFT, + FCITX_LCTRL_LSUPER, + FCITX_LALT_LSUPER, +}; + +static const FcitxHotkey* imSWNextKey2[] = { + FCITX_LCTRL_LSHIFT2, + FCITX_LALT_LSHIFT2, + FCITX_LCTRL_LSUPER2, + FCITX_LALT_LSUPER2, +}; + +static const FcitxHotkey* imSWPrevKey1[] = { + FCITX_RCTRL_RSHIFT, + FCITX_RALT_RSHIFT, + FCITX_RCTRL_RSUPER, + FCITX_RALT_RSUPER, +}; + +static const FcitxHotkey* imSWPrevKey2[] = { + FCITX_RCTRL_RSHIFT2, + FCITX_RALT_RSHIFT2, + FCITX_RCTRL_RSUPER2, + FCITX_RALT_RSUPER2, +}; + + static const UT_icd ime_icd = {sizeof(FcitxIM), NULL , NULL, NULL}; static const UT_icd imclass_icd = {sizeof(FcitxAddon*), NULL , NULL, NULL}; static boolean IMMenuAction(FcitxUIMenu* menu, int index); @@ -61,13 +114,14 @@ static void FcitxInstanceCloseIMInternal(FcitxInstance* instance, FcitxInputContext* ic); static void FcitxInstanceChangeIMStateInternal(FcitxInstance* instance, FcitxInputContext* ic, FcitxContextState objectState); static void FreeIMEntry(FcitxIMEntry* entry); -static INPUT_RETURN_VALUE FcitxStandardKeyBlocker(FcitxInputState* input, FcitxKeySym key, unsigned int state); +static boolean FcitxInstanceCheckICFromSameApplication (FcitxInstance* instance, FcitxInputContext* rec, FcitxInputContext* ic); FCITX_GETTER_VALUE(FcitxInputState, IsInRemind, bIsInRemind, boolean) FCITX_SETTER(FcitxInputState, IsInRemind, bIsInRemind, boolean) FCITX_GETTER_VALUE(FcitxInputState, IsDoInputOnly, bIsDoInputOnly, boolean) FCITX_SETTER(FcitxInputState, IsDoInputOnly, bIsDoInputOnly, boolean) FCITX_GETTER_VALUE(FcitxInputState, OutputString, strStringGet, char*) +FCITX_GETTER_VALUE(FcitxInputState, LastCommitString, strLastCommit, const char*) FCITX_GETTER_VALUE(FcitxInputState, RawInputBuffer, strCodeInput, char*) FCITX_GETTER_VALUE(FcitxInputState, CursorPos, iCursorPos, int) FCITX_SETTER(FcitxInputState, CursorPos, iCursorPos, int) @@ -179,9 +233,26 @@ } } -static const char* GetStateName(INPUT_RETURN_VALUE retVal) -{ - return "unknown"; + +static boolean FcitxInstanceCheckICFromSameApplication (FcitxInstance* instance, FcitxInputContext* rec, FcitxInputContext* ic) { + if (rec->frontendid != ic->frontendid) + return false; + if (rec == ic) + return true; + FcitxInputContext2* rec2 = (FcitxInputContext2*) rec; + FcitxInputContext2* ic2 = (FcitxInputContext2*) ic; + if (rec2->imname || ic2->imname) + return false; + UT_array* frontends = &instance->frontends; + FcitxAddon** pfrontend = (FcitxAddon**) utarray_eltptr(frontends, ic->frontendid); + if (pfrontend) { + FcitxFrontend* frontend = (*pfrontend)->frontend; + if (frontend->CheckICFromSameApplication + && frontend->CheckICFromSameApplication((*pfrontend)->addonInstance, rec, ic)) + return true; + } + + return false; } void FcitxInstanceLoadIM(FcitxInstance* instance, FcitxAddon* addon) @@ -219,10 +290,13 @@ dlclose(handle); return; } + + instance->currentIMAddon = addon; if ((addon->addonInstance = imclass->Create(instance)) == NULL) { dlclose(handle); return; } + instance->currentIMAddon = NULL; addon->imclass = imclass; utarray_push_back(&instance->imeclasses, &addon); } @@ -278,8 +352,44 @@ const char *langCode ) { - if (priority <= 0) + FcitxIMIFace iface; + memset(&iface, 0, sizeof(FcitxIMIFace)); + iface.Init = Init; + iface.ResetIM = ResetIM; + iface.DoInput = DoInput; + iface.GetCandWords = GetCandWords; + iface.PhraseTips = PhraseTips; + iface.Save = Save; + iface.ReloadConfig = ReloadConfig; + iface.KeyBlocker = KeyBlocker; + FcitxInstanceRegisterIMv2(instance, + imclass, + uniqueName, + name, + iconName, + iface, + priority, + langCode + ); +} + +FCITX_EXPORT_API +void FcitxInstanceRegisterIMv2(FcitxInstance *instance, + void *imclass, + const char* uniqueName, + const char* name, + const char* iconName, + FcitxIMIFace iface, + int priority, + const char *langCode + ) +{ + if (priority < 0) return ; + + if (priority == PRIORITY_MAGIC_FIRST) + priority = 0; + UT_array* imes = &instance->availimes ; FcitxIM* entry; @@ -300,20 +410,23 @@ entry->uniqueName = strdup(uniqueName); entry->strName = strdup(name); entry->strIconName = strdup(iconName); - entry->Init = Init; - entry->ResetIM = ResetIM; - entry->DoInput = DoInput; - entry->GetCandWords = GetCandWords; - entry->PhraseTips = PhraseTips; - entry->Save = Save; - entry->ReloadConfig = ReloadConfig; - entry->KeyBlocker = KeyBlocker; + entry->Init = iface.Init; + entry->ResetIM = iface.ResetIM; + entry->DoInput = iface.DoInput; + entry->GetCandWords = iface.GetCandWords; + entry->PhraseTips = iface.PhraseTips; + entry->Save = iface.Save; + entry->ReloadConfig = iface.ReloadConfig; + entry->KeyBlocker = iface.KeyBlocker; + entry->UpdateSurroundingText = iface.UpdateSurroundingText; + entry->DoReleaseInput = iface.DoReleaseInput; entry->klass = imclass; entry->iPriority = priority; if (langCode) strncpy(entry->langCode, langCode, LANGCODE_LENGTH); entry->langCode[LANGCODE_LENGTH] = 0; entry->initialized = true; + entry->owner = instance->currentIMAddon; } CONFIG_DESC_DEFINE(GetIMConfigDesc, "inputmethod.desc") @@ -407,10 +520,13 @@ FcitxGlobalConfig *fc = instance->config; - if (FcitxInstanceGetCurrentIC(instance) == NULL) + if (instance->CurrentIC == NULL) + return IRV_TO_PROCESS; + + if (instance->CurrentIC->contextCaps & CAPACITY_PASSWORD) return IRV_TO_PROCESS; - if (FcitxInstanceGetCurrentIC(instance)->contextCaps & CAPACITY_PASSWORD) + if (currentIM == NULL) return IRV_TO_PROCESS; /* @@ -445,21 +561,15 @@ } input->keyReleased = KR_OTHER; - } else if (fc->bIMSwitchKey && (FcitxHotkeyIsHotKey(sym, state, FCITX_LCTRL_LSHIFT) || FcitxHotkeyIsHotKey(sym, state, FCITX_LCTRL_LSHIFT2))) { - if (FcitxInstanceGetCurrentState(instance) == IS_ACTIVE) { - if (input->keyReleased == KR_SWITCH_IM) - FcitxInstanceSwitchIM(instance, -1); - } else if (FcitxHotkeyIsHotKey(sym, state, fc->hkTrigger)) { - FcitxInstanceCloseIM(instance, FcitxInstanceGetCurrentIC(instance)); + } else if (fc->bIMSwitchKey && (FcitxHotkeyIsHotKey(sym, state, imSWNextKey1[fc->iIMSwitchKey]) || FcitxHotkeyIsHotKey(sym, state, imSWNextKey2[fc->iIMSwitchKey]))) { + if (input->keyReleased == KR_SWITCH_IM) { + FcitxInstanceSwitchIMByIndex(instance, -1); } - } else if (fc->bIMSwitchKey && (FcitxHotkeyIsHotKey(sym, state, FCITX_RCTRL_RSHIFT) || FcitxHotkeyIsHotKey(sym, state, FCITX_RCTRL_RSHIFT2))) { - if (FcitxInstanceGetCurrentState(instance) == IS_ACTIVE) { - if (input->keyReleased == KR_SWITCH_IM_REVERSE) - FcitxInstanceSwitchIM(instance, -2); - } else if (FcitxHotkeyIsHotKey(sym, state, fc->hkTrigger)) { - FcitxInstanceCloseIM(instance, FcitxInstanceGetCurrentIC(instance)); + } else if (fc->bIMSwitchKey && (FcitxHotkeyIsHotKey(sym, state, imSWPrevKey1[fc->iIMSwitchKey]) || FcitxHotkeyIsHotKey(sym, state, imSWPrevKey2[fc->iIMSwitchKey]))) { + if (input->keyReleased == KR_SWITCH_IM_REVERSE) { + FcitxInstanceSwitchIMByIndex(instance, -2); } - } else if (FcitxHotkeyIsHotKey(sym, state, fc->switchKey) && input->keyReleased == KR_SWITCH && !fc->bDoubleSwitchKey) { + } else if ((FcitxHotkeyIsHotKey(sym, state, switchKey1[fc->iSwitchKey]) || FcitxHotkeyIsHotKey(sym, state, switchKey2[fc->iSwitchKey])) && input->keyReleased == KR_SWITCH && !fc->bDoubleSwitchKey) { retVal = IRV_DONOT_PROCESS; if (fc->bSendTextWhenSwitchEng) { if (input->iCodeInputCount != 0) { @@ -470,7 +580,7 @@ input->keyReleased = KR_OTHER; if (FcitxInstanceGetCurrentState(instance) == IS_INACTIVE) FcitxInstanceShowInputSpeed(instance); - FcitxInstanceChangeIMState(instance, FcitxInstanceGetCurrentIC(instance)); + FcitxInstanceChangeIMState(instance, instance->CurrentIC); } } } @@ -499,41 +609,58 @@ return IRV_DO_NOTHING; } } - if (!FcitxHotkeyIsHotKey(sym, state, fc->switchKey)) - input->keyReleased = KR_OTHER; + if (!(FcitxHotkeyIsHotKey(sym, state, switchKey1[fc->iSwitchKey]) || FcitxHotkeyIsHotKey(sym, state, switchKey2[fc->iSwitchKey]))) + input->keyReleased = KR_OTHER; else { if ((input->keyReleased == KR_SWITCH) && (timestamp - input->lastKeyPressedTime < fc->iTimeInterval) && fc->bDoubleSwitchKey) { - FcitxInstanceCommitString(instance, FcitxInstanceGetCurrentIC(instance), FcitxInputStateGetRawInputBuffer(input)); - FcitxInstanceChangeIMState(instance, FcitxInstanceGetCurrentIC(instance)); + FcitxInstanceCommitString(instance, instance->CurrentIC, FcitxInputStateGetRawInputBuffer(input)); + FcitxInstanceChangeIMState(instance, instance->CurrentIC); } } - if (FcitxHotkeyIsHotKey(sym, state, fc->switchKey)) { + if (FcitxHotkeyIsHotKey(sym, state, switchKey1[fc->iSwitchKey]) || FcitxHotkeyIsHotKey(sym, state, switchKey2[fc->iSwitchKey])) { input->keyReleased = KR_SWITCH; - retVal = IRV_DO_NOTHING; - } else if (fc->bIMSwitchKey && (FcitxHotkeyIsHotKey(sym, state, FCITX_LCTRL_LSHIFT) || FcitxHotkeyIsHotKey(sym, state, FCITX_LCTRL_LSHIFT2))) { + retVal = IRV_DONOT_PROCESS; + } else if (fc->bIMSwitchKey && (FcitxHotkeyIsHotKey(sym, state, imSWNextKey1[fc->iIMSwitchKey]) || FcitxHotkeyIsHotKey(sym, state, imSWNextKey2[fc->iIMSwitchKey]))) { input->keyReleased = KR_SWITCH_IM; - retVal = IRV_DO_NOTHING; - } else if (fc->bIMSwitchKey && (FcitxHotkeyIsHotKey(sym, state, FCITX_RCTRL_RSHIFT) || FcitxHotkeyIsHotKey(sym, state, FCITX_RCTRL_RSHIFT2))) { + retVal = IRV_DONOT_PROCESS; + } else if (fc->bIMSwitchKey && (FcitxHotkeyIsHotKey(sym, state, imSWPrevKey1[fc->iIMSwitchKey]) || FcitxHotkeyIsHotKey(sym, state, imSWPrevKey2[fc->iIMSwitchKey]))) { input->keyReleased = KR_SWITCH_IM_REVERSE; - retVal = IRV_DO_NOTHING; + retVal = IRV_DONOT_PROCESS; } else if (FcitxHotkeyIsHotKey(sym, state, fc->hkTrigger)) { /* trigger key has the highest priority, so we check it first */ if (FcitxInstanceGetCurrentState(instance) == IS_INACTIVE) { - FcitxInstanceChangeIMState(instance, FcitxInstanceGetCurrentIC(instance)); + FcitxInstanceChangeIMState(instance, instance->CurrentIC); FcitxInstanceShowInputSpeed(instance); } else - FcitxInstanceCloseIM(instance, FcitxInstanceGetCurrentIC(instance)); + FcitxInstanceCloseIM(instance, instance->CurrentIC); retVal = IRV_DO_NOTHING; + } else if (FcitxHotkeyIsHotKey(sym, state, fc->hkActivate)) { + if (FcitxInstanceGetCurrentState(instance) != IS_ACTIVE) { + FcitxInstanceEnableIM(instance, instance->CurrentIC, false); + retVal = IRV_DO_NOTHING; + } + } else if (FcitxHotkeyIsHotKey(sym, state, fc->hkInactivate)) { + if (FcitxInstanceGetCurrentState(instance) == IS_ACTIVE) { + FcitxInstanceCloseIM(instance, instance->CurrentIC); + retVal = IRV_DO_NOTHING; + } } } } - if (retVal == IRV_TO_PROCESS && event != FCITX_PRESS_KEY) - retVal = IRV_DONOT_PROCESS; + if (retVal == IRV_TO_PROCESS && event == FCITX_RELEASE_KEY) { + if (currentIM && currentIM->DoReleaseInput) { + retVal = currentIM->DoReleaseInput(currentIM->klass, sym, state); + if (retVal == IRV_TO_PROCESS) + retVal = IRV_DONOT_PROCESS; + } + else + retVal = IRV_DONOT_PROCESS; + } /* the key processed before this phase is very important, we don't let any interrupt */ if (FcitxInstanceGetCurrentStatev2(instance) == IS_ACTIVE @@ -544,7 +671,7 @@ } if (retVal == IRV_TO_PROCESS) { - if (!FcitxHotkeyIsHotKey(sym, state, FCITX_LCTRL_LSHIFT) && currentIM) { + if (!FcitxHotkeyIsHotKey(sym, state, imSWNextKey1[fc->iIMSwitchKey]) && currentIM) { retVal = currentIM->DoInput(currentIM->klass, sym, state); } } @@ -651,8 +778,6 @@ retVal = FcitxInstanceProcessHotkey(instance, sym, state); } - FcitxLog(DEBUG, "ProcessKey Return State: %s", GetStateName(retVal)); - FcitxInstanceProcessInputReturnValue(instance, retVal); return retVal; @@ -669,8 +794,7 @@ FcitxGlobalConfig *fc = instance->config; if (retVal & IRV_FLAG_PENDING_COMMIT_STRING) { - FcitxInstanceCommitString(instance, FcitxInstanceGetCurrentIC(instance), FcitxInputStateGetOutputString(input)); - instance->iHZInputed += (int)(fcitx_utf8_strlen(FcitxInputStateGetOutputString(input))); + FcitxInstanceCommitString(instance, instance->CurrentIC, FcitxInputStateGetOutputString(input)); } if (retVal & IRV_FLAG_DO_PHRASE_TIPS) { @@ -691,7 +815,7 @@ if (retVal & IRV_FLAG_DISPLAY_LAST) { FcitxInstanceCleanInputWindow(instance); FcitxMessagesAddMessageAtLast(input->msgAuxUp, MSG_INPUT, "%c", FcitxInputStateGetRawInputBuffer(input)[0]); - FcitxMessagesAddMessageAtLast(input->msgAuxDown, MSG_TIPS, "%s", FcitxInputStateGetOutputString(input)); + FcitxMessagesAddMessageAtLast(input->msgAuxDown, MSG_TIPS, "%s", FcitxInputStateGetLastCommitString(input)); } if (retVal & IRV_FLAG_UPDATE_INPUT_WINDOW) @@ -714,16 +838,66 @@ FCITX_EXPORT_API void FcitxInstanceSwitchIM(FcitxInstance* instance, int index) { - FcitxInstanceSwitchIMInternal(instance, index, instance->config->firstAsInactive); + FcitxInputContext* ic = FcitxInstanceGetCurrentIC(instance); + if (ic) + FcitxInstanceSetLocalIMName(instance, ic, NULL); + FcitxInstanceSwitchIMInternal(instance, index, true, true); +} + +FCITX_EXPORT_API +void FcitxInstanceSwitchIMByName(FcitxInstance* instance, const char* name) +{ + FcitxIM* im = FcitxInstanceGetIMFromIMList(instance, IMAS_Enable, name); + if (im) { + int idx = FcitxInstanceGetIMIndexByName(instance, name); + if (idx == 0) + FcitxInstanceCloseIM(instance, FcitxInstanceGetCurrentIC(instance)); + else { + FcitxInstanceSwitchIM(instance, idx); + if (FcitxInstanceGetCurrentState(instance) != IS_ACTIVE) { + FcitxInstanceEnableIM(instance, FcitxInstanceGetCurrentIC(instance), false); + } + } + } +} + +FCITX_EXPORT_API +void FcitxInstanceSwitchIMByIndex(FcitxInstance* instance, int index) +{ + UT_array* imes = &instance->imes; + int iIMCount = utarray_len(imes); + /* less than -2, invalid, set to zero + * -2 scroll back + * -1 scroll forward + * 0~positive select + */ + if (index < -2 || index >= iIMCount) + return; + else if (index == -2) { + if (instance->iIMIndex > 0) + index = instance->iIMIndex -1; + else + index = iIMCount - 1; + } else if (index == -1) { + if (instance->iIMIndex >= (iIMCount - 1)) + index = 0; + else + index = instance->iIMIndex + 1; + } + if (index == 0) + FcitxInstanceCloseIM(instance, FcitxInstanceGetCurrentIC(instance)); + else { + FcitxInstanceSwitchIM(instance, index); + if (FcitxInstanceGetCurrentState(instance) != IS_ACTIVE) { + FcitxInstanceEnableIM(instance, FcitxInstanceGetCurrentIC(instance), false); + } + } } -void FcitxInstanceSwitchIMInternal(FcitxInstance* instance, int index, boolean skipZero) +void FcitxInstanceSwitchIMInternal(FcitxInstance* instance, int index, boolean skipZero, boolean updateGlobal) { UT_array* imes = &instance->imes; int iIMCount = utarray_len(imes); - int oldIMIndex = instance->iIMIndex; - if (instance->iIMIndex == 0 && instance->lastIMIndex != 0) - oldIMIndex = instance->lastIMIndex; FcitxInstanceCleanInputWindow(instance); FcitxInstanceResetInput(instance); @@ -754,8 +928,12 @@ } else if (index >= 0) instance->iIMIndex = index; - if (skipZero && instance->iIMIndex == 0) - instance->iIMIndex = 1; + if (skipZero && instance->iIMIndex == 0) { + if (index == -2) + instance->iIMIndex = iIMCount -1; + else + instance->iIMIndex = 1; + } if (instance->iIMIndex >= iIMCount || instance->iIMIndex < 0) newIM = NULL; @@ -789,17 +967,13 @@ newIM->Init(newIM->klass); } - if (instance->config->firstAsInactive && instance->iIMIndex != 0) - instance->lastIMIndex = instance->iIMIndex; - - int newIMIndex = instance->iIMIndex; - if (instance->iIMIndex == 0 && instance->lastIMIndex != 0) - newIMIndex = instance->lastIMIndex; + if (newIM && updateGlobal) { + fcitx_utils_free(instance->globalIMName); + instance->globalIMName = strdup(newIM->uniqueName); + FcitxProfileSave(instance->profile); + } FcitxInstanceResetInput(instance); - - if (newIMIndex != oldIMIndex) - FcitxProfileSave(instance->profile); } /** @@ -952,6 +1126,65 @@ } FCITX_EXPORT_API +void FcitxInstanceSetLocalIMName(FcitxInstance* instance, FcitxInputContext* ic, const char* imname) +{ + FcitxInputContext2* ic2 = (FcitxInputContext2*) ic; + if (ic2->imname) { + free(ic2->imname); + ic2->imname = NULL; + } + + if (imname) + ic2->imname = strdup(imname); + + if (ic == FcitxInstanceGetCurrentIC(instance)) + FcitxInstanceUpdateCurrentIM(instance, false); +} + +void FcitxInstanceUpdateCurrentIM(FcitxInstance* instance, boolean force) { + FcitxInputContext* ic = FcitxInstanceGetCurrentIC(instance); + if (!ic && !force) + return; + FcitxInputContext2* ic2 = (FcitxInputContext2*) ic; + int globalIndex = FcitxInstanceGetIMIndexByName(instance, instance->globalIMName); + boolean forceSwtich = force; + /* fix it here */ + if (globalIndex == 0) { + UT_array* ime = &instance->imes; + FcitxIM* im = (FcitxIM*) utarray_eltptr(ime, 1); + if (im) { + fcitx_utils_string_swap(&instance->globalIMName, im->uniqueName); + globalIndex = 1; + forceSwtich = true; + } + } + int targetIMIndex = 0; + boolean skipZero = false; + + if (ic2 && ic2->imname) { + FcitxIM* im = FcitxInstanceGetIMFromIMList(instance, IMAS_Enable, ic2->imname); + if (!im) { + free(ic2->imname); + ic2->imname = NULL; + } + } + + if (ic && ic->state != IS_ACTIVE) { + targetIMIndex = 0; + } + else { + if (ic2 && ic2->imname) + targetIMIndex = FcitxInstanceGetIMIndexByName(instance, ic2->imname); + else + targetIMIndex = globalIndex; + skipZero = true; + } + + if (forceSwtich || targetIMIndex != instance->iIMIndex) + FcitxInstanceSwitchIMInternal(instance, targetIMIndex, skipZero, forceSwtich); +} + +FCITX_EXPORT_API void FcitxInstanceEnableIM(FcitxInstance* instance, FcitxInputContext* ic, boolean keepState) { if (ic == NULL) @@ -966,14 +1199,7 @@ if (instance->config->shareState == ShareState_All) flag = true; else { - UT_array* frontends = &instance->frontends; - FcitxAddon** pfrontend = (FcitxAddon**) utarray_eltptr(frontends, ic->frontendid); - if (pfrontend) { - FcitxFrontend* frontend = (*pfrontend)->frontend; - if (frontend->CheckICFromSameApplication && - frontend->CheckICFromSameApplication((*pfrontend)->addonInstance, rec, ic)) - flag = true; - } + flag = FcitxInstanceCheckICFromSameApplication(instance, rec, ic); } if (flag && (rec == ic || !(rec->contextCaps & CAPACITY_CLIENT_SIDE_CONTROL_STATE))) @@ -987,12 +1213,7 @@ break; } - if (instance->config->firstAsInactive - && FcitxInstanceGetCurrentState(instance) == IS_ACTIVE - && instance->iIMIndex == 0 - ) { - FcitxInstanceSwitchIM(instance, instance->lastIMIndex); - } + FcitxInstanceUpdateCurrentIM(instance, false); instance->input->keyReleased = KR_OTHER; } @@ -1011,7 +1232,7 @@ if (oldstate == IS_CLOSED) frontend->EnableIM((*pfrontend)->addonInstance, ic); - if (ic == FcitxInstanceGetCurrentIC(instance)) { + if (ic == instance->CurrentIC) { if (oldstate == IS_CLOSED) FcitxUIOnTriggerOn(instance); if (!keepState) @@ -1025,8 +1246,9 @@ if (ic == NULL) return; - if (instance->config->firstAsInactive && !(ic->contextCaps & CAPACITY_CLIENT_SIDE_CONTROL_STATE)) { - FcitxInstanceChangeIMState(instance, ic); + if (!(ic->contextCaps & CAPACITY_CLIENT_SIDE_CONTROL_STATE)) { + if (ic->state == IS_ACTIVE) + FcitxInstanceChangeIMState(instance, ic); return; } @@ -1040,14 +1262,7 @@ if (instance->config->shareState == ShareState_All) flag = true; else { - UT_array* frontends = &instance->frontends; - FcitxAddon** pfrontend = (FcitxAddon**) utarray_eltptr(frontends, ic->frontendid); - if (pfrontend) { - FcitxFrontend* frontend = (*pfrontend)->frontend; - if (frontend->CheckICFromSameApplication && - frontend->CheckICFromSameApplication((*pfrontend)->addonInstance, rec, ic)) - flag = true; - } + flag = FcitxInstanceCheckICFromSameApplication(instance, rec, ic); } if (flag && (rec == ic || !(rec->contextCaps & CAPACITY_CLIENT_SIDE_CONTROL_STATE))) @@ -1074,7 +1289,7 @@ ic->state = IS_CLOSED; frontend->CloseIM((*pfrontend)->addonInstance, ic); - if (ic == FcitxInstanceGetCurrentIC(instance)) { + if (ic == instance->CurrentIC) { FcitxUIOnTriggerOff(instance); FcitxUICloseInputWindow(instance); FcitxInstanceResetInput(instance); @@ -1097,14 +1312,6 @@ else objectState = IS_INACTIVE; - if (instance->config->firstAsInactive) { - if (objectState == IS_ACTIVE) - FcitxInstanceSwitchIM(instance, instance->lastIMIndex); - else { - FcitxInstanceSwitchIMInternal(instance, 0, false); - } - } - instance->globalState = objectState; switch (instance->config->shareState) { case ShareState_All: @@ -1115,14 +1322,7 @@ if (instance->config->shareState == ShareState_All) flag = true; else { - UT_array* frontends = &instance->frontends; - FcitxAddon** pfrontend = (FcitxAddon**) utarray_eltptr(frontends, ic->frontendid); - if (pfrontend) { - FcitxFrontend* frontend = (*pfrontend)->frontend; - if (frontend->CheckICFromSameApplication && - frontend->CheckICFromSameApplication((*pfrontend)->addonInstance, rec, ic)) - flag = true; - } + flag = FcitxInstanceCheckICFromSameApplication(instance, rec, ic); } if (flag && (rec == ic || !(rec->contextCaps & CAPACITY_CLIENT_SIDE_CONTROL_STATE))) @@ -1135,6 +1335,8 @@ FcitxInstanceChangeIMStateInternal(instance, ic, objectState); break; } + + FcitxInstanceUpdateCurrentIM(instance, false); } void FcitxInstanceChangeIMStateInternal(FcitxInstance* instance, FcitxInputContext* ic, FcitxContextState objectState) @@ -1144,7 +1346,7 @@ if (ic->state == objectState) return; ic->state = objectState; - if (ic == FcitxInstanceGetCurrentIC(instance)) { + if (ic == instance->CurrentIC) { if (objectState == IS_ACTIVE) { FcitxInstanceResetInput(instance); } else { @@ -1157,7 +1359,7 @@ void FcitxInstanceInitIMMenu(FcitxInstance* instance) { FcitxMenuInit(&instance->imMenu); - instance->imMenu.candStatusBind = strdup("im"); + instance->imMenu.candStatusBind = NULL; instance->imMenu.name = strdup(_("Input Method")); instance->imMenu.UpdateMenu = UpdateIMMenuItem; @@ -1170,12 +1372,12 @@ { FcitxInstance* instance = (FcitxInstance*) menu->priv; - if (index == 0 && FcitxInstanceGetGlobalConfig(instance)->firstAsInactive) - FcitxInstanceCloseIM(instance, FcitxInstanceGetCurrentIC(instance)); + if (index == 0) + FcitxInstanceCloseIM(instance, instance->CurrentIC); else { FcitxInstanceSwitchIM(instance, index); if (FcitxInstanceGetCurrentState(instance) != IS_ACTIVE) { - FcitxInstanceEnableIM(instance, FcitxInstanceGetCurrentIC(instance), false); + FcitxInstanceEnableIM(instance, instance->CurrentIC, false); } } return true; @@ -1206,9 +1408,13 @@ input->bShowCursor = false; FcitxInstanceCleanInputWindow(instance); + + FcitxIM* im = FcitxInstanceGetCurrentIM(instance); + if (!im) + return; + if (instance->config->bShowVersion) { FcitxMessagesAddMessageAtLast(input->msgAuxUp, MSG_TIPS, "FCITX " VERSION); - FcitxIM* im = FcitxInstanceGetCurrentIM(instance); if (im) { FcitxMessagesAddMessageAtLast(input->msgAuxUp, MSG_TIPS, " %s", im->strName); } @@ -1320,6 +1526,32 @@ } FCITX_EXPORT_API +void FcitxInstanceNotifyUpdateSurroundingText(FcitxInstance* instance, FcitxInputContext* ic) +{ + if (!ic) + return; + if (ic != instance->CurrentIC) + return; + + FcitxIM* im = FcitxInstanceGetCurrentIM(instance); + if (!im) + return; + + if (im->UpdateSurroundingText) + im->UpdateSurroundingText(im->klass); +} + +void UnusedIMItemFreeAll(UnusedIMItem* item) +{ + UnusedIMItem *cur; + while (item) { + cur = item; + HASH_DEL(item, cur); + fcitx_utils_free(cur->name); + } +} + +FCITX_EXPORT_API void FcitxInstanceUpdateIMList(FcitxInstance* instance) { if (!instance->imLoaded) @@ -1328,6 +1560,8 @@ UT_array* imList = fcitx_utils_split_string(instance->profile->imList, ','); utarray_sort(&instance->availimes, IMPriorityCmp); utarray_clear(&instance->imes); + UnusedIMItemFreeAll(instance->unusedItem); + instance->unusedItem = NULL; char** pstr; FcitxIM* ime; @@ -1340,11 +1574,21 @@ ime = NULL; *pos = '\0'; pos ++; - if (strcmp(pos, "True") == 0) - ime = FcitxInstanceGetIMFromIMList(instance, IMAS_Disable, str); - - if (ime) + ime = FcitxInstanceGetIMFromIMList(instance, IMAS_Disable, str); + boolean status = (strcmp(pos, "True") == 0); + if (status && ime) utarray_push_back(&instance->imes, ime); + + if (!ime) { + UnusedIMItem* item; + HASH_FIND_STR(instance->unusedItem, str, item); + if (!item) { + item = fcitx_utils_new(UnusedIMItem); + item->name = strdup(str); + item->status = status; + HASH_ADD_KEYPTR(hh, instance->unusedItem, item->name, strlen(item->name), item); + } + } } } @@ -1353,18 +1597,20 @@ ime = (FcitxIM*) utarray_next(&instance->availimes, ime)) { if (!IMIsInIMNameList(imList, ime)) { /* ok, make all im priority larger than 100 disable by default */ - if (ime->iPriority < PRIORITY_DISABLE) + if (ime->iPriority == 0) + utarray_push_front(&instance->imes, ime); + else if (ime->iPriority < PRIORITY_DISABLE) utarray_push_back(&instance->imes, ime); } } utarray_free(imList); - instance->iIMIndex = FcitxInstanceGetIMIndexByName(instance, instance->profile->imName); - - FcitxInstanceSwitchIM(instance, instance->iIMIndex); + FcitxInstanceUpdateCurrentIM(instance, true); FcitxInstanceProcessUpdateIMListHook(instance); - FcitxProfileSave(instance->profile); + + if (instance->globalIMName) + FcitxProfileSave(instance->profile); } FCITX_EXPORT_API @@ -1410,6 +1656,7 @@ free(entry); } +FCITX_EXPORT_API INPUT_RETURN_VALUE FcitxStandardKeyBlocker(FcitxInputState* input, FcitxKeySym key, unsigned int state) { if (FcitxInputStateGetRawInputBufferSize(input) != 0 diff -Nru fcitx-4.2.2/src/lib/fcitx/ime.h fcitx-4.2.4.1/src/lib/fcitx/ime.h --- fcitx-4.2.2/src/lib/fcitx/ime.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/ime.h 2012-06-10 14:34:48.000000000 +0000 @@ -30,6 +30,25 @@ * * Public Header for Input Method Develop * + * The input method is key event centric application. When a key event comes to fcitx, + * the process handling the keyboard event can be separated into 7 phases, PreInput, DoInput, Update Candidates, Prev/Next Page + * PostInput, Hotkey, and key blocker. + * + * The input method engine process key event inside "DoInput". + * + * Each phase will change the INPUT_RETURN_VALUE, if INPUT_RETURN_VALUE is non-zero (non IRV_TO_PROCESS), the following + * phases will not run. + * + * If a key event goes through all phase and still the state is IRV_TO_PROCESS, it will be forwarded. + * + * When it comes to update candidates, if the flag contains IRV_FLAG_UPDATE_CANDIDATE_WORDS, it will trigger the GetCandWords + * of input method engine and clean up all stiring in the input window, after that, it will trigger update candidates hook. + * + * Key blocker is useful if you want to post input phase to do something, but you don't want forward key if they do nothing. + * There is an default implemention inside fcitx, it will blocks key when raw input buffer is not empty. Those keys + * contains direction key(left/right..), key will cause something input (a,b,c...), key will cause cursor move (home/end...). + * + * DoInput, Update Candidates, Key Blocker are belongs to input method engine, other can be registered by other addon. */ #ifndef _FCITX_IME_H_ #define _FCITX_IME_H_ @@ -65,11 +84,14 @@ /** when input method priority is larger than 100, it will be disabled by default after install */ #define PRIORITY_DISABLE 100 +/** due to backward compatible, this priority will be the most priority one */ +#define PRIORITY_MAGIC_FIRST 0xf1527 + struct _FcitxInputContext; struct _FcitxInstance; struct _FcitxAddon; struct _FcitxCandidateWordList; - + /** input method available status */ typedef enum _FcitxIMAvailableStatus { IMAS_Enable, @@ -121,6 +143,26 @@ typedef void (*FcitxIMSave)(void *arg); /**< FcitxIMSave */ typedef void (*FcitxIMReloadConfig)(void *arg); /**< FcitxIMReloadConfig */ typedef INPUT_RETURN_VALUE (*FcitxIMKeyBlocker)(void* arg, FcitxKeySym, unsigned int); /**< FcitxIMKeyBlocker */ + typedef void (*FcitxIMUpdateSurroundingText)(void* arg); /**< FcitxIMKeyBlocker */ + + /** + * a more fexible interface for input method + * + * @since 4.2.3 + **/ + typedef struct _FcitxIMIFace { + FcitxIMResetIM ResetIM /**< Reset input method state */; + FcitxIMDoInput DoInput /**< process key input */; + FcitxIMGetCandWords GetCandWords; /**< get candidate words */ + FcitxIMPhraseTips PhraseTips; /**< don't use it */ + FcitxIMSave Save; /**< force save input method data */ + FcitxIMInit Init; /**< called when switch to this input method */ + FcitxIMReloadConfig ReloadConfig; /**< reload configuration */ + FcitxIMKeyBlocker KeyBlocker; /**< block unused key */ + FcitxIMUpdateSurroundingText UpdateSurroundingText; /**< surrounding text update trigger */ + FcitxIMDoInput DoReleaseInput; + void* padding[63]; /**< padding */ + } FcitxIMIFace; /** * Fcitx Input method instance @@ -196,7 +238,11 @@ **/ FcitxIMKeyBlocker KeyBlocker; - void* padding[10]; /**< padding */ + FcitxIMUpdateSurroundingText UpdateSurroundingText; /**< called when surrounding text updated */ + + FcitxIMDoInput DoReleaseInput; + + void* padding[8]; /**< padding */ } FcitxIM; /** a key event is press or release */ @@ -226,6 +272,16 @@ char* FcitxInputStateGetOutputString(FcitxInputState* input); /** + * @brief get last commit string + * + * @param input input state + * @return const char* + * + * @since 4.2.3 + **/ + const char* FcitxInputStateGetLastCommitString(FcitxInputState * input); + + /** * get current input method * * @param instance fcitx instance @@ -341,6 +397,34 @@ int priority, const char *langCode ); + + /** + * register a new input method + * + * @param instance fcitx instance + * @param imclass pointer to input method class + * @param uniqueName uniqueName which cannot be duplicated to others + * @param name input method name + * @param iconName icon name + * @param iface interface + * @param priority order of this input method + * @param langCode language code for this input method + * @return void + * + * @see FcitxInstanceRegisterIMv2 + * + * @since 4.2.3 + **/ + void FcitxInstanceRegisterIMv2(struct _FcitxInstance *instance, + void *imclass, + const char* uniqueName, + const char* name, + const char* iconName, + FcitxIMIFace iface, + int priority, + const char *langCode + ); + /** * process a key event, should only used by frontend * @@ -371,8 +455,8 @@ long unsigned int timestamp, FcitxKeySym sym, unsigned int state); - - + + /** * @brief choose candidate by index * @@ -413,7 +497,11 @@ void FcitxInstanceReloadConfig(struct _FcitxInstance* instance); /** - * switch to input method by index + * switch to input method by index, if index is zero, it will be skipped + * + * @deprecated + * + * @see FcitxInstanceSwitchIMByIndex * * @param instance fcitx instance * @param index input method index @@ -421,6 +509,33 @@ **/ void FcitxInstanceSwitchIM(struct _FcitxInstance* instance, int index); + + /** + * switch to a input method by name, name need to be valid, otherwise it have no effect + * And if the index is zero, the state will automatically change to inactive + * + * @param instance fcitx instance + * @param name ... + * @return void + * + * @since 4.2.4 + **/ + void FcitxInstanceSwitchIMByName(struct _FcitxInstance* instance, const char* name); + + /** + * switch to a input method by index, index need to be valid, otherwise it have no effect + * And if the object index is zero, the state will automatically change to inactive + * -1 means scroll forward, and -2 means scroll back. + * + * + * @param instance fcitx instance + * @param name ... + * @return void + * + * @since 4.2.4 + **/ + void FcitxInstanceSwitchIMByIndex(struct _FcitxInstance* instance, int index); + /** * check is choose key or not, if so, return the choose index * @@ -441,14 +556,14 @@ * @return int **/ int FcitxHotkeyCheckChooseKeyAndModifier(FcitxKeySym sym, int state, const char* strChoose, int candState); - + /** * get im index by im name * * @param instance fcitx instance * @param imName im name * @return int im index - * + * * @since 4.2 **/ int FcitxInstanceGetIMIndexByName(struct _FcitxInstance* instance, const char* imName); @@ -619,7 +734,7 @@ * @return void **/ void FcitxInputStateSetLastIsSingleChar(FcitxInputState* input, int lastIsSingleChar); - + /** * set keycode for current key event * @@ -628,7 +743,7 @@ * @return void **/ void FcitxInputStateSetKeyCode( FcitxInputState* input, uint32_t value ); - + /** * set keysym for current key event * @@ -642,11 +757,11 @@ * set keystate for current key state * * @param input input state - * @param value state + * @param state key state * @return void **/ void FcitxInputStateSetKeyState( FcitxInputState* input, uint32_t state ); - + /** * get keycode for current key event * @@ -654,7 +769,7 @@ * @return uint32_t **/ uint32_t FcitxInputStateGetKeyCode( FcitxInputState* input); - + /** * get keysym for current key event * @@ -689,6 +804,34 @@ **/ void FcitxInstanceUpdateIMList(struct _FcitxInstance* instance); + /** + * notify surrounding text changed to im + * + * @param instance instance + * @param ic ic + * @return void + **/ + void FcitxInstanceNotifyUpdateSurroundingText(struct _FcitxInstance* instance, struct _FcitxInputContext* ic); + + /** + * an standard key blocker, block all the key that cause cursor move when raw input buffer is not empty. + * + * @param input input state + * @param key keysym + * @param state key state + * @return INPUT_RETURN_VALUE + **/ + INPUT_RETURN_VALUE FcitxStandardKeyBlocker(FcitxInputState* input, FcitxKeySym key, unsigned int state); + + /** + * set local input method name + * + * @param ic name + * @param imname im name + * @return void + **/ + void FcitxInstanceSetLocalIMName(struct _FcitxInstance* instance, struct _FcitxInputContext* ic, const char* imname); + #ifdef __cplusplus } #endif diff -Nru fcitx-4.2.2/src/lib/fcitx/ime-internal.h fcitx-4.2.4.1/src/lib/fcitx/ime-internal.h --- fcitx-4.2.2/src/lib/fcitx/ime-internal.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/ime-internal.h 2012-06-10 14:34:48.000000000 +0000 @@ -51,6 +51,7 @@ int iCodeInputCount; char strCodeInput[MAX_USER_INPUT + 1]; char strStringGet[MAX_USER_INPUT + 1]; + char strLastCommit[MAX_USER_INPUT + 1]; boolean bIsInRemind; time_t dummy; @@ -68,7 +69,7 @@ FcitxMessages* msgAuxUp; FcitxMessages* msgAuxDown; FcitxMessages* msgClientPreedit; - + uint32_t keycode; uint32_t keysym; uint32_t keystate; @@ -116,12 +117,14 @@ void FcitxInstanceLoadIM(struct _FcitxInstance* instance, FcitxAddon* addon); -void FcitxInstanceSwitchIMInternal(struct _FcitxInstance* instance, int index, boolean skipZero); +void FcitxInstanceSwitchIMInternal(struct _FcitxInstance* instance, int index, boolean skipZero, boolean updateGlobal); FcitxConfigFileDesc* GetIMConfigDesc(); int IMPriorityCmp(const void *a, const void *b); +void FcitxInstanceUpdateCurrentIM(struct _FcitxInstance* instance, boolean force); + #endif // kate: indent-mode cstyle; space-indent on; indent-width 0; diff -Nru fcitx-4.2.2/src/lib/fcitx/instance.c fcitx-4.2.4.1/src/lib/fcitx/instance.c --- fcitx-4.2.2/src/lib/fcitx/instance.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/instance.c 2012-06-10 14:34:48.000000000 +0000 @@ -40,6 +40,7 @@ #include "ui-internal.h" #include "fcitx-internal.h" #include "instance-internal.h" +#include "module-internal.h" #define CHECK_ENV(env, value, icase) (!getenv(env) \ || (icase ? \ @@ -104,6 +105,7 @@ FcitxAddonsInit(&instance->addons); FcitxInstanceInitIM(instance); FcitxFrontendsInit(&instance->frontends); + InitFcitxModules(&instance->modules); InitFcitxModules(&instance->eventmodules); utarray_init(&instance->uistats, &stat_icd); utarray_init(&instance->uicompstats, &compstat_icd); @@ -112,6 +114,7 @@ instance->sem = sem; instance->config = fcitx_utils_malloc0(sizeof(FcitxGlobalConfig)); instance->profile = fcitx_utils_malloc0(sizeof(FcitxProfile)); + instance->globalIMName = strdup(""); if (!FcitxGlobalConfigLoad(instance->config)) goto error_exit; @@ -153,7 +156,9 @@ FcitxInstanceInitIMMenu(instance); FcitxUIRegisterMenu(instance, &instance->imMenu); - FcitxUIRegisterStatus(instance, instance, "remind", _("Remind"), _("Remind"), ToggleRemindState, GetRemindEnabled); + FcitxUIRegisterStatus(instance, instance, "remind", + instance->profile->bUseRemind ? _("Use remind") : _("No remind"), + _("Toggle Remind"), ToggleRemindState, GetRemindEnabled); FcitxUISetStatusVisable(instance, "remind", false); FcitxUILoad(instance); @@ -161,43 +166,12 @@ instance->iIMIndex = FcitxInstanceGetIMIndexByName(instance, instance->profile->imName); FcitxInstanceSwitchIM(instance, instance->iIMIndex); - instance->lastIMIndex = instance->iIMIndex; if (!FcitxInstanceLoadFrontend(instance)) { FcitxInstanceEnd(instance); return instance; } - if (instance->config->bFirstRun) { - instance->config->bFirstRun = false; - FcitxGlobalConfigSave(instance->config); - - const char *imname = "fcitx"; - char *strTemp; - asprintf(&strTemp, "@im=%s", imname); - - if ((getenv("XMODIFIERS") != NULL && CHECK_ENV("XMODIFIERS", strTemp, true)) || - (CHECK_ENV("GTK_IM_MODULE", "xim", false) && CHECK_ENV("GTK_IM_MODULE", "fcitx", false)) - || (CHECK_ENV("QT_IM_MODULE", "xim", false) && CHECK_ENV("QT_IM_MODULE", "fcitx", false))) { - char *msg[12]; - msg[0] = _("Please check your environment varibles."); - msg[1] = _("You can use tools provided by your distribution."); - msg[2] = _("Or You may need to set environment varibles below to make fcitx work correctly."); - msg[3] = "export XMODIFIERS=\"@im=fcitx\""; - msg[4] = "export QT_IM_MODULE=xim"; - msg[5] = "export GTK_IM_MODULE=xim"; - msg[6] = _("Or (Depends on you install im module or not)"); - msg[7] = "export XMODIFIERS=\"@im=fcitx\""; - msg[8] = "export QT_IM_MODULE=fcitx"; - msg[9] = "export GTK_IM_MODULE=fcitx"; - msg[10] = _("If you use login manager like gdm or kdm, put those lines in your ~/.xprofile."); - msg[11] = _("If you use ~/.xinitrc and startx, put those lines in ~/.xinitrc."); - - FcitxUIDisplayMessage(instance, _("Setting Hint"), msg, 12); - } - - free(strTemp); - } /* make in order to use block X, query is not good here */ pthread_create(&instance->pid, NULL, RunInstance, instance); @@ -209,6 +183,12 @@ } +FCITX_EXPORT_API +void FcitxInstanceSetRecheckEvent(FcitxInstance* instance) +{ + instance->uiflag |= UI_EVENT_CHECK; +} + void* RunInstance(void* arg) { FcitxInstance* instance = (FcitxInstance*) arg; @@ -290,16 +270,26 @@ frontend->DestroyIC((*pfrontend)->addonInstance, rec); } - int frontendid = 0; for (pfrontend = (FcitxAddon**) utarray_front(&instance->frontends); pfrontend != NULL; pfrontend = (FcitxAddon**) utarray_next(&instance->frontends, pfrontend) ) { if (pfrontend == NULL) - return; + continue; FcitxFrontend* frontend = (*pfrontend)->frontend; frontend->Destroy((*pfrontend)->addonInstance); - frontendid++; + } + + FcitxAddon** pmodule; + for (pmodule = (FcitxAddon**) utarray_front(&instance->modules); + pmodule != NULL; + pmodule = (FcitxAddon**) utarray_next(&instance->modules, pmodule) + ) { + if (pmodule == NULL) + return; + FcitxModule* module = (*pmodule)->module; + if (module->Destroy) + module->Destroy((*pmodule)->addonInstance); } sem_post(instance->sem); @@ -333,6 +323,9 @@ { FcitxInstance* instance = (FcitxInstance*) arg; instance->profile->bUseRemind = !instance->profile->bUseRemind; + FcitxUISetStatusString(instance, "remind", + instance->profile->bUseRemind ? _("Use remind") : _("No remind"), + _("Toggle Remind")); FcitxProfileSave(instance->profile); } @@ -442,12 +435,6 @@ return changed; } -FCITX_EXPORT_API -void FcitxInstanceIncreateInputCharacterCount(FcitxInstance* instance, int count) -{ - instance += count; -} - void FcitxInstanceInitBuiltContext(FcitxInstance* instance) { FcitxInstanceRegisterWatchableContext(instance, CONTEXT_ALTERNATIVE_PREVPAGE_KEY, FCT_Hotkey, FCF_ResetOnInputMethodChange); @@ -455,6 +442,7 @@ FcitxInstanceRegisterWatchableContext(instance, CONTEXT_IM_KEYBOARD_LAYOUT, FCT_String, FCF_ResetOnInputMethodChange); FcitxInstanceRegisterWatchableContext(instance, CONTEXT_IM_LANGUAGE, FCT_String, FCF_None); FcitxInstanceRegisterWatchableContext(instance, CONTEXT_SHOW_REMIND_STATUS, FCT_Boolean, FCF_ResetOnInputMethodChange); + FcitxInstanceRegisterWatchableContext(instance, CONTEXT_DISABLE_AUTO_FIRST_CANDIDATE_HIGHTLIGHT, FCT_Boolean, FCF_ResetOnInputMethodChange); FcitxInstanceWatchContext(instance, CONTEXT_SHOW_REMIND_STATUS, FcitxInstanceShowRemindStatusChanged, instance); } @@ -478,4 +466,6 @@ instance->tryReplace = false; } + + // kate: indent-mode cstyle; space-indent on; indent-width 0; diff -Nru fcitx-4.2.2/src/lib/fcitx/instance.h fcitx-4.2.4.1/src/lib/fcitx/instance.h --- fcitx-4.2.2/src/lib/fcitx/instance.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/instance.h 2012-06-10 14:34:48.000000000 +0000 @@ -73,6 +73,15 @@ **/ void FcitxInstanceResetTryReplace(FcitxInstance* instance); + + /** + * some event maybe sync to the buffer, set this flag to force recheck + * + * @param instance fcitx instance + * @return void + **/ + void FcitxInstanceSetRecheckEvent(FcitxInstance* instance); + /** * lock the instance * @@ -148,8 +157,6 @@ FcitxInputState* FcitxInstanceGetInputState(FcitxInstance* instance); - void FcitxInstanceIncreateInputCharacterCount(FcitxInstance* instance, int count); - #ifdef __cplusplus } #endif diff -Nru fcitx-4.2.2/src/lib/fcitx/instance-internal.h fcitx-4.2.4.1/src/lib/fcitx/instance-internal.h --- fcitx-4.2.2/src/lib/fcitx/instance-internal.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/instance-internal.h 2012-06-10 14:34:48.000000000 +0000 @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2011~2011 by CSSlayer * + * Copyright (C) 2011~2012 by CSSlayer * * wengxt@gmail.com * * * * This program is free software; you can redistribute it and/or modify * @@ -36,6 +36,12 @@ #include "addon.h" #include "context.h" +typedef struct _UnusedIMItem { + char* name; + boolean status; + UT_hash_handle hh; +} UnusedIMItem; + struct _FcitxInstance { pthread_mutex_t fcitxMutex; UT_array uistats; @@ -56,6 +62,7 @@ UT_array imeclasses; UT_array imes; UT_array frontends; + UT_array modules; UT_array eventmodules; struct _FcitxInputContext *CurrentIC; @@ -97,14 +104,18 @@ FcitxAddon* uifallback; FcitxAddon* uinormal; - + FcitxContext* context; - + boolean tryReplace; - - int lastIMIndex; - + + char* globalIMName; + char* fallbackuiName; + + FcitxAddon* currentIMAddon; + + UnusedIMItem* unusedItem; }; #endif diff -Nru fcitx-4.2.2/src/lib/fcitx/keys.c fcitx-4.2.4.1/src/lib/fcitx/keys.c --- fcitx-4.2.2/src/lib/fcitx/keys.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/keys.c 2012-06-10 14:34:48.000000000 +0000 @@ -110,6 +110,31 @@ }; FCITX_EXPORT_API +FcitxHotkey FCITX_LALT_LSHIFT[2] = { + {NULL, FcitxKey_Shift_L, FcitxKeyState_Alt_Shift}, + {NULL, FcitxKey_Alt_L, FcitxKeyState_Alt_Shift}, +}; + +FCITX_EXPORT_API +FcitxHotkey FCITX_LALT_LSHIFT2[2] = { + {NULL, FcitxKey_Shift_L, FcitxKeyState_Alt}, + {NULL, 0, 0}, +}; + +FCITX_EXPORT_API +FcitxHotkey FCITX_RALT_RSHIFT[2] = { + {NULL, FcitxKey_Shift_R, FcitxKeyState_Alt_Shift}, + {NULL, FcitxKey_Alt_R, FcitxKeyState_Alt_Shift}, +}; + +FCITX_EXPORT_API +FcitxHotkey FCITX_RALT_RSHIFT2[2] = { + {NULL, FcitxKey_Shift_R, FcitxKeyState_Alt}, + {NULL, 0, 0}, +}; + + +FCITX_EXPORT_API FcitxHotkey FCITX_SEMICOLON[2] = { {NULL, FcitxKey_semicolon, FcitxKeyState_None}, {NULL, 0, 0}, @@ -187,4 +212,54 @@ {NULL, FcitxKey_Shift_R, FcitxKeyState_Alt}, }; +FCITX_EXPORT_API +FcitxHotkey FCITX_LCTRL_LSUPER[2] = { + {NULL, FcitxKey_Super_L, FcitxKeyState_Ctrl | FcitxKeyState_Super}, + {NULL, FcitxKey_Control_L, FcitxKeyState_Ctrl | FcitxKeyState_Super}, +}; + +FCITX_EXPORT_API +FcitxHotkey FCITX_LCTRL_LSUPER2[2] = { + {NULL, FcitxKey_Super_L, FcitxKeyState_Ctrl}, + {NULL, 0, 0}, +}; + +FCITX_EXPORT_API +FcitxHotkey FCITX_RCTRL_RSUPER[2] = { + {NULL, FcitxKey_Super_R, FcitxKeyState_Ctrl | FcitxKeyState_Super}, + {NULL, FcitxKey_Control_R, FcitxKeyState_Ctrl | FcitxKeyState_Super}, +}; + +FCITX_EXPORT_API +FcitxHotkey FCITX_RCTRL_RSUPER2[2] = { + {NULL, FcitxKey_Super_R, FcitxKeyState_Ctrl}, + {NULL, 0, 0}, +}; + + +FCITX_EXPORT_API +FcitxHotkey FCITX_LALT_LSUPER[2] = { + {NULL, FcitxKey_Super_L, FcitxKeyState_Alt | FcitxKeyState_Super}, + {NULL, FcitxKey_Alt_L, FcitxKeyState_Alt | FcitxKeyState_Super}, +}; + +FCITX_EXPORT_API +FcitxHotkey FCITX_LALT_LSUPER2[2] = { + {NULL, FcitxKey_Super_L, FcitxKeyState_Alt}, + {NULL, 0, 0}, +}; + +FCITX_EXPORT_API +FcitxHotkey FCITX_RALT_RSUPER[2] = { + {NULL, FcitxKey_Super_R, FcitxKeyState_Alt | FcitxKeyState_Super}, + {NULL, FcitxKey_Alt_R, FcitxKeyState_Alt | FcitxKeyState_Super}, +}; + +FCITX_EXPORT_API +FcitxHotkey FCITX_RALT_RSUPER2[2] = { + {NULL, FcitxKey_Super_R, FcitxKeyState_Alt}, + {NULL, 0, 0}, +}; + + // kate: indent-mode cstyle; space-indent on; indent-width 0; diff -Nru fcitx-4.2.2/src/lib/fcitx/keys.h fcitx-4.2.4.1/src/lib/fcitx/keys.h --- fcitx-4.2.2/src/lib/fcitx/keys.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/keys.h 2012-06-10 14:34:48.000000000 +0000 @@ -45,6 +45,18 @@ extern FcitxHotkey FCITX_LCTRL_LSHIFT2[2]; extern FcitxHotkey FCITX_RCTRL_RSHIFT[2]; extern FcitxHotkey FCITX_RCTRL_RSHIFT2[2]; + extern FcitxHotkey FCITX_LALT_LSHIFT[2]; + extern FcitxHotkey FCITX_LALT_LSHIFT2[2]; + extern FcitxHotkey FCITX_RALT_RSHIFT[2]; + extern FcitxHotkey FCITX_RALT_RSHIFT2[2]; + extern FcitxHotkey FCITX_LCTRL_LSUPER[2]; + extern FcitxHotkey FCITX_LCTRL_LSUPER2[2]; + extern FcitxHotkey FCITX_RCTRL_RSUPER[2]; + extern FcitxHotkey FCITX_RCTRL_RSUPER2[2]; + extern FcitxHotkey FCITX_LALT_LSUPER[2]; + extern FcitxHotkey FCITX_LALT_LSUPER2[2]; + extern FcitxHotkey FCITX_RALT_RSUPER[2]; + extern FcitxHotkey FCITX_RALT_RSUPER2[2]; extern FcitxHotkey FCITX_SEMICOLON[2]; extern FcitxHotkey FCITX_SPACE[2]; extern FcitxHotkey FCITX_COMMA[2]; diff -Nru fcitx-4.2.2/src/lib/fcitx/module.c fcitx-4.2.4.1/src/lib/fcitx/module.c --- fcitx-4.2.2/src/lib/fcitx/module.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/module.c 2012-06-10 14:34:48.000000000 +0000 @@ -32,10 +32,9 @@ #include "addon-internal.h" #include "ime-internal.h" -static UT_icd module_icd = {sizeof(FcitxModule*), NULL, NULL, NULL}; +static UT_icd module_icd = {sizeof(FcitxAddon*), NULL, NULL, NULL}; typedef void*(*FcitxModuleFunction)(void *arg, FcitxModuleFunctionArg); -FCITX_EXPORT_API void InitFcitxModules(UT_array* modules) { utarray_init(modules, &module_icd); @@ -86,6 +85,7 @@ addon->addonInstance = moduleinstance; if (module->ProcessEvent && module->SetFD) utarray_push_back(&instance->eventmodules, &addon); + utarray_push_back(&instance->modules, &addon); } break; default: diff -Nru fcitx-4.2.2/src/lib/fcitx/module.h fcitx-4.2.4.1/src/lib/fcitx/module.h --- fcitx-4.2.2/src/lib/fcitx/module.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/module.h 2012-06-10 14:34:48.000000000 +0000 @@ -73,14 +73,6 @@ } FcitxModuleFunctionArg; /** - * init module array - * - * @param modules module array - * @return void - **/ - void InitFcitxModules(UT_array* modules); - - /** * load all modules * * @param instance fcitx instance diff -Nru fcitx-4.2.2/src/lib/fcitx/module-internal.h fcitx-4.2.4.1/src/lib/fcitx/module-internal.h --- fcitx-4.2.2/src/lib/fcitx/module-internal.h 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/module-internal.h 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,28 @@ +/*************************************************************************** + * Copyright (C) 2011~2012 by CSSlayer * + * wengxt@gmail.com * + * * + * This program is free software; you can 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#ifndef _FCITX_MODULE_INTERNAL_H_ +#define _FCITX_MODULE_INTERNAL_H_ +#include "fcitx-utils/utarray.h" + +void InitFcitxModules(UT_array* modules); + +#endif + diff -Nru fcitx-4.2.2/src/lib/fcitx/profile.c fcitx-4.2.4.1/src/lib/fcitx/profile.c --- fcitx-4.2.2/src/lib/fcitx/profile.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/profile.c 2012-06-10 14:34:48.000000000 +0000 @@ -74,16 +74,40 @@ CONFIG_DESC_DEFINE(GetProfileDesc, "profile.desc") +#define PROFILE_TEMP_FILE "profile_XXXXXX" + + FCITX_EXPORT_API void FcitxProfileSave(FcitxProfile* profile) { + /* profile save need to be safe, so we put an rename trick here */ FcitxConfigFileDesc* profileDesc = GetProfileDesc(); - if (profileDesc) { - FILE* fp = FcitxXDGGetFileUserWithPrefix("", "profile", "w", NULL); + do { + if (!profileDesc) + break; + // make ~/.config/fcitx + char* tempfile; + FcitxXDGGetFileUserWithPrefix("", "", "w", NULL); + FcitxXDGGetFileUserWithPrefix("", PROFILE_TEMP_FILE, NULL, &tempfile); + int fd = mkstemp(tempfile); + + FILE* fp; + if (fd <= 0) + break; + + fp = fdopen(fd, "w"); FcitxConfigSaveConfigFileFp(fp, &profile->gconfig, profileDesc); if (fp) fclose(fp); - } + char* profileFileName = 0; + FcitxXDGGetFileUserWithPrefix("", "profile", NULL, &profileFileName); + if (access(profileFileName, 0)) + unlink(profileFileName); + rename(tempfile, profileFileName); + + free(tempfile); + free(profileFileName); + } while(0); } void FilterIMList(FcitxGenericConfig* config, FcitxConfigGroup* group, FcitxConfigOption* option, void* value, FcitxConfigSync sync, void* arg) @@ -120,6 +144,20 @@ } } + UnusedIMItem* item = instance->unusedItem; + while(item) { + char* newresult; + const char* status = item->status ? "True" : "False"; + if (result == NULL) + asprintf(&newresult, "%s:%s", item->name, status); + else + asprintf(&newresult, "%s,%s:%s", result, item->name, status); + if (result) + free(result); + result = newresult; + item = item->hh.next; + } + char** imList = (char**) value; if (*imList) @@ -134,26 +172,15 @@ void FilterIMName(FcitxGenericConfig* config, FcitxConfigGroup* group, FcitxConfigOption* option, void* value, FcitxConfigSync sync, void* arg) { FcitxInstance* instance = arg; + char** imName = (char**) value; if (sync == Value2Raw) { - FcitxIM* im; - if (!instance->config->firstAsInactive) { - im = FcitxInstanceGetCurrentIM(instance); + if (instance->globalIMName) { + fcitx_utils_string_swap(imName, instance->globalIMName); } - else { - int idx = instance->iIMIndex; - if (instance->iIMIndex == 0 && instance->lastIMIndex != 0) - idx = instance->lastIMIndex; - UT_array* imes = &instance->imes; - im = (FcitxIM*) utarray_eltptr(imes, idx); + } else if (sync == Raw2Value) { + if (*imName) { + fcitx_utils_string_swap(&instance->globalIMName, *imName); } - char** imName = (char**) value; - if (*imName) - free(*imName); - - if (im) - *imName = strdup(im->uniqueName); - else - *imName = strdup(""); } } diff -Nru fcitx-4.2.2/src/lib/fcitx/ui.c fcitx-4.2.4.1/src/lib/fcitx/ui.c --- fcitx-4.2.2/src/lib/fcitx/ui.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/ui.c 2012-06-10 14:34:48.000000000 +0000 @@ -158,27 +158,13 @@ instance->ui = instance->uinormal; - if (instance->ui == NULL) + if (instance->ui == NULL) { FcitxLog(ERROR, "no usable user interface."); - else { - do { - FcitxAddon* fallbackAddon = FcitxAddonsGetAddonByName(&instance->addons, addon->uifallback); - if (fallbackAddon == NULL) - break; - - if (!fallbackAddon->bEnabled) - break; - - instance->fallbackuiName = strdup(addon->uifallback); - - /* ui is fallback */ - if (FcitxUILoadInternal(instance, fallbackAddon)) { - instance->uifallback = fallbackAddon; - if (instance->uifallback->ui->Suspend) - instance->uifallback->ui->Suspend(instance->uifallback->addonInstance); - } - } while (0); + return; } + + if (addon->uifallback) + instance->fallbackuiName = strdup(addon->uifallback); } boolean FcitxUILoadInternal(FcitxInstance* instance, FcitxAddon* addon) @@ -283,7 +269,7 @@ } FCITX_EXPORT_API -void FcitxMessagesSetMessage(FcitxMessages* message, int position, FcitxMessageType type, const char* fmt, ...) +void FcitxMessagesSetMessage(FcitxMessages* message, int position, int type, const char* fmt, ...) { va_list ap; va_start(ap, fmt); @@ -301,7 +287,7 @@ } FCITX_EXPORT_API -void FcitxMessagesSetMessageV(FcitxMessages* message, int position, FcitxMessageType type, const char* fmt, va_list ap) +void FcitxMessagesSetMessageV(FcitxMessages* message, int position, int type, const char* fmt, va_list ap) { if (position < MAX_MESSAGE_COUNT) { vsnprintf(message->msg[position].strMsg, MESSAGE_MAX_LENGTH, fmt, ap); @@ -543,6 +529,7 @@ return ; menu->mark = -1; + menu->visible = true; utarray_push_back(uimenus, &menu); if (UI_FUNC_IS_VALID(RegisterMenu)) @@ -552,7 +539,7 @@ } FCITX_EXPORT_API -void FcitxMenuAddMenuItem(FcitxUIMenu* menu, const char* string, FcitxMenuItemType type, FcitxUIMenu* subMenu) +void FcitxMenuAddMenuItemWithData(FcitxUIMenu* menu, const char* string, FcitxMenuItemType type, FcitxUIMenu* subMenu, void* arg) { FcitxMenuItem shell; memset(&shell, 0, sizeof(FcitxMenuItem)); @@ -566,6 +553,7 @@ shell.tipstr = NULL; shell.type = type; + shell.data = arg; shell.isselect = false; @@ -575,6 +563,13 @@ utarray_push_back(&menu->shell, &shell); } + +FCITX_EXPORT_API +void FcitxMenuAddMenuItem(FcitxUIMenu* menu, const char* string, FcitxMenuItemType type, FcitxUIMenu* subMenu) +{ + FcitxMenuAddMenuItemWithData(menu, string, type, subMenu, NULL); +} + FCITX_EXPORT_API void FcitxMenuClear(FcitxUIMenu* menu) { @@ -590,15 +585,8 @@ FcitxInstanceProcessInputFocusHook(instance); FcitxInstanceResetInput(instance); - if (instance->config->firstAsInactive) { - if (FcitxInstanceGetCurrentState(instance) == IS_ACTIVE) - FcitxInstanceSwitchIM(instance, instance->lastIMIndex); - else if (FcitxInstanceGetCurrentState(instance) == IS_INACTIVE) { - if (instance->iIMIndex != 0) - instance->lastIMIndex = instance->iIMIndex; - FcitxInstanceSwitchIMInternal(instance, 0, false); - } - } + + FcitxInstanceUpdateCurrentIM(instance, false); FcitxUICloseInputWindow(instance); } @@ -615,7 +603,9 @@ FCITX_EXPORT_API void FcitxUICommitPreedit(struct _FcitxInstance* instance) { - if (instance->CurrentIC && !instance->config->bDontCommitPreeditWhenUnfocus) { + if (instance->CurrentIC + && !instance->config->bDontCommitPreeditWhenUnfocus + && !(instance->CurrentIC->contextCaps & CAPACITY_CLIENT_UNFOCUS_COMMIT)) { FcitxInputState* input = FcitxInstanceGetInputState(instance); FcitxMessages* clientPreedit = FcitxInputStateGetClientPreedit(input); @@ -735,7 +725,9 @@ if (i == 0 && FcitxCandidateWordGetCurrentPage(input->candList) == 0 - && type == MSG_OTHER) + && type == MSG_OTHER + && !FcitxInstanceGetContextBoolean(instance, CONTEXT_DISABLE_AUTO_FIRST_CANDIDATE_HIGHTLIGHT) + ) type = MSG_FIRSTCAND; FcitxMessagesAddMessageAtLast(msgDown, type, "%s", candWord->strWord); @@ -883,9 +875,23 @@ FCITX_EXPORT_API void FcitxUISwitchToFallback(struct _FcitxInstance* instance) { - if (!instance->uifallback || instance->ui != instance->uinormal) + if (!instance->fallbackuiName || instance->ui != instance->uinormal) return; + if (!instance->uifallback) { + // load fallback ui + FcitxAddon* fallbackAddon = FcitxAddonsGetAddonByName(&instance->addons, instance->fallbackuiName); + if (!fallbackAddon || !fallbackAddon->bEnabled || !FcitxUILoadInternal(instance, fallbackAddon)) { + // reset fallbackuiName, never load it again and again + free(instance->fallbackuiName); + instance->fallbackuiName = NULL; + return; + } + instance->uifallback = fallbackAddon; + if (instance->uifallback->ui->Suspend) + instance->uifallback->ui->Suspend(instance->uifallback->addonInstance); + } + if (instance->uinormal->ui->Suspend) instance->uinormal->ui->Suspend(instance->uinormal->addonInstance); @@ -928,6 +934,9 @@ FcitxMenuItem* item = arg; if (item->tipstr) free(item->tipstr); + if (item->data) { + free(item->data); + } } FCITX_EXPORT_API diff -Nru fcitx-4.2.2/src/lib/fcitx/ui.h fcitx-4.2.4.1/src/lib/fcitx/ui.h --- fcitx-4.2.2/src/lib/fcitx/ui.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/ui.h 2012-06-10 14:34:48.000000000 +0000 @@ -23,6 +23,40 @@ * @{ */ +/** + * @file ui.h + * + * this file provides the UI component for Fcitx, fcitx doesn't provides any platform specific + * UI element, all UI are implemented via Fcitx's addon. + * + * For input method and module, they can register UI component and get native UI for free from + * Fcitx. + * + * There is two abstract UI element in Fcitx, one is Status, and the other is Menu. Both of them + * require a unique name in Fcitx. Usually this name is meaningful in order to increase + * readability. + * + * For status, due to backward compatible problem, there are two kinds of status, simple and complex + * one. Status have three property, short description, long description and icon name. The actual + * UI depends on specific UI implementation, but usually, status are displayed as a button, with + * an icon. Icon name can be absolute png file path. All description need to be I18N'ed by addon + * themselves. + * + * For menu, each menu item contains a string, like status, it need to I18N'ed before set. Though + * there is different type in menu item, DONOT use submenu or divline, they are not supported by + * specific implementation, and suppose to be only used internally. + * + * For display string, there are five field can be used to display string: + * - Client Preedit + * - Preedit + * - AuxUp + * - AuxDown + * - Candidate words + * + * In spite of candidate words, other four fields are FcitxMessages pointer. FcitxMessages is + * basically a fixed length string array. Each string inside FcitxMessages can have a type. + */ + #ifndef _FCITX_UI_H_ #define _FCITX_UI_H_ @@ -37,22 +71,27 @@ extern "C" { #endif -#define MESSAGE_TYPE_COUNT 7 +#define MESSAGE_TYPE_COUNT 7 /**< message color type count */ #define MESSAGE_MAX_CHARNUM (150) /**< Maximum length per-message */ #define MESSAGE_MAX_LENGTH (MESSAGE_MAX_CHARNUM*UTF8_MAX_LENGTH) /**< maximum byte per message */ -#define MAX_MESSAGE_COUNT 64 +#define MAX_MESSAGE_COUNT 64 /**< maximum message string number */ + struct _FcitxAddon; + + /** fcitx menu item */ typedef struct _FcitxMenuItem FcitxMenuItem; struct _FcitxUIMenu; + /** fcitx menu state */ typedef enum _FcitxMenuState { MENU_ACTIVE = 0, MENU_INACTIVE = 1 } FcitxMenuState; + /** fcitx menu item type */ typedef enum _FcitxMenuItemType { MENUTYPE_SIMPLE, MENUTYPE_SUBMENU, @@ -60,7 +99,9 @@ } FcitxMenuItemType; + /** menu action prototype */ typedef boolean (*FcitxMenuActionFunction)(struct _FcitxUIMenu *arg, int index); + /** menu update prototype */ typedef void (*FcitxUpdateMenuFunction)(struct _FcitxUIMenu *arg); /** @@ -84,7 +125,12 @@ **/ struct _FcitxUIMenu *subMenu; - int padding[16]; /**< padding */ + union { + void* data; + int dummy[2]; + }; + + int padding[14]; /**< padding */ }; /** @@ -130,7 +176,9 @@ **/ int mark; - int padding[16]; /**< padding */ + boolean visible; /**< menu is visible or not */ + + int padding[15]; /**< padding */ }; /** @@ -214,34 +262,33 @@ int padding[16]; /**< padding */ }; - typedef enum _FcitxUIFlag { - UI_NONE = 0, - UI_MOVE = (1 << 1), - UI_UPDATE = (1 << 2), - } FcitxUIFlag; - struct _FcitxInstance; + + /** message type and flags */ typedef enum _FcitxMessageType { MSG_TYPE_FIRST = 0, MSG_TYPE_LAST = 6, MSG_TIPS = 0, /**< Hint Text */ MSG_INPUT = 1, /**< User Input */ MSG_INDEX = 2, /**< Index Number */ - MSG_FIRSTCAND = 3, /**< First candidate */ + MSG_CANDIATE_CURSOR = 3,/**< candidate cursor */ + MSG_FIRSTCAND = MSG_CANDIATE_CURSOR, /**< deprecated */ MSG_USERPHR = 4, /**< User Phrase */ MSG_CODE = 5, /**< Typed character */ MSG_OTHER = 6, /**< Other Text */ MSG_NOUNDERLINE = (1 << 3), /**< backward compatible, no underline is a flag */ - MSG_HIGHLIGHT = (1 << 4), + MSG_HIGHLIGHT = (1 << 4), /**< highlight the preedit */ MSG_DONOT_COMMIT_WHEN_UNFOCUS = (1 << 5), /**< backward compatible */ - MSG_REGULAR_MASK = 0x7 + MSG_REGULAR_MASK = 0x7 /**< regular color type mask */ } FcitxMessageType; + /** an array of message for display */ typedef struct _FcitxMessages FcitxMessages; - struct _FcitxAddon; - + /** Fcitx Menu */ typedef struct _FcitxUIMenu FcitxUIMenu; + /** Fcitx Status, supports active/inactive */ typedef struct _FcitxUIStatus FcitxUIStatus; + /** Fcitx Complex Status, ability to use custom icon */ typedef struct _FcitxUIComplexStatus FcitxUIComplexStatus; /** @@ -315,7 +362,7 @@ void (*Destroy)(void*); /**< destroy user interface addon */ void (*RegisterComplexStatus)(void*, FcitxUIComplexStatus*); /**< register complex status */ - void (*UpdateComplexStatus)(void *arg, FcitxUIComplexStatus*);; /**< register complext status */ + void (*UpdateComplexStatus)(void *arg, FcitxUIComplexStatus*); /**< register complext status */ void (*padding3)(void*); /**< padding */ } FcitxUI; @@ -355,7 +402,7 @@ * @param ... * @return void **/ - void FcitxMessagesSetMessage(FcitxMessages* message, int position, FcitxMessageType type, const char* fmt, ...); + void FcitxMessagesSetMessage(FcitxMessages* message, int position, int type, const char* fmt, ...); /** * set only message string * @@ -393,7 +440,7 @@ * @param ap arguments * @return void **/ - void FcitxMessagesSetMessageV(FcitxMessages* message, int position, FcitxMessageType type, const char* fmt, va_list ap); + void FcitxMessagesSetMessageV(FcitxMessages* message, int position, int type, const char* fmt, va_list ap); /** * set message count * @@ -462,6 +509,16 @@ * @return void **/ void FcitxMenuAddMenuItem(FcitxUIMenu* menu, const char* string, FcitxMenuItemType type, FcitxUIMenu* subMenu); + /** + * add a new menu shell + * + * @param menu menu + * @param string menu text + * @param type menu type + * @param subMenu submenu pointer + * @return void + **/ + void FcitxMenuAddMenuItemWithData(FcitxUIMenu* menu, const char* string, FcitxMenuItemType type, FcitxUIMenu* subMenu, void* arg); /** * clear all menu shell @@ -522,7 +579,7 @@ * @param shortDesc short description * @param longDesc long description * @param toggleStatus callback for toggle status - * @param getStatus get current status + * @param getIconName get current icon name * @return void **/ void FcitxUIRegisterComplexStatus(struct _FcitxInstance* instance, diff -Nru fcitx-4.2.2/src/lib/fcitx/ui-internal.h fcitx-4.2.4.1/src/lib/fcitx/ui-internal.h --- fcitx-4.2.2/src/lib/fcitx/ui-internal.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx/ui-internal.h 2012-06-10 14:34:48.000000000 +0000 @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2011~2011 by CSSlayer * + * Copyright (C) 2011~2012 by CSSlayer * * yuking_net@sohu.com * * * * This program is free software; you can redistribute it and/or modify * @@ -55,5 +55,12 @@ **/ char* FcitxUIMessagesToCStringForCommit(FcitxMessages* messages); +typedef enum _FcitxUIFlag { + UI_NONE = 0, + UI_MOVE = (1 << 1), + UI_UPDATE = (1 << 2), + UI_EVENT_CHECK = (1 << 3), +} FcitxUIFlag; + #endif diff -Nru fcitx-4.2.2/src/lib/fcitx-config/fcitx-config.c fcitx-4.2.4.1/src/lib/fcitx-config/fcitx-config.c --- fcitx-4.2.2/src/lib/fcitx-config/fcitx-config.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx-config/fcitx-config.c 2012-06-10 14:34:48.000000000 +0000 @@ -34,7 +34,7 @@ #include "fcitx-config.h" #include "fcitx-utils/log.h" #include "hotkey.h" -#include +#include "fcitx-utils/utils.h" #include @@ -441,13 +441,10 @@ return SyncSuccess; case Value2Raw: - if (option->rawValue) - free(option->rawValue); - if (*option->value.boolvalue) - option->rawValue = strdup("True"); + fcitx_utils_string_swap(&option->rawValue, "True"); else - option->rawValue = strdup("False"); + fcitx_utils_string_swap(&option->rawValue, "False"); return SyncSuccess; } @@ -484,10 +481,7 @@ if (*option->value.enumerate < 0 || *option->value.enumerate >= cenum->enumCount) return SyncInvalid; - if (option->rawValue) - free(option->rawValue); - - option->rawValue = strdup(cenum->enumDesc[*option->value.enumerate]); + fcitx_utils_string_swap(&option->rawValue, cenum->enumDesc[*option->value.enumerate]); return SyncSuccess; } @@ -528,9 +522,7 @@ g = RoundColor(g); b = RoundColor(b); - if (option->rawValue) - free(option->rawValue); - + fcitx_utils_free(option->rawValue); option->rawValue = NULL; asprintf(&option->rawValue, "%d %d %d", r, g , b); @@ -550,19 +542,12 @@ switch (sync) { case Raw2Value: - - if (*option->value.string) - free(*option->value.string); - - *option->value.string = strdup(option->rawValue); + fcitx_utils_string_swap(option->value.string, option->rawValue); return SyncSuccess; case Value2Raw: - if (option->rawValue) - free(option->rawValue); - - option->rawValue = strdup(*option->value.string); + fcitx_utils_string_swap(&option->rawValue, *option->value.string); return SyncSuccess; } @@ -578,11 +563,7 @@ switch (sync) { case Raw2Value: - - if (*option->value.string) - free(*option->value.string); - - *option->value.string = strdup(FcitxConfigOptionGetLocaleString(option)); + fcitx_utils_string_swap(option->value.string, FcitxConfigOptionGetLocaleString(option)); return SyncSuccess; diff -Nru fcitx-4.2.2/src/lib/fcitx-config/hotkey.c fcitx-4.2.4.1/src/lib/fcitx-config/hotkey.c --- fcitx-4.2.2/src/lib/fcitx-config/hotkey.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx-config/hotkey.c 2012-06-10 14:34:48.000000000 +0000 @@ -332,8 +332,17 @@ {"BRAILLEDOT7", FcitxKey_braille_dot_7 }, {"BRAILLEDOT8", FcitxKey_braille_dot_8 }, {"BRAILLEDOT9", FcitxKey_braille_dot_9 }, - {"BRAILLEDOT10", FcitxKey_braille_dot_10 }, - + {"BRAILLEDOT10",FcitxKey_braille_dot_10 }, + {"SELECT", FcitxKey_Select }, + {"EXECUTE", FcitxKey_Execute }, + {"PRINT", FcitxKey_Print }, + {"UNDO", FcitxKey_Undo }, + {"REDO", FcitxKey_Redo }, + {"MENU", FcitxKey_Menu }, + {"FIND", FcitxKey_Find }, + {"CANCEL", FcitxKey_Cancel }, + {"HELP", FcitxKey_Help }, + {"BREAK", FcitxKey_Break }, {"\0", 0} }; @@ -461,7 +470,7 @@ FCITX_EXPORT_API boolean FcitxHotkeyIsHotKey(FcitxKeySym sym, int state, const FcitxHotkey * hotkey) { - state &= FcitxKeyState_Ctrl_Alt_Shift; + state &= FcitxKeyState_Ctrl_Alt_Shift | FcitxKeyState_Super; if (hotkey[0].sym && sym == hotkey[0].sym && (hotkey[0].state == state)) return true; if (hotkey[1].sym && sym == hotkey[1].sym && (hotkey[1].state == state)) @@ -544,6 +553,9 @@ if (state & FcitxKeyState_Shift) len += strlen("SHIFT_"); + if (state & FcitxKeyState_Super) + len += strlen("SUPER_"); + char *key = FcitxHotkeyGetKeyListString(sym); if (!key) @@ -562,6 +574,9 @@ if (state & FcitxKeyState_Shift) strcat(str, "SHIFT_"); + if (state & FcitxKeyState_Super) + strcat(str, "SUPER_"); + strcat(str, key); free(key); @@ -598,6 +613,11 @@ p += strlen("SHIFT_"); } + if (strstr(strKey, "SUPER_")) { + iKeyState |= FcitxKeyState_Super; + p += strlen("SUPER_"); + } + iKey = FcitxHotkeyGetKeyList(p); if (iKey == -1) @@ -772,4 +792,13 @@ return result->keymain; } +FCITX_EXPORT_API +void FcitxHotkeyFree(FcitxHotkey* hotkey) +{ + if (hotkey[0].desc) + free(hotkey[0].desc); + if (hotkey[1].desc) + free(hotkey[1].desc); +} + // kate: indent-mode cstyle; space-indent on; indent-width 0; diff -Nru fcitx-4.2.2/src/lib/fcitx-config/hotkey.h fcitx-4.2.4.1/src/lib/fcitx-config/hotkey.h --- fcitx-4.2.2/src/lib/fcitx-config/hotkey.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx-config/hotkey.h 2012-06-10 14:34:48.000000000 +0000 @@ -2532,7 +2532,7 @@ * @return boolean **/ boolean FcitxHotkeyIsHotKeyCapital(FcitxKeySym sym, int state); - + /** * hotkey have combine modifier * @@ -2569,18 +2569,28 @@ * @since 4.1.1 */ FcitxKeySym FcitxHotkeyPadToMain(FcitxKeySym sym); - + /** - * convert unicode character to keyval + * @brief free hotkey description + * + * @param hotkey hotkey array + * @return void + * + * @since 4.2.3 + **/ + void FcitxHotkeyFree(FcitxHotkey* hotkey); + + /** + * convert unicode character to keyval * * If No matching keysym value found, return Unicode value plus 0x01000000 * (a convention introduced in the UTF-8 work on xterm). - * + * * @param wc unicode * @return FcitxKeySym **/ FcitxKeySym FcitxUnicodeToKeySym (uint32_t wc); - + /** * convert keyval to unicode character * diff -Nru fcitx-4.2.2/src/lib/fcitx-gclient/CMakeLists.txt fcitx-4.2.4.1/src/lib/fcitx-gclient/CMakeLists.txt --- fcitx-4.2.2/src/lib/fcitx-gclient/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx-gclient/CMakeLists.txt 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,89 @@ +_pkgconfig_invoke("glib-2.0" GLIB2 GLIB_GENMARSHAL "" "--variable=glib_genmarshal") +FIND_PROGRAM(GLIB_GENMARSHAL ${GLIB2_GLIB_GENMARSHAL}) + +include_directories(${GIO2_INCLUDE_DIRS}) +include_directories(${CMAKE_CURRENT_BINARY_DIR}) +link_directories(${GIO2_LIBRARY_DIRS}) + +add_custom_command(OUTPUT marshall.c + COMMAND ${GLIB_GENMARSHAL} --body --prefix=fcitx_marshall ${PROJECT_SOURCE_DIR}/src/frontend/gtk-common/marshall.list > marshall.c + DEPENDS ${PROJECT_SOURCE_DIR}/src/frontend/gtk-common/marshall.list +) +add_custom_command(OUTPUT marshall.h + COMMAND ${GLIB_GENMARSHAL} --header --prefix=fcitx_marshall ${PROJECT_SOURCE_DIR}/src/frontend/gtk-common/marshall.list > marshall.h + DEPENDS ${PROJECT_SOURCE_DIR}/src/frontend/gtk-common/marshall.list +) + +set(FCITX_GCLIENT_SOURCES + fcitxclient.c + fcitxinputmethod.c + fcitxkbd.c +) + +set(FCITX_GCLIENT_BUILT_SOURCES + ${CMAKE_CURRENT_BINARY_DIR}/marshall.c +) + +set(FCITX_GCLIENT_HEADERS + fcitxclient.h + fcitxinputmethod.h + fcitxkbd.h +) + +set(FCITX_GCLIENT_BUILT_HEADERS + ${CMAKE_CURRENT_BINARY_DIR}/marshall.h +) + +add_library(fcitx-gclient SHARED ${FCITX_GCLIENT_SOURCES} ${FCITX_GCLIENT_BUILT_SOURCES} ${FCITX_GCLIENT_BUILT_HEADERS}) +set_target_properties(fcitx-gclient + PROPERTIES VERSION 0.1 + SOVERSION 0 + COMPILE_FLAGS "-fvisibility=hidden" + LINK_FLAGS "-Wl,--no-undefined" +) +target_link_libraries(fcitx-gclient ${GIO2_LIBRARIES} fcitx-utils) + +configure_file(fcitx-gclient.pc.in ${CMAKE_CURRENT_BINARY_DIR}/fcitx-gclient.pc) + +install(TARGETS fcitx-gclient LIBRARY DESTINATION "${libdir}") +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/fcitx-gclient.pc DESTINATION "${libdir}/pkgconfig") +install(FILES ${FCITX_GCLIENT_HEADERS} DESTINATION "${includedir}/fcitx-gclient") + +if (ENABLE_GIR) + +include(GObjectIntrospection) + +gobject_introspection( + FILENAME Fcitx-1.0.gir + NSVERSION 1.0 + INCLUDE Gio-2.0 GObject-2.0 GLib-2.0 + PACKAGE_EXPORT fcitx-gclient + LIBRARY fcitx-gclient + SCANNER_ARGS --warn-all --add-include-path=${CMAKE_CURRENT_SOURCE_DIR} + COMPILER_ARGS "--includedir=${CMAKE_CURRENT_SOURCE_DIR}" + SYMBOL_PREFIXES fcitx + SOURCES ${FCITX_GCLIENT_SOURCES} ${FCITX_GCLIENT_HEADERS} +) + + + +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/Fcitx-1.0.gir DESTINATION ${GOBJECT_INTROSPECTION_GIRDIR}) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/Fcitx-1.0.typelib DESTINATION ${GOBJECT_INTROSPECTION_TYPELIBDIR}) + +endif (ENABLE_GIR) + +if (ENABLE_STATIC) + +add_library(fcitx-gclient-static STATIC ${FCITX_GCLIENT_SOURCES}) +set_target_properties(fcitx-gclient-static PROPERTIES + OUTPUT_NAME "fcitx-gclient" + PREFIX "lib" +) + +install(TARGETS fcitx-gclient-static + LIBRARY DESTINATION ${libdir} + ARCHIVE DESTINATION ${libdir} +) +endif (ENABLE_STATIC) + +add_subdirectory(test) \ No newline at end of file diff -Nru fcitx-4.2.2/src/lib/fcitx-gclient/fcitxclient.c fcitx-4.2.4.1/src/lib/fcitx-gclient/fcitxclient.c --- fcitx-4.2.2/src/lib/fcitx-gclient/fcitxclient.c 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx-gclient/fcitxclient.c 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,734 @@ +/*************************************************************************** + * Copyright (C) 2012~2012 by CSSlayer * + * * + * This program is free software; you can 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include +#include +#include "module/dbus/dbusstuff.h" +#include "frontend/ipc/ipc.h" +#include "fcitx/fcitx.h" +#include "fcitxclient.h" +#include "marshall.h" + +struct _FcitxClientPrivate { + GDBusProxy* improxy; + GDBusProxy* icproxy; + char servicename[64]; + char icname[64]; + int id; + guint watch_id; + GCancellable* cancellable; +}; + +static const gchar introspection_xml[] = + "" + " " + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " " + ""; + + +static const gchar ic_introspection_xml[] = + "\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + "\n"; +FCITX_EXPORT_API +GType fcitx_client_get_type(void) G_GNUC_CONST; + +G_DEFINE_TYPE(FcitxClient, fcitx_client, G_TYPE_OBJECT); + +#define FCITX_CLIENT_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE((obj), FCITX_TYPE_CLIENT, FcitxClientPrivate)) + +enum { + CONNTECTED_SIGNAL, + ENABLE_IM_SIGNAL, + CLOSE_IM_SIGNAL, + FORWARD_KEY_SIGNAL, + COMMIT_STRING_SIGNAL, + DELETE_SURROUNDING_TEXT_SIGNAL, + UPDATED_FORMATTED_PREEDIT_SIGNAL, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = {0}; + +static GDBusInterfaceInfo *_fcitx_client_get_interface_info(void); +static GDBusInterfaceInfo *_fcitx_client_get_clientic_info(void); +static void _fcitx_client_create_ic(FcitxClient* self); +static void _fcitx_client_create_ic_phase1_finished(GObject* source_object, GAsyncResult* res, gpointer user_data); +static void _fcitx_client_create_ic_cb(GObject *source_object, GAsyncResult *res, gpointer user_data); +static void _fcitx_client_create_ic_phase2_finished(GObject *source_object, GAsyncResult *res, gpointer user_data); +static void _fcitx_client_g_signal(GDBusProxy *proxy, gchar *sender_name, gchar *signal_name, GVariant *parameters, gpointer user_data); +static void fcitx_client_init(FcitxClient *self); +static void fcitx_client_finalize(GObject *object); +static void _fcitx_client_appear (GDBusConnection *connection, const gchar *name, const gchar *name_owner, gpointer user_data); +static void _fcitx_client_vanish (GDBusConnection *connection, const gchar *name, gpointer user_data); + +static void fcitx_client_class_init(FcitxClientClass *klass); + +static void _item_free(gpointer arg); + +static GDBusInterfaceInfo * +_fcitx_client_get_interface_info(void) +{ + static gsize has_info = 0; + static GDBusInterfaceInfo *info = NULL; + if (g_once_init_enter(&has_info)) { + GDBusNodeInfo *introspection_data; + introspection_data = g_dbus_node_info_new_for_xml(introspection_xml, NULL); + info = introspection_data->interfaces[0]; + g_once_init_leave(&has_info, 1); + } + return info; +} + +static GDBusInterfaceInfo * +_fcitx_client_get_clientic_info(void) +{ + static gsize has_info = 0; + static GDBusInterfaceInfo *info = NULL; + if (g_once_init_enter(&has_info)) { + GDBusNodeInfo *introspection_data; + introspection_data = g_dbus_node_info_new_for_xml(ic_introspection_xml, NULL); + info = introspection_data->interfaces[0]; + g_once_init_leave(&has_info, 1); + } + return info; +} + +static void +fcitx_client_finalize(GObject *object) +{ + FcitxClient *self = FCITX_CLIENT(object); + + if (self->priv->icproxy) { + g_dbus_proxy_call(self->priv->icproxy, "DestroyIC", NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL); + } + g_bus_unwatch_name(self->priv->watch_id); + GDBusProxy* icproxy = self->priv->icproxy; + GDBusProxy* improxy = self->priv->improxy; + self->priv->icproxy = NULL; + self->priv->improxy = NULL; + if (icproxy) + g_object_unref(icproxy); + if (improxy) + g_object_unref(improxy); + + if (G_OBJECT_CLASS(fcitx_client_parent_class)->finalize != NULL) + G_OBJECT_CLASS(fcitx_client_parent_class)->finalize(object); +} + +FCITX_EXPORT_API +void fcitx_client_focus_in(FcitxClient* self) +{ + if (self->priv->icproxy) { + g_dbus_proxy_call(self->priv->icproxy, "FocusIn", NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL); + } +} + +FCITX_EXPORT_API +void fcitx_client_focus_out(FcitxClient* self) +{ + if (self->priv->icproxy) { + g_dbus_proxy_call(self->priv->icproxy, "FocusOut", NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL); + } +} + +FCITX_EXPORT_API +void fcitx_client_reset(FcitxClient* self) +{ + if (self->priv->icproxy) { + g_dbus_proxy_call(self->priv->icproxy, "Reset", NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL); + } +} + +FCITX_EXPORT_API +void fcitx_client_set_capacity(FcitxClient* self, guint flags) +{ + uint32_t iflags = flags; + if (self->priv->icproxy) { + g_dbus_proxy_call(self->priv->icproxy, "SetCapacity", g_variant_new("(u)", iflags), G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL); + } +} + +FCITX_EXPORT_API +void fcitx_client_set_cusor_rect(FcitxClient* self, int x, int y, int w, int h) +{ + if (self->priv->icproxy) { + g_dbus_proxy_call(self->priv->icproxy, "SetCursorRect", g_variant_new("(iiii)", x, y, w, h), G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL); + } +} + +FCITX_EXPORT_API +void fcitx_client_set_surrounding_text(FcitxClient* self, gchar* text, guint cursor, guint anchor) +{ + if (self->priv->icproxy) { + g_dbus_proxy_call(self->priv->icproxy, "SetSurroundingText", g_variant_new("(suu)", text, cursor, anchor), G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL); + } +} + +FCITX_EXPORT_API +void fcitx_client_process_key(FcitxClient* self, GAsyncReadyCallback cb, gpointer user_data, guint32 keyval, guint32 keycode, guint32 state, gint type, guint32 t) +{ + int itype = type; + if (self->priv->icproxy) { + g_dbus_proxy_call(self->priv->icproxy, + "ProcessKeyEvent", + g_variant_new("(uuuiu)", keyval, keycode, state, itype, t), + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, + cb, + user_data); + } +} + +FCITX_EXPORT_API +int fcitx_client_process_key_sync(FcitxClient* self, guint32 keyval, guint32 keycode, guint32 state, gint type, guint32 t) +{ + int itype = type; + GError *error = NULL; + int ret = -1; + if (self->priv->icproxy) { + GVariant* result = g_dbus_proxy_call_sync(self->priv->icproxy, + "ProcessKeyEvent", + g_variant_new("(uuuiu)", keyval, keycode, state, itype, t), + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, + &error); + + if (error) + { + g_error_free(error); + } + else { + g_variant_get(result, "(i)", &ret); + } + } + + return ret; +} + + +static void +_fcitx_client_appear (GDBusConnection *connection, + const gchar *name, + const gchar *name_owner, + gpointer user_data) +{ + FcitxClient* self = (FcitxClient*) user_data; + gboolean new_owner_good = name_owner && (name_owner[0] != '\0'); + if (new_owner_good) { + if (self->priv->improxy) { + g_object_unref(self->priv->improxy); + self->priv->improxy = NULL; + } + + if (self->priv->icproxy) { + g_object_unref(self->priv->icproxy); + self->priv->icproxy = NULL; + } + + _fcitx_client_create_ic(self); + } +} + +static void +_fcitx_client_vanish (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + FcitxClient* self = (FcitxClient*) user_data; + if (self->priv->improxy) { + g_object_unref(self->priv->improxy); + self->priv->improxy = NULL; + } + + if (self->priv->icproxy) { + g_object_unref(self->priv->icproxy); + self->priv->icproxy = NULL; + } +} + +static void +fcitx_client_init(FcitxClient *self) +{ + self->priv = FCITX_CLIENT_GET_PRIVATE(self); + + sprintf(self->priv->servicename, "%s-%d", FCITX_DBUS_SERVICE, fcitx_utils_get_display_number()); + + self->priv->watch_id = g_bus_watch_name( + G_BUS_TYPE_SESSION, + self->priv->servicename, + G_BUS_NAME_WATCHER_FLAGS_NONE, + _fcitx_client_appear, + _fcitx_client_vanish, + self, + NULL + ); + self->priv->improxy = NULL; + self->priv->icproxy = NULL; +} + +static void +_fcitx_client_create_ic(FcitxClient *self) +{ + if (self->priv->cancellable) { + g_cancellable_cancel (self->priv->cancellable); + g_object_unref (self->priv->cancellable); + self->priv->cancellable = NULL; + } + if (self->priv->improxy) { + g_object_unref(self->priv->improxy); + self->priv->improxy = NULL; + } + + if (self->priv->icproxy) { + g_object_unref(self->priv->icproxy); + self->priv->icproxy = NULL; + } + self->priv->cancellable = g_cancellable_new (); + g_dbus_proxy_new_for_bus( + G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, + _fcitx_client_get_interface_info(), + self->priv->servicename, + FCITX_IM_DBUS_PATH, + FCITX_IM_DBUS_INTERFACE, + self->priv->cancellable, + _fcitx_client_create_ic_phase1_finished, + self + ); +}; + +static void +_fcitx_client_create_ic_phase1_finished(GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + FcitxClient* self = (FcitxClient*) user_data; + GError* error = NULL; + if (self->priv->cancellable) { + g_object_unref (self->priv->cancellable); + self->priv->cancellable = NULL; + } + if (self->priv->improxy) + g_object_unref(self->priv->improxy); + self->priv->improxy = g_dbus_proxy_new_for_bus_finish(res, &error); + if (error) { + g_warning ("Create fcitx input method proxy failed: %s.", error->message); + g_error_free(error); + } + if (!self->priv->improxy) + return; + + gchar* owner_name = g_dbus_proxy_get_name_owner(self->priv->improxy); + + if (!owner_name) { + g_object_unref(self->priv->improxy); + self->priv->improxy = NULL; + return; + } + g_free(owner_name); + + self->priv->cancellable = g_cancellable_new (); + char* appname = fcitx_utils_get_process_name(); + int pid = getpid(); + g_dbus_proxy_call( + self->priv->improxy, + "CreateICv3", + g_variant_new("(si)", appname, pid), + G_DBUS_CALL_FLAGS_NONE, + -1, /* timeout */ + self->priv->cancellable, + _fcitx_client_create_ic_cb, + self + ); + free(appname); + +} + +static void +_fcitx_client_create_ic_cb(GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + FcitxClient* self = (FcitxClient*) user_data; + GError* error = NULL; + if (self->priv->cancellable) { + g_object_unref (self->priv->cancellable); + self->priv->cancellable = NULL; + } + GVariant* result = g_dbus_proxy_call_finish(G_DBUS_PROXY(source_object), res, &error); + + if (error) { + g_error_free(error); + return; + } + + gboolean enable; + guint32 key1, state1, key2, state2; + g_variant_get(result, "(ibuuuu)", &self->priv->id, &enable, &key1, &state1, &key2, &state2); + + sprintf(self->priv->icname, FCITX_IC_DBUS_PATH, self->priv->id); + + self->priv->cancellable = g_cancellable_new (); + g_dbus_proxy_new_for_bus( + G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + _fcitx_client_get_clientic_info(), + self->priv->servicename, + self->priv->icname, + FCITX_IC_DBUS_INTERFACE, + self->priv->cancellable, + _fcitx_client_create_ic_phase2_finished, + self + ); +} + + +static void +_fcitx_client_create_ic_phase2_finished(GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + FcitxClient* self = (FcitxClient*) user_data; + GError* error = NULL; + if (self->priv->cancellable) { + g_object_unref (self->priv->cancellable); + self->priv->cancellable = NULL; + } + if (self->priv->icproxy) + g_object_unref(self->priv->icproxy); + self->priv->icproxy = g_dbus_proxy_new_for_bus_finish(res, &error); + + if (error) { + g_error_free(error); + } + + if (!self->priv->icproxy) + return; + + gchar* owner_name = g_dbus_proxy_get_name_owner(self->priv->icproxy); + + if (!owner_name) { + g_object_unref(self->priv->icproxy); + self->priv->icproxy = NULL; + return; + } + g_free(owner_name); + + g_signal_connect(self->priv->icproxy, "g-signal", G_CALLBACK(_fcitx_client_g_signal), self); + g_signal_emit(user_data, signals[CONNTECTED_SIGNAL], 0); +} + +static void +_item_free(gpointer arg) +{ + FcitxPreeditItem* item = arg; + free(item->string); + free(item); +} + +static void +_fcitx_client_g_signal(GDBusProxy *proxy, + gchar *sender_name, + gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + if (strcmp(signal_name, "EnableIM") == 0) { + g_signal_emit(user_data, signals[ENABLE_IM_SIGNAL], 0); + } + else if (strcmp(signal_name, "CloseIM") == 0) { + g_signal_emit(user_data, signals[CLOSE_IM_SIGNAL], 0); + } + else if (strcmp(signal_name, "CommitString") == 0) { + const gchar* data = NULL; + g_variant_get(parameters, "(s)", &data); + if (data) { + g_signal_emit(user_data, signals[COMMIT_STRING_SIGNAL], 0, data); + } + } + else if (strcmp(signal_name, "ForwardKey") == 0) { + guint32 key, state; + gint32 type; + g_variant_get(parameters, "(uui)", &key, &state, &type); + g_signal_emit(user_data, signals[FORWARD_KEY_SIGNAL], 0, key, state, type); + } + else if (strcmp(signal_name, "DeleteSurroundingText") == 0) { + guint32 nchar; + gint32 offset; + g_variant_get(parameters, "(iu)", &offset, &nchar); + g_signal_emit(user_data, signals[DELETE_SURROUNDING_TEXT_SIGNAL], 0, offset, nchar); + } + else if (strcmp(signal_name, "UpdateFormattedPreedit") == 0) { + int cursor_pos; + GPtrArray* array = g_ptr_array_new_with_free_func(_item_free); + GVariantIter* iter; + g_variant_get(parameters, "(a(si)i)", &iter, &cursor_pos); + + gchar* string; + int type; + while (g_variant_iter_next(iter, "(si)", &string, &type, NULL)) { + FcitxPreeditItem* item = g_malloc0(sizeof(FcitxPreeditItem)); + item->string = strdup(string); + item->type = type; + g_ptr_array_add(array, item); + g_free(string); + } + g_variant_iter_free(iter); + g_signal_emit(user_data, signals[UPDATED_FORMATTED_PREEDIT_SIGNAL], 0, array, cursor_pos); + g_ptr_array_free(array, TRUE); + } +} + +static void +fcitx_client_class_init(FcitxClientClass *klass) +{ + GObjectClass *gobject_class; + + gobject_class = G_OBJECT_CLASS(klass); + gobject_class->finalize = fcitx_client_finalize; + + g_type_class_add_private (klass, sizeof (FcitxClientPrivate)); + + /* install signals */ + /** + * FcitxClient::connected + * + * @client: A FcitxClient + * + * Emit when connected to fcitx + */ + signals[CONNTECTED_SIGNAL] = g_signal_new( + "connected", + FCITX_TYPE_CLIENT, + G_SIGNAL_RUN_LAST, + 0, + NULL, + NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + + /** + * FcitxClient::enable-im + * + * @client: A FcitxClient + * + * Emit when input method is enabled + */ + signals[ENABLE_IM_SIGNAL] = g_signal_new( + "enable-im", + FCITX_TYPE_CLIENT, + G_SIGNAL_RUN_LAST, + 0, + NULL, + NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + /** + * FcitxClient::enable-im + * + * @client: A FcitxClient + * + * Emit when input method is closed + */ + signals[CLOSE_IM_SIGNAL] = g_signal_new( + "close-im", + FCITX_TYPE_CLIENT, + G_SIGNAL_RUN_LAST, + 0, + NULL, + NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + /** + * FcitxClient::enable-im + * + * @client: A FcitxClient + * @keyval: key value + * @state: key state + * @type: event type + * + * Emit when input method ask for forward a key + */ + signals[FORWARD_KEY_SIGNAL] = g_signal_new( + "forward-key", + FCITX_TYPE_CLIENT, + G_SIGNAL_RUN_LAST, + 0, + NULL, + NULL, + fcitx_marshall_VOID__UINT_UINT_INT, + G_TYPE_NONE, + 3, + G_TYPE_UINT, G_TYPE_INT, G_TYPE_INT + ); + /** + * FcitxClient::commit-string + * + * @client: A FcitxClient + * @string: string to be commited + * + * Emit when input method commit one string + */ + signals[COMMIT_STRING_SIGNAL] = g_signal_new( + "commit-string", + FCITX_TYPE_CLIENT, + G_SIGNAL_RUN_LAST, + 0, + NULL, + NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, + 1, + G_TYPE_STRING + ); + + /** + * FcitxClient::delete-surrounding-text + * + * @client: A FcitxClient + * @cursor: deletion start + * @len: deletion length + * + * Emit when input method need to delete surrounding text + */ + signals[DELETE_SURROUNDING_TEXT_SIGNAL] = g_signal_new( + "delete-surrounding-text", + FCITX_TYPE_CLIENT, + G_SIGNAL_RUN_LAST, + 0, + NULL, + NULL, + fcitx_marshall_VOID__INT_UINT, + G_TYPE_NONE, + 2, + G_TYPE_INT, G_TYPE_UINT + ); + + /** + * FcitxClient::update-formatted-preedit + * + * @client: A FcitxClient + * @preedit: (transfer none) (element-type FcitxPreeditItem): An FcitxPreeditItem List + * @cursor: cursor postion by utf8 byte + * + * Emit when input method need to delete surrounding text + */ + signals[UPDATED_FORMATTED_PREEDIT_SIGNAL] = g_signal_new( + "update-formatted-preedit", + FCITX_TYPE_CLIENT, + G_SIGNAL_RUN_LAST, + 0, + NULL, + NULL, + fcitx_marshall_VOID__BOXED_INT, + G_TYPE_NONE, + 2, + G_TYPE_PTR_ARRAY, G_TYPE_INT + ); +} + +FCITX_EXPORT_API +FcitxClient* +fcitx_client_new() +{ + FcitxClient* self = g_object_new(FCITX_TYPE_CLIENT, NULL); + + if (self != NULL) { + return FCITX_CLIENT(self); + } + else + return NULL; + return self; +} + +FCITX_EXPORT_API +gboolean +fcitx_client_is_valid(FcitxClient* self) +{ + return self->priv->icproxy != NULL; +} + +// kate: indent-mode cstyle; replace-tabs on; + diff -Nru fcitx-4.2.2/src/lib/fcitx-gclient/fcitxclient.h fcitx-4.2.4.1/src/lib/fcitx-gclient/fcitxclient.h --- fcitx-4.2.2/src/lib/fcitx-gclient/fcitxclient.h 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx-gclient/fcitxclient.h 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,185 @@ +/*************************************************************************** + * Copyright (C) 2012~2012 by CSSlayer * + * * + * This program is free software; you can 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#ifndef CLIENT_IM_H +#define CLIENT_IM_H + + +#include + +/* + * Type macros + */ + +/* define GOBJECT macros */ +#define FCITX_TYPE_CLIENT (fcitx_client_get_type ()) +#define FCITX_CLIENT(o) \ + (G_TYPE_CHECK_INSTANCE_CAST ((o), FCITX_TYPE_CLIENT, FcitxClient)) +#define FCITX_IS_CLIENT(object) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((object), FCITX_TYPE_CLIENT)) +#define FCITX_CLIENT_CLASS(k) \ + (G_TYPE_CHECK_CLASS_CAST((k), FCITX_TYPE_CLIENT, FcitxClientClass)) +#define FCITX_CLIENT_GET_CLASS(o) \ + (G_TYPE_INSTANCE_GET_CLASS ((o), FCITX_TYPE_CLIENT, FcitxClientClass)) + +G_BEGIN_DECLS + +typedef struct _FcitxClient FcitxClient; +typedef struct _FcitxClientClass FcitxClientClass; +typedef struct _FcitxClientPrivate FcitxClientPrivate; +typedef struct _FcitxPreeditItem FcitxPreeditItem; + +/** + * FcitxClient: + * + * A FcitxClient allow to create a input context via DBus + */ +struct _FcitxClient { + GObject parent_instance; + /* instance member */ + FcitxClientPrivate* priv; +}; + +struct _FcitxClientClass { + GObjectClass parent_class; + /* signals */ + + /*< private >*/ + /* padding */ +}; + +struct _FcitxPreeditItem { + gchar* string; + gint32 type; +}; + +GType fcitx_client_get_type(void) G_GNUC_CONST; + +/** + * fcitx_client_new + * + * @returns: A newly allocated FcitxClient + * + * New a FcitxClient + **/ +FcitxClient* fcitx_client_new(); + +/** + * fcitx_client_is_valid: + * + * @client: A FcitxClient + * @returns: FcitxClient is valid or not + * + * Check FcitxClient is valid to communicate with Fcitx + **/ +gboolean fcitx_client_is_valid(FcitxClient* client); + +/** + * fcitx_client_process_key_sync: + * + * @client: A FcitxClient + * @keyval: key value + * @state: key state + * @type: event type + * @ts: timestamp + * + * @returns: the key is processed or not + * + * send a key event to fcitx synchronizely + */ +int fcitx_client_process_key_sync(FcitxClient* client, guint32 keyval, guint32 keycode, guint32 state, gint type, guint32 ts); + +/** + * fcitx_client_process_key: + * + * @client A FcitxClient + * @cb callback + * @user_data user data + * @keyval key value + * @keycode hardware key code + * @state key state + * @type event type + * @t timestamp + * + * send a key event to fcitx asynchronizely + **/ +void fcitx_client_process_key(FcitxClient* client, GAsyncReadyCallback cb, gpointer user_data, guint32 keyval, guint32 keycode, guint32 state, gint type, guint32 t); + +/** + * fcitx_client_focus_in: + * + * @client A FcitxClient + * + * tell fcitx current client has focus + **/ +void fcitx_client_focus_in(FcitxClient* client); + +/** + * fcitx_client_focus_out: + * + * @client A FcitxClient + * + * tell fcitx current client has lost focus + **/ +void fcitx_client_focus_out(FcitxClient* client); + +/** + * fcitx_client_set_cusor_rect: + * + * @client A FcitxClient + * @x x of cursor + * @y y of cursor + * @w width of cursor + * @h height of cursor + * + * tell fcitx current client's cursor geometry info + **/ +void fcitx_client_set_cusor_rect(FcitxClient* client, int x, int y, int w, int h); + +/** + * fcitx_client_set_surrounding_text: + * + * @client A FcitxClient + * @text surroundng text + * @cursor cursor position coresponding to text + * @anchor anchor position coresponding to text + **/ +void fcitx_client_set_surrounding_text(FcitxClient* client, gchar* text, guint cursor, guint anchor); + +/** + * fcitx_client_set_capacity: + * + * @client A FcitxClient + * + * set client capacity of Fcitx + **/ +void fcitx_client_set_capacity(FcitxClient* client, guint flags); + +/** + * fcitx_client_reset: + * + * @client A FcitxClient + * + * tell fcitx current client is reset from client side + **/ +void fcitx_client_reset(FcitxClient* client); + +G_END_DECLS + +#endif //CLIENT_IM_H diff -Nru fcitx-4.2.2/src/lib/fcitx-gclient/fcitx-gclient.pc.in fcitx-4.2.4.1/src/lib/fcitx-gclient/fcitx-gclient.pc.in --- fcitx-4.2.2/src/lib/fcitx-gclient/fcitx-gclient.pc.in 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx-gclient/fcitx-gclient.pc.in 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: fcitx-gclient +Description: Fcitx Client Library for Glib +Version: @version@ +Requires: fcitx-utils gio-2.0 +Cflags: -I${includedir} +Libs: -L${libdir} -lfcitx-utils -lfcitx-gclient diff -Nru fcitx-4.2.2/src/lib/fcitx-gclient/fcitxinputmethod.c fcitx-4.2.4.1/src/lib/fcitx-gclient/fcitxinputmethod.c --- fcitx-4.2.2/src/lib/fcitx-gclient/fcitxinputmethod.c 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx-gclient/fcitxinputmethod.c 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,432 @@ +/*************************************************************************** + * Copyright (C) 2010~2012 by CSSlayer * + * * + * This program is free software; you can 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include "fcitx/fcitx.h" +#include "module/dbus/dbusstuff.h" +#include "frontend/ipc/ipc.h" +#include "fcitxinputmethod.h" + +static const gchar introspection_xml[] = + "" + " " + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " " + " " + " " + " " + ""; + + +enum { + IMLIST_CHANGED_SIGNAL, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = {0}; + +G_DEFINE_TYPE(FcitxInputMethod, fcitx_input_method, G_TYPE_DBUS_PROXY); + +FCITX_EXPORT_API +GType fcitx_input_method_get_type(void) G_GNUC_CONST; + +static GDBusInterfaceInfo * _fcitx_input_method_get_interface_info(void); +static void _fcitx_im_item_foreach_cb(gpointer data, gpointer user_data); + +static GDBusInterfaceInfo * +_fcitx_input_method_get_interface_info(void) +{ + static gsize has_info = 0; + static GDBusInterfaceInfo *info = NULL; + if (g_once_init_enter(&has_info)) { + GDBusNodeInfo *introspection_data; + introspection_data = g_dbus_node_info_new_for_xml(introspection_xml, NULL); + info = introspection_data->interfaces[0]; + g_once_init_leave(&has_info, 1); + } + return info; +} + +static void +fcitx_input_method_finalize(GObject *object) +{ + G_GNUC_UNUSED FcitxInputMethod *im = FCITX_INPUT_METHOD(object); + + if (G_OBJECT_CLASS(fcitx_input_method_parent_class)->finalize != NULL) + G_OBJECT_CLASS(fcitx_input_method_parent_class)->finalize(object); +} + +static void +fcitx_input_method_init(FcitxInputMethod *im) +{ + /* Sets the expected interface */ + g_dbus_proxy_set_interface_info(G_DBUS_PROXY(im), _fcitx_input_method_get_interface_info()); +} + +FCITX_EXPORT_API +GPtrArray * +fcitx_input_method_get_imlist(FcitxInputMethod* im) +{ + GPtrArray *array = NULL; + GVariant* value; + GVariantIter *iter; + gchar *name, *unique_name, *langcode; + gboolean enable; + value = g_dbus_proxy_get_cached_property(G_DBUS_PROXY(im), "IMList"); + + if (value == NULL) { + GError* error = NULL; + GVariant* result = g_dbus_connection_call_sync(g_dbus_proxy_get_connection(G_DBUS_PROXY(im)), + g_dbus_proxy_get_name(G_DBUS_PROXY(im)), + FCITX_IM_DBUS_PATH, + "org.freedesktop.DBus.Properties", + "Get", + g_variant_new("(ss)", FCITX_IM_DBUS_INTERFACE, "IMList"), + G_VARIANT_TYPE("(v)"), + G_DBUS_CALL_FLAGS_NONE, + -1, /* timeout */ + NULL, + &error); + + if (error) { + g_warning("%s", error->message); + g_error_free(error); + } else if (result) { + g_variant_get(result, "(v)", &value); + g_variant_unref(result); + } + } + + if (value) { + array = g_ptr_array_new_with_free_func(fcitx_im_item_free); + g_variant_get(value, "a(sssb)", &iter); + while (g_variant_iter_next(iter, "(sssb)", &name, &unique_name, &langcode, &enable, NULL)) { + FcitxIMItem* item = g_malloc0(sizeof(FcitxIMItem)); + item->enable = enable; + item->name = g_strdup(name); + item->unique_name = g_strdup(unique_name); + item->langcode = g_strdup(langcode); + g_ptr_array_add(array, item); + g_free(name); + g_free(unique_name); + g_free(langcode); + } + g_variant_iter_free(iter); + + g_variant_unref(value); + } + + return array; +} + +FCITX_EXPORT_API +void +fcitx_input_method_set_imlist(FcitxInputMethod *im, GPtrArray* array) +{ + GVariantBuilder builder; + g_variant_builder_init(&builder, G_VARIANT_TYPE("a(sssb)")); + g_ptr_array_foreach(array, _fcitx_im_item_foreach_cb, &builder); + GVariant* value = g_variant_builder_end(&builder); + GError* error = NULL; + GVariant* result = g_dbus_connection_call_sync(g_dbus_proxy_get_connection(G_DBUS_PROXY(im)), + g_dbus_proxy_get_name(G_DBUS_PROXY(im)), + FCITX_IM_DBUS_PATH, + "org.freedesktop.DBus.Properties", + "Set", + g_variant_new("(ssv)", FCITX_IM_DBUS_INTERFACE, "IMList", value), + G_VARIANT_TYPE_UNIT, + G_DBUS_CALL_FLAGS_NONE, + -1, /* timeout */ + NULL, + &error); + + if (error) { + g_warning("%s", error->message); + g_error_free(error); + } + + g_variant_unref(result); +} + +static void +fcitx_input_method_g_properties_changed(GDBusProxy *proxy, + GVariant *changed_properties, + const gchar* const *invalidated_properties) +{ + FcitxInputMethod *user = FCITX_INPUT_METHOD(proxy); + GVariantIter *iter; + const gchar *key; + + if (changed_properties != NULL) { + g_variant_get(changed_properties, "a{sv}", &iter); + while (g_variant_iter_next(iter, "{&sv}", &key, NULL)) { + if (g_strcmp0(key, "IMList") == 0) + g_signal_emit(user, signals[IMLIST_CHANGED_SIGNAL], 0); + } + g_variant_iter_free(iter); + } + + if (invalidated_properties != NULL) { + const gchar*const* item = invalidated_properties; + while (*item) { + if (g_strcmp0(*item, "IMList") == 0) + g_signal_emit(user, signals[IMLIST_CHANGED_SIGNAL], 0); + item++; + } + } +} + +static void +fcitx_input_method_g_signal(GDBusProxy *proxy, + const gchar *sender_name, + const gchar *signal_name, + GVariant *parameters) +{ +} + +static void +fcitx_input_method_class_init(FcitxInputMethodClass *klass) +{ + GObjectClass *gobject_class; + GDBusProxyClass *proxy_class; + + gobject_class = G_OBJECT_CLASS(klass); + gobject_class->finalize = fcitx_input_method_finalize; + + proxy_class = G_DBUS_PROXY_CLASS(klass); + proxy_class->g_signal = fcitx_input_method_g_signal; + proxy_class->g_properties_changed = fcitx_input_method_g_properties_changed; + + /* install signals */ + /** + * FcitxInputMethod::imlist-changed + * + * @im: A FcitxInputMethod + * + * Emit when input method list changed + */ + signals[IMLIST_CHANGED_SIGNAL] = g_signal_new("imlist-changed", + FCITX_TYPE_INPUT_METHOD, + G_SIGNAL_RUN_LAST, + 0, + NULL, + NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 0); +} + +FCITX_EXPORT_API +FcitxInputMethod* +fcitx_input_method_new(GBusType bus_type, + GDBusProxyFlags flags, + gint display_number, + GCancellable *cancellable, + GError **error) +{ + gchar servicename[64]; + sprintf(servicename, "%s-%d", FCITX_DBUS_SERVICE, display_number); + + char* name = servicename; + FcitxInputMethod* im = g_initable_new(FCITX_TYPE_INPUT_METHOD, + cancellable, + error, + "g-flags", flags, + "g-name", name, + "g-bus-type", bus_type, + "g-object-path", FCITX_IM_DBUS_PATH, + "g-interface-name", FCITX_IM_DBUS_INTERFACE, + NULL); + + if (im != NULL) + return FCITX_INPUT_METHOD(im); + return NULL; +} + +FCITX_EXPORT_API +void fcitx_im_item_free(gpointer data) +{ + FcitxIMItem* item = data; + g_free(item->name); + g_free(item->unique_name); + g_free(item->langcode); + g_free(data); +} + +void _fcitx_im_item_foreach_cb(gpointer data, + gpointer user_data) +{ + FcitxIMItem* item = data; + GVariantBuilder* builder = user_data; + + g_variant_builder_add(builder, "(sssb)", item->name, item->unique_name, item->langcode, item->enable); +} + +FCITX_EXPORT_API +void fcitx_input_method_exit(FcitxInputMethod* im) +{ + g_dbus_proxy_call(G_DBUS_PROXY(im), + "Exit", + NULL, + G_DBUS_CALL_FLAGS_NO_AUTO_START, + 0, + NULL, + NULL, + NULL + ); +} + +FCITX_EXPORT_API +void fcitx_input_method_configure(FcitxInputMethod* im) +{ + g_dbus_proxy_call(G_DBUS_PROXY(im), + "Configure", + NULL, + G_DBUS_CALL_FLAGS_NO_AUTO_START, + 0, + NULL, + NULL, + NULL + ); +} + +FCITX_EXPORT_API +void fcitx_input_method_configure_addon(FcitxInputMethod* im, gchar* addon) +{ + g_dbus_proxy_call(G_DBUS_PROXY(im), + "ConfigureAddon", + g_variant_new("(s)", addon), + G_DBUS_CALL_FLAGS_NO_AUTO_START, + 0, + NULL, + NULL, + NULL + ); +} + +FCITX_EXPORT_API +gchar* fcitx_input_method_get_current_im(FcitxInputMethod* im) +{ + GError* error = NULL; + GVariant* variant = g_dbus_proxy_call_sync(G_DBUS_PROXY(im), + "GetCurrentIM", + NULL, + G_DBUS_CALL_FLAGS_NO_AUTO_START, + -1, + NULL, + &error + ); + + gchar* result = NULL; + + if (error) { + g_warning("%s", error->message); + g_error_free(error); + } else if (variant) { + g_variant_get(variant, "(s)", &result); + g_variant_unref(variant); + } + + return result; +} + +FCITX_EXPORT_API +gchar* fcitx_input_method_get_im_addon(FcitxInputMethod* im, gchar* imname) +{ + GError* error = NULL; + GVariant* variant = g_dbus_proxy_call_sync(G_DBUS_PROXY(im), + "GetIMAddon", + g_variant_new("(s)", imname), + G_DBUS_CALL_FLAGS_NO_AUTO_START, + -1, + NULL, + &error + ); + + gchar* result = NULL; + + if (error) { + g_warning("%s", error->message); + g_error_free(error); + } else if (variant) { + g_variant_get(variant, "(s)", &result); + g_variant_unref(variant); + } + + return result; +} + +FCITX_EXPORT_API +void fcitx_input_method_reload_config(FcitxInputMethod* im) +{ + g_dbus_proxy_call(G_DBUS_PROXY(im), + "ReloadConfig", + NULL, + G_DBUS_CALL_FLAGS_NO_AUTO_START, + 0, + NULL, + NULL, + NULL + ); +} + +FCITX_EXPORT_API +void fcitx_input_method_restart(FcitxInputMethod* im) +{ + g_dbus_proxy_call(G_DBUS_PROXY(im), + "Restart", + NULL, + G_DBUS_CALL_FLAGS_NO_AUTO_START, + 0, + NULL, + NULL, + NULL + ); +} + +FCITX_EXPORT_API +void fcitx_input_method_set_current_im(FcitxInputMethod* im, gchar* imname) +{ + g_dbus_proxy_call(G_DBUS_PROXY(im), + "SetCurrentIM", + g_variant_new("(s)", imname), + G_DBUS_CALL_FLAGS_NO_AUTO_START, + 0, + NULL, + NULL, + NULL + ); +} diff -Nru fcitx-4.2.2/src/lib/fcitx-gclient/fcitxinputmethod.h fcitx-4.2.4.1/src/lib/fcitx-gclient/fcitxinputmethod.h --- fcitx-4.2.2/src/lib/fcitx-gclient/fcitxinputmethod.h 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx-gclient/fcitxinputmethod.h 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,203 @@ +/*************************************************************************** + * Copyright (C) 2010~2012 by CSSlayer * + * * + * This program is free software; you can 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#ifndef _FCITX_INPUTMETHOD_H_ +#define _FCITX_INPUTMETHOD_H_ + +#include + +/* + * Type macros + */ + +/* define GOBJECT macros */ +#define FCITX_TYPE_INPUT_METHOD (fcitx_input_method_get_type ()) +#define FCITX_INPUT_METHOD(object) \ + (G_TYPE_CHECK_INSTANCE_CAST ((object), FCITX_TYPE_INPUT_METHOD, FcitxInputMethod)) +#define FCITX_IS_INPUT_METHOD(object) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((object), FCITX_TYPE_INPUT_METHOD)) +#define FCITX_INPUT_METHOD_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), FCITX_TYPE_INPUT_METHOD, FcitxInputMethodClass)) +#define FCITX_INPUT_METHOD_GET_CLASS(object)\ + (G_TYPE_INSTANCE_GET_CLASS ((object), FCITX_TYPE_INPUT_METHOD, FcitxInputMethodClass)) + +G_BEGIN_DECLS + +typedef struct _FcitxInputMethod FcitxInputMethod; +typedef struct _FcitxInputMethodClass FcitxInputMethodClass; +typedef struct _FcitxIMItem FcitxIMItem; + +/** + * FcitxInputMethod: + * + * A FcitxInputMethod allow you to control fcitx via DBus. + */ +struct _FcitxInputMethod { + GDBusProxy parent; + /* instance members */ +}; + +struct _FcitxInputMethodClass { + GDBusProxyClass parent; + /* signals */ + + /*< private >*/ + /* padding */ +}; + +struct _FcitxIMItem { + gchar* name; + gchar* unique_name; + gchar* langcode; + gboolean enable; +}; + +GType fcitx_input_method_get_type(void) G_GNUC_CONST; + +/** + * fcitx_input_method_new + * @bus_type: #GBusType + * @flags: #GDBusProxyFlags + * @display_number: display_number + * @cancellable: A #GCancellable or %NULL + * @error: Error or %NULL + * + * @returns: A newly allocated FcitxInputMethod. + * + * New a FcitxInputMethod. + */ +FcitxInputMethod* +fcitx_input_method_new(GBusType bus_type, + GDBusProxyFlags flags, + gint display_number, + GCancellable *cancellable, + GError **error); + +/** + * fcitx_input_method_get_imlist: + * + * @im: A FcitxInputMethod + * @returns: (transfer full) (element-type FcitxIMItem): A FcitxIMItem List + * + * Get Fcitx all im list + **/ +GPtrArray* fcitx_input_method_get_imlist(FcitxInputMethod* im); + +/** + * fcitx_input_method_set_imlist: + * + * @im: A FcitxInputMethod + * @array: A FcitxIMItem List + * + * Set Fcitx all im list + **/ +void fcitx_input_method_set_imlist(FcitxInputMethod* im, GPtrArray* array); + +/** + * fcitx_input_method_exit: + * + * @im: A FcitxInputMethod + * + * Send exit command to fcitx + **/ +void fcitx_input_method_exit(FcitxInputMethod* im); + +/** + * fcitx_input_method_restart: + * + * @im: A FcitxInputMethod + * + * Send restart command to fcitx + **/ +void fcitx_input_method_restart(FcitxInputMethod* im); + +/** + * fcitx_input_method_reload_config: + * + * @im: A FcitxInputMethod + * + * Send reload config command to fcitx + **/ +void fcitx_input_method_reload_config(FcitxInputMethod* im); + +/** + * fcitx_input_method_configure: + * + * @im: A FcitxInputMethod + * + * Send configure command to fcitx + **/ +void fcitx_input_method_configure(FcitxInputMethod* im); + +/** + * fcitx_input_method_configure_addon: + * + * @im: A FcitxInputMethod + * @addon: addon name + * + * Send configure addon command to fcitx + **/ +void fcitx_input_method_configure_addon(FcitxInputMethod* im, gchar* addon); + +/** + * fcitx_input_method_get_im_addon: + * + * @im: A FcitxInputMethod + * @imname: imname + * + * @returns: (transfer full): get addon name + * + * Get addon name by im + **/ +gchar* fcitx_input_method_get_im_addon(FcitxInputMethod* im, gchar* imname); + +/** + * fcitx_input_method_get_current_im: + * + * @im: A FcitxInputMethod + * + * @returns: (transfer full): get im name + * + * Get im name + **/ +gchar* fcitx_input_method_get_current_im(FcitxInputMethod* im); + + +/** + * fcitx_input_method_set_current_im: + * + * @im: A FcitxInputMethod + * @imname: set im name + * + * Set im name + **/ +void fcitx_input_method_set_current_im(FcitxInputMethod* im, gchar* imname); + +/** + * fcitx_im_item_free + * + * @data: A FcitxIMItem + * + * free an im_item + **/ +void fcitx_im_item_free(gpointer data); + +G_END_DECLS + +#endif diff -Nru fcitx-4.2.2/src/lib/fcitx-gclient/fcitxkbd.c fcitx-4.2.4.1/src/lib/fcitx-gclient/fcitxkbd.c --- fcitx-4.2.2/src/lib/fcitx-gclient/fcitxkbd.c 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx-gclient/fcitxkbd.c 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,205 @@ +/*************************************************************************** + * Copyright (C) 2010~2012 by CSSlayer * + * * + * This program is free software; you can 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include "fcitx/fcitx.h" +#include "module/dbus/dbusstuff.h" +#include "fcitxkbd.h" + +static const gchar introspection_xml[] = +"" +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +""; + + +G_DEFINE_TYPE(FcitxKbd, fcitx_kbd, G_TYPE_DBUS_PROXY); + +FCITX_EXPORT_API +GType fcitx_kbd_get_type(void) G_GNUC_CONST; + +static GDBusInterfaceInfo * _fcitx_kbd_get_interface_info(void); + +static GDBusInterfaceInfo * +_fcitx_kbd_get_interface_info(void) +{ + static gsize has_info = 0; + static GDBusInterfaceInfo *info = NULL; + if (g_once_init_enter(&has_info)) { + GDBusNodeInfo *introspection_data; + introspection_data = g_dbus_node_info_new_for_xml(introspection_xml, NULL); + info = introspection_data->interfaces[0]; + g_once_init_leave(&has_info, 1); + } + return info; +} + +static void +fcitx_kbd_finalize(GObject *object) +{ + G_GNUC_UNUSED FcitxKbd *im = FCITX_KBD(object); + + if (G_OBJECT_CLASS(fcitx_kbd_parent_class)->finalize != NULL) + G_OBJECT_CLASS(fcitx_kbd_parent_class)->finalize(object); +} + +static void +fcitx_kbd_init(FcitxKbd *im) +{ + /* Sets the expected interface */ + g_dbus_proxy_set_interface_info(G_DBUS_PROXY(im), _fcitx_kbd_get_interface_info()); +} + +static void +fcitx_kbd_class_init(FcitxKbdClass *klass) +{ + GObjectClass *gobject_class; + + gobject_class = G_OBJECT_CLASS(klass); + gobject_class->finalize = fcitx_kbd_finalize; + +} + +FCITX_EXPORT_API +FcitxKbd* +fcitx_kbd_new(GBusType bus_type, + GDBusProxyFlags flags, + gint display_number, + GCancellable *cancellable, + GError **error) +{ + gchar servicename[64]; + sprintf(servicename, "%s-%d", FCITX_DBUS_SERVICE, display_number); + + char* name = servicename; + FcitxKbd* im = g_initable_new(FCITX_TYPE_KBD, + cancellable, + error, + "g-flags", flags, + "g-name", name, + "g-bus-type", bus_type, + "g-object-path", "/keyboard", + "g-interface-name", "org.fcitx.Fcitx.Keyboard", + NULL); + + if (im != NULL) + return FCITX_KBD(im); + return NULL; +} + +FCITX_EXPORT_API +GPtrArray* fcitx_kbd_get_layouts(FcitxKbd* kbd) +{ + GError* error = NULL; + GVariant* variant = g_dbus_proxy_call_sync(G_DBUS_PROXY(kbd), + "GetLayouts", + NULL, + G_DBUS_CALL_FLAGS_NO_AUTO_START, + -1, + NULL, + &error + ); + + GPtrArray* array = NULL; + + if (error) { + g_warning("%s", error->message); + g_error_free(error); + } else if (variant) { + array = g_ptr_array_new_with_free_func(fcitx_layout_item_free); + GVariantIter *iter; + gchar *layout, *kbdvariant, *name, *langcode; + g_variant_get(variant, "(a(ssss))", &iter); + while (g_variant_iter_next(iter, "(ssss)", &layout, &kbdvariant, &name, &langcode, NULL)) { + FcitxLayoutItem* item = g_malloc0(sizeof(FcitxLayoutItem)); + item->layout = g_strdup(layout); + item->variant = g_strdup(kbdvariant); + item->name = g_strdup(name); + item->langcode = g_strdup(langcode); + g_ptr_array_add(array, item); + g_free(name); + g_free(kbdvariant); + g_free(layout); + g_free(langcode); + } + g_variant_iter_free(iter); + } + + return array; +} + +FCITX_EXPORT_API +void fcitx_kbd_get_layout_for_im(FcitxKbd* kbd, const gchar* imname, gchar** layout, gchar** variant) +{ + GError* error = NULL; + GVariant* v = g_dbus_proxy_call_sync(G_DBUS_PROXY(kbd), + "GetLayoutForIM", + g_variant_new("(s)", imname), + G_DBUS_CALL_FLAGS_NO_AUTO_START, + -1, + NULL, + &error + ); + + + if (error) { + g_warning("%s", error->message); + g_error_free(error); + } else if (v) { + g_variant_get(v, "(ss)", layout, variant); + g_variant_unref(v); + } + +} + +FCITX_EXPORT_API +void fcitx_kbd_set_layout_for_im(FcitxKbd* kbd, const gchar* imname, const gchar* layout, const gchar* variant) +{ + g_dbus_proxy_call(G_DBUS_PROXY(kbd), + "SetLayoutForIM", + g_variant_new("(sss)", imname, layout, variant), + G_DBUS_CALL_FLAGS_NO_AUTO_START, + 0, + NULL, + NULL, + NULL + ); +} + +void fcitx_layout_item_free(gpointer data) +{ + FcitxLayoutItem* item = data; + g_free(item->langcode); + g_free(item->name); + g_free(item->variant); + g_free(item->layout); + g_free(data); +} diff -Nru fcitx-4.2.2/src/lib/fcitx-gclient/fcitxkbd.h fcitx-4.2.4.1/src/lib/fcitx-gclient/fcitxkbd.h --- fcitx-4.2.2/src/lib/fcitx-gclient/fcitxkbd.h 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx-gclient/fcitxkbd.h 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,136 @@ +/*************************************************************************** + * Copyright (C) 2010~2012 by CSSlayer * + * * + * This program is free software; you can 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#ifndef _FCITX_KBD_H_ +#define _FCITX_KBD_H_ + +#include + +/* + * Type macros + */ + +/* define GOBJECT macros */ +#define FCITX_TYPE_KBD (fcitx_kbd_get_type ()) +#define FCITX_KBD(object) \ + (G_TYPE_CHECK_INSTANCE_CAST ((object), FCITX_TYPE_KBD, FcitxKbd)) +#define FCITX_IS_KBD(object) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((object), FCITX_TYPE_KBD)) +#define FCITX_KBD_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), FCITX_TYPE_KBD, FcitxKbdClass)) +#define FCITX_KBD_GET_CLASS(object)\ + (G_TYPE_INSTANCE_GET_CLASS ((object), FCITX_TYPE_KBD, FcitxKbdClass)) + +G_BEGIN_DECLS + +typedef struct _FcitxKbd FcitxKbd; +typedef struct _FcitxKbdClass FcitxKbdClass; +typedef struct _FcitxLayoutItem FcitxLayoutItem; + +/** + * FcitxKbd: + * + * A FcitxKbd allow you to control fcitx via DBus. + */ +struct _FcitxKbd { + GDBusProxy parent; + /* instance members */ +}; + +struct _FcitxKbdClass { + GDBusProxyClass parent; + /* signals */ + + /*< private >*/ + /* padding */ +}; + +struct _FcitxLayoutItem { + gchar* layout; + gchar* variant; + gchar* name; + gchar* langcode; +}; + +GType fcitx_kbd_get_type(void) G_GNUC_CONST; + +/** + * fcitx_kbd_new + * @bus_type: #GBusType + * @flags: #GDBusProxyFlags + * @display_number: display_number + * @cancellable: A #GCancellable or %NULL + * @error: Error or %NULL + * + * @returns: A newly allocated FcitxKbd. + * + * New a FcitxKbd. + */ +FcitxKbd* +fcitx_kbd_new(GBusType bus_type, + GDBusProxyFlags flags, + gint display_number, + GCancellable *cancellable, + GError **error); + +/** + * fcitx_kbd_get_layouts: + * + * @kbd: A FcitxKbd + * @returns: (transfer full) (element-type FcitxLayoutItem): A FcitxLayoutItem List + * + * Get Fcitx all im list + **/ +GPtrArray* fcitx_kbd_get_layouts(FcitxKbd* kbd); + +/** + * fcitx_kbd_get_layout_for_im: + * + * @kbd: A FcitxKbd + * @imname: input method name + * @layout: return'd layout + * @variant: return'd variant + * + * Get a layout binding with input method + **/ +void fcitx_kbd_get_layout_for_im(FcitxKbd* kbd, const gchar* imname, gchar** layout, gchar** variant); + +/** + * fcitx_kbd_get_layout_for_im: + * + * @kbd: A FcitxKbd + * @imname: input method name + * + * Get a layout binding with input method + **/ +void fcitx_kbd_set_layout_for_im(FcitxKbd* kbd, const gchar* imname, const gchar* layout, const gchar* variant); + + +/** + * fcitx_layout_item_free + * + * @data: A FcitxLayoutItem + * + * free an im_item + **/ +void fcitx_layout_item_free(gpointer data); + +G_END_DECLS + +#endif diff -Nru fcitx-4.2.2/src/lib/fcitx-gclient/test/CMakeLists.txt fcitx-4.2.4.1/src/lib/fcitx-gclient/test/CMakeLists.txt --- fcitx-4.2.2/src/lib/fcitx-gclient/test/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx-gclient/test/CMakeLists.txt 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,4 @@ + + +add_executable(testgclient testgclient.c) +target_link_libraries(testgclient fcitx-gclient) diff -Nru fcitx-4.2.2/src/lib/fcitx-gclient/test/testgclient.c fcitx-4.2.4.1/src/lib/fcitx-gclient/test/testgclient.c --- fcitx-4.2.2/src/lib/fcitx-gclient/test/testgclient.c 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx-gclient/test/testgclient.c 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,49 @@ +#include + +static gboolean +timeout_cb (gpointer data) +{ + g_main_loop_quit ((GMainLoop *)data); + return FALSE; +} + +static void +run_loop_with_timeout (gint interval) +{ + GMainLoop *loop = g_main_loop_new (NULL, FALSE); + g_timeout_add (interval, timeout_cb, loop); + g_main_loop_run (loop); + g_main_loop_unref (loop); +} + +static void +foreach_cb(gpointer data, gpointer user_data) +{ + FcitxLayoutItem* item = data; + g_debug("%s %s %s %s", item->layout, item->variant, item->name, item->langcode); +} + +static void +test_keyboard (void) +{ + run_loop_with_timeout (1000); + FcitxKbd* kbd = fcitx_kbd_new(G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_NONE, 0, NULL, NULL); + + GPtrArray* layouts = fcitx_kbd_get_layouts(kbd); + + g_ptr_array_foreach(layouts, foreach_cb, NULL); + + g_ptr_array_free(layouts, FALSE); + + g_object_unref(G_OBJECT(kbd)); +} + +int main(int argc, char* argv[]) +{ + g_type_init(); + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/fcitx/keyboard", test_keyboard); + + return g_test_run (); +} \ No newline at end of file diff -Nru fcitx-4.2.2/src/lib/fcitx-utils/log.c fcitx-4.2.4.1/src/lib/fcitx-utils/log.c --- fcitx-4.2.2/src/lib/fcitx-utils/log.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx-utils/log.c 2012-06-10 14:34:48.000000000 +0000 @@ -31,13 +31,6 @@ static iconv_t iconvW = NULL; -/** - * Fcitx记录Log的函数 - * - * @param ErrorLevel - * @param fmt - * @param ... - */ FCITX_EXPORT_API void FcitxLogFunc(ErrorLevel e, const char* filename, const int line, const char* fmt, ...) { diff -Nru fcitx-4.2.2/src/lib/fcitx-utils/log.h fcitx-4.2.4.1/src/lib/fcitx-utils/log.h --- fcitx-4.2.2/src/lib/fcitx-utils/log.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx-utils/log.h 2012-06-10 14:34:48.000000000 +0000 @@ -18,6 +18,26 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ +/** + * @addtogroup FcitxUtils + * @{ + */ + +/** + * @file log.h + * + * Fcitx provides a simply log function in order to record usually message for developers. + * + * A common use case for log function will like this: + * + * @code + * FcitxLog(INFO, "Log for %s", str); + * @endcode + * + * FcitxLog uses printf style argument, please make sure you don't use format string with some + * unsafe string, for example, contains percent symbol. + * + */ #ifndef _FCITX_LOG_H_ #define _FCITX_LOG_H_ @@ -27,6 +47,9 @@ extern "C" { #endif + /** + * @brief ErrorLevel, DEBUG will not be printed if -DENABLE_DEBUG=On is not specified while compiling + **/ typedef enum _ErrorLevel { DEBUG, @@ -36,6 +59,9 @@ WARNING } ErrorLevel; +/** + * a convenient macro for log, it will automatically printed current file and code line number. + */ #define FcitxLog(e, fmt...) FcitxLogFunc(e, __FILE__, __LINE__, fmt) /** @@ -48,11 +74,16 @@ * @param ... * @return void **/ - void FcitxLogFunc(ErrorLevel, const char* filename, const int line, const char* fmt, ...); + void FcitxLogFunc(ErrorLevel level, const char* filename, const int line, const char* fmt, ...); #ifdef __cplusplus } #endif #endif + +/** + * @} + */ + // kate: indent-mode cstyle; space-indent on; indent-width 0; diff -Nru fcitx-4.2.2/src/lib/fcitx-utils/memory.h fcitx-4.2.4.1/src/lib/fcitx-utils/memory.h --- fcitx-4.2.2/src/lib/fcitx-utils/memory.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx-utils/memory.h 2012-06-10 14:34:48.000000000 +0000 @@ -18,18 +18,34 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ -#ifndef _FCITX_MEMORY_H_ -#define _FCITX_MEMORY_H_ -#include +/** + * @addtogroup FcitxUtils + * @{ + */ /** * @file memory.h - * - * a simple naive memory pool for fcitx, scenerio is many small allocate, - * but nearly no single memory free, but it may only free all the allocated memory * + * a simple naive memory pool for fcitx, scenerio is many small allocation, + * but don't need to free, or only free all the allocated memory at once. + * + * A common usage for simple memory pool + * @code + * FcitxMemoryPool* pool = fcitx_memory_pool_create(); + * void* mem = fcitx_memory_pool_alloc(pool, 20); + * ... + * fcitx_memory_pool_destroy(pool); + * @endcode + * + * Memory pool will alloc new memory block by 8k, and mark the page to full when there + * is only 16 bytes left. It can achieve good performance and little memory foot print + * when you need a lot of small allocation. */ +#ifndef _FCITX_MEMORY_H_ +#define _FCITX_MEMORY_H_ + +#include /** memory pool private struct */ typedef struct _FcitxMemoryPool FcitxMemoryPool; @@ -59,3 +75,7 @@ void fcitx_memory_pool_destroy(FcitxMemoryPool* pool); #endif + +/** + * @} + */ diff -Nru fcitx-4.2.2/src/lib/fcitx-utils/utarray.h fcitx-4.2.4.1/src/lib/fcitx-utils/utarray.h --- fcitx-4.2.2/src/lib/fcitx-utils/utarray.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx-utils/utarray.h 2012-06-10 14:34:48.000000000 +0000 @@ -115,6 +115,17 @@ #define utarray_eltptr(a,j) (((j) < (a)->i) ? _utarray_eltptr(a,j) : NULL) #define _utarray_eltptr(a,j) ((char*)((a)->d + ((a)->icd->sz*(j) ))) +#define utarray_push_front(a,p) do { \ + utarray_reserve(a,1); \ + if ((0) < (a)->i) { \ + memmove( _utarray_eltptr(a,1), _utarray_eltptr(a,0), \ + ((a)->i)*((a)->icd->sz)); \ + } \ + if ((a)->icd->copy) { (a)->icd->copy( _utarray_eltptr(a,0), p); } \ + else { memcpy(_utarray_eltptr(a,0), p, (a)->icd->sz); }; \ + (a)->i++; \ + } while(0) + #define utarray_insert(a,p,j) do { \ utarray_reserve(a,1); \ if (j > (a)->i) break; \ @@ -186,7 +197,7 @@ } \ (a)->i -= (len); \ } while(0) - + #define utarray_remove_quick(a,pos) do { \ if ((a)->i - 1 != (pos)) \ memcpy( _utarray_eltptr(a,pos), _utarray_eltptr(a,(a)->i-1), (a)->icd->sz); \ diff -Nru fcitx-4.2.2/src/lib/fcitx-utils/utf8.c fcitx-4.2.4.1/src/lib/fcitx-utils/utf8.c --- fcitx-4.2.2/src/lib/fcitx-utils/utf8.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx-utils/utf8.c 2012-06-10 14:34:48.000000000 +0000 @@ -18,6 +18,7 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ +#include #include "fcitx/fcitx.h" #include "fcitx-utils/utf8.h" @@ -266,4 +267,49 @@ return 1; } + +FCITX_EXPORT_API +void fcitx_utf8_strncpy(char* str, const char* s, size_t byte) +{ + while (*s) { + int chr; + + const char* next = fcitx_utf8_get_char(s, &chr); + size_t diff = next - s; + if (byte < diff) + break; + + memcpy(str, s, diff); + str += diff; + byte -= diff; + s = next; + } + + while(byte --) { + *str = '\0'; + str++; + } +} + + +FCITX_EXPORT_API +size_t fcitx_utf8_strnlen(const char* str, size_t byte) +{ + size_t len = 0; + while (*str && byte > 0) { + int chr; + + const char* next = fcitx_utf8_get_char(str, &chr); + size_t diff = next - str; + if (byte < diff) + break; + + str += diff; + byte -= diff; + str = next; + len ++ ; + } + return len; +} + // kate: indent-mode cstyle; space-indent on; indent-width 0; diff -Nru fcitx-4.2.2/src/lib/fcitx-utils/utf8.h fcitx-4.2.4.1/src/lib/fcitx-utils/utf8.h --- fcitx-4.2.2/src/lib/fcitx-utils/utf8.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx-utils/utf8.h 2012-06-10 14:34:48.000000000 +0000 @@ -84,6 +84,8 @@ /** * next pointer to the nth character, n start with 0 + * this function will not touch the content for s, so const pointer + * can be safely passed and converted. * * @param s string * @param n index @@ -117,6 +119,30 @@ **/ int fcitx_utf8_get_char_validated(const char *p, int max_len); + +/** + * @brief copy most byte length, but keep utf8 valid + * + * @param str dest string + * @param s source string + * @param byte max length + * @return void* + * + * @since 4.2.3 + **/ +void fcitx_utf8_strncpy(char* str, const char* s, size_t byte); + +/** + * @brief count most byte length, utf8 string length + * + * @param str string + * @param byte max length + * @return size_t + * + * @since 4.2.4 + **/ +size_t fcitx_utf8_strnlen(const char* str, size_t byte); + #ifdef __cplusplus } #endif diff -Nru fcitx-4.2.2/src/lib/fcitx-utils/utils.c fcitx-4.2.4.1/src/lib/fcitx-utils/utils.c --- fcitx-4.2.2/src/lib/fcitx-utils/utils.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx-utils/utils.c 2012-06-10 14:34:48.000000000 +0000 @@ -44,6 +44,7 @@ #include "fcitx/fcitx.h" #include "utils.h" #include "utf8.h" +#include "log.h" #if defined(LIBKVM_FOUND) #include @@ -170,10 +171,10 @@ { if (!list) return NULL; - + if (utarray_len(list) == 0) return strdup(""); - + size_t len = 0; char** str; for (str = (char**) utarray_front(list); @@ -182,7 +183,7 @@ { len += strlen(*str) + 1; } - + char* result = (char*) fcitx_utils_malloc0(sizeof(char) * len); char* p = result; for (str = (char**) utarray_front(list); @@ -195,7 +196,7 @@ p += strl + 1; } result[len - 1] = '\0'; - + return result; } @@ -269,7 +270,7 @@ if (*p == '.') { *p = '\0'; } - + if (strDisplayNumber) sscanf(strDisplayNumber, "%d", &displayNumber); @@ -294,7 +295,7 @@ char* m; m = strchr(result, '.'); if (m) *m = '\0'; - + m = strchr(result, '@'); if (m) *m= '\0'; return result; @@ -303,6 +304,50 @@ } FCITX_EXPORT_API +int fcitx_utils_pid_exists(pid_t pid) +{ +#if defined(__linux__) + // verify if a process is running + char path[256]; + snprintf(path, 255, "/proc/%d", pid); + struct stat buf; + if (stat(path, &buf) != 0) { + return 0; + } + if (!S_ISDIR(buf.st_mode)) { + return 0; + } + return 1; +#elif defined(LIBKVM_FOUND) + kvm_t *vm = kvm_open(0, "/dev/null", 0, O_RDONLY, NULL); + if (vm == 0) // ignore all error + return 1; + + int result = 1; + do { + int cnt; + struct kinfo_proc * kp = kvm_getprocs(vm, KERN_PROC_PID, pid, &cnt); + if (kp == 0) { + result = 1; + break; + } + int i; + for (i = 0; i < cnt; i++) + if (kp->ki_pid == pid) + break; + if (i != cnt) + result = 1; + else + result = 0; + } while (0); + kvm_close(vm); + return result; +#else + return 1; +#endif +} + +FCITX_EXPORT_API char* fcitx_utils_get_process_name() { #if defined(__linux__) @@ -310,12 +355,12 @@ FILE* fp = fopen("/proc/self/stat", "r"); if (!fp) break; - + const size_t bufsize = 1024; char buf[bufsize]; fgets(buf, bufsize, fp); fclose(fp); - + char* S = strchr(buf, '('); if (!S) break; @@ -331,21 +376,24 @@ if (vm == 0) return strdup(""); - int cnt; - int mypid = getpid(); - struct kinfo_proc * kp = kvm_getprocs(vm, KERN_PROC_PID, mypid, &cnt); - if ((cnt != 1) || (kp == 0)) - return strdup(""); - int i; - for (i = 0; i < cnt; i++) - if (kp->ki_pid == mypid) - break; char* result = NULL; - if (i != cnt) - result = strdup(kp->ki_comm); - else - result = strdup(""); + do { + int cnt; + int mypid = getpid(); + struct kinfo_proc * kp = kvm_getprocs(vm, KERN_PROC_PID, mypid, &cnt); + if ((cnt != 1) || (kp == 0)) { + break; + } + int i; + for (i = 0; i < cnt; i++) + if (kp->ki_pid == mypid) + break; + if (i != cnt) + result = strdup(kp->ki_comm); + } while (0); kvm_close(vm); + if (result == NULL) + result = strdup(""); return result; #else return strdup(""); @@ -407,5 +455,58 @@ return result; } +FCITX_EXPORT_API +void fcitx_utils_string_swap(char** obj, const char* str) +{ + fcitx_utils_free(*obj); + + if (str) + *obj = strdup(str); + else + *obj = NULL; +} + +FCITX_EXPORT_API +void fcitx_utils_launch_configure_tool() +{ + char* command = fcitx_utils_get_fcitx_path_with_filename("bindir", "/fcitx-configtool &"); + FILE* p = popen(command, "r"); + free(command); + if (p) + pclose(p); + else + FcitxLog(ERROR, _("Unable to create process")); +} + + +FCITX_EXPORT_API +void fcitx_utils_launch_configure_tool_for_addon(const char* imaddon) +{ + char* command = fcitx_utils_get_fcitx_path_with_filename("bindir", "/fcitx-configtool"); + char* commandf; + asprintf(&commandf, "%s %s &", command, imaddon); + FILE* p = popen(commandf, "r"); + free(command); + free(commandf); + if (p) + pclose(p); + else + FcitxLog(ERROR, _("Unable to create process")); +} + +FCITX_EXPORT_API +void fcitx_utils_launch_restart() +{ + char* command = fcitx_utils_get_fcitx_path_with_filename("bindir", "/fcitx"); + char* commandf; + asprintf(&commandf, "%s -r &", command); + FILE* p = popen(commandf, "r"); + free(command); + free(commandf); + if (p) + pclose(p); + else + FcitxLog(ERROR, _("Unable to create process")); +} // kate: indent-mode cstyle; space-indent on; indent-width 0; diff -Nru fcitx-4.2.2/src/lib/fcitx-utils/utils.h fcitx-4.2.4.1/src/lib/fcitx-utils/utils.h --- fcitx-4.2.2/src/lib/fcitx-utils/utils.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/lib/fcitx-utils/utils.h 2012-06-10 14:34:48.000000000 +0000 @@ -19,18 +19,18 @@ ***************************************************************************/ /** * @defgroup FcitxUtils FcitxUtils - * + * * Fcitx Utils contains a bunch of functions, with extend common c library. * It contains uthash/utarray as macro based hash table and dynamic array. - * + * * Some Fcitx path related function, includes fcitx_utils_get_fcitx_path() * and fcitx_utils_get_fcitx_path_with_filename() - * + * * Some string related function, providing split, join string list. - * - * A simple memory pool, if you need to allocate many small memory block, and + * + * A simple memory pool, if you need to allocate many small memory block, and * only need to free them at once. - * + * * Some log function, which prints the current file number, with printf format. */ @@ -51,6 +51,7 @@ #define _FCITX_UTILS_H_ #include +#include #include #include @@ -94,7 +95,7 @@ * * @return void **/ - void fcitx_utils_init_as_daemon(); + void fcitx_utils_init_as_daemon(void); /** * Count the file line count @@ -103,14 +104,14 @@ * @return int line count **/ int fcitx_utils_calculate_record_number(FILE* fpDict); - - + + /** * create empty string list * * @return UT_array* **/ - UT_array* fcitx_utils_new_string_list(); + UT_array* fcitx_utils_new_string_list(void); /** * Split a string by delm @@ -120,7 +121,7 @@ * @return UT_array* a new utarray for store the split string **/ UT_array* fcitx_utils_split_string(const char *str, char delm); - + /** * append a string with printf format * @@ -129,7 +130,7 @@ * @return void **/ void fcitx_utils_string_list_printf_append(UT_array* list, const char* fmt,...); - + /** * Join string list with delm * @@ -174,20 +175,22 @@ **/ void* fcitx_utils_malloc0(size_t bytes); +#define fcitx_utils_new(TYPE) ((TYPE*) fcitx_utils_malloc0(sizeof(TYPE))) + /** * Get Display number, Fcitx DBus and Socket are identified by display number. * * @return int **/ - int fcitx_utils_get_display_number(); - + int fcitx_utils_get_display_number(void); + /** * Get current language code, result need to be free'd * It will check LC_CTYPE, LC_ALL, LANG, for current language code. * * @return char* **/ - char* fcitx_utils_get_current_langcode(); + char* fcitx_utils_get_current_langcode(void); /** * Get Current Process Name, implementation depends on OS, @@ -196,8 +199,17 @@ * * @return char* **/ - char* fcitx_utils_get_process_name(); - + char* fcitx_utils_get_process_name(void); + + + /** + * @brief check a process is running or not + * + * @param pid pid + * @return 1 for exists or error, 0 for non exists + **/ + int fcitx_utils_pid_exists(pid_t pid); + /** * Get Fcitx install path, need be free'd * All possible type includes: @@ -206,37 +218,74 @@ * bindir * libdir * localedir - * + * * It's determined at compile time, and can be changed via environment variable: FCITXDIR - * + * * It will only return NULL while the type is invalid. - * + * * @param type path type - * + * * @return char* - * + * * @since 4.2.1 */ char* fcitx_utils_get_fcitx_path(const char* type); - + /** * Get fcitx install path with file name, need to be free'd - * + * * It's just simply return the path/filename string. - * + * * It will only return NULL while the type is invalid. - * + * * @param type path type * @param filename filename - * + * * @return char* - * + * * @see fcitx_utils_get_fcitx_path - * + * * @since 4.2.1 */ char* fcitx_utils_get_fcitx_path_with_filename(const char* type, const char* filename); + /** + * launch fcitx-configtool + * + * @return void + **/ + void fcitx_utils_launch_configure_tool(void); + + /** + * launch fcitx-configtool for an addon + * + * @return void + **/ + void fcitx_utils_launch_configure_tool_for_addon(const char* addon); + + /** + * helper function to execute fcitx -r + * + * @return void + **/ + void fcitx_utils_launch_restart(void); + + /** + * if obj is null, free it, after that, if str is NULL set it with NULL, + * if str is not NULL, set it with strdup(str) + * + * @param obj object string + * @param str source string + * @return void + **/ + void fcitx_utils_string_swap(char** obj, const char* str); + + /** free a pointer if it's not NULL */ +#define fcitx_utils_free(ptr) do { \ + if (ptr) \ + free(ptr); \ + } while(0) + #ifdef __cplusplus } #endif diff -Nru fcitx-4.2.2/src/module/autoeng/AutoEng.c fcitx-4.2.4.1/src/module/autoeng/AutoEng.c --- fcitx-4.2.2/src/module/autoeng/AutoEng.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/module/autoeng/AutoEng.c 2012-06-10 14:34:48.000000000 +0000 @@ -138,7 +138,7 @@ khk.func = PreInputProcessAutoEng; FcitxInstanceRegisterPreInputFilter(instance, khk); - + khk.func = PostInputProcessAutoEng; FcitxInstanceRegisterPostInputFilter(instance, khk); @@ -146,7 +146,7 @@ rhk.arg = autoEngState; rhk.func = ResetAutoEng; FcitxInstanceRegisterResetInputHook(instance, rhk); - + FcitxInstanceRegisterWatchableContext(instance, CONTEXT_DISABLE_AUTOENG, FCT_Boolean, FCF_ResetOnInputMethodChange); ResetAutoEng(autoEngState); @@ -163,7 +163,7 @@ boolean disableCheckUAZ = FcitxInstanceGetContextBoolean(autoEngState->owner, CONTEXT_DISABLE_AUTOENG); if (disableCheckUAZ) return false; - + if (autoEngState->active) { FcitxKeySym keymain = FcitxHotkeyPadToMain(sym); if (FcitxHotkeyIsHotKeySimple(keymain, state)) { @@ -231,7 +231,7 @@ ShowAutoEngMessage(autoEngState); return true; } - + return false; } @@ -307,6 +307,7 @@ strcpy(FcitxInputStateGetRawInputBuffer(input), autoEngState->buf); FcitxInputStateSetRawInputBufferSize(input, strlen(autoEngState->buf)); FcitxInputStateSetCursorPos(input, FcitxInputStateGetRawInputBufferSize(input)); + FcitxInputStateSetClientCursorPos(input, FcitxInputStateGetRawInputBufferSize(input)); FcitxInputStateSetShowCursor(input, true); FcitxMessagesAddMessageAtLast(FcitxInputStateGetAuxDown(input), MSG_TIPS, _("Press Enter to input text")); } diff -Nru fcitx-4.2.2/src/module/chttrans/chttrans.c fcitx-4.2.4.1/src/module/chttrans/chttrans.c --- fcitx-4.2.2/src/module/chttrans/chttrans.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/module/chttrans/chttrans.c 2012-06-10 14:34:48.000000000 +0000 @@ -124,13 +124,17 @@ FcitxInstanceRegisterHotkeyFilter(instance, hk); FcitxInstanceRegisterOutputFilter(instance, shk); FcitxInstanceRegisterCommitFilter(instance, shk); - FcitxUIRegisterStatus(instance, transState, "chttrans", _("Traditional Chinese Translate"), _("Traditional Chinese Translate"), ToggleChttransState, GetChttransEnabled); - + FcitxUIRegisterStatus(instance, transState, "chttrans", + transState->enabled ? _("Convert to Traditional Chinese") : _("Convert to Simplified Chinese"), + _("Toggle Simp/Trad Chinese Conversion"), + ToggleChttransState, + GetChttransEnabled); + FcitxInstanceWatchContext(instance, CONTEXT_IM_LANGUAGE, ChttransLanguageChanged, transState); - + AddFunction(transAddon, ChttransS2T); AddFunction(transAddon, ChttransT2S); - + return transState; } @@ -151,6 +155,10 @@ { FcitxChttrans* transState = (FcitxChttrans*) arg; transState->enabled = !transState->enabled; + FcitxUISetStatusString(transState->owner, "chttrans", + transState->enabled ? _("Convert to Traditional Chinese") : _("Convert to Simplified Chinese"), + _("Toggle Simp/Trad Chinese Conversion")); + FcitxUIUpdateInputWindow(transState->owner); SaveChttransConfig(transState); } @@ -188,7 +196,7 @@ { FcitxChttrans* transState = (FcitxChttrans*) arg; const char* s = args.args[0]; - + return ConvertGBKSimple2Tradition(transState, s); } @@ -196,7 +204,7 @@ { FcitxChttrans* transState = (FcitxChttrans*) arg; const char* s = args.args[0]; - + return ConvertGBKTradition2Simple(transState, s); } @@ -360,7 +368,7 @@ ps = fcitx_utf8_get_char(strBuf, &wc); t2s = (simple2trad_t*) malloc(sizeof(simple2trad_t)); - + fcitx_utf8_get_char(ps, &wc); t2s->wc = wc; t2s->len = fcitx_utf8_char_len(strBuf); @@ -385,7 +393,7 @@ int chr_len = fcitx_utf8_char_len(ps); char *nps; nps = fcitx_utf8_get_char(ps , &wc); - HASH_FIND_INT(transState->s2t_table, &wc, t2s); + HASH_FIND_INT(transState->t2s_table, &wc, t2s); if (t2s) { strcat(ret, t2s->str); @@ -428,7 +436,7 @@ FcitxChttransConfigBind(transState, cfile, configDesc); FcitxConfigBindSync((FcitxGenericConfig*)transState); - + if (newconfig) { char *p = fcitx_utils_get_current_langcode(); if (strcmp(p, "zh_TW") == 0 || strcmp(p, "zh_HK") == 0) { @@ -471,7 +479,7 @@ boolean visible = false; if (lang && strncmp(lang, "zh", 2) == 0 && strlen(lang) > 2) visible = true; - + FcitxUISetStatusVisable(transState->owner, "chttrans", visible); } diff -Nru fcitx-4.2.2/src/module/CMakeLists.txt fcitx-4.2.4.1/src/module/CMakeLists.txt --- fcitx-4.2.2/src/module/CMakeLists.txt 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/module/CMakeLists.txt 2012-06-10 14:34:48.000000000 +0000 @@ -5,10 +5,17 @@ add_subdirectory(autoeng) add_subdirectory(fullwidthchar) add_subdirectory(remote) +add_subdirectory(imselector) +add_subdirectory(xkb) if (_ENABLE_CAIRO) add_subdirectory(vk) endif (_ENABLE_CAIRO) if (_ENABLE_DBUS) add_subdirectory(dbus) + add_subdirectory(xkbdbus) endif (_ENABLE_DBUS) + +if (ENABLE_LUA) + add_subdirectory(lua) +endif (ENABLE_LUA) \ No newline at end of file diff -Nru fcitx-4.2.2/src/module/dbus/dbusstuff.c fcitx-4.2.4.1/src/module/dbus/dbusstuff.c --- fcitx-4.2.2/src/module/dbus/dbusstuff.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/module/dbus/dbusstuff.c 2012-06-10 14:34:48.000000000 +0000 @@ -80,7 +80,7 @@ int retry = 0; DBusConnection* conn = NULL; - do { + while (1) { conn = dbus_bus_get(DBUS_BUS_SESSION, &err); if (dbus_error_is_set(&err)) { FcitxLog(WARNING, _("Connection Error (%s)"), err.message); @@ -88,11 +88,13 @@ dbus_error_init(&err); } - if (NULL == conn) { - sleep(RETRY_INTERVAL * MAX_RETRY_TIMES); + if (NULL == conn && retry < MAX_RETRY_TIMES) { retry ++; + sleep(RETRY_INTERVAL * retry); + } else { + break; } - } while (NULL == conn && retry < MAX_RETRY_TIMES); + } if (NULL == conn) { free(dbusmodule); @@ -129,30 +131,30 @@ } if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) { FcitxLog(WARNING, "DBus Service Already Exists"); - + if (FcitxInstanceIsTryReplace(instance)) { FcitxInstanceResetTryReplace(instance); DBusMessage* message = dbus_message_new_method_call(servicename, FCITX_IM_DBUS_PATH, FCITX_IM_DBUS_INTERFACE, "Exit"); dbus_connection_send(dbusmodule->conn, message, NULL); /* synchronize call here */ DBusMessage* reply = dbus_connection_send_with_reply_and_block(dbusmodule->conn, message, 0, &err); - + if (dbus_error_is_set(&err)) { dbus_error_free(&err); dbus_error_init(&err); } - + if (reply) dbus_message_unref(reply); dbus_message_unref(message); - + /* sleep for a while and retry */ sleep(1); - + request_retry = true; continue; } - + dbus_error_free(&err); free(servicename); free(dbusmodule); diff -Nru fcitx-4.2.2/src/module/dbus/fcitx-dbus.conf.in fcitx-4.2.4.1/src/module/dbus/fcitx-dbus.conf.in --- fcitx-4.2.2/src/module/dbus/fcitx-dbus.conf.in 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/module/dbus/fcitx-dbus.conf.in 2012-06-10 14:34:48.000000000 +0000 @@ -6,4 +6,5 @@ Enabled=True Library=fcitx-dbus.so Type=SharedLibrary -Priority=30 \ No newline at end of file +Priority=30 +Advance=True diff -Nru fcitx-4.2.2/src/module/fullwidthchar/fullwidthchar.c fcitx-4.2.4.1/src/module/fullwidthchar/fullwidthchar.c --- fcitx-4.2.2/src/module/fullwidthchar/fullwidthchar.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/module/fullwidthchar/fullwidthchar.c 2012-06-10 14:34:48.000000000 +0000 @@ -34,6 +34,7 @@ #include "fcitx/keys.h" #include "fcitx/frontend.h" #include "fcitx/instance.h" +#include char *sCornerTrans[] = { " ", "!", """, "#", "¥", "%", "&", "'", "(", ")", @@ -72,6 +73,7 @@ unsigned int state, INPUT_RETURN_VALUE *retval ); +static void DisableFullWidthCharChanged(void* arg, const void* value); typedef struct _FcitxFullWidthChar { FcitxInstance* owner; @@ -111,11 +113,25 @@ FcitxInstanceRegisterHotkeyFilter(instance, hotkey); - FcitxUIRegisterStatus(instance, fwchar, "fullwidth", _("Full Width Character"), _("Full Width Character"), ToggleFullWidthState, GetFullWidthState); + FcitxProfile* profile = FcitxInstanceGetProfile(instance); + FcitxUIRegisterStatus(instance, fwchar, "fullwidth", + profile->bUseFullWidthChar ? _("Full width Character") : _("Half width Character"), + _("Toggle Half/Full width Character"), + ToggleFullWidthState, GetFullWidthState); + + FcitxInstanceRegisterWatchableContext(instance, CONTEXT_DISABLE_FULLWIDTH, FCT_Boolean, FCF_ResetOnInputMethodChange); + FcitxInstanceWatchContext(instance, CONTEXT_DISABLE_FULLWIDTH, DisableFullWidthCharChanged, fwchar); return fwchar; } +void DisableFullWidthCharChanged(void* arg, const void* value) +{ + const boolean* b = value; + FcitxFullWidthChar* fwchar = arg; + FcitxUISetStatusVisable(fwchar->owner, "fullwidth", !(*b)); +} + boolean FullWidthPostFilter(void* arg, FcitxKeySym sym, unsigned int state, INPUT_RETURN_VALUE *retval @@ -126,7 +142,8 @@ if (*retval != IRV_TO_PROCESS) return false; - if (profile->bUseFullWidthChar && FcitxHotkeyIsHotKeySimple(sym, state)) { + FcitxUIStatus *status = FcitxUIGetStatusByName(fwchar->owner, "fullwidth"); + if (profile->bUseFullWidthChar && status->visible && FcitxHotkeyIsHotKeySimple(sym, state)) { sprintf(FcitxInputStateGetOutputString(FcitxInstanceGetInputState(fwchar->owner)), "%s", sCornerTrans[sym - 32]); *retval = IRV_COMMIT_STRING; return true; @@ -139,7 +156,8 @@ { FcitxFullWidthChar* fwchar = (FcitxFullWidthChar*)arg; FcitxProfile* profile = FcitxInstanceGetProfile(fwchar->owner); - if (profile->bUseFullWidthChar) { + FcitxUIStatus *status = FcitxUIGetStatusByName(fwchar->owner, "fullwidth"); + if (profile->bUseFullWidthChar && status->visible) { size_t i = 0, ret_len = 0, len = fcitx_utf8_strlen(str); char* ret = (char *) fcitx_utils_malloc0(sizeof(char) * (UTF8_MAX_LENGTH * len + 1)); const char* ps = str; @@ -173,8 +191,10 @@ FcitxFullWidthChar* fwchar = (FcitxFullWidthChar*)arg; FcitxProfile* profile = FcitxInstanceGetProfile(fwchar->owner); profile->bUseFullWidthChar = !profile->bUseFullWidthChar; + FcitxUISetStatusString(fwchar->owner, "fullwidth", + profile->bUseFullWidthChar ? _("Full width Character") : _("Half width Character"), + _("Toggle Half/Full width Character")); FcitxProfileSave(profile); - FcitxInstanceResetInput(fwchar->owner); } boolean GetFullWidthState(void* arg) @@ -187,8 +207,13 @@ INPUT_RETURN_VALUE ToggleFullWidthStateWithHotkey(void* arg) { FcitxFullWidthChar* fwchar = (FcitxFullWidthChar*)arg; - FcitxUIUpdateStatus(fwchar->owner, "fullwidth"); - return IRV_DO_NOTHING; + FcitxUIStatus *status = FcitxUIGetStatusByName(fwchar->owner, "fullwidth"); + if (status->visible) { + FcitxUIUpdateStatus(fwchar->owner, "fullwidth"); + return IRV_DO_NOTHING; + } + else + return IRV_TO_PROCESS; } // kate: indent-mode cstyle; space-indent on; indent-width 0; diff -Nru fcitx-4.2.2/src/module/imselector/CMakeLists.txt fcitx-4.2.4.1/src/module/imselector/CMakeLists.txt --- fcitx-4.2.2/src/module/imselector/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/module/imselector/CMakeLists.txt 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,9 @@ +include_directories(${PROJECT_SOURCE_DIR}/src) + +set(FCITX_imselector_SOURCES + imselector.c +) + +fcitx_add_addon(fcitx-imselector ${FCITX_imselector_SOURCES}) +fcitx_add_addon_conf_file(fcitx-imselector.conf) +fcitx_add_configdesc_file(fcitx-imselector.desc) diff -Nru fcitx-4.2.2/src/module/imselector/fcitx-imselector.conf.in fcitx-4.2.4.1/src/module/imselector/fcitx-imselector.conf.in --- fcitx-4.2.2/src/module/imselector/fcitx-imselector.conf.in 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/module/imselector/fcitx-imselector.conf.in 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,9 @@ +[Addon] +Name=fcitx-imselector +_GeneralName=Input method selector +_Comment=Select specific input method via keyboard +Category=Module +Enabled=True +Library=fcitx-imselector.so +Type=SharedLibrary +Priority=40 diff -Nru fcitx-4.2.2/src/module/imselector/fcitx-imselector.desc fcitx-4.2.4.1/src/module/imselector/fcitx-imselector.desc --- fcitx-4.2.2/src/module/imselector/fcitx-imselector.desc 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/module/imselector/fcitx-imselector.desc 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,12 @@ +[IMSelector/LocalInputMethodSelectKey] +Type=Hotkey +DefaultValue= +Description=Local Input Method SelectKey + +[IMSelector/GlobalInputMethodSelectKey] +Type=Hotkey +DefaultValue= +Description=Global Input Method SelectKey + +[DescriptionFile] +LocaleDomain=fcitx \ No newline at end of file diff -Nru fcitx-4.2.2/src/module/imselector/imselector.c fcitx-4.2.4.1/src/module/imselector/imselector.c --- fcitx-4.2.2/src/module/imselector/imselector.c 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/module/imselector/imselector.c 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,290 @@ +/*************************************************************************** + * Copyright (C) 2002~2005 by Yuking * + * yuking_net@sohu.com * + * * + * This program is free software; you can 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ +#include +#include +#include +#include +#include +#include "fcitx/instance.h" + +#include "fcitx/fcitx.h" +#include "fcitx/module.h" +#include "fcitx/hook.h" +#include "fcitx/candidate.h" +#include "fcitx/keys.h" +#include +#include "fcitx-config/xdg.h" +#include "fcitx-utils/log.h" + +typedef struct _IMSelector { + FcitxGenericConfig gconfig; + FcitxHotkey localKey[2]; + FcitxHotkey globalKey[2]; + boolean triggered; + boolean global; + FcitxInstance* owner; +} IMSelector; + +static void* IMSelectorCreate(FcitxInstance* instance); +static boolean IMSelectorPreFilter(void* arg, FcitxKeySym sym, + unsigned int state, + INPUT_RETURN_VALUE *retval + ); +static void IMSelectorReset(void* arg); +static void IMSelectorReload(void* arg); +static INPUT_RETURN_VALUE IMSelectorLocalTrigger(void* arg); +static INPUT_RETURN_VALUE IMSelectorGlobalTrigger(void* arg); +static boolean LoadIMSelectorConfig(IMSelector* imselector); +static void SaveIMSelectorConfig(IMSelector* imselector); +static void IMSelectorGetCands(IMSelector* imselector); + +FCITX_EXPORT_API +FcitxModule module = { + IMSelectorCreate, + NULL, + NULL, + NULL, + IMSelectorReload +}; + +FCITX_EXPORT_API +int ABI_VERSION = FCITX_ABI_VERSION; + +CONFIG_BINDING_BEGIN(IMSelector) +CONFIG_BINDING_REGISTER("IMSelector", "LocalInputMethodSelectKey", localKey) +CONFIG_BINDING_REGISTER("IMSelector", "GlobalInputMethodSelectKey", globalKey) +CONFIG_BINDING_END() + +void* IMSelectorCreate(FcitxInstance* instance) +{ + IMSelector* imselector = fcitx_utils_malloc0(sizeof(IMSelector)); + imselector->owner = instance; + if (!LoadIMSelectorConfig(imselector)) { + free(imselector); + return NULL; + } + + FcitxKeyFilterHook hk; + hk.arg = imselector; + hk.func = IMSelectorPreFilter; + FcitxInstanceRegisterPreInputFilter(instance, hk); + + FcitxHotkeyHook hkhk; + hkhk.arg = imselector; + hkhk.hotkeyhandle = IMSelectorLocalTrigger; + hkhk.hotkey = imselector->localKey; + FcitxInstanceRegisterHotkeyFilter(instance, hkhk); + + hkhk.arg = imselector; + hkhk.hotkeyhandle = IMSelectorGlobalTrigger; + hkhk.hotkey = imselector->globalKey; + FcitxInstanceRegisterHotkeyFilter(instance, hkhk); + + FcitxIMEventHook resethk; + resethk.arg = imselector; + resethk.func = IMSelectorReset; + FcitxInstanceRegisterResetInputHook(instance, resethk); + return imselector; +} + +boolean IMSelectorPreFilter(void* arg, FcitxKeySym sym, unsigned int state, INPUT_RETURN_VALUE* retval) +{ + IMSelector* imselector = arg; + FcitxInstance* instance = imselector->owner; + FcitxInputState *input = FcitxInstanceGetInputState(instance); + FcitxGlobalConfig* fc = FcitxInstanceGetGlobalConfig(instance); + if (!imselector->triggered) + return false; + + const FcitxHotkey* hkPrevPage = FcitxInstanceGetContextHotkey(instance, CONTEXT_ALTERNATIVE_PREVPAGE_KEY); + if (hkPrevPage == NULL) + hkPrevPage = fc->hkPrevPage; + + const FcitxHotkey* hkNextPage = FcitxInstanceGetContextHotkey(instance, CONTEXT_ALTERNATIVE_NEXTPAGE_KEY); + if (hkNextPage == NULL) + hkNextPage = fc->hkNextPage; + + FcitxCandidateWordList* candList = FcitxInputStateGetCandidateList(input); + + if (FcitxHotkeyIsHotKey(sym, state, hkPrevPage)) { + FcitxCandidateWordGoPrevPage(candList); + *retval = IRV_DISPLAY_MESSAGE; + } else if (FcitxHotkeyIsHotKey(sym, state, hkNextPage)) { + FcitxCandidateWordGoNextPage(candList); + *retval = IRV_DISPLAY_MESSAGE; + } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_SPACE)) { + if (FcitxCandidateWordPageCount(candList) != 0) + *retval = FcitxCandidateWordChooseByIndex(candList, 0); + } else if (FcitxHotkeyIsHotKeyDigit(sym, state)) { + int iKey = FcitxHotkeyCheckChooseKey(sym, state, DIGIT_STR_CHOOSE); + if (iKey >= 0) + *retval = FcitxCandidateWordChooseByIndex(candList, iKey); + } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_ESCAPE)) { + *retval = IRV_CLEAN; + } else { + *retval = IRV_DO_NOTHING; + } + return true; +} + +INPUT_RETURN_VALUE IMSelectorGlobalTrigger(void* arg) +{ + IMSelector* imselector = arg; + imselector->triggered = true; + imselector->global = true; + IMSelectorGetCands(imselector); + return IRV_DISPLAY_MESSAGE; +} + +INPUT_RETURN_VALUE IMSelectorLocalTrigger(void* arg) +{ + IMSelector* imselector = arg; + imselector->triggered = true; + imselector->global = false; + IMSelectorGetCands(imselector); + return IRV_DISPLAY_MESSAGE; +} + +INPUT_RETURN_VALUE IMSelectorGetCand(void* arg, FcitxCandidateWord* candWord) +{ + IMSelector* imselector = arg; + FcitxInstance* instance = imselector->owner; + + if (!candWord->priv) { + FcitxInstanceSetLocalIMName(instance, FcitxInstanceGetCurrentIC(instance), NULL); + return IRV_CLEAN; + } + + int index = FcitxInstanceGetIMIndexByName(imselector->owner, (char*) candWord->priv); + + if (index == 0) + FcitxInstanceCloseIM(instance, FcitxInstanceGetCurrentIC(instance)); + else { + if (imselector->global) + FcitxInstanceSwitchIM(instance, index); + else + FcitxInstanceSetLocalIMName(instance, FcitxInstanceGetCurrentIC(instance), (char*) candWord->priv); + + if (FcitxInstanceGetCurrentState(instance) != IS_ACTIVE) + FcitxInstanceEnableIM(instance, FcitxInstanceGetCurrentIC(instance), false); + } + return IRV_CLEAN; +} + +void IMSelectorGetCands(IMSelector* imselector) +{ + FcitxInstance* instance = imselector->owner; + FcitxInputState *input = FcitxInstanceGetInputState(instance); + FcitxIM* pim; + UT_array* imes = FcitxInstanceGetIMEs(instance); + FcitxInstanceCleanInputWindow(instance); + FcitxCandidateWordSetPageSize(FcitxInputStateGetCandidateList(input), 10); + FcitxCandidateWordSetChoose(FcitxInputStateGetCandidateList(input), DIGIT_STR_CHOOSE); + FcitxInputStateSetShowCursor(input, false); + + FcitxInputContext* ic = FcitxInstanceGetCurrentIC(instance); + FcitxInputContext2* ic2 = (FcitxInputContext2*) ic; + if (!ic) + return; + + FcitxMessagesAddMessageAtLast(FcitxInputStateGetAuxUp(input), MSG_TIPS, "%s", imselector->global ? _("Select global input method: ") : _("Select local input method: ")); + if (ic2->imname) { + int idx = FcitxInstanceGetIMIndexByName(instance, ic2->imname); + FcitxIM* im = (FcitxIM*) utarray_eltptr(imes, idx); + if (im) { + FcitxMessagesAddMessageAtLast(FcitxInputStateGetAuxUp(input), MSG_TIPS, _("Current local input method is %s"), im->strName); + } + } + else { + FcitxMessagesAddMessageAtLast(FcitxInputStateGetAuxUp(input), MSG_TIPS, _("No local input method")); + } + for (pim = (FcitxIM *) utarray_front(imes); + pim != NULL; + pim = (FcitxIM *) utarray_next(imes, pim)) { + FcitxCandidateWord candWord; + candWord.callback = IMSelectorGetCand; + candWord.owner = imselector; + candWord.strExtra = NULL; + if (ic2->imname && strcmp(ic2->imname, pim->uniqueName) == 0) { + candWord.priv = NULL; + candWord.strWord = strdup(_("Clear local input method")); + } + else { + candWord.priv = strdup(pim->uniqueName); + candWord.strWord = strdup(pim->strName); + } + candWord.wordType = MSG_OTHER; + FcitxCandidateWordAppend(FcitxInputStateGetCandidateList(input), &candWord); + } +} + +void IMSelectorReset(void* arg) +{ + IMSelector* imselector = arg; + imselector->triggered = false; +} + + +void IMSelectorReload(void* arg) +{ + IMSelector* imselector = arg; + LoadIMSelectorConfig(imselector); +} + +CONFIG_DESC_DEFINE(GetIMSelectorConfig, "fcitx-imselector.desc") + +boolean LoadIMSelectorConfig(IMSelector* imselector) +{ + FcitxConfigFileDesc* configDesc = GetIMSelectorConfig(); + if (configDesc == NULL) + return false; + + FILE *fp; + char *file; + fp = FcitxXDGGetFileUserWithPrefix("conf", "fcitx-imselector.config", "r", &file); + FcitxLog(DEBUG, "Load Config File %s", file); + free(file); + if (!fp) { + if (errno == ENOENT) + SaveIMSelectorConfig(imselector); + } + + FcitxConfigFile *cfile = FcitxConfigParseConfigFileFp(fp, configDesc); + + IMSelectorConfigBind(imselector, cfile, configDesc); + FcitxConfigBindSync((FcitxGenericConfig*)imselector); + + if (fp) + fclose(fp); + + return true; +} + +void SaveIMSelectorConfig(IMSelector* imselector) +{ + FcitxConfigFileDesc* configDesc = GetIMSelectorConfig(); + char *file; + FILE *fp = FcitxXDGGetFileUserWithPrefix("conf", "fcitx-imselector.config", "w", &file); + FcitxLog(DEBUG, "Save Config to %s", file); + FcitxConfigSaveConfigFileFp(fp, &imselector->gconfig, configDesc); + free(file); + if (fp) + fclose(fp); +} \ No newline at end of file diff -Nru fcitx-4.2.2/src/module/lua/CMakeLists.txt fcitx-4.2.4.1/src/module/lua/CMakeLists.txt --- fcitx-4.2.2/src/module/lua/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/module/lua/CMakeLists.txt 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,13 @@ +find_package(Lua51 REQUIRED) + +include_directories(${LUA_INCLUDE_DIR}) + +set(FCITX_LUA_SOURCES + lua.c + luawrap.c +) + +fcitx_add_addon(fcitx-lua ${FCITX_LUA_SOURCES}) +fcitx_add_addon_conf_file(fcitx-lua.conf) + +target_link_libraries(fcitx-lua ${LUA_LIBRARIES}) diff -Nru fcitx-4.2.2/src/module/lua/fcitx-lua.conf.in fcitx-4.2.4.1/src/module/lua/fcitx-lua.conf.in --- fcitx-4.2.2/src/module/lua/fcitx-lua.conf.in 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/module/lua/fcitx-lua.conf.in 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,10 @@ +[Addon] +Name=fcitx-lua +_GeneralName=Fcitx Lua Support +_Comment=Add Lua script support for Fcitx +Category=Module +Enabled=True +Library=fcitx-lua.so +Type=SharedLibrary +Priority=80 +Advance=True diff -Nru fcitx-4.2.2/src/module/lua/lua.c fcitx-4.2.4.1/src/module/lua/lua.c --- fcitx-4.2.2/src/module/lua/lua.c 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/module/lua/lua.c 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,176 @@ +/*************************************************************************** + * Copyright (C) 2012~2012 by CSSlayer * + * wengxt@gmail.com * + * * + * This program is free software; you can 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include "fcitx/fcitx.h" +#include "fcitx/candidate.h" +#include "fcitx/instance.h" +#include "fcitx/module.h" +#include "fcitx/hook.h" +#include "fcitx-utils/log.h" +#include "fcitx-config/xdg.h" + +#include "luamod.h" +#include "luawrap.h" + +static void* LuaCreate(FcitxInstance* instance); +static void LuaReloadConfig(void* arg); +static void* LuaCallCommand(void* arg, FcitxModuleFunctionArg args); + +FCITX_EXPORT_API +FcitxModule module = { + LuaCreate, + NULL, + NULL, + NULL, + LuaReloadConfig +}; + +FCITX_EXPORT_API +int ABI_VERSION = FCITX_ABI_VERSION; + +static int LoadLuaConfig(LuaModule *luamodule) { + int count = 0; + FcitxStringHashSet *sset = FcitxXDGGetFiles("lua", NULL, ".lua"); + FcitxStringHashSet *str; + for (str = sset; str != NULL;) { + FcitxStringHashSet *tmp = str->hh.next; + char *path; + FILE *f = FcitxXDGGetFileWithPrefix("lua", str->name, "r", &path); + if (f && path) { + if (LoadExtension(luamodule, path)) { + FcitxLog(INFO, "lua load extension file:%s", path); + ++count; + } else { + FcitxLog(ERROR, "LoadExtension() failed"); + } + } + if (f) { + fclose(f); + } + if (path) { + free(path); + } + HASH_DEL(sset, str); + free(str->name); + free(str); + str = tmp; + } + return count; +} + +static INPUT_RETURN_VALUE LuaGetCandWord(void* arg, FcitxCandidateWord* candWord) { + LuaModule *luamodule = (LuaModule *)candWord->owner; + FcitxInputState* input = FcitxInstanceGetInputState(GetFcitx(luamodule)); + snprintf(FcitxInputStateGetOutputString(input), MAX_USER_INPUT, "%s", candWord->strWord); + return IRV_COMMIT_STRING; +} + +static void* LuaCallCommand(void* arg, FcitxModuleFunctionArg args) { + LuaModule *luamodule = (LuaModule *)arg; + UT_array *result = InputCommand(luamodule, (const char *)args.args[0]); + if (result) { + FcitxInputState* input = FcitxInstanceGetInputState(GetFcitx(luamodule)); + LuaResultItem *p = NULL; + while ((p = (LuaResultItem *)utarray_next(result, p))) { + FcitxCandidateWord candWord; + if (args.args[1] && args.args[2]) { + candWord.callback = args.args[1]; + candWord.owner = args.args[2]; + } + else { + candWord.callback = LuaGetCandWord; + candWord.owner = luamodule; + } + candWord.priv = NULL; + if (p->help) { + candWord.strExtra = strdup(p->help); + } else { + candWord.strExtra = NULL; + } + candWord.strWord = strdup(p->result); + candWord.wordType = MSG_TIPS; + candWord.extraType = MSG_CODE; + FcitxCandidateWordAppend(FcitxInputStateGetCandidateList(input), &candWord); + } + utarray_free(result); + } + return NULL; +} + +void AddToCandList(LuaModule *luamodule, const char *in, const char *out) { + FcitxCandidateWord candWord; + candWord.callback = LuaGetCandWord; + candWord.owner = luamodule; + candWord.priv = NULL; + candWord.wordType = MSG_TIPS; + candWord.strExtra = NULL; + candWord.strWord = strdup(out); + + FcitxInputState* input = FcitxInstanceGetInputState(GetFcitx(luamodule)); + FcitxCandidateWordList* candList = FcitxInputStateGetCandidateList(input); + FcitxCandidateWordInsert(candList, &candWord, 0); +} + +void LuaUpdateCandidateWordHookCallback(void *arg) { + LuaModule *luamodule = (LuaModule *)arg; + FcitxInputState* input = FcitxInstanceGetInputState(GetFcitx(luamodule)); + char *text = FcitxInputStateGetRawInputBuffer(input); + UT_array *result = InputTrigger(luamodule, text); + if (result) { + LuaResultItem *p; + while ((p = (LuaResultItem *)utarray_next(result, p))) { + AddToCandList(luamodule, text, p->result); + } + utarray_free(result); + } +} + +void* LuaCreate(FcitxInstance* instance) { + LuaModule *luamodule = LuaModuleAlloc(instance); + if (luamodule == NULL) { + FcitxLog(ERROR, "LuaModule alloc failed"); + goto err; + } + LoadLuaConfig(luamodule); + + FcitxIMEventHook hook = {.arg = luamodule, + .func = LuaUpdateCandidateWordHookCallback}; + + FcitxInstanceRegisterUpdateCandidateWordHook(instance, hook); + + FcitxAddon* luaAddon = FcitxAddonsGetAddonByName( + FcitxInstanceGetAddons(instance), + FCITX_LUA_NAME); + AddFunction(luaAddon, LuaCallCommand); + + return luamodule; +err: + if (luamodule) { + LuaModuleFree(luamodule); + } + return NULL; +} + +void LuaReloadConfig(void* arg) +{ + LuaModule* luamodule = arg; + UnloadAllExtension(luamodule); + LoadLuaConfig(luamodule); +} diff -Nru fcitx-4.2.2/src/module/lua/luamod.h fcitx-4.2.4.1/src/module/lua/luamod.h --- fcitx-4.2.2/src/module/lua/luamod.h 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/module/lua/luamod.h 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,38 @@ +/*************************************************************************** + * Copyright (C) 2012~2012 by xubin * + * nybux.tsui@gmail.com * + * * + * This program is free software; you can 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#ifndef _FCITX_MODULE_LUA_H_ +#define _FCITX_MODULE_LUA_H_ + + +#ifdef __cplusplus +extern "C" { +#endif + +#define FCITX_LUA_NAME "fcitx-lua" +#define FCITX_LUA_CALLCOMMAND 0 +#define FCITX_LUA_CALLCOMMAND_RETURNTYPE void + + +#ifdef __cplusplus +} +#endif + +#endif diff -Nru fcitx-4.2.2/src/module/lua/luawrap.c fcitx-4.2.4.1/src/module/lua/luawrap.c --- fcitx-4.2.2/src/module/lua/luawrap.c 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/module/lua/luawrap.c 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,743 @@ +/*************************************************************************** + * Copyright (C) 2012~2012 by xubin * + * nybux.tsui@gmail.com * + * * + * This program is free software; you can 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include "fcitx/fcitx.h" +#include "fcitx/instance.h" +#include "fcitx/ime.h" +#include "fcitx/module.h" +#include "fcitx-utils/log.h" +#include "fcitx-utils/uthash.h" +#include "fcitx-utils/utarray.h" +#include "luawrap.h" + +typedef struct _CommandItem { + char *function_name; + lua_State *lua; + UT_hash_handle hh; + char* command_name; +} CommandItem; + +typedef struct _FunctionItem { + char *name; + lua_State *lua; +} FunctionItem; + +typedef struct _TriggerItem { + char *key; + UT_array *functions; // need linklist + UT_hash_handle hh; +} TriggerItem; + +typedef struct _ConverterItem { + char *function_name; + lua_State *lua; + UT_hash_handle hh; +} ConverterItem; + +struct _LuaExtension { + char *name; + lua_State *lua; + UT_hash_handle hh; +}; + +struct _LuaModule { + FcitxInstance *fcitx; + LuaExtension *extensions; + CommandItem *commands; + TriggerItem *input_triggers; + TriggerItem *candidate_tiggers; + ConverterItem *converters; + ConverterItem *current_converter; + size_t shortest_input_trigger_key_length; +}; + +typedef void (*LuaResultFn)(LuaModule *luamodule, const char *in, const char *out); + +static int RegisterInputTrigger(lua_State *lua, const char *input_string, const char *function_name); +static int RegisterCommand(lua_State *lua, const char *command_name, const char *function_name); +static lua_State * LuaCreateState(LuaModule *module); +static void LuaPrintError(lua_State *lua); +static void LuaPError(int err, const char *s); +static void FunctionItemCopy(void *_dst, const void *_src); +static void FunctionItemDtor(void *_elt); +static void LuaResultItemCopy(void *_dst, const void *_src); +static void LuaResultItemDtor(void *_elt); +static LuaModule * GetModule(lua_State *lua); +static void UnloadExtension(LuaModule *module, LuaExtension* extension); + +const char *kLuaModuleName = "__fcitx_luamodule"; +const char *kFcitxLua = + "function __ime_call_function(function_name, p1)" + " if type(_G[function_name]) ~= 'function' then" + " return nil" + " end" + " return _G[function_name](p1)" + "end;" + "ime = {};" + "ime.register_trigger = function(lua_function_name, description, input_trigger_strings, candidate_trigger_strings)" + " __ime_register_trigger(lua_function_name, desc, input_trigger_strings, candidate_trigger_strings);" + "end;" + "ime.register_command = function(command_name, lua_function_name)" + " __ime_register_command(command_name, lua_function_name);" + "end;" + "ime.unique_name = function()" + " return __ime_unique_name();" + "end;" + "ime.get_last_commit = function()" + " return __ime_get_last_commit();" + "end;"; +const UT_icd FunctionItem_icd = {sizeof(FunctionItem), NULL, FunctionItemCopy, FunctionItemDtor}; +const UT_icd LuaResultItem_icd = {sizeof(LuaResultItem), NULL, LuaResultItemCopy, LuaResultItemDtor}; + +LuaModule * LuaModuleAlloc(FcitxInstance *fcitx) { + LuaModule *module; + module = calloc(sizeof(*module), 1); + if (module) { + module->fcitx = fcitx; + } + return module; +} +void LuaModuleFree(LuaModule *luamodule) { + free(luamodule); +} +FcitxInstance *GetFcitx(LuaModule *luamodule) { + if (luamodule) { + return luamodule->fcitx; + } else { + return NULL; + } +} + +static int GetUniqueName_Export(lua_State *lua) { + FcitxIM *im = FcitxInstanceGetCurrentIM(GetModule(lua)->fcitx); + if (im) + lua_pushstring(lua, im->uniqueName); + else + lua_pushstring(lua, ""); + return 1; +} + +static int GetLastCommit_Export(lua_State *lua) { + FcitxInputState* input = FcitxInstanceGetInputState(GetModule(lua)->fcitx); + lua_pushstring(lua, FcitxInputStateGetLastCommitString(input)); + return 1; +} + +static int FcitxLog_Export(lua_State *lua) { + int c = lua_gettop(lua); + if (c == 0) { + return 0; + } + const char *msg = lua_tostring(lua, 1); + if (msg) { + FcitxLog(DEBUG, "%s", msg); + } + return 0; +} + +static int ImeRegisterCommand_Export(lua_State *lua) { + int c = lua_gettop(lua); + if (c < 2) { + FcitxLog(WARNING, "register command arugment missing"); + return 0; + } + const char *command_name = lua_tostring(lua, 1); + const char *function_name = lua_tostring(lua, 2); + if (command_name == NULL || function_name == NULL) { + FcitxLog(WARNING, "register command command_name or function_name empty"); + return 0; + } + if (strlen(command_name) > 2) { + FcitxLog(WARNING, "register command command_name length great than 2"); + return 0; + } + if (RegisterCommand(lua, command_name, function_name) == -1) { + FcitxLog(ERROR, "RegisterCommand() failed"); + return 0; + } + return 0; +} + +static int ImeRegisterTrigger_Export(lua_State *lua) { + int c = lua_gettop(lua); + const char *function_name = NULL; + const int kFunctionNameArg = 1; + const int kInputStringsArg = 3; + if (c >= kFunctionNameArg) { + function_name = lua_tostring(lua, kFunctionNameArg); + if (function_name == NULL || function_name[0] == 0) { + FcitxLog(WARNING, "register trigger arugment function_name empty"); + return 0; + } + } + if (c >= kInputStringsArg) { + if (!lua_istable(lua, kInputStringsArg)) { + FcitxLog(WARNING, "register trigger argument #3 is not table"); + return 0; + } + size_t i; + size_t len = lua_objlen(lua, kInputStringsArg); + for (i = 1; i <= len; ++i) { + lua_pushinteger(lua, i); + lua_gettable(lua, kInputStringsArg); + const char *text = lua_tostring(lua, -1); + if (text == NULL) { + FcitxLog(WARNING, "input_trigger_strings[%d] is not string", i); + } else { + if (RegisterInputTrigger(lua, text, function_name) == -1) { + FcitxLog(WARNING, "RegisterInputTrigger() failed"); + } + } + lua_pop(lua, 1); + } + } + return 0; +} + +static void FunctionItemCopy(void *_dst, const void *_src) { + FunctionItem *dst = (FunctionItem *)_dst; + FunctionItem *src = (FunctionItem *)_src; + dst->lua = src->lua; + dst->name = src->name ? strdup(src->name) : NULL; +} +static void FunctionItemDtor(void *_elt) { + FunctionItem *elt = (FunctionItem *)_elt; + if (elt->name) { + free(elt->name); + } +} + +static void LuaResultItemCopy(void *_dst, const void *_src) { + LuaResultItem *dst = (LuaResultItem *)_dst; + LuaResultItem *src = (LuaResultItem *)_src; + dst->result = src->result ? strdup(src->result) : NULL; + dst->help = src->help ? strdup(src->help) : NULL; +} +static void LuaResultItemDtor(void *_elt) { + LuaResultItem *elt = (LuaResultItem *)_elt; + if (elt->result) { + free(elt->result); + } + if (elt->help) { + free(elt->help); + } +} + +static void FreeTrigger(TriggerItem **triggers, LuaExtension *extension) { + TriggerItem *trigger; + for (trigger = *triggers; trigger != NULL; ) { + int count = utarray_len(trigger->functions); + int i; + for (i = 0; i < count; ) { + FunctionItem *f = (FunctionItem *)utarray_eltptr(trigger->functions, i); + if (f->lua == extension->lua) { + utarray_erase(trigger->functions, i, 1); + --count; + } else { + ++i; + } + } + TriggerItem *temp = trigger->hh.next; + if (utarray_len(trigger->functions) == 0) { + HASH_DEL(*triggers, trigger); + utarray_free(trigger->functions); + free(trigger->key); + free(trigger); + } + trigger = temp; + } +} + +static void FreeCommand(CommandItem **commands, LuaExtension *extension) { + CommandItem *command; + for (command = *commands; command != NULL; ) { + if (command->lua == extension->lua) { + CommandItem *temp = command->hh.next; + HASH_DEL(*commands, command); + free(command->function_name); + free(command); + command = temp; + } else { + command = command->hh.next; + } + } +} + +static void FreeConverter(ConverterItem **converters, LuaExtension *extension) { + ConverterItem *converter; + for (converter = *converters; converter != NULL; ) { + if (converter->lua == extension->lua) { + ConverterItem *temp = converter->hh.next; + HASH_DEL(*converters, converter); + free(converter->function_name); + free(converter); + converter = temp; + } else { + converter = converter->hh.next; + } + } +} + +static void UpdateShortestInputTriggerKeyLength(LuaModule *module) { + size_t length = UINT_MAX; + TriggerItem *trigger; + for (trigger = module->input_triggers; trigger; trigger = trigger->hh.next) { + size_t keylen = strlen(trigger->key); + if (keylen < length) { + length = keylen; + } + } + if (length == UINT_MAX) { + module->shortest_input_trigger_key_length = 0; + } else { + module->shortest_input_trigger_key_length = length; + } +} + +LuaExtension * LoadExtension(LuaModule *module, const char *name) { + LuaExtension *extension; + HASH_FIND_STR(module->extensions, name, extension); + if (extension) { + FcitxLog(DEBUG, "extension:%s reload", name); + UnloadExtension(module, extension); + } + extension = calloc(sizeof(*extension), 1); + if (extension == NULL) { + FcitxLog(ERROR, "extension memory alloc failed"); + return NULL; + } + extension->name = strdup(name); + if (extension->name == NULL) { + FcitxLog(ERROR, "extension->name memory alloc failed"); + free(extension); + return NULL; + } + extension->lua = LuaCreateState(module); + if (extension->lua == NULL) { + FcitxLog(ERROR, "extension->lua create failed"); + free(extension->name); + free(extension); + return NULL; + } + HASH_ADD_KEYPTR(hh, module->extensions, extension->name, strlen(extension->name), extension); + + int rv = lua_pcall(extension->lua, 0, 0, 0); + if (rv != 0) { + LuaPError(rv, "lua_pcall() failed"); + LuaPrintError(extension->lua); + UnloadExtensionByName(module, name); + return NULL; + } + + rv = luaL_loadfile(extension->lua, name); + if (rv != 0) { + LuaPError(rv, "luaL_loadfile() failed"); + LuaPrintError(extension->lua); + UnloadExtensionByName(module, name); + return NULL; + } + rv = lua_pcall(extension->lua, 0, 0, 0); + if (rv != 0) { + LuaPError(rv, "lua_pcall() failed"); + LuaPrintError(extension->lua); + UnloadExtensionByName(module, name); + return NULL; + } + UpdateShortestInputTriggerKeyLength(module); + return extension; +} + +void UnloadExtensionByName(LuaModule *module, const char *name) { + LuaExtension *extension = NULL; + HASH_FIND_STR(module->extensions, name, extension); + if (extension == NULL) { + FcitxLog(WARNING, "extension:%s unload failed, not found", name); + return; + } + UnloadExtension(module, extension); +} + +void UnloadExtension(LuaModule *module, LuaExtension* extension) { + + FreeCommand(&module->commands, extension); + FreeTrigger(&module->input_triggers, extension); + FreeTrigger(&module->candidate_tiggers, extension); + if (module->current_converter && module->current_converter->lua == extension->lua) { + module->current_converter = NULL; + } + FreeConverter(&module->converters, extension); + + free(extension->name); + lua_close(extension->lua); + HASH_DEL(module->extensions, extension); + free(extension); + + UpdateShortestInputTriggerKeyLength(module); +} + +static LuaModule * GetModule(lua_State *lua) { + lua_getglobal(lua, kLuaModuleName); + LuaModule **module = lua_touserdata(lua, -1); + lua_pop(lua, 1); + return *module; +} + +static LuaExtension * FindExtension(lua_State *lua) { + LuaModule *module = GetModule(lua); + if (!module) { + FcitxLog(ERROR, "LuaModule not found"); + return NULL; + } + LuaExtension *e; + for (e = module->extensions; e != NULL; e = e->hh.next) { + if (e->lua == lua) { + return e; + } + } + return NULL; +} + +static int RegisterCommand(lua_State *lua, + const char *command_name, + const char *function_name) { + if (lua == NULL || command_name == NULL || function_name == NULL) { + FcitxLog(WARNING, "RegisterCommand() argument error"); + return -1; + } + LuaExtension *extension = FindExtension(lua); + if (extension == NULL) { + FcitxLog(ERROR, "find extension failed"); + return -1; + } + LuaModule *module = GetModule(lua); + if (!module) { + FcitxLog(ERROR, "LuaModule not found"); + return -1; + } + CommandItem *command = NULL; + HASH_FIND_STR(module->commands, command_name, command); + if (command != NULL) { + FcitxLog(WARNING, "command:%s exist", command_name); + return -1; + } + command = calloc(sizeof(*command), 1); + command->lua = lua; + if (command == NULL) { + FcitxLog(ERROR, "command alloc failed"); + return -1; + } + command->function_name = strdup(function_name); + if (command->function_name == NULL) { + FcitxLog(ERROR, "Command::function_name alloc failed"); + goto err; + } + command->command_name = strdup(command_name); + if (command->command_name == NULL) { + FcitxLog(ERROR, "Command::command_name alloc failed"); + goto err; + } + HASH_ADD_KEYPTR(hh, + module->commands, + command->command_name, + strlen(command->command_name), + command); + return 0; +err: + if (command) { + if (command->function_name) { + free(command->function_name); + } + if (command->command_name) { + free(command->command_name); + } + free(command); + } + return -1; +} + +static int RegisterInputTrigger(lua_State *lua, + const char *input, + const char *function_name) { + if (lua == NULL || input == NULL || function_name == NULL) { + FcitxLog(WARNING, "RegisterInputTrigger() argument error"); + return -1; + } + LuaExtension *extension = FindExtension(lua); + if (extension == NULL) { + FcitxLog(ERROR, "find extension failed"); + return -1; + } + LuaModule *module = GetModule(lua); + if (!module) { + FcitxLog(ERROR, "LuaModule not found"); + return -1; + } + TriggerItem *trigger = NULL; + HASH_FIND_STR(module->input_triggers, input, trigger); + if (trigger == NULL) { + trigger = calloc(sizeof(*trigger), 1); + if (trigger == NULL) { + FcitxLog(ERROR, "trigger memory alloc failed"); + goto cleanup; + } + trigger->key = strdup(input); + if (trigger->key == NULL) { + FcitxLog(ERROR, "trigger->key memory alloc failed"); + goto cleanup; + } + utarray_new(trigger->functions, &FunctionItem_icd); + if (trigger->functions == NULL) { + FcitxLog(ERROR, "trigger->functions memory alloc failed"); + goto cleanup; + } + HASH_ADD_KEYPTR(hh, module->input_triggers, trigger->key, strlen(trigger->key), trigger); + } + FunctionItem function; + function.lua = lua; + function.name = strdup(function_name); + if (function.name == NULL) { + FcitxLog(ERROR, "function.name memory alloc failed"); + goto cleanup; + } + utarray_push_back(trigger->functions, &function); + free(function.name); + return 0; +cleanup: + if (trigger) { + if (trigger->functions) { + utarray_free(trigger->functions); + } + if (trigger->key) { + free(trigger->key); + } + free(trigger); + } + return -1; +} + +static void LuaPrintError(lua_State *lua) { + if (lua_gettop(lua) > 0) { + FcitxLog(ERROR, " %s", lua_tostring(lua, -1)); + } +} + +static void LuaPError(int err, const char *s) { + switch (err) { + case LUA_ERRSYNTAX: + FcitxLog(ERROR, "%s:syntax error during pre-compilation", s); + break; + case LUA_ERRMEM: + FcitxLog(ERROR, "%s:memory allocation error", s); + break; + case LUA_ERRFILE: + FcitxLog(ERROR, "%s:cannot open/read the file", s); + break; + case LUA_ERRRUN: + FcitxLog(ERROR, "%s:a runtime error", s); + break; + case LUA_ERRERR: + FcitxLog(ERROR, "%s:error while running the error handler function", s); + break; + case 0: + FcitxLog(ERROR, "%s:ok", s); + break; + default: + FcitxLog(ERROR, "%s:unknown error,%d", s, err); + break; + } +} + +void LuaPrintStackInfo(lua_State *lua) { + int count = lua_gettop(lua); + FcitxLog(DEBUG, "lua stack count:%d", count); + int i; + for (i = count; i > 0 ; --i) { + FcitxLog(DEBUG, " %-3d(%02d):%s", i, lua_type(lua, i), lua_tostring(lua, i)); + } +} + +static lua_State * LuaCreateState(LuaModule *module) { + lua_State *lua = NULL; + + lua = luaL_newstate(); + if (lua == NULL) { + FcitxLog(ERROR, "luaL_newstate() failed"); + goto cleanup; + } + + luaL_openlibs(lua); + lua_register(lua, "fcitx_log", FcitxLog_Export); + lua_register(lua, "__ime_register_trigger", ImeRegisterTrigger_Export); + lua_register(lua, "__ime_register_command", ImeRegisterCommand_Export); + lua_register(lua, "__ime_unique_name", GetUniqueName_Export); + lua_register(lua, "__ime_get_last_commit", GetLastCommit_Export); + LuaModule **ppmodule = lua_newuserdata(lua, sizeof(LuaModule *)); + *ppmodule = module; + lua_setglobal(lua, kLuaModuleName); + + int rv = luaL_loadstring(lua, kFcitxLua); + /*int rv = luaL_loadfile(lua, "fcitx.lua");*/ + if (rv != 0) { + LuaPError(rv, "luaL_loadfile() failed"); + LuaPrintError(lua); + goto cleanup; + } + return lua; +cleanup: + if (lua) { + lua_close(lua); + } + return NULL; +} + +static UT_array * LuaCallFunction(lua_State *lua, + const char *function_name, + const char *argument) { + UT_array *result = NULL; + lua_getfield(lua, LUA_GLOBALSINDEX, "__ime_call_function"); + lua_pushstring(lua, function_name); + lua_pushstring(lua, argument); + int rv = lua_pcall(lua, 2, 1, 0); + if (rv != 0) { + LuaPError(rv, "lua_pcall() failed"); + LuaPrintError(lua); + return result; + } + if (lua_gettop(lua) == 0) { + FcitxLog(WARNING, "lua_gettop() not retrun"); + return result; + } + int type = lua_type(lua, -1); + if (type == LUA_TSTRING) { + const char *str = lua_tostring(lua, -1); + if (str) { + utarray_new(result, &LuaResultItem_icd); + LuaResultItem r = {.result = (char *)str, .help = NULL}; + utarray_push_back(result, &r); + } else { + FcitxLog(WARNING, "lua function return return null"); + } + } else if (type == LUA_TTABLE) { + size_t i, len = lua_objlen(lua, -1); + if (len < 1) { + return result; + } + utarray_new(result, &LuaResultItem_icd); + for (i = 1; i <= len; ++i) { + lua_pushinteger(lua, i); + lua_gettable(lua, -2); + char istable = 0; + if (lua_type(lua, -1) == LUA_TTABLE) { + istable = 1; + lua_pushstring(lua, "help"); + lua_gettable(lua, -2); + } + const char *str = lua_tostring(lua, -1); + if (str == NULL) { + FcitxLog(WARNING, "function %s() result[%d] is not string", i); + } else { + LuaResultItem r; + r.result = (char *)str; + if (istable) { + lua_pushstring(lua, "suggest"); + lua_gettable(lua, -3); + r.help = (char *)lua_tostring(lua, -1); + } else { + r.help = NULL; + } + utarray_push_back(result, &r); + } + if (istable) { + lua_pop(lua, 3); + } else { + lua_pop(lua, 1); + } + } + if (utarray_len(result) == 0) { + utarray_free(result); + result = NULL; + } + } else { + FcitxLog(WARNING, "lua function return type not expected:%s", + lua_typename(lua, type)); + } + lua_pop(lua, lua_gettop(lua)); + return result; +} + +UT_array * InputCommand(LuaModule *module, const char *input) { + CommandItem *command; + char key[3]; + strncpy(key, input, sizeof(key)); + key[2] = 0; + HASH_FIND_STR(module->commands, key, command); + if (command == NULL) { + return NULL; + } + const char *arg; + if (strlen(input) > 2) { + arg = input + 2; + } else { + arg = ""; + } + return LuaCallFunction(command->lua, command->function_name, arg); +} + +UT_array * InputTrigger(LuaModule *module, const char *input) { + if (module->shortest_input_trigger_key_length == 0 + || strlen(input) < module->shortest_input_trigger_key_length) { + return NULL; + } + TriggerItem *trigger; + HASH_FIND_STR(module->input_triggers, input, trigger); + if (trigger == NULL) { + return NULL; + } + + UT_array *result = NULL; + FunctionItem *f = NULL; + while ((f = (FunctionItem *)utarray_next(trigger->functions, f))) { + UT_array *temp = LuaCallFunction(f->lua, f->name, input); + if (temp) { + if (result) { + LuaResultItem *p; + while ((p = (LuaResultItem *)utarray_next(temp, p))) { + utarray_push_back(result, p); + } + } else { + result = temp; + } + } + } + return result; +} + +void UnloadAllExtension(LuaModule* luamodule) +{ + while(luamodule->extensions) + UnloadExtensionByName(luamodule, luamodule->extensions->name); +} \ No newline at end of file diff -Nru fcitx-4.2.2/src/module/lua/luawrap.h fcitx-4.2.4.1/src/module/lua/luawrap.h --- fcitx-4.2.2/src/module/lua/luawrap.h 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/module/lua/luawrap.h 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,51 @@ +/*************************************************************************** + * Copyright (C) 2012~2012 by xubin * + * nybux.tsui@gmail.com * + * * + * This program is free software; you can 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#ifndef _LUA_WRAP_H_ +#define _LUA_WRAP_H_ + +#include + +typedef struct _LuaResultItem { + char *result; + char *help; +} LuaResultItem; + +typedef struct _LuaModule LuaModule; +typedef struct _LuaExtension LuaExtension; + +// alloc/free luamodule +LuaModule * LuaModuleAlloc(struct _FcitxInstance *fcitx); +void LuaModuleFree(LuaModule *luamodule); +FcitxInstance *GetFcitx(LuaModule *luamodule); + +// Load lua extension, name is filename of lua source file +LuaExtension * LoadExtension(LuaModule *luamodule, const char *name); + +// Unload extension by name +void UnloadExtensionByName(LuaModule *luamodule, const char *name); +void UnloadAllExtension(LuaModule *luamodule); + +// call lua trigger, input is user input +// callback is called when valid candidate generated +UT_array * InputTrigger(LuaModule *luamodule, const char *input); +UT_array * InputCommand(LuaModule *module, const char *input); + +#endif diff -Nru fcitx-4.2.2/src/module/punc/punc.c fcitx-4.2.4.1/src/module/punc/punc.c --- fcitx-4.2.2/src/module/punc/punc.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/module/punc/punc.c 2012-06-10 14:34:48.000000000 +0000 @@ -58,7 +58,7 @@ typedef struct _FcitxPunc { char* langCode; WidePunc* curPunc; - + UT_hash_handle hh; } FcitxPunc; @@ -67,8 +67,10 @@ static char *GetPunc(struct _FcitxPuncState* puncState, int iKey); static void FreePunc(struct _FcitxPuncState* puncState); static void* PuncCreate(FcitxInstance* instance); +static boolean PuncPreFilter(void* arg, FcitxKeySym sym, unsigned int state, INPUT_RETURN_VALUE* retVal); static boolean ProcessPunc(void* arg, FcitxKeySym sym, unsigned int state, INPUT_RETURN_VALUE* retVal); static void* PuncGetPunc(void* a, FcitxModuleFunctionArg arg); +static void* PuncGetPunc2(void* a, FcitxModuleFunctionArg arg); static void TogglePuncState(void *arg); static boolean GetPuncState(void *arg); static void ReloadPunc(void *arg); @@ -110,6 +112,9 @@ FcitxInstanceRegisterPostInputFilter(instance, hk); + hk.func = PuncPreFilter; + FcitxInstanceRegisterPreInputFilter(instance, hk); + puncState->cLastIsAutoConvert = '\0'; puncState->bLastIsNumber = false; @@ -124,16 +129,20 @@ hook.func = ResetPunc; FcitxInstanceRegisterResetInputHook(instance, hook); - + hook.func = ResetPuncWhichStatus; FcitxInstanceRegisterInputUnFocusHook(instance, hook); - + FcitxInstanceWatchContext(instance, CONTEXT_IM_LANGUAGE, PuncLanguageChanged, puncState); - FcitxUIRegisterStatus(instance, puncState, "punc", _("Full Width Punctuation"), _("Full Width Punctuation"), TogglePuncState, GetPuncState); + FcitxProfile* profile = FcitxInstanceGetProfile(instance); + FcitxUIRegisterStatus(instance, puncState, "punc", + profile->bUseWidePunc ? _("Full width punct") : _("Latin punct"), + _("Toggle Full Width Punctuation"), TogglePuncState, GetPuncState); AddFunction(puncaddon, PuncGetPunc); + AddFunction(puncaddon, PuncGetPunc2); return puncState; } @@ -148,9 +157,9 @@ puncState->curPunc = punc->curPunc; else puncState->curPunc = NULL; - } else + } else puncState->curPunc = NULL; - + FcitxUISetStatusVisable (puncState->owner, "punc", puncState->curPunc != NULL) ; } @@ -161,6 +170,33 @@ return GetPunc(puncState, *key); } + +void* PuncGetPunc2(void* a, FcitxModuleFunctionArg arg) +{ + FcitxPuncState* puncState = (FcitxPuncState*) a; + int *key = arg.args[0]; + char** p1 = arg.args[1]; + char** p2 = arg.args[2]; + int iIndex = 0; + WidePunc *curPunc = puncState->curPunc; + + if (!curPunc) + return NULL; + + while (curPunc[iIndex].ASCII) { + if (curPunc[iIndex].ASCII == *key) { + if (p1) + *p1 = curPunc[iIndex].strWidePunc[0]; + if (curPunc[iIndex].iCount > 1 && p2) + *p2 = curPunc[iIndex].strWidePunc[1]; + break; + } + iIndex++; + } + + return NULL; +} + void ResetPunc(void* arg) { FcitxPuncState* puncState = (FcitxPuncState*) arg; @@ -172,18 +208,30 @@ { FcitxPuncState* puncState = (FcitxPuncState*) arg; WidePunc *curPunc = puncState->curPunc; - + if (!curPunc) return; - + int iIndex = 0; - + while (curPunc[iIndex].ASCII) { curPunc[iIndex].iWhich = 0; iIndex++; } } +boolean PuncPreFilter(void* arg, FcitxKeySym sym, unsigned int state, INPUT_RETURN_VALUE* retVal) +{ + if (!FcitxHotkeyIsHotKeySimple(sym, state)) + return false; + + FcitxPuncState* puncState = (FcitxPuncState*) arg; + if (!FcitxHotkeyIsHotKeyDigit(sym, state) && !IsHotKeyPunc(sym, state)) + puncState->bLastIsNumber = false; + + return false; +} + boolean ProcessPunc(void* arg, FcitxKeySym sym, unsigned int state, INPUT_RETURN_VALUE* retVal) { FcitxPuncState* puncState = (FcitxPuncState*) arg; @@ -291,7 +339,7 @@ HASH_ADD_KEYPTR(hh, puncState->puncSet, punc->langCode, strlen(punc->langCode), punc); curpuncfile = curpuncfile->hh.next; } - + fcitx_utils_free_string_hash_set(puncfiles); return true; } @@ -304,7 +352,7 @@ char *pstr; // 临时指针 int i; fpDict = FcitxXDGGetFileWithPrefix("data", filename, "r", NULL); - + if (strlen(filename) < strlen(PUNC_DICT_FILENAME)) return NULL; @@ -371,18 +419,18 @@ punc[iRecordNo].ASCII = '\0'; fclose(fpDict); - + FcitxPunc* p = fcitx_utils_malloc0(sizeof(FcitxPunc)); p->langCode = ""; - + const char* langcode = filename + strlen(PUNC_DICT_FILENAME); if (*langcode == '\0') p->langCode = strdup("C"); else p->langCode = strdup(langcode + 1); - + p->curPunc = punc; - + return p; } @@ -432,8 +480,11 @@ FcitxInstance* instance = puncState->owner; FcitxProfile* profile = FcitxInstanceGetProfile(instance); profile->bUseWidePunc = !profile->bUseWidePunc; + + FcitxUISetStatusString(puncState->owner, "punc", + profile->bUseWidePunc ? _("Full width punct") : _("Latin punct"), + _("Toggle Full Width Punctuation")); FcitxProfileSave(profile); - FcitxInstanceResetInput(puncState->owner); } INPUT_RETURN_VALUE TogglePuncStateWithHotkey(void* arg) @@ -462,7 +513,7 @@ FcitxPuncState* puncState = (FcitxPuncState*) arg; FreePunc(puncState); LoadPuncDict(puncState); - + PuncLanguageChanged(puncState, FcitxInstanceGetContextString(puncState->owner, CONTEXT_IM_LANGUAGE)); } diff -Nru fcitx-4.2.2/src/module/punc/punc.h fcitx-4.2.4.1/src/module/punc/punc.h --- fcitx-4.2.2/src/module/punc/punc.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/module/punc/punc.h 2012-06-10 14:34:48.000000000 +0000 @@ -23,6 +23,8 @@ #define FCITX_PUNC_NAME "fcitx-punc" #define FCITX_PUNC_GETPUNC 0 #define FCITX_PUNC_GETPUNC_RETURNTYPE char* +#define FCITX_PUNC_GETPUNC2 1 +#define FCITX_PUNC_GETPUNC2_RETURNTYPE void* #endif diff -Nru fcitx-4.2.2/src/module/quickphrase/QuickPhrase.c fcitx-4.2.4.1/src/module/quickphrase/QuickPhrase.c --- fcitx-4.2.2/src/module/quickphrase/QuickPhrase.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/module/quickphrase/QuickPhrase.c 2012-06-10 14:34:48.000000000 +0000 @@ -38,6 +38,7 @@ #include "fcitx/candidate.h" #include "fcitx/context.h" #include "module/punc/punc.h" +#include "module/lua/luamod.h" typedef enum _QuickPhraseTriggerKey @@ -55,6 +56,7 @@ int iLastQuickPhrase; boolean enabled; FcitxInstance* owner; + char buffer[MAX_USER_INPUT * UTF8_MAX_LENGTH + 1]; } QuickPhraseState; typedef struct _QuickPhraseCand { @@ -70,6 +72,7 @@ static UT_icd qp_icd = {sizeof(QUICK_PHRASE), NULL, NULL, NULL}; static void ShowQuickPhraseMessage(QuickPhraseState *qpstate); static INPUT_RETURN_VALUE QuickPhraseGetCandWord(void* arg, FcitxCandidateWord* candWord); +static INPUT_RETURN_VALUE QuickPhraseGetLuaCandWord(void* arg, FcitxCandidateWord* candWord); static boolean LoadQuickPhraseConfig(QuickPhraseState* qpstate); static void SaveQuickPhraseConfig(QuickPhraseState* qpstate); static boolean QuickPhrasePostFilter(void* arg, FcitxKeySym sym, @@ -131,12 +134,12 @@ qpstate->iFirstQuickPhrase = -1; qpstate->owner = instance; qpstate->enabled = false; - + if (!LoadQuickPhraseConfig(qpstate)) { free(qpstate); return NULL; } - + LoadQuickPhrase(qpstate); FcitxKeyFilterHook hk; @@ -151,7 +154,7 @@ resethk.arg = qpstate; resethk.func = QuickPhraseReset; FcitxInstanceRegisterResetInputHook(instance, resethk); - + FcitxInstanceRegisterWatchableContext(instance, CONTEXT_DISABLE_QUICKPHRASE, FCT_Boolean, FCF_ResetOnInputMethodChange); return qpstate; @@ -237,11 +240,12 @@ void ShowQuickPhraseMessage(QuickPhraseState *qpstate) { FcitxInputState *input = FcitxInstanceGetInputState(qpstate->owner); - FcitxInputStateSetCursorPos(input, strlen(FcitxInputStateGetRawInputBuffer(input))); + FcitxInputStateSetCursorPos(input, strlen(qpstate->buffer)); + FcitxInputStateSetClientCursorPos(input, strlen(qpstate->buffer)); FcitxInstanceCleanInputWindowUp(qpstate->owner); FcitxMessagesAddMessageAtLast(FcitxInputStateGetAuxUp(input), MSG_TIPS, "%s", _("Quick Phrase: ")); - FcitxMessagesAddMessageAtLast(FcitxInputStateGetPreedit(input), MSG_INPUT, "%s", FcitxInputStateGetRawInputBuffer(input)); - FcitxMessagesAddMessageAtLast(FcitxInputStateGetClientPreedit(input), MSG_INPUT, "%s", FcitxInputStateGetRawInputBuffer(input)); + FcitxMessagesAddMessageAtLast(FcitxInputStateGetPreedit(input), MSG_INPUT, "%s", qpstate->buffer); + FcitxMessagesAddMessageAtLast(FcitxInputStateGetClientPreedit(input), MSG_INPUT, "%s", qpstate->buffer); } boolean QuickPhrasePreFilter(void* arg, FcitxKeySym sym, @@ -256,7 +260,7 @@ if (FcitxHotkeyIsHotKeySimple(keymain, state)) { *retval = QuickPhraseDoInput(qpstate, keymain, state); if (*retval == IRV_TO_PROCESS) { - if (strlen(FcitxInputStateGetRawInputBuffer(input)) == 0 + if (strlen(qpstate->buffer) == 0 && (FcitxHotkeyIsHotKey(keymain, state, QuickPhraseTriggerKeys[qpstate->triggerKey]) || FcitxHotkeyIsHotKey(keymain, state, FCITX_SPACE))) { char c[2] = { (char) (QuickPhraseTriggerKeys[qpstate->triggerKey][0].sym & 0xff), '\0'}; FcitxModuleFunctionArg farg; @@ -269,17 +273,17 @@ char buf[2]; buf[0] = keymain; buf[1] = '\0'; - if (strlen(FcitxInputStateGetRawInputBuffer(input)) < MAX_USER_INPUT) - strcat(FcitxInputStateGetRawInputBuffer(input), buf); + if (strlen(qpstate->buffer) < MAX_USER_INPUT) + strcat(qpstate->buffer, buf); ShowQuickPhraseMessage(qpstate); *retval = QuickPhraseGetCandWords(qpstate); } } else return true; } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_BACKSPACE)) { - size_t len = strlen(FcitxInputStateGetRawInputBuffer(input)); + size_t len = strlen(qpstate->buffer); if (len > 0) - FcitxInputStateGetRawInputBuffer(input)[--len] = '\0'; + qpstate->buffer[--len] = '\0'; if (len == 0) { *retval = IRV_CLEAN; } else { @@ -288,8 +292,8 @@ } } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_ENTER)) { - if (strlen(FcitxInputStateGetRawInputBuffer(input)) > 0) { - strcpy(FcitxInputStateGetOutputString(input), FcitxInputStateGetRawInputBuffer(input)); + if (strlen(qpstate->buffer) > 0) { + strcpy(FcitxInputStateGetOutputString(input), qpstate->buffer); QuickPhraseReset(qpstate); *retval = IRV_COMMIT_STRING; } else { @@ -322,15 +326,15 @@ if (*retval != IRV_TO_PROCESS) return false; - if (!disableQuickPhrase + if (!disableQuickPhrase && !qpstate->enabled - && FcitxInputStateGetRawInputBufferSize(input) == 0 + && qpstate->buffer[0] == '\0' && FcitxHotkeyIsHotKey(sym, state, QuickPhraseTriggerKeys[qpstate->triggerKey])) { FcitxInstanceCleanInputWindow(qpstate->owner); FcitxInputStateSetShowCursor(input, true); FcitxMessagesAddMessageAtLast(FcitxInputStateGetAuxUp(input), MSG_TIPS, "%s", _("Quick Phrase: ")); FcitxInputStateSetCursorPos(input, 0); - + char c[2] = { (char) (QuickPhraseTriggerKeys[qpstate->triggerKey][0].sym & 0xff), '\0'}; FcitxModuleFunctionArg farg; FcitxKeySym s = QuickPhraseTriggerKeys[qpstate->triggerKey][0].sym; @@ -351,6 +355,7 @@ { QuickPhraseState *qpstate = (QuickPhraseState*) arg; qpstate->enabled = false; + qpstate->buffer[0] = '\0'; } INPUT_RETURN_VALUE QuickPhraseDoInput(void* arg, FcitxKeySym sym, int state) { @@ -358,11 +363,11 @@ FcitxInputState *input = FcitxInstanceGetInputState(qpstate->owner); FcitxGlobalConfig* fc = FcitxInstanceGetGlobalConfig(qpstate->owner); int retVal = IRV_TO_PROCESS; - + const FcitxHotkey* hkPrevPage = FcitxInstanceGetContextHotkey(qpstate->owner, CONTEXT_ALTERNATIVE_PREVPAGE_KEY); if (hkPrevPage == NULL) hkPrevPage = fc->hkPrevPage; - + const FcitxHotkey* hkNextPage = FcitxInstanceGetContextHotkey(qpstate->owner, CONTEXT_ALTERNATIVE_NEXTPAGE_KEY); if (hkNextPage == NULL) hkNextPage = fc->hkNextPage; @@ -392,7 +397,6 @@ FcitxInputState *input = FcitxInstanceGetInputState(qpstate->owner); FcitxInstance *instance = qpstate->owner; FcitxGlobalConfig* config = FcitxInstanceGetGlobalConfig(instance); - FcitxInstanceCleanInputWindowDown(qpstate->owner); FcitxCandidateWordSetPageSize(FcitxInputStateGetCandidateList(input), config->iMaxCandWord); @@ -400,16 +404,23 @@ pKey = &searchKey; + { + FcitxModuleFunctionArg arg; + char *text = qpstate->buffer; + arg.args[0] = text; + arg.args[1] = QuickPhraseGetLuaCandWord; + arg.args[2] = qpstate; + InvokeFunction(qpstate->owner, FCITX_LUA, CALLCOMMAND, arg); + } + if (!qpstate->quickPhrases) return IRV_DISPLAY_MESSAGE; - iInputLen = strlen(FcitxInputStateGetRawInputBuffer(input)); + iInputLen = strlen(qpstate->buffer); if (iInputLen > QUICKPHRASE_CODE_LEN) return IRV_DISPLAY_MESSAGE; - strcpy(searchKey.strCode, FcitxInputStateGetRawInputBuffer(input)); - - FcitxCandidateWordReset(FcitxInputStateGetCandidateList(input)); + strcpy(searchKey.strCode, qpstate->buffer); currentQuickPhrase = utarray_custom_bsearch(pKey, qpstate->quickPhrases, false, PhraseCmp); qpstate->iFirstQuickPhrase = utarray_eltidx(qpstate->quickPhrases, currentQuickPhrase); @@ -417,8 +428,7 @@ qpstate->iLastQuickPhrase = utarray_eltidx(qpstate->quickPhrases, lastQuickPhrase); if (qpstate->iLastQuickPhrase < 0) qpstate->iLastQuickPhrase = utarray_len(qpstate->quickPhrases); - if (!currentQuickPhrase || strncmp(FcitxInputStateGetRawInputBuffer(input), currentQuickPhrase->strCode, iInputLen)) { - FcitxInstanceCleanInputWindowDown(instance); + if (!currentQuickPhrase || strncmp(qpstate->buffer, currentQuickPhrase->strCode, iInputLen)) { currentQuickPhrase = NULL; return IRV_DISPLAY_MESSAGE; } @@ -427,7 +437,7 @@ qpstate->iFirstQuickPhrase); currentQuickPhrase != NULL; currentQuickPhrase = (QUICK_PHRASE*) utarray_next(qpstate->quickPhrases, currentQuickPhrase)) { - if (!strncmp(FcitxInputStateGetRawInputBuffer(input), currentQuickPhrase->strCode, iInputLen)) { + if (!strncmp(qpstate->buffer, currentQuickPhrase->strCode, iInputLen)) { QuickPhraseCand* qpcand = fcitx_utils_malloc0(sizeof(QuickPhraseCand)); qpcand->cand = currentQuickPhrase; FcitxCandidateWord candWord; @@ -453,6 +463,21 @@ LoadQuickPhrase(qpstate); } +INPUT_RETURN_VALUE QuickPhraseGetLuaCandWord(void* arg, FcitxCandidateWord* candWord) +{ + QuickPhraseState *qpstate = (QuickPhraseState*) arg; + FcitxInputState *input = FcitxInstanceGetInputState(qpstate->owner); + if (candWord->strExtra) { + strcat(qpstate->buffer, candWord->strExtra); + ShowQuickPhraseMessage(qpstate); + return QuickPhraseGetCandWords(qpstate); + } + else { + strcpy(FcitxInputStateGetOutputString(input), candWord->strWord); + return IRV_COMMIT_STRING; + } +} + INPUT_RETURN_VALUE QuickPhraseGetCandWord(void* arg, FcitxCandidateWord* candWord) { QuickPhraseState *qpstate = (QuickPhraseState*) arg; diff -Nru fcitx-4.2.2/src/module/remote/fcitx-remote-module.conf.in fcitx-4.2.4.1/src/module/remote/fcitx-remote-module.conf.in --- fcitx-4.2.2/src/module/remote/fcitx-remote-module.conf.in 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/module/remote/fcitx-remote-module.conf.in 2012-06-10 14:34:48.000000000 +0000 @@ -5,4 +5,5 @@ Category=Module Enabled=True Library=fcitx-remote-module.so -Type=SharedLibrary \ No newline at end of file +Type=SharedLibrary +Advance=True \ No newline at end of file diff -Nru fcitx-4.2.2/src/module/remote/remote.c fcitx-4.2.4.1/src/module/remote/remote.c --- fcitx-4.2.2/src/module/remote/remote.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/module/remote/remote.c 2012-06-10 14:34:48.000000000 +0000 @@ -164,24 +164,13 @@ FcitxInstanceCloseIM(remote->owner, FcitxInstanceGetCurrentIC(remote->owner)); else { FcitxInstanceEnableIM(remote->owner, FcitxInstanceGetCurrentIC(remote->owner), false); - if (arg == 2) - FcitxInstanceChangeIMState(remote->owner, FcitxInstanceGetCurrentIC(remote->owner)); } break; case 2: FcitxInstanceReloadConfig(remote->owner); break; case 3: - if (FcitxInstanceGetCurrentStatev2(remote->owner) == IS_ACTIVE) - FcitxInstanceCloseIM(remote->owner, FcitxInstanceGetCurrentIC(remote->owner)); - else - FcitxInstanceEnableIM(remote->owner, FcitxInstanceGetCurrentIC(remote->owner), false); - break; - case 4: - if (FcitxInstanceGetCurrentStatev2(remote->owner) == IS_CLOSED) - FcitxInstanceEnableIM(remote->owner, FcitxInstanceGetCurrentIC(remote->owner), false); - else - FcitxInstanceChangeIMState(remote->owner, FcitxInstanceGetCurrentIC(remote->owner)); + FcitxInstanceChangeIMState(remote->owner, FcitxInstanceGetCurrentIC(remote->owner)); break; default: break; diff -Nru fcitx-4.2.2/src/module/vk/vk.c fcitx-4.2.4.1/src/module/vk/vk.c --- fcitx-4.2.2/src/module/vk/vk.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/module/vk/vk.c 2012-06-10 14:34:48.000000000 +0000 @@ -47,6 +47,20 @@ #define VK_NUMBERS 47 #define VK_MAX 50 +const char* dummyTranslate[] = { + N_("Latin"), + N_("Fullwidth"), + N_("Greek"), + N_("Russian"), + N_("Index"), + N_("Math"), + N_("Number"), + N_("Special"), + N_("Hiragana"), + N_("Katakana"), + N_("Table Symbol") +}; + struct _FcitxVKState; typedef struct _VKS { @@ -56,13 +70,11 @@ typedef struct _VKWindow { Window window; - FcitxConfigColor* fontColor; int fontSize; cairo_surface_t* surface; cairo_surface_t* keyboard; Display* dpy; struct _FcitxVKState* owner; - char **font; char *defaultFont; int iVKWindowX; int iVKWindowY; @@ -78,7 +90,6 @@ boolean bVK; FcitxUIMenu vkmenu; FcitxInstance* owner; - FcitxAddon* classicui; } FcitxVKState; const char vkTable[VK_NUMBERS + 1] = "`1234567890-=qwertyuiop[]\\asdfghjkl;'zxcvbnm,./"; @@ -137,7 +148,6 @@ FcitxVKState *vkstate = fcitx_utils_malloc0(sizeof(FcitxVKState)); FcitxGlobalConfig* config = FcitxInstanceGetGlobalConfig(instance); vkstate->owner = instance; - vkstate->classicui = FcitxAddonsGetAddonByName(FcitxInstanceGetAddons(instance), FCITX_CLASSIC_UI_NAME); FcitxHotkeyHook hotkey; hotkey.hotkey = config->hkVK; @@ -145,7 +155,7 @@ hotkey.arg = vkstate; FcitxInstanceRegisterHotkeyFilter(instance, hotkey); - FcitxUIRegisterStatus(instance, vkstate, "vk", _("Virtual Keyboard"), _("Virtual Keyboard State"), ToggleVKState, GetVKState); + FcitxUIRegisterStatus(instance, vkstate, "vk", _("Toggle Virtual Keyboard"), _("Virtual Keyboard State"), ToggleVKState, GetVKState); LoadVKMapFile(vkstate); @@ -173,10 +183,6 @@ vkstate->vkmenu.priv = vkstate; vkstate->vkmenu.isSubMenu = false; - int i; - for (i = 0; i < vkstate->iVKCount; i ++) - FcitxMenuAddMenuItem(&vkstate->vkmenu, vkstate->vks[i].strName, MENUTYPE_SIMPLE, NULL); - FcitxUIRegisterMenu(instance, &vkstate->vkmenu); return vkstate; @@ -185,13 +191,26 @@ boolean VKMenuAction(FcitxUIMenu *menu, int index) { FcitxVKState* vkstate = (FcitxVKState*) menu->priv; - SelectVK(vkstate, index); + if (index < vkstate->iVKCount) + SelectVK(vkstate, index); + else { + if (vkstate->bVK) { + FcitxUIUpdateStatus(vkstate->owner, "vk"); + } + } return true; } void UpdateVKMenu(FcitxUIMenu *menu) { FcitxVKState* vkstate = (FcitxVKState*) menu->priv; + FcitxMenuClear(menu); + int i; + for (i = 0; i < vkstate->iVKCount; i ++) + FcitxMenuAddMenuItem(&vkstate->vkmenu, vkstate->vks[i].strName, MENUTYPE_SIMPLE, NULL); + if (vkstate->bVK) { + FcitxMenuAddMenuItem(&vkstate->vkmenu, _("Close virtual keyboard"), MENUTYPE_SIMPLE, NULL); + } menu->mark = vkstate->iCurrentVK; } @@ -268,18 +287,10 @@ vkWindow->dpy = InvokeFunction(vkstate->owner, FCITX_X11, GETDISPLAY, arg); vkWindow->fontSize = 12; - if (vkstate->classicui) { - FcitxModuleFunctionArg arg; - vkWindow->fontColor = InvokeFunction(vkstate->owner, FCITX_CLASSIC_UI, GETKEYBOARDFONTCOLOR, arg); - vkWindow->font = InvokeFunction(vkstate->owner, FCITX_CLASSIC_UI, GETFONT, arg); - } else { - vkWindow->fontColor = &blackColor; - vkWindow->defaultFont = strdup("sans"); + vkWindow->defaultFont = strdup("sans"); #ifndef _ENABLE_PANGO - GetValidFont("zh", &vkWindow->defaultFont); + GetValidFont("zh", &vkWindow->defaultFont); #endif - vkWindow->font = &vkWindow->defaultFont; - } vkWindow->window = XCreateWindow(vkWindow->dpy, DefaultRootWindow(vkWindow->dpy), @@ -334,22 +345,22 @@ cairo_surface_t* LoadVKImage(VKWindow* vkWindow) { FcitxVKState* vkstate = vkWindow->owner; - if (vkstate->classicui) { - FcitxModuleFunctionArg arg; - boolean fallback = true; - char vkimage[] = "keyboard.png"; - arg.args[0] = vkimage; - arg.args[1] = &fallback; - return InvokeFunction(vkstate->owner, FCITX_CLASSIC_UI, LOADIMAGE, arg); - } else { - if (!vkWindow->keyboard) { - char* path = fcitx_utils_get_fcitx_path_with_filename("pkgdatadir", "skin/default/keyboard.png"); - vkWindow->keyboard = cairo_image_surface_create_from_png(path); - free(path); - } - return vkWindow->keyboard; + FcitxModuleFunctionArg arg; + boolean fallback = true; + char vkimage[] = "keyboard.png"; + arg.args[0] = vkimage; + arg.args[1] = &fallback; + cairo_surface_t* image = InvokeFunction(vkstate->owner, FCITX_CLASSIC_UI, LOADIMAGE, arg); + + if (image) + return image; + + if (!vkWindow->keyboard) { + char* path = fcitx_utils_get_fcitx_path_with_filename("pkgdatadir", "skin/default/keyboard.png"); + vkWindow->keyboard = cairo_image_surface_create_from_png(path); + free(path); } - return NULL; + return vkWindow->keyboard; } void DisplayVKWindow(VKWindow* vkWindow) @@ -371,6 +382,14 @@ FcitxVKState *vkstate = vkWindow->owner; VKS *vks = vkstate->vks; + FcitxModuleFunctionArg arg; + FcitxConfigColor* fontColor = InvokeFunction(vkstate->owner, FCITX_CLASSIC_UI, GETKEYBOARDFONTCOLOR, arg); + char** font = InvokeFunction(vkstate->owner, FCITX_CLASSIC_UI, GETFONT, arg); + + if (!fontColor || !font) { + fontColor = &blackColor; + font = &vkWindow->defaultFont; + } cr = cairo_create(vkWindow->surface); cairo_surface_t* vkimage = LoadVKImage(vkWindow); @@ -378,35 +397,35 @@ cairo_paint(cr); /* 显示字符 */ /* 名称 */ - OutputString(cr, vks[vkstate->iCurrentVK].strName, *vkWindow->font, vkWindow->fontSize , (VK_WINDOW_WIDTH - StringWidth(vks[vkstate->iCurrentVK].strName, *vkWindow->font, vkWindow->fontSize)) / 2, 6, vkWindow->fontColor); + OutputString(cr, vks[vkstate->iCurrentVK].strName, *font, vkWindow->fontSize , (VK_WINDOW_WIDTH - StringWidth(vks[vkstate->iCurrentVK].strName, *font, vkWindow->fontSize)) / 2, 6, fontColor); /* 第一排 */ iPos = 13; for (i = 0; i < 13; i++) { - OutputString(cr, vks[vkstate->iCurrentVK].strSymbol[i][1], *vkWindow->font, vkWindow->fontSize, iPos, 27, vkWindow->fontColor); - OutputString(cr, vks[vkstate->iCurrentVK].strSymbol[i][0], *vkWindow->font, vkWindow->fontSize, iPos - 5, 40, vkWindow->fontColor); + OutputString(cr, vks[vkstate->iCurrentVK].strSymbol[i][1], *font, vkWindow->fontSize, iPos, 27, fontColor); + OutputString(cr, vks[vkstate->iCurrentVK].strSymbol[i][0], *font, vkWindow->fontSize, iPos - 5, 40, fontColor); iPos += 24; } /* 第二排 */ iPos = 48; for (i = 13; i < 26; i++) { - OutputString(cr, vks[vkstate->iCurrentVK].strSymbol[i][1], *vkWindow->font, vkWindow->fontSize, iPos, 55, vkWindow->fontColor); - OutputString(cr, vks[vkstate->iCurrentVK].strSymbol[i][0], *vkWindow->font, vkWindow->fontSize, iPos - 5, 68, vkWindow->fontColor); + OutputString(cr, vks[vkstate->iCurrentVK].strSymbol[i][1], *font, vkWindow->fontSize, iPos, 55, fontColor); + OutputString(cr, vks[vkstate->iCurrentVK].strSymbol[i][0], *font, vkWindow->fontSize, iPos - 5, 68, fontColor); iPos += 24; } /* 第三排 */ iPos = 55; for (i = 26; i < 37; i++) { - OutputString(cr, vks[vkstate->iCurrentVK].strSymbol[i][1], *vkWindow->font, vkWindow->fontSize, iPos, 83, vkWindow->fontColor); - OutputString(cr, vks[vkstate->iCurrentVK].strSymbol[i][0], *vkWindow->font, vkWindow->fontSize, iPos - 5, 96, vkWindow->fontColor); + OutputString(cr, vks[vkstate->iCurrentVK].strSymbol[i][1], *font, vkWindow->fontSize, iPos, 83, fontColor); + OutputString(cr, vks[vkstate->iCurrentVK].strSymbol[i][0], *font, vkWindow->fontSize, iPos - 5, 96, fontColor); iPos += 24; } /* 第四排 */ iPos = 72; for (i = 37; i < 47; i++) { - OutputString(cr, vks[vkstate->iCurrentVK].strSymbol[i][1], *vkWindow->font, vkWindow->fontSize, iPos, 111, vkWindow->fontColor); - OutputString(cr, vks[vkstate->iCurrentVK].strSymbol[i][0], *vkWindow->font, vkWindow->fontSize, iPos - 5, 124, vkWindow->fontColor); + OutputString(cr, vks[vkstate->iCurrentVK].strSymbol[i][1], *font, vkWindow->fontSize, iPos, 111, fontColor); + OutputString(cr, vks[vkstate->iCurrentVK].strSymbol[i][0], *font, vkWindow->fontSize, iPos - 5, 124, fontColor); iPos += 24; } @@ -519,7 +538,6 @@ if (pstr) { FcitxInstanceCommitString(instance, FcitxInstanceGetCurrentIC(instance), pstr); - FcitxInstanceIncreateInputCharacterCount(instance, fcitx_utf8_strlen(pstr)); } } @@ -572,7 +590,7 @@ if (!strcmp(pstr, "[VK]")) vkstate->iVKCount++; else if (!strncmp(pstr, "NAME=", 5)) - vks[vkstate->iVKCount - 1].strName = strdup(pstr + 5); + vks[vkstate->iVKCount - 1].strName = strdup(gettext(pstr + 5)); else { if (pstr[1] != '=' && !vkstate->iVKCount) continue; @@ -710,7 +728,7 @@ if (!FcitxUISupportMainWindow(instance)) { x = dwidth / 2 - VK_WINDOW_WIDTH / 2; - y = 0; + y = 40; } else { int mx = 0, my = 0, mw = 0, mh = 0; FcitxUIGetMainWindowSize(instance, &mx, &my, &mw, &mh); diff -Nru fcitx-4.2.2/src/module/x11/fcitx-x11.conf.in fcitx-4.2.4.1/src/module/x11/fcitx-x11.conf.in --- fcitx-4.2.2/src/module/x11/fcitx-x11.conf.in 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/module/x11/fcitx-x11.conf.in 2012-06-10 14:34:48.000000000 +0000 @@ -7,3 +7,4 @@ Library=fcitx-x11.so Type=SharedLibrary Priority=30 +Advance=True diff -Nru fcitx-4.2.2/src/module/x11/x11stuff.c fcitx-4.2.4.1/src/module/x11/x11stuff.c --- fcitx-4.2.2/src/module/x11/x11stuff.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/module/x11/x11stuff.c 2012-06-10 14:34:48.000000000 +0000 @@ -18,6 +18,7 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ +#include "config.h" #include "fcitx/fcitx.h" #include @@ -30,11 +31,11 @@ #endif #include "fcitx/module.h" +#include "fcitx-utils/log.h" #include "x11stuff.h" #include "fcitx-utils/utils.h" #include "fcitx/instance.h" #include "xerrorhandler.h" -#include static void* X11Create(FcitxInstance* instance); static void X11SetFD(void* arg); @@ -53,6 +54,7 @@ static void X11HandlerComposite(FcitxX11* x11priv, boolean enable); static boolean X11GetCompositeManager(FcitxX11* x11stuff); static void X11InitScreen(FcitxX11* x11stuff); +static void X11ProcessEventReal(void* arg, FcitxModuleFunctionArg args); static inline boolean RectIntersects(FcitxRect rt1, FcitxRect rt2); static inline int RectWidth(FcitxRect r); @@ -78,6 +80,7 @@ FcitxX11* x11priv = fcitx_utils_malloc0(sizeof(FcitxX11)); FcitxAddon* x11addon = FcitxAddonsGetAddonByName(FcitxInstanceGetAddons(instance), FCITX_X11_NAME); x11priv->dpy = XOpenDisplay(NULL); + x11priv->xim = FcitxAddonsGetAddonByName(FcitxInstanceGetAddons(instance), "fcitx-xim"); if (x11priv->dpy == NULL) return false; @@ -103,6 +106,7 @@ AddFunction(x11addon, X11MouseClick); AddFunction(x11addon, X11AddCompositeHandler); AddFunction(x11addon, X11ScreenGeometry); + AddFunction(x11addon, X11ProcessEventReal); InitComposite(x11priv); X11InitScreen(x11priv); @@ -128,14 +132,12 @@ } -void X11ProcessEvent(void* arg) +void X11ProcessEventReal(void* arg, FcitxModuleFunctionArg args) { - FcitxX11* x11priv = (FcitxX11*)arg; + FcitxX11* x11priv = arg; XEvent event; while (XPending(x11priv->dpy)) { XNextEvent(x11priv->dpy, &event); //等待一个事件发生 - - FcitxInstanceLock(x11priv->owner); /* 处理X事件 */ if (XFilterEvent(&event, None) == False) { if (event.type == DestroyNotify) { @@ -158,10 +160,19 @@ if (handler->eventHandler(handler->instance, &event)) break; } - FcitxInstanceUnlock(x11priv->owner); } } +void X11ProcessEvent(void* arg) +{ + FcitxX11* x11priv = (FcitxX11*)arg; + + FcitxModuleFunctionArg args; + X11ProcessEventReal(x11priv, args); + + FcitxModuleInvokeFunction(x11priv->xim, 0, args); +} + void* X11GetDisplay(void* arg, FcitxModuleFunctionArg args) { FcitxX11* x11priv = (FcitxX11*)arg; diff -Nru fcitx-4.2.2/src/module/x11/x11stuff.h fcitx-4.2.4.1/src/module/x11/x11stuff.h --- fcitx-4.2.2/src/module/x11/x11stuff.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/module/x11/x11stuff.h 2012-06-10 14:34:48.000000000 +0000 @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2010~2011 by CSSlayer * + * Copyright (C) 2010~2012 by CSSlayer * * wengxt@gmail.com * * * * This program is free software; you can redistribute it and/or modify * @@ -45,6 +45,8 @@ #define FCITX_X11_ADDCOMPOSITEHANDLER_RETURNTYPE void #define FCITX_X11_GETSCREENGEOMETRY 9 #define FCITX_X11_GETSCREENGEOMETRY_RETURNTYPE void +#define FCITX_X11_PROCESSREMAINEVENT 10 +#define FCITX_X11_PROCESSREMAINEVENT_RETURNTYPE void struct _FcitxInstance; @@ -80,6 +82,7 @@ FcitxRect* rects; int screenCount; int defaultScreen; + struct _FcitxAddon* xim; } FcitxX11; typedef enum _FcitxXWindowType { diff -Nru fcitx-4.2.2/src/module/xkb/CMakeLists.txt fcitx-4.2.4.1/src/module/xkb/CMakeLists.txt --- fcitx-4.2.2/src/module/xkb/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/module/xkb/CMakeLists.txt 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,20 @@ +include_directories ( + ${PROJECT_BINARY_DIR} + ${X11_INCLUDE_DIR} + ${X11_Xkb_INCLUDE_PATH} + ${X11_Xkblib_INCLUDE_PATH} + ${LIBINTL_INCLUDE_DIR} + ${LIBXML2_INCLUDE_DIR} + ) + +set(fcitx_xkb_SOURCES + xkb.c + rules.c + xkbconfig.c +) + +fcitx_add_addon(fcitx-xkb ${fcitx_xkb_SOURCES}) +target_link_libraries(fcitx-xkb ${X11_X11_LIB} ${XKBFILE_LIBRARIES} ${LIBXML2_LIBRARIES}) + +fcitx_add_addon_conf_file(fcitx-xkb.conf) +fcitx_add_configdesc_file(fcitx-xkb.desc) \ No newline at end of file diff -Nru fcitx-4.2.2/src/module/xkb/fcitx-xkb.conf.in fcitx-4.2.4.1/src/module/xkb/fcitx-xkb.conf.in --- fcitx-4.2.2/src/module/xkb/fcitx-xkb.conf.in 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/module/xkb/fcitx-xkb.conf.in 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,10 @@ +[Addon] +Name=fcitx-xkb +_GeneralName=X Keyboard Integration +_Comment=X Keyboard Integration +Category=Module +Enabled=True +Library=fcitx-xkb.so +Type=SharedLibrary +Dependency=fcitx-x11 +Advance=True diff -Nru fcitx-4.2.2/src/module/xkb/fcitx-xkb.desc fcitx-4.2.4.1/src/module/xkb/fcitx-xkb.desc --- fcitx-4.2.2/src/module/xkb/fcitx-xkb.desc 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/module/xkb/fcitx-xkb.desc 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,12 @@ +[X Keyboard/OverrideSystemXKBSettings] +Type=Boolean +DefaultValue=True +Description=Allow to Override System XKB Settings + +[X Keyboard/IgnoreInputMethodLayoutRequest] +Type=Boolean +DefaultValue=False +Description=Ignore Input Method Layout Request + +[DescriptionFile] +LocaleDomain=fcitx diff -Nru fcitx-4.2.2/src/module/xkb/rules.c fcitx-4.2.4.1/src/module/xkb/rules.c --- fcitx-4.2.2/src/module/xkb/rules.c 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/module/xkb/rules.c 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,492 @@ +/*************************************************************************** + * Copyright (C) 2012~2012 by CSSlayer * + * wengxt@gmail.com * + * * + * This program is free software; you can 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include + +#include "rules.h" +#define XMLCHAR_CAST (const char*) + +static void RulesHandlerStartElement(void *ctx, + const xmlChar *name, + const xmlChar **atts); +static void RulesHandlerEndElement(void *ctx, + const xmlChar *name); +static void RulesHandlerCharacters(void *ctx, + const xmlChar *ch, + int len); +static void FcitxXkbLayoutInfoInit(void* arg); +static void FcitxXkbVariantInfoInit(void* arg); +static void FcitxXkbModelInfoInit(void* arg); +static void FcitxXkbOptionGroupInfoInit(void* arg); +static void FcitxXkbOptionInfoInit(void* arg); +static void FcitxXkbLayoutInfoCopy(void* dst, const void* src); +static void FcitxXkbVariantInfoCopy(void* dst, const void* src); +static void FcitxXkbModelInfoCopy(void* dst, const void* src); +static void FcitxXkbOptionGroupInfoCopy(void* dst, const void* src); +static void FcitxXkbOptionInfoCopy(void* dst, const void* src); +static void FcitxXkbLayoutInfoFree(void* arg); +static void FcitxXkbVariantInfoFree(void* arg); +static void FcitxXkbModelInfoFree(void* arg); +static void FcitxXkbOptionGroupInfoFree(void* arg); +static void FcitxXkbOptionInfoFree(void* arg); +static inline FcitxXkbLayoutInfo* FindByName(FcitxXkbRules* rules, const char* name); +static void MergeRules(FcitxXkbRules* rules, FcitxXkbRules* rulesextra); + +static const UT_icd layout_icd = {sizeof(FcitxXkbLayoutInfo), FcitxXkbLayoutInfoInit, FcitxXkbLayoutInfoCopy, FcitxXkbLayoutInfoFree }; +static const UT_icd variant_icd = {sizeof(FcitxXkbVariantInfo), FcitxXkbVariantInfoInit, FcitxXkbVariantInfoCopy, FcitxXkbVariantInfoFree }; +static const UT_icd model_icd = {sizeof(FcitxXkbModelInfo), FcitxXkbModelInfoInit, FcitxXkbModelInfoCopy, FcitxXkbModelInfoFree }; +static const UT_icd option_group_icd = {sizeof(FcitxXkbOptionGroupInfo), FcitxXkbOptionGroupInfoInit, FcitxXkbOptionGroupInfoCopy, FcitxXkbOptionGroupInfoFree }; +static const UT_icd option_icd = {sizeof(FcitxXkbOptionInfo), FcitxXkbOptionInfoInit, FcitxXkbOptionInfoCopy, FcitxXkbOptionInfoFree }; +#define COPY_IF_NOT_NULL(x) ((x)?(strdup(x)):NULL) +#define utarray_clone(t, f) do { \ + utarray_new((t), (f)->icd); \ + utarray_concat((t), (f)); \ + } while(0) + +boolean StringEndsWith(const char* str, const char* suffix) +{ + size_t sl = strlen(str); + size_t sufl = strlen(suffix); + if (sl < sufl) + return false; + const char* start = str + (sl - sufl); + if (strncmp(start, suffix, sufl) == 0) + return true; + return false; +} + +FcitxXkbRules* FcitxXkbReadRules(const char* file) +{ + xmlSAXHandler handle; + memset(&handle, 0, sizeof(xmlSAXHandler)); + handle.startElement = RulesHandlerStartElement; + handle.endElement = RulesHandlerEndElement; + handle.characters = RulesHandlerCharacters; + + xmlInitParser(); + + FcitxXkbRules* rules = (FcitxXkbRules*) fcitx_utils_malloc0(sizeof(FcitxXkbRules)); + utarray_new(rules->layoutInfos, &layout_icd); + utarray_new(rules->modelInfos, &model_icd); + utarray_new(rules->optionGroupInfos, &option_group_icd); + + FcitxXkbRulesHandler ruleshandler; + ruleshandler.rules = rules; + ruleshandler.path = fcitx_utils_new_string_list(); + ruleshandler.fromExtra = false; + + xmlSAXUserParseFile(&handle, &ruleshandler, file); + utarray_free(ruleshandler.path); + + if (strcmp (file + strlen(file) - 4, ".xml") == 0) { + char* extra = strndup (file, strlen (file) - 4), *extrafile; + asprintf(&extrafile, "%s.extras.xml", extra); + FcitxXkbRules* rulesextra = (FcitxXkbRules*) fcitx_utils_malloc0(sizeof(FcitxXkbRules)); + utarray_new(rulesextra->layoutInfos, &layout_icd); + utarray_new(rulesextra->modelInfos, &model_icd); + utarray_new(rulesextra->optionGroupInfos, &option_group_icd); + ruleshandler.rules = rulesextra; + ruleshandler.path = fcitx_utils_new_string_list(); + xmlSAXUserParseFile(&handle, &ruleshandler, extrafile); + utarray_free(ruleshandler.path); + free(extra); + free(extrafile); + + MergeRules(rules, rulesextra); + } + + + xmlCleanupParser(); + + return rules; +} + +void FcitxXkbRulesFree(FcitxXkbRules* rules) +{ + if (!rules) + return; + + utarray_free(rules->layoutInfos); + utarray_free(rules->modelInfos); + utarray_free(rules->optionGroupInfos); + + fcitx_utils_free(rules->version); + free(rules); +} + +void MergeRules(FcitxXkbRules* rules, FcitxXkbRules* rulesextra) +{ + utarray_concat(rules->modelInfos, rulesextra->modelInfos); + utarray_concat(rules->optionGroupInfos, rulesextra->optionGroupInfos); + + FcitxXkbLayoutInfo* layoutInfo; + UT_icd icd = {sizeof(FcitxXkbLayoutInfo*), 0, 0, 0}; + UT_array toAdd; + utarray_init(&toAdd, &icd); + for (layoutInfo = (FcitxXkbLayoutInfo*) utarray_front(rulesextra->layoutInfos); + layoutInfo != NULL; + layoutInfo = (FcitxXkbLayoutInfo*) utarray_next(rulesextra->layoutInfos, layoutInfo)) + { + FcitxXkbLayoutInfo* l = FindByName(rules, layoutInfo->name); + if (l) { + utarray_concat(l->languages, layoutInfo->languages); + utarray_concat(l->variantInfos, layoutInfo->variantInfos); + } + else + utarray_push_back(&toAdd, &layoutInfo); + } + + int i; + for(i = 0; i < utarray_len(&toAdd); i ++) { + FcitxXkbLayoutInfo* p = *(FcitxXkbLayoutInfo**) utarray_eltptr(&toAdd, i); + utarray_push_back(rules->layoutInfos, p); + } + + utarray_done(&toAdd); + FcitxXkbRulesFree(rulesextra); +} + + +char* FcitxXkbRulesToReadableString(FcitxXkbRules* rules) +{ + FcitxXkbLayoutInfo* layoutInfo; + FcitxXkbModelInfo* modelInfo; + FcitxXkbVariantInfo* variantInfo; + FcitxXkbOptionInfo* optionInfo; + FcitxXkbOptionGroupInfo* optionGroupInfo; + + UT_array* list = fcitx_utils_new_string_list(); + + fcitx_utils_string_list_printf_append(list, "Version: %s", rules->version); + + for (layoutInfo = (FcitxXkbLayoutInfo*) utarray_front(rules->layoutInfos); + layoutInfo != NULL; + layoutInfo = (FcitxXkbLayoutInfo*) utarray_next(rules->layoutInfos, layoutInfo)) + { + fcitx_utils_string_list_printf_append(list, "\tLayout Name: %s", layoutInfo->name); + fcitx_utils_string_list_printf_append(list, "\tLayout Description: %s", layoutInfo->description); + char* languages = fcitx_utils_join_string_list(layoutInfo->languages, ','); + fcitx_utils_string_list_printf_append(list, "\tLayout Languages: %s", languages); + free(languages); + for (variantInfo = (FcitxXkbVariantInfo*) utarray_front(layoutInfo->variantInfos); + variantInfo != NULL; + variantInfo = (FcitxXkbVariantInfo*) utarray_next(layoutInfo->variantInfos, variantInfo)) + { + fcitx_utils_string_list_printf_append(list, "\t\tVariant Name: %s", variantInfo->name); + fcitx_utils_string_list_printf_append(list, "\t\tVariant Description: %s", variantInfo->description); + char* languages = fcitx_utils_join_string_list(variantInfo->languages, ','); + fcitx_utils_string_list_printf_append(list, "\t\tVariant Languages: %s", languages); + free(languages); + } + } + + for (modelInfo = (FcitxXkbModelInfo*) utarray_front(rules->modelInfos); + modelInfo != NULL; + modelInfo = (FcitxXkbModelInfo*) utarray_next(rules->modelInfos, modelInfo)) + { + fcitx_utils_string_list_printf_append(list, "\tModel Name: %s", modelInfo->name); + fcitx_utils_string_list_printf_append(list, "\tModel Description: %s", modelInfo->description); + fcitx_utils_string_list_printf_append(list, "\tModel Vendor: %s", modelInfo->vendor); + } + + for (optionGroupInfo = (FcitxXkbOptionGroupInfo*) utarray_front(rules->optionGroupInfos); + optionGroupInfo != NULL; + optionGroupInfo = (FcitxXkbOptionGroupInfo*) utarray_next(rules->optionGroupInfos, optionGroupInfo)) + { + fcitx_utils_string_list_printf_append(list, "\tOption Group Name: %s", optionGroupInfo->name); + fcitx_utils_string_list_printf_append(list, "\tOption Group Description: %s", optionGroupInfo->description); + fcitx_utils_string_list_printf_append(list, "\tOption Group Exclusive: %d", optionGroupInfo->exclusive); + for (optionInfo = (FcitxXkbOptionInfo*) utarray_front(optionGroupInfo->optionInfos); + optionInfo != NULL; + optionInfo = (FcitxXkbOptionInfo*) utarray_next(optionGroupInfo->optionInfos, optionInfo)) + { + fcitx_utils_string_list_printf_append(list, "\t\tOption Name: %s", optionInfo->name); + fcitx_utils_string_list_printf_append(list, "\t\tOption Description: %s", optionInfo->description); + } + } + + char* result = fcitx_utils_join_string_list(list, '\n'); + utarray_free(list); + return result; +} + +static inline +FcitxXkbLayoutInfo* FindByName(FcitxXkbRules* rules, const char* name) { + FcitxXkbLayoutInfo* layoutInfo; + for (layoutInfo = (FcitxXkbLayoutInfo*) utarray_front(rules->layoutInfos); + layoutInfo != NULL; + layoutInfo = (FcitxXkbLayoutInfo*) utarray_next(rules->layoutInfos, layoutInfo)) + { + if (strcmp(layoutInfo->name, name) == 0) + break; + } + return layoutInfo; +} + +/* code borrow from kde-workspace/kcontrol/keyboard/xkb_rules.cpp */ +void RulesHandlerStartElement(void *ctx, + const xmlChar *name, + const xmlChar **atts) +{ + FcitxXkbRulesHandler* ruleshandler = (FcitxXkbRulesHandler*) ctx; + FcitxXkbRules* rules = ruleshandler->rules; + utarray_push_back(ruleshandler->path, &name); + + char* strPath = fcitx_utils_join_string_list(ruleshandler->path, '/'); + if ( StringEndsWith(strPath, "layoutList/layout/configItem") ) { + utarray_extend_back(rules->layoutInfos); + } + else if ( StringEndsWith(strPath, "layoutList/layout/variantList/variant") ) { + FcitxXkbLayoutInfo* layoutInfo = (FcitxXkbLayoutInfo*) utarray_back(rules->layoutInfos); + utarray_extend_back(layoutInfo->variantInfos); + } + else if ( StringEndsWith(strPath, "modelList/model") ) { + utarray_extend_back(rules->modelInfos); + } + else if ( StringEndsWith(strPath, "optionList/group") ) { + utarray_extend_back(rules->optionGroupInfos); + FcitxXkbOptionGroupInfo* optionGroupInfo = (FcitxXkbOptionGroupInfo*) utarray_back(rules->optionGroupInfos); + int i = 0; + while(atts && atts[i*2] != 0) { + if (strcmp(XMLCHAR_CAST atts[i*2], "allowMultipleSelection") == 0) { + optionGroupInfo->exclusive = (strcmp(XMLCHAR_CAST atts[i*2 + 1], "true") != 0); + } + i++; + } + } + else if ( StringEndsWith(strPath, "optionList/group/option") ) { + FcitxXkbOptionGroupInfo* optionGroupInfo = (FcitxXkbOptionGroupInfo*) utarray_back(rules->optionGroupInfos); + utarray_extend_back(optionGroupInfo->optionInfos); + } + else if ( strcmp(strPath, "xkbConfigRegistry") == 0 ) { + int i = 0; + while(atts && atts[i*2] != 0) { + if (strcmp(XMLCHAR_CAST atts[i*2], "version") == 0 && strlen(XMLCHAR_CAST atts[i*2 + 1]) != 0) { + rules->version = strdup(XMLCHAR_CAST atts[i*2 + 1]); + } + i++; + } + } + free(strPath); +} + +void RulesHandlerEndElement(void *ctx, + const xmlChar *name) +{ + FcitxXkbRulesHandler* ruleshandler = (FcitxXkbRulesHandler*) ctx; + utarray_pop_back(ruleshandler->path); +} + +void RulesHandlerCharacters(void *ctx, + const xmlChar *ch, + int len) +{ + FcitxXkbRulesHandler* ruleshandler = (FcitxXkbRulesHandler*) ctx; + FcitxXkbRules* rules = ruleshandler->rules; + char* temp = strndup(XMLCHAR_CAST ch, len); + char* trimmed = fcitx_utils_trim(temp); + free(temp); + if ( strlen(trimmed) != 0 ) { + char* strPath = fcitx_utils_join_string_list(ruleshandler->path, '/'); + FcitxXkbLayoutInfo* layoutInfo = (FcitxXkbLayoutInfo*) utarray_back(rules->layoutInfos); + FcitxXkbModelInfo* modelInfo = (FcitxXkbModelInfo*) utarray_back(rules->modelInfos); + FcitxXkbOptionGroupInfo* optionGroupInfo = (FcitxXkbOptionGroupInfo*) utarray_back(rules->optionGroupInfos); + if ( StringEndsWith(strPath, "layoutList/layout/configItem/name") ) { + if ( layoutInfo != NULL ) + layoutInfo->name = strdup(trimmed); + } + else if ( StringEndsWith(strPath, "layoutList/layout/configItem/description") ) { + layoutInfo->description = strdup(trimmed); + } + else if ( StringEndsWith(strPath, "layoutList/layout/configItem/languageList/iso639Id") ) { + utarray_push_back(layoutInfo->languages, &trimmed); + } + else if ( StringEndsWith(strPath, "layoutList/layout/variantList/variant/configItem/name") ) { + FcitxXkbVariantInfo* variantInfo = (FcitxXkbVariantInfo*) utarray_back(layoutInfo->variantInfos); + variantInfo->name = strdup(trimmed); + } + else if ( StringEndsWith(strPath, "layoutList/layout/variantList/variant/configItem/description") ) { + FcitxXkbVariantInfo* variantInfo = (FcitxXkbVariantInfo*) utarray_back(layoutInfo->variantInfos); + fcitx_utils_free(variantInfo->description); + variantInfo->description = strdup(trimmed); + } + else if ( StringEndsWith(strPath, "layoutList/layout/variantList/variant/configItem/languageList/iso639Id") ) { + FcitxXkbVariantInfo* variantInfo = (FcitxXkbVariantInfo*) utarray_back(layoutInfo->variantInfos); + utarray_push_back(variantInfo->languages, &trimmed); + } + else if ( StringEndsWith(strPath, "modelList/model/configItem/name") ) { + modelInfo->name = strdup(trimmed); + } + else if ( StringEndsWith(strPath, "modelList/model/configItem/description") ) { + modelInfo->description = strdup(trimmed); + } + else if ( StringEndsWith(strPath, "modelList/model/configItem/vendor") ) { + modelInfo->vendor = strdup(trimmed); + } + else if ( StringEndsWith(strPath, "optionList/group/configItem/name") ) { + optionGroupInfo->name = strdup(trimmed); + } + else if ( StringEndsWith(strPath, "optionList/group/configItem/description") ) { + optionGroupInfo->description = strdup(trimmed); + } + else if ( StringEndsWith(strPath, "optionList/group/option/configItem/name") ) { + FcitxXkbOptionInfo* optionInfo = (FcitxXkbOptionInfo*) utarray_back(optionGroupInfo->optionInfos); + optionInfo->name = strdup(trimmed); + } + else if ( StringEndsWith(strPath, "optionList/group/option/configItem/description") ) { + FcitxXkbOptionInfo* optionInfo = (FcitxXkbOptionInfo*) utarray_back(optionGroupInfo->optionInfos); + fcitx_utils_free(optionInfo->description); + optionInfo->description = strdup(trimmed); + } + free(strPath); + } + free(trimmed); +} + + +void FcitxXkbLayoutInfoInit(void* arg) +{ + FcitxXkbLayoutInfo* layoutInfo = (FcitxXkbLayoutInfo*) arg; + memset(layoutInfo, 0, sizeof(FcitxXkbLayoutInfo)); + layoutInfo->languages = fcitx_utils_new_string_list(); + utarray_new(layoutInfo->variantInfos, &variant_icd); +} + + +void FcitxXkbVariantInfoInit(void* arg) +{ + FcitxXkbVariantInfo* variantInfo = (FcitxXkbVariantInfo*) arg; + memset(variantInfo, 0, sizeof(FcitxXkbVariantInfo)); + variantInfo->languages = fcitx_utils_new_string_list(); +} + + +void FcitxXkbModelInfoInit(void* arg) +{ + FcitxXkbModelInfo* modelInfo = (FcitxXkbModelInfo*) arg; + memset(modelInfo, 0, sizeof(FcitxXkbModelInfo)); +} + + +void FcitxXkbOptionGroupInfoInit(void* arg) +{ + FcitxXkbOptionGroupInfo* optionGroupInfo = (FcitxXkbOptionGroupInfo*) arg; + memset(optionGroupInfo, 0, sizeof(FcitxXkbOptionGroupInfo)); + utarray_new(optionGroupInfo->optionInfos, &option_icd); +} + + +void FcitxXkbOptionInfoInit(void* arg) +{ + FcitxXkbOptionInfo* optionInfo = (FcitxXkbOptionInfo*) arg; + memset(optionInfo, 0, sizeof(FcitxXkbOptionInfo)); +} + + +void FcitxXkbLayoutInfoFree(void* arg) +{ + FcitxXkbLayoutInfo* layoutInfo = (FcitxXkbLayoutInfo*) arg; + fcitx_utils_free(layoutInfo->name); + fcitx_utils_free(layoutInfo->description); + utarray_free(layoutInfo->languages); + utarray_free(layoutInfo->variantInfos); +} + + +void FcitxXkbVariantInfoFree(void* arg) +{ + FcitxXkbVariantInfo* variantInfo = (FcitxXkbVariantInfo*) arg; + fcitx_utils_free(variantInfo->name); + fcitx_utils_free(variantInfo->description); + utarray_free(variantInfo->languages); +} + + +void FcitxXkbModelInfoFree(void* arg) +{ + FcitxXkbModelInfo* modelInfo = (FcitxXkbModelInfo*) arg; + fcitx_utils_free(modelInfo->name); + fcitx_utils_free(modelInfo->description); + fcitx_utils_free(modelInfo->vendor); +} + + +void FcitxXkbOptionGroupInfoFree(void* arg) +{ + FcitxXkbOptionGroupInfo* optionGroupInfo = (FcitxXkbOptionGroupInfo*) arg; + fcitx_utils_free(optionGroupInfo->name); + fcitx_utils_free(optionGroupInfo->description); + utarray_free(optionGroupInfo->optionInfos); +} + + +void FcitxXkbOptionInfoFree(void* arg) +{ + FcitxXkbOptionInfo* optionInfo = (FcitxXkbOptionInfo*) arg; + fcitx_utils_free(optionInfo->name); + fcitx_utils_free(optionInfo->description); +} + +void FcitxXkbLayoutInfoCopy(void* dst, const void* src) +{ + FcitxXkbLayoutInfo* layoutInfoDst = (FcitxXkbLayoutInfo*) dst; + FcitxXkbLayoutInfo* layoutInfoSrc = (FcitxXkbLayoutInfo*) src; + layoutInfoDst->name = COPY_IF_NOT_NULL(layoutInfoSrc->name); + layoutInfoDst->description = COPY_IF_NOT_NULL(layoutInfoSrc->description); + utarray_clone(layoutInfoDst->languages, layoutInfoSrc->languages); + utarray_clone(layoutInfoDst->variantInfos, layoutInfoSrc->variantInfos); +} + +void FcitxXkbModelInfoCopy(void* dst, const void* src) +{ + FcitxXkbModelInfo* modeInfoDst = (FcitxXkbModelInfo*) dst; + FcitxXkbModelInfo* modeInfoSrc = (FcitxXkbModelInfo*) src; + modeInfoDst->name = COPY_IF_NOT_NULL(modeInfoSrc->name); + modeInfoDst->description = COPY_IF_NOT_NULL(modeInfoSrc->description); + modeInfoDst->vendor = COPY_IF_NOT_NULL(modeInfoSrc->vendor); +} + +void FcitxXkbOptionGroupInfoCopy(void* dst, const void* src) +{ + FcitxXkbOptionGroupInfo* optionGroupInfoDst = (FcitxXkbOptionGroupInfo*) dst; + FcitxXkbOptionGroupInfo* optionGroupInfoSrc = (FcitxXkbOptionGroupInfo*) src; + optionGroupInfoDst->name = COPY_IF_NOT_NULL(optionGroupInfoSrc->name); + optionGroupInfoDst->description = COPY_IF_NOT_NULL(optionGroupInfoSrc->description); + optionGroupInfoDst->exclusive = optionGroupInfoSrc->exclusive; + utarray_clone(optionGroupInfoDst->optionInfos, optionGroupInfoSrc->optionInfos); +} + +void FcitxXkbOptionInfoCopy(void* dst, const void* src) +{ + FcitxXkbOptionInfo* optionInfoDst = (FcitxXkbOptionInfo*) dst; + FcitxXkbOptionInfo* optionInfoSrc = (FcitxXkbOptionInfo*) src; + optionInfoDst->name = COPY_IF_NOT_NULL(optionInfoSrc->name); + optionInfoDst->description = COPY_IF_NOT_NULL(optionInfoSrc->description); +} + +void FcitxXkbVariantInfoCopy(void* dst, const void* src) +{ + FcitxXkbVariantInfo* variantInfoDst = (FcitxXkbVariantInfo*) dst; + FcitxXkbVariantInfo* variantInfoSrc = (FcitxXkbVariantInfo*) src; + variantInfoDst->name = COPY_IF_NOT_NULL(variantInfoSrc->name); + variantInfoDst->description = COPY_IF_NOT_NULL(variantInfoSrc->description); + utarray_clone(variantInfoDst->languages, variantInfoSrc->languages); +} + diff -Nru fcitx-4.2.2/src/module/xkb/rules.h fcitx-4.2.4.1/src/module/xkb/rules.h --- fcitx-4.2.2/src/module/xkb/rules.h 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/module/xkb/rules.h 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,76 @@ +/*************************************************************************** + * Copyright (C) 2012~2012 by CSSlayer * + * wengxt@gmail.com * + * * + * This program is free software; you can 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#ifndef FCITX_KEYBOARD_RULES_H +#define FCITX_KEYBOARD_RULES_H + +#include +#include + +typedef struct _FcitxXkbRules { + UT_array* layoutInfos; + UT_array* modelInfos; + UT_array* optionGroupInfos; + char* version; +} FcitxXkbRules; + +typedef struct _FcitxXkbRulesHandler { + UT_array* path; + FcitxXkbRules* rules; + boolean fromExtra; +} FcitxXkbRulesHandler; + +typedef struct _FcitxXkbLayoutInfo { + UT_array* variantInfos; + char* name; + char* description; + UT_array* languages; +} FcitxXkbLayoutInfo; + +typedef struct _FcitxXkbVariantInfo { + char* name; + char* description; + UT_array* languages; +} FcitxXkbVariantInfo; + +typedef struct _FcitxXkbModelInfo { + char* name; + char* description; + char* vendor; +} FcitxXkbModelInfo; + +typedef struct _FcitxXkbOptionGroupInfo { + UT_array* optionInfos; + char* name; + char* description; + boolean exclusive; +} FcitxXkbOptionGroupInfo; + +typedef struct _FcitxXkbOptionInfo { + char* name; + char* description; +} FcitxXkbOptionInfo; + +FcitxXkbRules* FcitxXkbReadRules(const char* file); +void FcitxXkbRulesFree(FcitxXkbRules* rules); +char* FcitxXkbRulesToReadableString(FcitxXkbRules* rules); +boolean StringEndsWith(const char* str, const char* suffix); + +#endif diff -Nru fcitx-4.2.2/src/module/xkb/xkb.c fcitx-4.2.4.1/src/module/xkb/xkb.c --- fcitx-4.2.2/src/module/xkb/xkb.c 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/module/xkb/xkb.c 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,903 @@ +/*************************************************************************** + * Copyright (C) 2012~2012 by CSSlayer * + * wengxt@gmail.com * + * * + * This program is free software; you can 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include "fcitx/context.h" +#include "fcitx/hook.h" +#include "fcitx/addon.h" +#include "fcitx/module.h" +#include "module/x11/x11stuff.h" +#include "fcitx-config/xdg.h" +#include "fcitx-utils/log.h" +#include "fcitx-utils/utils.h" + +#include "config.h" +#include "xkb.h" +#include "rules.h" + +#ifndef XKB_RULES_XML_FILE +#define XKB_RULES_XML_FILE "/usr/share/X11/xkb/rules/evdev.xml" +#endif + +#define GROUP_CHANGE_MASK \ + ( XkbGroupStateMask | XkbGroupBaseMask | XkbGroupLatchMask | XkbGroupLockMask ) + +static void* FcitxXkbGetRules(void* arg, FcitxModuleFunctionArg args); +static void* FcitxXkbLayoutExists(void* arg, FcitxModuleFunctionArg args); +static void* FcitxXkbGetCurrentLayout(void* arg, FcitxModuleFunctionArg args); +static void* FcitxXkbGetLayoutOverride(void* arg, FcitxModuleFunctionArg args); +static void* FcitxXkbSetLayoutOverride(void* arg, FcitxModuleFunctionArg args); +static void* FcitxXkbCreate(struct _FcitxInstance* instance); +static void FcitxXkbDestroy(void*); +static void FcitxXkbReloadConfig(void*); +static void FcitxXkbInitDefaultLayout (FcitxXkb* xkb); +static Bool FcitxXkbSetRules (FcitxXkb* xkb, + const char *rules_file, const char *model, + const char *all_layouts, const char *all_variants, + const char *all_options); +static Bool FcitxXkbUpdateProperties (FcitxXkb* xkb, + const char *rules_file, const char *model, + const char *all_layouts, const char *all_variants, + const char *all_options); +#if 0 +static char* FcitxXkbGetCurrentLayout (FcitxXkb* xkb); +static char* FcitxXkbGetCurrentModel (FcitxXkb* xkb); +static char* FcitxXkbGetCurrentOption (FcitxXkb* xkb); +#endif +static boolean FcitxXkbSetLayout (FcitxXkb* xkb, + const char *layouts, + const char *variants, + const char *options); +static int FcitxXkbGetCurrentGroup (FcitxXkb* xkb); +static void FcitxXkbIMKeyboardLayoutChanged(void* arg, const void* value); +static int FcitxXkbFindLayoutIndex(FcitxXkb* xkb, const char* layout, const char* variant); +static void FcitxXkbCurrentStateChanged(void* arg); +static void FcitxXkbCurrentStateChangedTriggerOn(void* arg); +static char* FcitxXkbGetRulesName(FcitxXkb* xkb); +static char* FcitxXkbFindXkbRulesFile(FcitxXkb* xkb); +static boolean LoadXkbConfig(FcitxXkb* xkb); +static void SaveXkbConfig(FcitxXkb* fs); +static boolean FcitxXkbEventHandler(void* arg, XEvent* event); + +CONFIG_DESC_DEFINE(GetXkbConfigDesc, "fcitx-xkb.desc") + +typedef struct _LayoutOverride { + char* im; + char* layout; + char* variant; + UT_hash_handle hh; +} LayoutOverride; + +FCITX_EXPORT_API +FcitxModule module = { + FcitxXkbCreate, + NULL, + NULL, + FcitxXkbDestroy, + FcitxXkbReloadConfig +}; + +FCITX_EXPORT_API +int ABI_VERSION = FCITX_ABI_VERSION; + +boolean FcitxXkbSupported(FcitxXkb* xkb, int* xkbOpcode) +{ + // Verify the Xlib has matching XKB extension. + + int major = XkbMajorVersion; + int minor = XkbMinorVersion; + + if (!XkbLibraryVersion(&major, &minor)) + { + FcitxLog(WARNING, "Xlib XKB extension %d.%d != %d %d", major, minor, XkbMajorVersion, XkbMinorVersion); + return false; + } + + // Verify the X server has matching XKB extension. + + int opcode_rtrn; + int error_rtrn; + int xkb_opcode; + if( ! XkbQueryExtension(xkb->dpy, &opcode_rtrn, &xkb_opcode, &error_rtrn, &major, &minor)) { + FcitxLog(WARNING, "Xlib XKB extension %d.%d != %d %d", major, minor, XkbMajorVersion, XkbMinorVersion); + return false; + } + + if( xkbOpcode != NULL ) { + *xkbOpcode = xkb_opcode; + } + + return true; +} + + +char* FcitxXkbGetRulesName(FcitxXkb* xkb) +{ + XkbRF_VarDefsRec vd; + char *tmp = NULL; + + if (XkbRF_GetNamesProp(xkb->dpy, &tmp, &vd) && tmp != NULL ) { + return strdup(tmp); + } + + return NULL; +} + + +static char* FcitxXkbFindXkbRulesFile(FcitxXkb* xkb) +{ + char* rulesFile = NULL; + char* rulesName = FcitxXkbGetRulesName(xkb); + + if ( rulesName != NULL ) { + char* xkbParentDir = NULL; + + const char* base = XLIBDIR; + + int count = 0, i = 0; + while(base[i]) { + if (base[i] == '/') + count++; + i ++; + } + + if( count >= 3 ) { + // .../usr/lib/X11 -> /usr/share/X11/xkb vs .../usr/X11/lib -> /usr/X11/share/X11/xkb + const char* delta = StringEndsWith(base, "X11") ? "/../../share/X11" : "/../share/X11"; + char* dirPath; + asprintf(&dirPath, "%s%s", base, delta); + + DIR* dir = opendir(dirPath); + if( dir ) { + closedir(dir); + xkbParentDir = realpath(dirPath, NULL); + free(dirPath); + } + else { + free(dirPath); + asprintf(&dirPath, "%s/X11", base); + DIR* dir = opendir(dirPath); + if( dir ) { + closedir(dir); + xkbParentDir = realpath(dirPath, NULL); + } + free(dirPath); + } + } + + if( xkbParentDir == NULL || strlen(xkbParentDir) == 0 ) { + xkbParentDir = strdup("/usr/share/X11"); + } + + rulesFile = fcitx_utils_malloc0(sizeof(char) * (1 + strlen(xkbParentDir) + strlen(rulesName) + strlen("/xkb/rules/"))); + sprintf(rulesFile, "%s/xkb/rules/%s.xml", xkbParentDir, rulesName); + fcitx_utils_free(xkbParentDir); + } + + fcitx_utils_free(rulesName); + + if (rulesFile == NULL) + rulesFile = strdup(XKB_RULES_XML_FILE); + + return rulesFile; +} + +static void +FcitxXkbInitDefaultLayout (FcitxXkb* xkb) +{ + Display* dpy = xkb->dpy; + XkbRF_VarDefsRec vd; + char *tmp = NULL; + + if (xkb->defaultLayouts) fcitx_utils_free_string_list(xkb->defaultLayouts); + if (xkb->defaultModels) fcitx_utils_free_string_list(xkb->defaultModels); + if (xkb->defaultOptions) fcitx_utils_free_string_list(xkb->defaultOptions); + if (xkb->defaultVariants) fcitx_utils_free_string_list(xkb->defaultVariants); + + if (!XkbRF_GetNamesProp(dpy, &tmp, &vd) || !tmp) + { + FcitxLog(WARNING, "Couldn't interpret %s property", _XKB_RF_NAMES_PROP_ATOM); + return; + } + if (!vd.model || !vd.layout) { + FcitxLog (WARNING, "Could not get group layout from X property"); + return; + } + if (vd.layout) + xkb->defaultLayouts = fcitx_utils_split_string (vd.layout, ','); + else + xkb->defaultLayouts = fcitx_utils_new_string_list(); + if (vd.model) + xkb->defaultModels = fcitx_utils_split_string (vd.model, ','); + else + xkb->defaultModels = fcitx_utils_new_string_list(); + if (vd.options) + xkb->defaultOptions = fcitx_utils_split_string (vd.options, ','); + else + xkb->defaultOptions = fcitx_utils_new_string_list(); + if (vd.variant) { + xkb->defaultVariants = fcitx_utils_split_string (vd.variant, ','); + } + else + xkb->defaultVariants = fcitx_utils_new_string_list(); +} + +static Bool +FcitxXkbSetRules (FcitxXkb* xkb, + const char *rules_file, const char *model, + const char *all_layouts, const char *all_variants, + const char *all_options) +{ + Display* dpy = xkb->dpy; + char *rulesPath; + XkbRF_RulesPtr rules = NULL; + XkbRF_VarDefsRec rdefs; + XkbComponentNamesRec rnames; + XkbDescPtr xkbDesc; + + rulesPath = strdup("./rules/evdev"); + rules = XkbRF_Load (rulesPath, "C", True, True); + if (rules == NULL) { + free (rulesPath); + + rulesPath = FcitxXkbFindXkbRulesFile(xkb); + if (strcmp (rulesPath + strlen(rulesPath) - 4, ".xml") == 0) { + char* old = rulesPath; + rulesPath = strndup (rulesPath, + strlen (rulesPath) - 4); + free(old); + } + rules = XkbRF_Load (rulesPath, "C", True, True); + } + if (rules == NULL) { + free(rulesPath); + return False; + } + + memset (&rdefs, 0, sizeof (XkbRF_VarDefsRec)); + memset (&rnames, 0, sizeof (XkbComponentNamesRec)); + rdefs.model = model ? strdup (model) : NULL; + rdefs.layout = all_layouts ? strdup (all_layouts) : NULL; + rdefs.variant = all_variants ? strdup (all_variants) : NULL; + rdefs.options = all_options ? strdup (all_options) : NULL; + XkbRF_GetComponents (rules, &rdefs, &rnames); + xkbDesc = XkbGetKeyboardByName (dpy, XkbUseCoreKbd, &rnames, + XkbGBN_AllComponentsMask, + XkbGBN_AllComponentsMask & + (~XkbGBN_GeometryMask), True); + if (!xkbDesc) { + FcitxLog (WARNING, "Cannot load new keyboard description."); + return False; + } + XkbRF_SetNamesProp (dpy, rulesPath, &rdefs); + free (rulesPath); + free (rdefs.model); + free (rdefs.layout); + free (rdefs.variant); + free (rdefs.options); + + return True; +} + +static Bool +FcitxXkbUpdateProperties (FcitxXkb* xkb, + const char *rules_file, const char *model, + const char *all_layouts, const char *all_variants, + const char *all_options) +{ + Display *dpy = xkb->dpy; + int len; + char *pval; + char *next; + Atom rules_atom; + Window root_window; + + len = (rules_file ? strlen (rules_file) : 0); + len += (model ? strlen (model) : 0); + len += (all_layouts ? strlen (all_layouts) : 0); + len += (all_variants ? strlen (all_variants) : 0); + len += (all_options ? strlen (all_options) : 0); + + if (len < 1) { + return True; + } + len += 5; /* trailing NULs */ + + rules_atom = XInternAtom (dpy, _XKB_RF_NAMES_PROP_ATOM, False); + root_window = XDefaultRootWindow (dpy); + pval = next = (char*) fcitx_utils_malloc0 (sizeof(char) *(len + 1)); + if (!pval) { + return True; + } + + if (rules_file) { + strcpy (next, rules_file); + next += strlen (rules_file); + } + *next++ = '\0'; + if (model) { + strcpy (next, model); + next += strlen (model); + } + *next++ = '\0'; + if (all_layouts) { + strcpy (next, all_layouts); + next += strlen (all_layouts); + } + *next++ = '\0'; + if (all_variants) { + strcpy (next, all_variants); + next += strlen (all_variants); + } + *next++ = '\0'; + if (all_options) { + strcpy (next, all_options); + next += strlen (all_options); + } + *next++ = '\0'; + if ((next - pval) != len) { + free (pval); + return True; + } + + XChangeProperty (dpy, root_window, + rules_atom, XA_STRING, 8, PropModeReplace, + (unsigned char *) pval, len); + XSync(dpy, False); + + return True; +} + +void* +FcitxXkbGetCurrentLayout (void* arg, FcitxModuleFunctionArg args) +{ + FcitxXkb* xkb = arg; + char** layout = args.args[0]; + char** variant = args.args[1]; + char* const * layoutName = (char* const*) utarray_eltptr(xkb->defaultLayouts, FcitxXkbGetCurrentGroup(xkb)); + char* const * pVariantName = (char* const*) utarray_eltptr(xkb->defaultVariants, FcitxXkbGetCurrentGroup(xkb)); + if (layoutName) { + *layout = strdup(*layoutName); + } + else + *layout = NULL; + if (pVariantName && strlen(*pVariantName) != 0) + *variant = strdup(*pVariantName); + else + *variant = NULL; + + return NULL; +} +#if 0 + +char * +FcitxXkbGetCurrentModel (FcitxXkb* xkb) +{ + if (xkb->defaultModels == NULL) { + return NULL; + } + return fcitx_utils_join_string_list(xkb->defaultModels, ','); +} + +char * +FcitxXkbGetCurrentOption (FcitxXkb* xkb) +{ + if (xkb->defaultOptions == NULL) { + return NULL; + } + return fcitx_utils_join_string_list(xkb->defaultOptions, ','); +} +#endif + +boolean +FcitxXkbSetLayout (FcitxXkb* xkb, + const char *layouts, + const char *variants, + const char *options) +{ + boolean retval; + char *layouts_line; + char *options_line; + char *variants_line; + char *model_line; + + if (xkb->defaultLayouts == NULL) { + FcitxLog(WARNING, "Your system seems not to support XKB."); + return False; + } + + if (layouts == NULL) + layouts_line = fcitx_utils_join_string_list (xkb->defaultLayouts, ','); + else + layouts_line = strdup (layouts); + + if (variants == NULL) + variants_line = fcitx_utils_join_string_list(xkb->defaultVariants, ','); + else + variants_line = strdup(variants); + + if (options == NULL) + options_line = fcitx_utils_join_string_list(xkb->defaultOptions, ','); + else + options_line = strdup(options); + + model_line = fcitx_utils_join_string_list(xkb->defaultModels, ','); + + retval = FcitxXkbSetRules(xkb, + "evdev", model_line, + layouts_line, variants_line, options_line); + FcitxXkbUpdateProperties(xkb, + "evdev", model_line, + layouts_line, variants_line, options_line); + free (layouts_line); + free (variants_line); + free (options_line); + free (model_line); + + return retval; +} + +int +FcitxXkbGetCurrentGroup (FcitxXkb* xkb) +{ + Display *dpy = xkb->dpy; + XkbStateRec state; + + if (xkb->defaultLayouts == NULL) { + FcitxLog(WARNING, "Your system seems not to support XKB."); + return 0; + } + + if (XkbGetState (dpy, XkbUseCoreKbd, &state) != Success) { + FcitxLog(WARNING, "Could not get state"); + return 0; + } + + return state.group; +} + +void FcitxXkbAddNewLayout(FcitxXkb* xkb, const char* layoutString, const char* variantString) +{ + while (utarray_len(xkb->defaultVariants) < utarray_len(xkb->defaultLayouts)) { + const char* dummy = ""; + utarray_push_back(xkb->defaultVariants, &dummy); + } + while (utarray_len(xkb->defaultVariants) >= 4) { + utarray_pop_back(xkb->defaultVariants); + utarray_pop_back(xkb->defaultLayouts); + } + utarray_push_back(xkb->defaultLayouts, &layoutString); + if (variantString) + utarray_push_back(xkb->defaultVariants, &variantString); + else { + const char* dummy = ""; + utarray_push_back(xkb->defaultVariants, &dummy); + } + FcitxXkbSetLayout(xkb, NULL, NULL, NULL); +} + +void FcitxXkbIMKeyboardLayoutChanged(void* arg, const void* value) +{ + /* fcitx-keyboard will be useless, if fcitx-xkb don't change the layout for them */ + FcitxXkb* xkb = (FcitxXkb*) arg; + FcitxIM* currentIM = FcitxInstanceGetCurrentIM(xkb->owner); + if (xkb->config.bIgnoreInputMethodLayoutRequest + && (!currentIM || strncmp(currentIM->uniqueName, "fcitx-keyboard", strlen("fcitx-keyboard")) != 0)) + { + XkbLockGroup(xkb->dpy, XkbUseCoreKbd, xkb->closeGroup); + return; + } + + /* active means im will be take care */ + if (FcitxInstanceGetCurrentStatev2(xkb->owner) == IS_ACTIVE) { + if (value == NULL) + return; + + char* layoutString = NULL; + char* variantString = NULL; + LayoutOverride* item = NULL; + UT_array* s = NULL; + if (currentIM) + HASH_FIND_STR(xkb->layoutOverride, currentIM->uniqueName, item); + if (item) { + layoutString = item->layout; + variantString = item->variant; + } + else { + const char* layout = (const char*) value; + UT_array* s = fcitx_utils_split_string(layout, ','); + char** pLayoutString = (char**) utarray_eltptr(s, 0); + char** pVariantString = (char**) utarray_eltptr(s, 1); + layoutString = (pLayoutString)? *pLayoutString: NULL; + variantString = (pVariantString)? *pVariantString: NULL; + } + int idx = FcitxXkbFindLayoutIndex(xkb, layoutString, variantString); + if (idx >= 0) { + XkbLockGroup(xkb->dpy, XkbUseCoreKbd, idx); + } + else { + + if (xkb->config.bOverrideSystemXKBSettings) { + FcitxXkbAddNewLayout(xkb, layoutString, variantString); + FcitxXkbInitDefaultLayout(xkb); + } + + int idx = FcitxXkbFindLayoutIndex(xkb, layoutString, variantString); + if (idx >= 0) + XkbLockGroup(xkb->dpy, XkbUseCoreKbd, idx); + else + XkbLockGroup(xkb->dpy, XkbUseCoreKbd, xkb->closeGroup); + } + if (s) + fcitx_utils_free_string_list(s); + } + else { + XkbLockGroup(xkb->dpy, XkbUseCoreKbd, xkb->closeGroup); + } +} + +boolean strcmp0(const char* a, const char* b) { + boolean isemptya = false, isemptyb = false; + if (a == NULL || strlen(a) == 0) + isemptya = true; + if (b == NULL || strlen(b) == 0) + isemptyb = true; + if (isemptya && isemptyb) + return true; + if (isemptya ^ isemptyb) + return false; + return strcmp(a, b) == 0; +} + +int FcitxXkbFindLayoutIndex(FcitxXkb* xkb, const char* layout, const char* variant) +{ + char** layoutName; + char* variantName, **pVariantName; + if (layout == NULL) + return -1; + + int i = 0; + for (i = 0; i < utarray_len(xkb->defaultLayouts); i++ ) + { + layoutName = (char**) utarray_eltptr(xkb->defaultLayouts, i); + pVariantName = (char**) utarray_eltptr(xkb->defaultVariants, i); + variantName = pVariantName ? *pVariantName : NULL; + if (strcmp(*layoutName, layout) == 0 && strcmp0(variantName, variant)) { + return i; + } + } + return -1; +} + +void* FcitxXkbCreate(FcitxInstance* instance) +{ + FcitxAddon* addon = FcitxAddonsGetAddonByName(FcitxInstanceGetAddons(instance), "fcitx-xkb"); + FcitxXkb* xkb = (FcitxXkb*) fcitx_utils_malloc0(sizeof(FcitxXkb)); + xkb->owner = instance; + do { + + FcitxModuleFunctionArg args; + xkb->dpy = InvokeFunction(xkb->owner, FCITX_X11, GETDISPLAY, args); + if (!xkb->dpy) + break; + + + if (!FcitxXkbSupported(xkb, &xkb->xkbOpcode)) + break; + + if (!LoadXkbConfig(xkb)) { + break; + } + + char* rulesPath = FcitxXkbFindXkbRulesFile(xkb); + xkb->rules = FcitxXkbReadRules(rulesPath); + free(rulesPath); + + FcitxXkbInitDefaultLayout(xkb); + + xkb->closeGroup = FcitxXkbGetCurrentGroup(xkb); + + int eventMask = XkbNewKeyboardNotifyMask | XkbStateNotifyMask; + XkbSelectEvents(xkb->dpy, XkbUseCoreKbd, eventMask, eventMask); + + FcitxModuleFunctionArg arg2; + arg2.args[0] = FcitxXkbEventHandler; + arg2.args[1] = xkb; + InvokeFunction(xkb->owner, FCITX_X11, ADDXEVENTHANDLER, arg2); + + FcitxInstanceWatchContext(instance, CONTEXT_IM_KEYBOARD_LAYOUT, FcitxXkbIMKeyboardLayoutChanged, xkb); + + FcitxIMEventHook hk; + hk.arg = xkb; + hk.func = FcitxXkbCurrentStateChanged; + FcitxInstanceRegisterInputFocusHook(instance, hk); + FcitxInstanceRegisterInputUnFocusHook(instance, hk); + FcitxInstanceRegisterTriggerOffHook(instance, hk); + + hk.arg = xkb; + hk.func = FcitxXkbCurrentStateChangedTriggerOn; + FcitxInstanceRegisterTriggerOnHook(instance, hk); + + AddFunction(addon, FcitxXkbGetRules); + AddFunction(addon, FcitxXkbGetCurrentLayout); + AddFunction(addon, FcitxXkbLayoutExists); + AddFunction(addon, FcitxXkbGetLayoutOverride); + AddFunction(addon, FcitxXkbSetLayoutOverride); + + return xkb; + } while (0); + + free(xkb); + + return NULL; +} + +boolean FcitxXkbEventHandler(void* arg, XEvent* event) +{ + FcitxXkb* xkb = (FcitxXkb*) arg; + + if (event->type == xkb->xkbOpcode) { + XkbEvent *xkbEvent = (XkbEvent*) event; + + if (xkbEvent->any.xkb_type == XkbStateNotify && xkbEvent->state.changed & GROUP_CHANGE_MASK) { + FcitxIM* currentIM = FcitxInstanceGetCurrentIM(xkb->owner); + if (FcitxInstanceGetCurrentStatev2(xkb->owner) != IS_ACTIVE + || (xkb->config.bIgnoreInputMethodLayoutRequest + && (!currentIM || strncmp(currentIM->uniqueName, "fcitx-keyboard", strlen("fcitx-keyboard")) != 0))) + xkb->closeGroup = FcitxXkbGetCurrentGroup(xkb); + } + + if (xkbEvent->any.xkb_type == XkbNewKeyboardNotify) { + FcitxXkbInitDefaultLayout(xkb); + } + return true; + } + return false; +} + +void FcitxXkbCurrentStateChanged(void* arg) +{ + FcitxXkb* xkb = (FcitxXkb*) arg; + const char* layout = FcitxInstanceGetContextString(xkb->owner, CONTEXT_IM_KEYBOARD_LAYOUT); + FcitxXkbIMKeyboardLayoutChanged(xkb, layout); +} + +void FcitxXkbCurrentStateChangedTriggerOn(void* arg) +{ + FcitxXkb* xkb = (FcitxXkb*) arg; + xkb->closeGroup = FcitxXkbGetCurrentGroup(xkb); + FcitxXkbCurrentStateChanged(arg); +} + +void FcitxXkbDestroy(void* arg) +{ + FcitxXkb* xkb = (FcitxXkb*) arg; + XkbLockGroup(xkb->dpy, XkbUseCoreKbd, xkb->closeGroup); + XSync(xkb->dpy, False); + FcitxXkbRulesFree(xkb->rules); + fcitx_utils_free_string_list (xkb->defaultVariants); + xkb->defaultVariants = NULL; + fcitx_utils_free_string_list (xkb->defaultLayouts); + xkb->defaultLayouts = NULL; + fcitx_utils_free_string_list (xkb->defaultModels); + xkb->defaultModels = NULL; + fcitx_utils_free_string_list (xkb->defaultOptions); + xkb->defaultOptions = NULL; + free(xkb); +} + +void FcitxXkbReloadConfig(void* arg) +{ + FcitxXkb* xkb = (FcitxXkb*) arg; + LoadXkbConfig(xkb); + FcitxXkbCurrentStateChanged(xkb); +} + + +void* FcitxXkbGetRules(void* arg, FcitxModuleFunctionArg args) +{ + FcitxXkb* xkb = (FcitxXkb*) arg; + return xkb->rules; +} + +void* FcitxXkbLayoutExists(void* arg, FcitxModuleFunctionArg args) +{ + FcitxXkb* xkb = (FcitxXkb*) arg; + int idx = FcitxXkbFindLayoutIndex(xkb, args.args[0], args.args[1]); + boolean* result = args.args[2]; + *result = (idx >= 0); + return NULL; +} + +static inline void LayoutOverrideFree(LayoutOverride* item) { + fcitx_utils_free(item->im); + fcitx_utils_free(item->layout); + fcitx_utils_free(item->variant); + free(item); +} + +void LoadLayoutOverride(FcitxXkb* xkb) +{ + char *buf = NULL; + size_t len = 0; + char *trimedbuf = NULL; + + /* clean all old configuration */ + while (xkb->layoutOverride) { + LayoutOverride* cur = xkb->layoutOverride; + HASH_DEL(xkb->layoutOverride, cur); + LayoutOverrideFree(cur); + } + + FILE *fp = FcitxXDGGetFileUserWithPrefix("data", "layout_override", "r", NULL); + if (!fp) + return; + + while (getline(&buf, &len, fp) != -1) { + if (trimedbuf) + free(trimedbuf); + trimedbuf = fcitx_utils_trim(buf); + + UT_array* s = fcitx_utils_split_string(trimedbuf, ','); + char** pIMString = (char**) utarray_eltptr(s, 0); + char** pLayoutString = (char**) utarray_eltptr(s, 1); + char** pVariantString = (char**) utarray_eltptr(s, 2); + char* imString = (pIMString)? *pIMString: NULL; + char* layoutString = (pLayoutString)? *pLayoutString: NULL; + char* variantString = (pVariantString)? *pVariantString: NULL; + + if (!imString || !layoutString) + continue; + LayoutOverride* override = NULL; + HASH_FIND_STR(xkb->layoutOverride, imString, override); + /* if rule exists or the rule is for fcitx-keyboard, skip it */ + if (override || strncmp(imString, "fcitx-keyboard", strlen("fcitx-keyboard")) == 0) { + continue; + } + + override = fcitx_utils_new(LayoutOverride); + override->im = strdup(imString); + override->layout = strdup(layoutString); + override->variant= variantString? strdup(variantString) : NULL; + + HASH_ADD_KEYPTR(hh, xkb->layoutOverride, override->im, strlen(override->im), override); + } + + if (buf) + free(buf); + if (trimedbuf) + free(trimedbuf); + + fclose(fp); +} + +boolean LoadXkbConfig(FcitxXkb* xkb) +{ + FcitxConfigFileDesc *configDesc = GetXkbConfigDesc(); + if (configDesc == NULL) + return false; + + FILE *fp = FcitxXDGGetFileUserWithPrefix("conf", "fcitx-xkb.config", "r", NULL); + + if (!fp) + { + if (errno == ENOENT) + SaveXkbConfig(xkb); + } + FcitxConfigFile *cfile = FcitxConfigParseConfigFileFp(fp, configDesc); + FcitxXkbConfigConfigBind(&xkb->config, cfile, configDesc); + FcitxConfigBindSync(&xkb->config.gconfig); + + if (fp) + fclose(fp); + + LoadLayoutOverride(xkb); + + return true; +} + +void SaveLayoutOverride(FcitxXkb* xkb) +{ + FILE *fp = FcitxXDGGetFileUserWithPrefix("data", "layout_override", "w", NULL); + if (!fp) + return; + + LayoutOverride* item = xkb->layoutOverride; + while(item) { + if (item->variant) + fprintf(fp, "%s,%s,%s", item->im, item->layout, item->variant); + else + fprintf(fp, "%s,%s", item->im, item->layout); + item = item->hh.next; + } + + fclose(fp); +} + +void SaveXkbConfig(FcitxXkb* xkb) +{ + FcitxConfigFileDesc *configDesc = GetXkbConfigDesc(); + FILE *fp = FcitxXDGGetFileUserWithPrefix("conf", "fcitx-xkb.config", "w", NULL); + FcitxConfigSaveConfigFileFp(fp, &xkb->config.gconfig, configDesc); + if (fp) + fclose(fp); + + SaveLayoutOverride(xkb); +} + + +void* FcitxXkbGetLayoutOverride(void* arg, FcitxModuleFunctionArg args) +{ + FcitxXkb* xkb = arg; + const char* imname = args.args[0]; + char** layout = args.args[1]; + char** variant = args.args[2]; + LayoutOverride* item = NULL; + HASH_FIND_STR(xkb->layoutOverride, imname, item); + if (item) { + *layout = item->layout; + *variant = item->variant; + } + else { + *layout = NULL; + *variant = NULL; + } + return NULL; +} + + +void* FcitxXkbSetLayoutOverride(void* arg, FcitxModuleFunctionArg args) +{ + FcitxXkb* xkb = arg; + const char* imname = args.args[0]; + const char* layout = args.args[1]; + const char* variant = args.args[2]; + LayoutOverride* item = NULL; + HASH_FIND_STR(xkb->layoutOverride, imname, item); + if (item) { + HASH_DEL(xkb->layoutOverride, item); + LayoutOverrideFree(item); + } + + if (layout && layout[0] != '\0' && strncmp(imname, "fcitx-keyboard", strlen("fcitx-keyboard")) != 0) { + item = fcitx_utils_new(LayoutOverride); + item->im = strdup(imname); + item->layout = strdup(layout); + item->variant= (variant && variant[0] != '\0')? strdup(variant) : NULL; + + HASH_ADD_KEYPTR(hh, xkb->layoutOverride, item->im, strlen(item->im), item); + } + + SaveLayoutOverride(xkb); + FcitxXkbCurrentStateChanged(xkb); + + return NULL; +} \ No newline at end of file diff -Nru fcitx-4.2.2/src/module/xkb/xkbconfig.c fcitx-4.2.4.1/src/module/xkb/xkbconfig.c --- fcitx-4.2.2/src/module/xkb/xkbconfig.c 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/module/xkb/xkbconfig.c 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,27 @@ +/*************************************************************************** + * Copyright (C) 2012~2012 by CSSlayer * + * wengxt@gmail.com * + * * + * This program is free software; you can 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include +#include "xkb.h" + +CONFIG_BINDING_BEGIN(FcitxXkbConfig); +CONFIG_BINDING_REGISTER("X Keyboard", "OverrideSystemXKBSettings", bOverrideSystemXKBSettings); +CONFIG_BINDING_REGISTER("X Keyboard", "IgnoreInputMethodLayoutRequest", bIgnoreInputMethodLayoutRequest); +CONFIG_BINDING_END(); diff -Nru fcitx-4.2.2/src/module/xkb/xkb.h fcitx-4.2.4.1/src/module/xkb/xkb.h --- fcitx-4.2.2/src/module/xkb/xkb.h 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/module/xkb/xkb.h 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,67 @@ +/*************************************************************************** + * Copyright (C) 2012~2012 by CSSlayer * + * wengxt@gmail.com * + * * + * This program is free software; you can 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#ifndef FCITX_XKB_H +#define FCITX_XKB_H + +#include + +#include "fcitx/instance.h" +#include "rules.h" + +typedef struct _FcitxXkbConfig { + FcitxGenericConfig gconfig; + boolean bOverrideSystemXKBSettings; + boolean bIgnoreInputMethodLayoutRequest; +} FcitxXkbConfig; + +typedef struct _FcitxXkb +{ + Display* dpy; + UT_array *defaultLayouts; + UT_array *defaultModels; + UT_array *defaultOptions; + UT_array* defaultVariants; + FcitxInstance* owner; + int closeGroup; + FcitxXkbRules* rules; + FcitxXkbConfig config; + int xkbOpcode; + struct _LayoutOverride* layoutOverride; +} FcitxXkb; + +#define FCITX_XKB_NAME "fcitx-xkb" +#define FCITX_XKB_GETRULES 0 +#define FCITX_XKB_GETRULES_RETURNTYPE FcitxXkbRules* +#define FCITX_XKB_GETCURRENTLAYOUT 1 +#define FCITX_XKB_GETCURRENTLAYOUT_RETURNTYPE void +#define FCITX_XKB_LAYOUTEXISTS 2 +#define FCITX_XKB_LAYOUTEXISTS_RETURNTYPE void +#define FCITX_XKB_GETLAYOUTOVERRIDE 3 +#define FCITX_XKB_GETLAYOUTOVERRIDE_RETURNTYPE void +#define FCITX_XKB_SETLAYOUTOVERRIDE 4 +#define FCITX_XKB_SETLAYOUTOVERRIDE_RETURNTYPE void + +#define FCITX_XKB_PATH "/keyboard" +#define FCITX_XKB_INTERFACE "org.fcitx.Fcitx.Keyboard" + +CONFIG_BINDING_DECLARE(FcitxXkbConfig); + +#endif diff -Nru fcitx-4.2.2/src/module/xkbdbus/CMakeLists.txt fcitx-4.2.4.1/src/module/xkbdbus/CMakeLists.txt --- fcitx-4.2.2/src/module/xkbdbus/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/module/xkbdbus/CMakeLists.txt 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,17 @@ + +include_directories( + ${DBUS_INCLUDE_DIRS} + ${LIBXML2_INCLUDE_DIR} +) + +link_directories(${DBUS_LIBRARY_DIRS}) + +set(fcitx_xkbdbus_SOURCES + xkbdbus.c + ../../im/keyboard/isocodes.c +) + +fcitx_add_addon(fcitx-xkbdbus ${fcitx_xkbdbus_SOURCES}) +target_link_libraries(fcitx-xkbdbus ${DBUS_LIBRARIES} ${LIBXML2_LIBRARIES}) + +fcitx_add_addon_conf_file(fcitx-xkbdbus.conf) diff -Nru fcitx-4.2.2/src/module/xkbdbus/fcitx-xkbdbus.conf.in fcitx-4.2.4.1/src/module/xkbdbus/fcitx-xkbdbus.conf.in --- fcitx-4.2.2/src/module/xkbdbus/fcitx-xkbdbus.conf.in 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/module/xkbdbus/fcitx-xkbdbus.conf.in 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,11 @@ +[Addon] +Name=fcitx-xkbdbus +_GeneralName=X Keyboard Integration export with DBus +_Comment=X Keyboard Integration export with DBus +Category=Module +Enabled=True +Library=fcitx-xkbdbus.so +Type=SharedLibrary +Priority=80 +Dependency=fcitx-xkb,fcitx-dbus +Advance=True diff -Nru fcitx-4.2.2/src/module/xkbdbus/xkbdbus.c fcitx-4.2.4.1/src/module/xkbdbus/xkbdbus.c --- fcitx-4.2.2/src/module/xkbdbus/xkbdbus.c 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/src/module/xkbdbus/xkbdbus.c 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,252 @@ +/*************************************************************************** + * Copyright (C) 2012~2012 by CSSlayer * + * wengxt@gmail.com * + * * + * This program is free software; you can 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include + +#include "config.h" + +#include "libintl.h" +#include "module/xkb/xkb.h" +#include "module/dbus/dbusstuff.h" +#include "fcitx-utils/log.h" +#include "fcitx/module.h" +#include + +static void* FcitxXkbDBusCreate(struct _FcitxInstance* instance); +typedef struct _FcitxXkbDBus { + FcitxInstance* owner; + FcitxXkbRules* rules; + FcitxIsoCodes* isocodes; +} FcitxXkbDBus; + +FCITX_EXPORT_API +FcitxModule module = { + FcitxXkbDBusCreate, + NULL, + NULL, + NULL, + NULL +}; + +FCITX_EXPORT_API +int ABI_VERSION = FCITX_ABI_VERSION; + +static DBusHandlerResult FcitxXkbDBusEventHandler (DBusConnection *connection, + DBusMessage *message, + void *user_data); + +const char *introspection_xml = + "\n" + "\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " \n" + "\n"; + +void* FcitxXkbDBusCreate(FcitxInstance* instance) +{ + FcitxXkbDBus* xkbdbus = fcitx_utils_new(FcitxXkbDBus); + xkbdbus->owner = instance; + do { + FcitxModuleFunctionArg arg; + DBusConnection* conn = InvokeFunction(instance, FCITX_DBUS, GETCONNECTION, arg); + if (conn == NULL) { + FcitxLog(ERROR, "DBus Not initialized"); + break; + } + + DBusObjectPathVTable fcitxIPCVTable = {NULL, &FcitxXkbDBusEventHandler, NULL, NULL, NULL, NULL }; + + if (!dbus_connection_register_object_path(conn, FCITX_XKB_PATH, + &fcitxIPCVTable, xkbdbus)) { + FcitxLog(ERROR, "No memory"); + break; + } + FcitxModuleFunctionArg args; + FcitxXkbRules* rules = InvokeFunction(instance, FCITX_XKB, GETRULES, args); + + if (!rules) + break; + + xkbdbus->rules = rules; + xkbdbus->isocodes = FcitxXkbReadIsoCodes(ISOCODES_ISO639_XML, ISOCODES_ISO3166_XML); + return xkbdbus; + } while(0); + + free(xkbdbus); + + return NULL; +} + +void FcitxXkbDBusAppendLayout(DBusMessageIter* sub, const char* layout, const char* variant, const char* description, const char* lang) +{ + DBusMessageIter ssub; + if (!lang) + lang = ""; + dbus_message_iter_open_container(sub, DBUS_TYPE_STRUCT, 0, &ssub); + dbus_message_iter_append_basic(&ssub, DBUS_TYPE_STRING, &layout); + dbus_message_iter_append_basic(&ssub, DBUS_TYPE_STRING, &variant); + dbus_message_iter_append_basic(&ssub, DBUS_TYPE_STRING, &description); + dbus_message_iter_append_basic(&ssub, DBUS_TYPE_STRING, &lang); + dbus_message_iter_close_container(sub, &ssub); +} + +void FcitxXkbDBusGetLayouts(FcitxXkbDBus* xkbdbus, DBusMessage* message) +{ + DBusMessageIter iter, sub; + dbus_message_iter_init_append(message, &iter); + + dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "(ssss)", &sub); + + FcitxXkbRules* rules = xkbdbus->rules; + FcitxIsoCodes* isocodes = xkbdbus->isocodes; + char* lang = NULL; +#define GET_LANG \ + do { \ + char** plang = NULL; \ + plang = (char**) utarray_front(layoutInfo->languages); \ + lang = NULL; \ + if (plang) { \ + FcitxIsoCodes639Entry* entry = FcitxIsoCodesGetEntry(isocodes, *plang); \ + if (entry) { \ + lang = entry->iso_639_1_code; \ + } \ + } \ + } while (0) + + if (rules) { + FcitxXkbLayoutInfo* layoutInfo; + for (layoutInfo = (FcitxXkbLayoutInfo*) utarray_front(rules->layoutInfos); + layoutInfo != NULL; + layoutInfo = (FcitxXkbLayoutInfo*) utarray_next(rules->layoutInfos, layoutInfo)) + { + char* description; + asprintf(&description, _("%s"), + dgettext("xkeyboard-config", layoutInfo->description)); + + GET_LANG; + FcitxXkbDBusAppendLayout(&sub, layoutInfo->name, "", description, lang); + free(description); + FcitxXkbVariantInfo* variantInfo; + for (variantInfo = (FcitxXkbVariantInfo*) utarray_front(layoutInfo->variantInfos); + variantInfo != NULL; + variantInfo = (FcitxXkbVariantInfo*) utarray_next(layoutInfo->variantInfos, variantInfo)) + { + char* description; + asprintf(&description, "%s - %s", + dgettext("xkeyboard-config", layoutInfo->description), + dgettext("xkeyboard-config", variantInfo->description)); + + GET_LANG; + FcitxXkbDBusAppendLayout(&sub, layoutInfo->name, variantInfo->name, description, lang); + free(description); + } + } + } + else { + char* description; + asprintf(&description, "%s", + dgettext("xkeyboard-config", "English (US)")); + + FcitxXkbDBusAppendLayout(&sub, "us", "", description, "en"); + free(description); + } + dbus_message_iter_close_container(&iter, &sub); +} + +DBusHandlerResult FcitxXkbDBusEventHandler (DBusConnection *connection, + DBusMessage *message, + void *user_data) +{ + FcitxXkbDBus* xkbdbus = user_data; + if (dbus_message_is_method_call(message, DBUS_INTERFACE_INTROSPECTABLE, "Introspect")) { + DBusMessage *reply = dbus_message_new_method_return(message); + + dbus_message_append_args(reply, DBUS_TYPE_STRING, &introspection_xml, DBUS_TYPE_INVALID); + dbus_connection_send(connection, reply, NULL); + dbus_message_unref(reply); + return DBUS_HANDLER_RESULT_HANDLED; + } else if (dbus_message_is_method_call(message, FCITX_XKB_INTERFACE, "GetLayouts")) { + DBusMessage *reply = dbus_message_new_method_return(message); + FcitxXkbDBusGetLayouts(xkbdbus, reply); + dbus_connection_send(connection, reply, NULL); + dbus_message_unref(reply); + dbus_connection_flush(connection); + return DBUS_HANDLER_RESULT_HANDLED; + } else if (dbus_message_is_method_call(message, FCITX_XKB_INTERFACE, "SetLayoutForIM")) { + DBusError error; + dbus_error_init(&error); + char* im, *layout, *variant; + if (dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &im, DBUS_TYPE_STRING, &layout, DBUS_TYPE_STRING, &variant, DBUS_TYPE_INVALID)) { + FcitxModuleFunctionArg args; + args.args[0] = im; + args.args[1] = layout; + args.args[2] = variant; + InvokeFunction(xkbdbus->owner, FCITX_XKB, SETLAYOUTOVERRIDE, args); + } + DBusMessage *reply = dbus_message_new_method_return(message); + dbus_connection_send(connection, reply, NULL); + dbus_message_unref(reply); + dbus_connection_flush(connection); + return DBUS_HANDLER_RESULT_HANDLED; + } else if (dbus_message_is_method_call(message, FCITX_XKB_INTERFACE, "GetLayoutForIM")) { + DBusError error; + dbus_error_init(&error); + char* im = NULL, *layout = NULL, *variant = NULL; + if (dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &im, DBUS_TYPE_INVALID)) { + FcitxModuleFunctionArg args; + args.args[0] = im; + args.args[1] = &layout; + args.args[2] = &variant; + InvokeFunction(xkbdbus->owner, FCITX_XKB, GETLAYOUTOVERRIDE, args); + + if (!layout) + layout = ""; + if (!variant) + variant = ""; + + DBusMessage *reply = dbus_message_new_method_return(message); + dbus_message_append_args(reply, DBUS_TYPE_STRING, &layout, DBUS_TYPE_STRING, &variant, DBUS_TYPE_INVALID); + dbus_connection_send(connection, reply, NULL); + dbus_message_unref(reply); + dbus_connection_flush(connection); + } + return DBUS_HANDLER_RESULT_HANDLED; + } + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} \ No newline at end of file diff -Nru fcitx-4.2.2/src/ui/cairostuff/cairostuff.c fcitx-4.2.4.1/src/ui/cairostuff/cairostuff.c --- fcitx-4.2.2/src/ui/cairostuff/cairostuff.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/ui/cairostuff/cairostuff.c 2012-06-10 14:34:48.000000000 +0000 @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2010~2011 by CSSlayer * + * Copyright (C) 2010~2012 by CSSlayer * * wengxt@gmail.com * * * * This program is free software; you can redistribute it and/or modify * diff -Nru fcitx-4.2.2/src/ui/cairostuff/cairostuff.h fcitx-4.2.4.1/src/ui/cairostuff/cairostuff.h --- fcitx-4.2.2/src/ui/cairostuff/cairostuff.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/ui/cairostuff/cairostuff.h 2012-06-10 14:34:48.000000000 +0000 @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2010~2011 by CSSlayer * + * Copyright (C) 2010~2012 by CSSlayer * * wengxt@gmail.com * * * * This program is free software; you can redistribute it and/or modify * diff -Nru fcitx-4.2.2/src/ui/classic/AboutWindow.c fcitx-4.2.4.1/src/ui/classic/AboutWindow.c --- fcitx-4.2.2/src/ui/classic/AboutWindow.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/ui/classic/AboutWindow.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,150 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2005 by Yunfan * - * yunfan_zg@163.com * - * * - * This program is free software; you can 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. * - * * - * This program 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 this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -#include -#include -#include - -#include "fcitx/fcitx.h" -#include "fcitx/module.h" -#include "fcitx-utils/utils.h" -#include "module/x11/x11stuff.h" - -#include "AboutWindow.h" -#include "classicui.h" - -int ABOUT_WINDOW_WIDTH; - -char AboutCaption[] = "关于 - FCITX"; -char AboutTitle[] = "小企鹅中文输入法"; -char AboutEmail[] = "yuking_net@sohu.com"; -char AboutCopyRight[] = "(c) 2005, Yuking"; -char strTitle[100]; - -static void InitAboutWindowProperty(AboutWindow* aboutWindow); -static boolean AboutWindowEventHandler(void *arg, XEvent* event); - -AboutWindow* CreateAboutWindow(FcitxClassicUI *classicui) -{ - AboutWindow *aboutWindow = fcitx_utils_malloc0(sizeof(AboutWindow)); - Display* dpy = classicui->dpy; - int iScreen = classicui->iScreen; - int dwidth, dheight; - strcpy(strTitle, AboutTitle); - strcat(strTitle, " "); - strcat(strTitle, VERSION); - GetScreenSize(classicui, &dwidth, &dheight); - - aboutWindow->owner = classicui; - - aboutWindow->color.r = aboutWindow->color.g = aboutWindow->color.b = 220.0 / 256; - aboutWindow->fontColor.r = aboutWindow->fontColor.g = aboutWindow->fontColor.b = 0; - aboutWindow->fontSize = 11; - - ABOUT_WINDOW_WIDTH = StringWidth(strTitle, classicui->font, aboutWindow->fontSize) + 50; - aboutWindow->window = - XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), (dwidth - ABOUT_WINDOW_WIDTH) / 2, (dheight - ABOUT_WINDOW_HEIGHT) / 2, ABOUT_WINDOW_WIDTH, ABOUT_WINDOW_HEIGHT, 0, WhitePixel(dpy, DefaultScreen(dpy)), WhitePixel(dpy, DefaultScreen(dpy))); - - aboutWindow->surface = cairo_xlib_surface_create(dpy, aboutWindow->window, DefaultVisual(dpy, iScreen), ABOUT_WINDOW_WIDTH, ABOUT_WINDOW_HEIGHT); - if (aboutWindow->window == None) - return NULL; - - InitAboutWindowProperty(aboutWindow); - XSelectInput(dpy, aboutWindow->window, ExposureMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask); - - FcitxModuleFunctionArg arg; - arg.args[0] = AboutWindowEventHandler; - arg.args[1] = aboutWindow; - InvokeFunction(classicui->owner, FCITX_X11, ADDXEVENTHANDLER, arg); - - return aboutWindow; -} - -boolean AboutWindowEventHandler(void *arg, XEvent* event) -{ - AboutWindow* aboutWindow = (AboutWindow*) arg; - if (event->type == ClientMessage - && event->xclient.data.l[0] == aboutWindow->owner->killAtom - && event->xclient.window == aboutWindow->window - ) { - XUnmapWindow(aboutWindow->owner->dpy, aboutWindow->window); - return true; - } - - if (event->xany.window == aboutWindow->window) { - switch (event->type) { - case Expose: - DrawAboutWindow(aboutWindow); - break; - case ButtonRelease: { - switch (event->xbutton.button) { - case Button1: - XUnmapWindow(aboutWindow->owner->dpy, aboutWindow->window); - break; - } - } - break; - } - return true; - } - return false; -} - -void InitAboutWindowProperty(AboutWindow* aboutWindow) -{ - FcitxClassicUI *classicui = aboutWindow->owner; - Display* dpy = classicui->dpy; - XSetTransientForHint(dpy, aboutWindow->window, DefaultRootWindow(dpy)); - - ClassicUISetWindowProperty(classicui, aboutWindow->window, FCITX_WINDOW_DIALOG, AboutCaption); - - XSetWMProtocols(dpy, aboutWindow->window, &classicui->killAtom, 1); -} - -void DisplayAboutWindow(AboutWindow* aboutWindow) -{ - FcitxClassicUI *classicui = aboutWindow->owner; - Display* dpy = classicui->dpy; - int dwidth, dheight; - GetScreenSize(classicui, &dwidth, &dheight); - XMapRaised(dpy, aboutWindow->window); - XMoveWindow(dpy, aboutWindow->window, (dwidth - ABOUT_WINDOW_WIDTH) / 2, (dheight - ABOUT_WINDOW_HEIGHT) / 2); -} - - - -void DrawAboutWindow(AboutWindow* aboutWindow) -{ - FcitxClassicUI *classicui = aboutWindow->owner; - cairo_t *c = cairo_create(aboutWindow->surface); - cairo_set_source_rgb(c, aboutWindow->color.r, aboutWindow->color.g, aboutWindow->color.b); - cairo_set_operator(c, CAIRO_OPERATOR_SOURCE); - cairo_paint(c); - - OutputString(c, strTitle, classicui->font, aboutWindow->fontSize, (ABOUT_WINDOW_WIDTH - StringWidth(strTitle, classicui->font, aboutWindow->fontSize)) / 2, 6 + 30, &aboutWindow->fontColor); - - OutputString(c, AboutEmail, classicui->font, aboutWindow->fontSize, (ABOUT_WINDOW_WIDTH - StringWidth(AboutEmail, classicui->font, aboutWindow->fontSize)) / 2, 6 + 60, &aboutWindow->fontColor); - - OutputString(c, AboutCopyRight, classicui->font, aboutWindow->fontSize, (ABOUT_WINDOW_WIDTH - StringWidth(AboutCopyRight, classicui->font, aboutWindow->fontSize)) / 2, 6 + 80, &aboutWindow->fontColor); - - cairo_destroy(c); -} - -// kate: indent-mode cstyle; space-indent on; indent-width 0; diff -Nru fcitx-4.2.2/src/ui/classic/AboutWindow.h fcitx-4.2.4.1/src/ui/classic/AboutWindow.h --- fcitx-4.2.2/src/ui/classic/AboutWindow.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/ui/classic/AboutWindow.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2005 by Yunfan * - * yunfan_zg@163.com * - * * - * This program is free software; you can 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. * - * * - * This program 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 this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -/** - * @file AboutWindow.h - * A very simple About Window for FCITX - * @author Yunfan yunfan_zg@163.com - */ - -#ifndef _ABOUT_WINDOW_H -#define _ABOUT_WINDOW_H - -#include -#include "skin.h" - -#define ABOUT_WINDOW_HEIGHT 150 -struct _FcitxClassicUI; -typedef struct _AboutWindow { - Window window; - cairo_surface_t* surface; - FcitxConfigColor color; - FcitxConfigColor fontColor; - int width; - int fontSize; - Atom about_kill_atom; - struct _FcitxClassicUI* owner; -} AboutWindow; - - -AboutWindow* CreateAboutWindow(struct _FcitxClassicUI *classicui); -void DisplayAboutWindow(AboutWindow* aboutWindow); -void DrawAboutWindow(AboutWindow* aboutWindow); - -#endif - -// kate: indent-mode cstyle; space-indent on; indent-width 0; diff -Nru fcitx-4.2.2/src/ui/classic/classicui.c fcitx-4.2.4.1/src/ui/classic/classicui.c --- fcitx-4.2.2/src/ui/classic/classicui.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/ui/classic/classicui.c 2012-06-10 14:34:48.000000000 +0000 @@ -43,13 +43,13 @@ #include "MainWindow.h" #include "TrayWindow.h" #include "MenuWindow.h" -#include "AboutWindow.h" #include "MessageWindow.h" #include "fcitx/hook.h" -#include +#include "fcitx-utils/utils.h" struct _FcitxSkin; -boolean MainMenuAction(FcitxUIMenu* menu, int index); +static boolean MainMenuAction(FcitxUIMenu* menu, int index); +static void UpdateMainMenu(FcitxUIMenu* menu); static void* ClassicUICreate(FcitxInstance* instance); static void ClassicUICloseInputWindow(void* arg); @@ -139,26 +139,9 @@ InitSkinMenu(classicui); FcitxUIRegisterMenu(instance, &classicui->skinMenu); - /* Main Menu Initial */ FcitxMenuInit(&classicui->mainMenu); - FcitxMenuAddMenuItem(&classicui->mainMenu, _("About Fcitx"), MENUTYPE_SIMPLE, NULL); - FcitxMenuAddMenuItem(&classicui->mainMenu, _("Online Help"), MENUTYPE_SIMPLE, NULL); - FcitxMenuAddMenuItem(&classicui->mainMenu, NULL, MENUTYPE_DIVLINE, NULL); - - FcitxUIMenu **menupp; - UT_array* uimenus = FcitxInstanceGetUIMenus(instance); - for (menupp = (FcitxUIMenu **) utarray_front(uimenus); - menupp != NULL; - menupp = (FcitxUIMenu **) utarray_next(uimenus, menupp) - ) { - FcitxUIMenu * menup = *menupp; - if (!menup->isSubMenu) - FcitxMenuAddMenuItem(&classicui->mainMenu, menup->name, MENUTYPE_SUBMENU, menup); - } - FcitxMenuAddMenuItem(&classicui->mainMenu, NULL, MENUTYPE_DIVLINE, NULL); - FcitxMenuAddMenuItem(&classicui->mainMenu, _("Configure"), MENUTYPE_SIMPLE, NULL); - FcitxMenuAddMenuItem(&classicui->mainMenu, _("Exit"), MENUTYPE_SIMPLE, NULL); + classicui->mainMenu.UpdateMenu = UpdateMainMenu; classicui->mainMenu.MenuAction = MainMenuAction; classicui->mainMenu.priv = classicui; classicui->mainMenu.mark = -1; @@ -167,7 +150,6 @@ classicui->inputWindow = CreateInputWindow(classicui); classicui->mainWindow = CreateMainWindow(classicui); classicui->trayWindow = CreateTrayWindow(classicui); - classicui->aboutWindow = CreateAboutWindow(classicui); classicui->messageWindow = CreateMessageWindow(classicui); classicui->mainMenuWindow = CreateMainMenuWindow(classicui); @@ -279,7 +261,7 @@ FcitxClassicUI* classicui = (FcitxClassicUI*) arg; if (classicui->isSuspend) return; - CloseMainWindow(classicui->mainWindow); + DrawMainWindow(classicui->mainWindow); DrawTrayWindow(classicui->trayWindow); } @@ -421,14 +403,88 @@ DrawMessageWindow(classicui->messageWindow, title, msg, length); } + +static void UpdateMainMenu(FcitxUIMenu* menu) +{ + FcitxClassicUI* classicui = (FcitxClassicUI*) menu->priv; + FcitxInstance* instance = classicui->owner; + FcitxMenuClear(menu); + + FcitxMenuAddMenuItem(menu, _("Online Help"), MENUTYPE_SIMPLE, NULL); + FcitxMenuAddMenuItem(menu, NULL, MENUTYPE_DIVLINE, NULL); + boolean flag = false; + + FcitxUIStatus* status; + UT_array* uistats = FcitxInstanceGetUIStats(instance); + for (status = (FcitxUIStatus*) utarray_front(uistats); + status != NULL; + status = (FcitxUIStatus*) utarray_next(uistats, status) + ) { + FcitxClassicUIStatus* privstat = GetPrivateStatus(status); + if (privstat == NULL || !status->visible || privstat->avail ) + continue; + + flag = true; + FcitxMenuAddMenuItemWithData(menu, status->shortDescription, MENUTYPE_SIMPLE, NULL, strdup(status->name)); + } + + FcitxUIComplexStatus* compstatus; + UT_array* uicompstats = FcitxInstanceGetUIComplexStats(instance); + for (compstatus = (FcitxUIComplexStatus*) utarray_front(uicompstats); + compstatus != NULL; + compstatus = (FcitxUIComplexStatus*) utarray_next(uicompstats, compstatus) + ) { + FcitxClassicUIStatus* privstat = GetPrivateStatus(compstatus); + if (privstat == NULL || !compstatus->visible || privstat->avail) + continue; + if (FcitxUIGetMenuByStatusName(instance, compstatus->name)) + continue; + + flag = true; + FcitxMenuAddMenuItemWithData(menu, compstatus->shortDescription, MENUTYPE_SIMPLE, NULL, strdup(compstatus->name)); + } + + if (flag) + FcitxMenuAddMenuItem(menu, NULL, MENUTYPE_DIVLINE, NULL); + + FcitxUIMenu **menupp; + UT_array* uimenus = FcitxInstanceGetUIMenus(instance); + for (menupp = (FcitxUIMenu **) utarray_front(uimenus); + menupp != NULL; + menupp = (FcitxUIMenu **) utarray_next(uimenus, menupp) + ) { + FcitxUIMenu * menup = *menupp; + if (menup->isSubMenu) + continue; + + if (!menup->visible) + continue; + + if (menup->candStatusBind) { + FcitxUIComplexStatus* compStatus = FcitxUIGetComplexStatusByName(instance, menup->candStatusBind); + if (compStatus) { + if (!compStatus->visible) + continue; + if (GetPrivateStatus(compStatus)->avail) + continue; + } + } + + FcitxMenuAddMenuItem(menu, menup->name, MENUTYPE_SUBMENU, menup); + } + FcitxMenuAddMenuItem(menu, NULL, MENUTYPE_DIVLINE, NULL); + FcitxMenuAddMenuItem(menu, _("Configure Current Input Method"), MENUTYPE_SIMPLE, NULL); + FcitxMenuAddMenuItem(menu, _("Configure"), MENUTYPE_SIMPLE, NULL); + FcitxMenuAddMenuItem(menu, _("Exit"), MENUTYPE_SIMPLE, NULL); +} + boolean MainMenuAction(FcitxUIMenu* menu, int index) { FcitxClassicUI* classicui = (FcitxClassicUI*) menu->priv; + FcitxInstance* instance = classicui->owner; int length = utarray_len(&menu->shell); if (index == 0) { - DisplayAboutWindow(classicui->mainWindow->owner->aboutWindow); - } else if (index == 1) { - FILE* p = popen("xdg-open http://fcitx.github.com/handbook/ &", "r"); + FILE* p = popen("xdg-open http://fcitx-im.org/ &", "r"); if (p) pclose(p); else @@ -436,13 +492,18 @@ } else if (index == length - 1) { /* Exit */ FcitxInstanceEnd(classicui->owner); } else if (index == length - 2) { /* Configuration */ - char* command = fcitx_utils_get_fcitx_path_with_filename("bindir", "/fcitx-configtool &"); - FILE* p = popen(command, "r"); - free(command); - if (p) - pclose(p); - else - FcitxLog(ERROR, _("Unable to create process")); + fcitx_utils_launch_configure_tool(); + } else if (index == length - 3) { /* Configuration */ + FcitxIM* im = FcitxInstanceGetCurrentIM(classicui->owner); + if (im && im->owner) { + fcitx_utils_launch_configure_tool_for_addon(im->owner->name); + } + } else { + FcitxMenuItem* item = (FcitxMenuItem*) utarray_eltptr(&menu->shell, index); + if (item && item->type == MENUTYPE_SIMPLE && item->data) { + const char* name = item->data; + FcitxUIUpdateStatus(instance, name); + } } return true; } @@ -530,21 +591,55 @@ { int ow = cairo_image_surface_get_width(*sur); int oh = cairo_image_surface_get_height(*sur); - + if (ow >= w && oh >= h) return false; - + while (ow < w) { ow *= 2; } - + while (oh < h) { oh *= 2; } - + cairo_surface_destroy(*sur); *sur = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, ow, oh); return true; } +void ResizeSurface(cairo_surface_t** surface, int w, int h) +{ + int ow = cairo_image_surface_get_width(*surface); + int oh = cairo_image_surface_get_height(*surface); + + if ((ow == w && oh == h) || w == 0 || h == 0 || ow == 0 || oh == 0) + return; + + double scalex = (double)w / ow; + double scaley = (double)h / oh; + double scale = (scalex > scaley) ? scaley : scalex; + + int nw = ow * scale; + int nh = oh * scale; + + cairo_surface_t* newsurface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, w, h); + cairo_t* c = cairo_create(newsurface); + cairo_set_operator(c, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgba(c ,1, 1, 1, 0.0); + cairo_paint(c); + cairo_translate(c, (w - nw) / 2.0 , (h - nh) / 2.0); + cairo_scale(c, scale, scale); + cairo_set_source_surface(c, *surface, 0, 0); + cairo_rectangle(c, 0, 0, ow, oh); + cairo_clip(c); + cairo_paint(c); + cairo_destroy(c); + + cairo_surface_destroy(*surface); + + *surface = newsurface; +} + + // kate: indent-mode cstyle; space-indent on; indent-width 0; diff -Nru fcitx-4.2.2/src/ui/classic/classicui.h fcitx-4.2.4.1/src/ui/classic/classicui.h --- fcitx-4.2.2/src/ui/classic/classicui.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/ui/classic/classicui.h 2012-06-10 14:34:48.000000000 +0000 @@ -59,7 +59,6 @@ struct _MainWindow* mainWindow; struct _MessageWindow* messageWindow; struct _TrayWindow* trayWindow; - struct _AboutWindow* aboutWindow; FcitxUIMenu skinMenu; FcitxSkin skin; @@ -99,6 +98,7 @@ void SaveClassicUIConfig(FcitxClassicUI* classicui); boolean WindowIsVisable(Display* dpy, Window window); boolean EnlargeCairoSurface(cairo_surface_t** sur, int w, int h); +void ResizeSurface(cairo_surface_t** surface, int w, int h); #define GetPrivateStatus(status) ((FcitxClassicUIStatus*)(status)->uipriv[classicui->isfallback]) diff -Nru fcitx-4.2.2/src/ui/classic/classicuiinterface.h fcitx-4.2.4.1/src/ui/classic/classicuiinterface.h --- fcitx-4.2.2/src/ui/classic/classicuiinterface.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/ui/classic/classicuiinterface.h 2012-06-10 14:34:48.000000000 +0000 @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2010~2011 by CSSlayer * + * Copyright (C) 2010~2012 by CSSlayer * * wengxt@gmail.com * * * * This program is free software; you can redistribute it and/or modify * @@ -22,7 +22,7 @@ #define CLASSICUIINTERFACE_H #include -#include +#include "fcitx-config/fcitx-config.h" #define FCITX_CLASSIC_UI_NAME "fcitx-classic-ui" #define FCITX_CLASSIC_UI_LOADIMAGE 0 diff -Nru fcitx-4.2.2/src/ui/classic/CMakeLists.txt fcitx-4.2.4.1/src/ui/classic/CMakeLists.txt --- fcitx-4.2.2/src/ui/classic/CMakeLists.txt 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/ui/classic/CMakeLists.txt 2012-06-10 14:34:48.000000000 +0000 @@ -17,7 +17,6 @@ MainWindow.c MenuWindow.c MessageWindow.c - AboutWindow.c TrayWindow.c tray.c skinconfig.c diff -Nru fcitx-4.2.2/src/ui/classic/InputWindow.c fcitx-4.2.4.1/src/ui/classic/InputWindow.c --- fcitx-4.2.2/src/ui/classic/InputWindow.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/ui/classic/InputWindow.c 2012-06-10 14:34:48.000000000 +0000 @@ -37,7 +37,7 @@ #include "skin.h" #include "module/x11/x11stuff.h" #include "MainWindow.h" -#include +#include "fcitx-utils/log.h" #include #include @@ -199,10 +199,10 @@ void MoveInputWindowInternal(InputWindow* inputWindow) { - int x = 0, y = 0; + int x = 0, y = 0, w = 0, h = 0; FcitxInputContext* ic = FcitxInstanceGetCurrentIC(inputWindow->owner->owner); - FcitxInstanceGetWindowPosition(inputWindow->owner->owner, ic, &x, &y); + FcitxInstanceGetWindowRect(inputWindow->owner->owner, ic, &x, &y, &w, &h); FcitxRect rect = GetScreenGeometry(inputWindow->owner, x, y); int iTempInputWindowX, iTempInputWindowY; @@ -215,7 +215,7 @@ if (y < rect.y1) iTempInputWindowY = rect.y1; else - iTempInputWindowY = y + inputWindow->iOffsetY; + iTempInputWindowY = y + h + inputWindow->iOffsetY; if ((iTempInputWindowX + inputWindow->iInputWindowWidth) > rect.x2) iTempInputWindowX = rect.x2 - inputWindow->iInputWindowWidth; @@ -223,8 +223,8 @@ if ((iTempInputWindowY + inputWindow->iInputWindowHeight) > rect.y2) { if (iTempInputWindowY > rect.y2) iTempInputWindowY = rect.y2 - inputWindow->iInputWindowHeight - 40; - else - iTempInputWindowY = iTempInputWindowY - inputWindow->iInputWindowHeight - 40; + else /* better position the window */ + iTempInputWindowY = iTempInputWindowY - inputWindow->iInputWindowHeight - ((h == 0)?40:h) - 2 * inputWindow->iOffsetY; } XMoveWindow(inputWindow->dpy, inputWindow->window, iTempInputWindowX, iTempInputWindowY); } diff -Nru fcitx-4.2.2/src/ui/classic/MainWindow.c fcitx-4.2.4.1/src/ui/classic/MainWindow.c --- fcitx-4.2.2/src/ui/classic/MainWindow.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/ui/classic/MainWindow.c 2012-06-10 14:34:48.000000000 +0000 @@ -43,16 +43,14 @@ #include "module/x11/x11stuff.h" #include "classicui.h" #include "skin.h" -#include "AboutWindow.h" #include "MenuWindow.h" -#include +#include "fcitx-utils/utils.h" #define FCITX_MAX(a,b) ((a) > (b)?(a) : (b)) #define MAIN_BAR_MAX_WIDTH 2 #define MAIN_BAR_MAX_HEIGHT 2 -static void ResizeSurface(cairo_surface_t** surface, int w, int h); static boolean MainWindowEventHandler(void *arg, XEvent* event); static void UpdateStatusGeometry(FcitxClassicUIStatus *privstat, SkinImage *image, int x, int y); static void ReloadMainWindow(void* arg, boolean enabled); @@ -135,9 +133,7 @@ void DisplayMainWindow(Display* dpy, MainWindow* mainWindow) { FcitxLog(DEBUG, _("DISPLAY MainWindow")); - - if (!mainWindow->bMainWindowHidden) - XMapRaised(dpy, mainWindow->window); + XMapRaised(dpy, mainWindow->window); } void DrawMainWindow(MainWindow* mainWindow) @@ -146,12 +142,39 @@ FcitxSkin *sc = &mainWindow->owner->skin; FcitxInstance *instance = mainWindow->owner->owner; - if (mainWindow->bMainWindowHidden) - return; - FcitxLog(DEBUG, _("DRAW MainWindow")); - if (mainWindow->owner->hideMainWindow == HM_SHOW || (mainWindow->owner->hideMainWindow == HM_AUTO && (FcitxInstanceGetCurrentState(mainWindow->owner->owner) != IS_CLOSED))) { + FcitxUIStatus* status; + UT_array* uistats = FcitxInstanceGetUIStats(instance); + for (status = (FcitxUIStatus*) utarray_front(uistats); + status != NULL; + status = (FcitxUIStatus*) utarray_next(uistats, status) + ) { + FcitxClassicUIStatus* privstat = GetPrivateStatus(status); + if (privstat == NULL) + continue; + /* reset status */ + privstat->x = privstat->y = -1; + privstat->w = privstat->h = 0; + privstat->avail = false; + } + + FcitxUIComplexStatus* compstatus; + UT_array* uicompstats = FcitxInstanceGetUIComplexStats(instance); + for (compstatus = (FcitxUIComplexStatus*) utarray_front(uicompstats); + compstatus != NULL; + compstatus = (FcitxUIComplexStatus*) utarray_next(uicompstats, compstatus) + ) { + FcitxClassicUIStatus* privstat = GetPrivateStatus(compstatus); + if (privstat == NULL) + continue; + /* reset status */ + privstat->x = privstat->y = -1; + privstat->w = privstat->h = 0; + privstat->avail = false; + } + + if (mainWindow->owner->hideMainWindow == HM_SHOW || (mainWindow->owner->hideMainWindow == HM_AUTO && (FcitxInstanceGetCurrentState(mainWindow->owner->owner) == IS_ACTIVE))) { SkinImage* activeIcon = LoadImage(sc, sc->skinMainBar.active, false); cairo_t *c; @@ -177,33 +200,6 @@ XResizeWindow(mainWindow->dpy, mainWindow->window, width, height); DrawResizableBackground(c, back->image, height, width, 0, 0, 0, 0, F_RESIZE, F_COPY); - FcitxUIStatus* status; - UT_array* uistats = FcitxInstanceGetUIStats(instance); - for (status = (FcitxUIStatus*) utarray_front(uistats); - status != NULL; - status = (FcitxUIStatus*) utarray_next(uistats, status) - ) { - FcitxClassicUIStatus* privstat = GetPrivateStatus(status); - if (privstat == NULL) - continue; - /* reset status */ - privstat->x = privstat->y = -1; - privstat->w = privstat->h = 0; - } - - FcitxUIComplexStatus* compstatus; - UT_array* uicompstats = FcitxInstanceGetUIComplexStats(instance); - for (compstatus = (FcitxUIComplexStatus*) utarray_front(uicompstats); - compstatus != NULL; - compstatus = (FcitxUIComplexStatus*) utarray_next(uicompstats, compstatus) - ) { - FcitxClassicUIStatus* privstat = GetPrivateStatus(compstatus); - if (privstat == NULL) - continue; - /* reset status */ - privstat->x = privstat->y = -1; - privstat->w = privstat->h = 0; - } SkinPlacement* sp; for (sp = (SkinPlacement*) utarray_front(&sc->skinMainBar.skinPlacement); @@ -220,24 +216,7 @@ if (FcitxInstanceGetCurrentStatev2(instance) != IS_ACTIVE || FcitxInstanceGetCurrentIM(instance) == NULL) imicon = LoadImage(sc, sc->skinMainBar.eng, false); else { - FcitxIM* im = FcitxInstanceGetCurrentIM(instance); - char* path; - if (im->strIconName[0] == '/') - path = strdup(im->strIconName); - else - asprintf(&path, "%s.png", im->strIconName); - imicon = LoadImage(sc, path, true); - if (imicon == NULL) - imicon = LoadImage(sc, sc->skinMainBar.active, false); - else { - SkinImage* activeIcon = LoadImage(sc, sc->skinMainBar.active, false); - if (activeIcon) { - ResizeSurface(&imicon->image, - cairo_image_surface_get_width(activeIcon->image), - cairo_image_surface_get_height(activeIcon->image)); - } - } - free(path); + imicon = GetIMIcon(instance, sc, sc->skinMainBar.active, 3, false); } if (imicon) { @@ -261,6 +240,7 @@ free(path); if (statusicon == NULL) continue; + privstat->avail = true; DrawImage(c, statusicon->image, sp->x, sp->y, privstat->mouse); UpdateStatusGeometry(privstat, statusicon, sp->x, sp->y); } @@ -281,6 +261,7 @@ free(path); if (statusicon == NULL) continue; + privstat->avail = true; DrawImage(c, statusicon->image, sp->x, sp->y, privstat->mouse); UpdateStatusGeometry(privstat, statusicon, sp->x, sp->y); } @@ -304,23 +285,7 @@ if (FcitxInstanceGetCurrentStatev2(instance) != IS_ACTIVE || FcitxInstanceGetCurrentIM(instance) == NULL) imicon = LoadImage(sc, sc->skinMainBar.eng, false); else { - FcitxIM* im = FcitxInstanceGetCurrentIM(instance); - char *path; - if (im->strIconName[0] == '/') - path = strdup(im->strIconName); - else - asprintf(&path, "%s.png", im->strIconName); - imicon = LoadImage(sc, path, true); - if (imicon == NULL) - imicon = LoadImage(sc, sc->skinMainBar.active, false); - else { - if (activeIcon) { - ResizeSurface(&imicon->image, - cairo_image_surface_get_width(activeIcon->image), - cairo_image_surface_get_height(activeIcon->image)); - } - } - free(path); + imicon = GetIMIcon(instance, sc, sc->skinMainBar.active, 3, false); } if (imicon) { @@ -377,11 +342,13 @@ else asprintf(&path, "%s_inactive.png", status->name); SkinImage* statusicon = LoadImage(sc, path, false); - if (statusicon == NULL) { + if (statusicon == NULL || statusicon->textIcon) { if (activeIcon) { statusicon = LoadImageWithText(classicui, sc, path, status->shortDescription, cairo_image_surface_get_width(activeIcon->image), - cairo_image_surface_get_height(activeIcon->image)); + cairo_image_surface_get_height(activeIcon->image), + active + ); } } free(path); @@ -426,15 +393,11 @@ compstatus != NULL; compstatus = (FcitxUIComplexStatus*) utarray_next(uicompstats, compstatus) ) { - - if (!compstatus->visible) - continue; FcitxClassicUIStatus* privstat = GetPrivateStatus(compstatus); if (privstat == NULL) continue; - /* reset status */ - privstat->x = privstat->y = -1; - privstat->w = privstat->h = 0; + if (!compstatus->visible) + continue; const char* icon = compstatus->getIconName(compstatus->arg); char* path; if (icon[0] != '/') @@ -445,6 +408,7 @@ free(path); if (statusicon == NULL) continue; + privstat->avail = true; DrawImage(c, statusicon->image, currentX, sc->skinMainBar.marginTop, privstat->mouse); UpdateStatusGeometry(privstat, statusicon, currentX, sc->skinMainBar.marginTop); currentX += cairo_image_surface_get_width(statusicon->image); @@ -454,14 +418,12 @@ status != NULL; status = (FcitxUIStatus*) utarray_next(uistats, status) ) { - if (!status->visible) - continue; FcitxClassicUIStatus* privstat = GetPrivateStatus(status); if (privstat == NULL) continue; + if (!status->visible) + continue; /* reset status */ - privstat->x = privstat->y = -1; - privstat->w = privstat->h = 0; boolean active = status->getCurrentStatus(status->arg); char *path; if (active) @@ -472,6 +434,7 @@ free(path); if (statusicon == NULL) continue; + privstat->avail = true; DrawImage(c, statusicon->image, currentX, sc->skinMainBar.marginTop, privstat->mouse); UpdateStatusGeometry(privstat, statusicon, currentX, sc->skinMainBar.marginTop); currentX += cairo_image_surface_get_width(statusicon->image); @@ -524,7 +487,8 @@ void CloseMainWindow(MainWindow *mainWindow) { - XUnmapWindow(mainWindow->dpy, mainWindow->window); + if (mainWindow->owner->hideMainWindow != HM_SHOW || mainWindow->owner->isSuspend) + XUnmapWindow(mainWindow->dpy, mainWindow->window); } boolean SetMouseStatus(MainWindow *mainWindow, MouseE* mouseE, MouseE value, MouseE other) @@ -638,16 +602,16 @@ classicui->iMainWindowOffsetY = event->xbutton.y; if (!ClassicUIMouseClick(mainWindow->owner, mainWindow->window, &classicui->iMainWindowOffsetX, &classicui->iMainWindowOffsetY)) { - if (FcitxInstanceGetCurrentState(instance) == IS_CLOSED) { - FcitxInstanceEnableIM(instance, FcitxInstanceGetCurrentIC(instance), false); - } else { - FcitxInstanceCloseIM(instance, FcitxInstanceGetCurrentIC(instance)); - } + FcitxInstanceChangeIMState(instance, FcitxInstanceGetCurrentIC(instance)); } SaveClassicUIConfig(classicui); } else if (IsInRspArea(event->xbutton.x, event->xbutton.y, &mainWindow->imiconstat)) { mouse = &mainWindow->imiconstat.mouse; - FcitxInstanceSwitchIM(instance, -1); + /* if close, we enable it, if enabled, we scroll it */ + if (FcitxInstanceGetCurrentState(instance) != IS_ACTIVE) + FcitxInstanceEnableIM(instance, FcitxInstanceGetCurrentIC(instance), false); + else + FcitxInstanceSwitchIM(instance, -1); } else { FcitxUIComplexStatus *compstatus; UT_array* uicompstats = FcitxInstanceGetUIComplexStats(instance); @@ -711,9 +675,6 @@ if (SetMouseStatus(mainWindow, NULL, RELEASE, RELEASE)) DrawMainWindow(mainWindow); break; - case Button2: - DisplayAboutWindow(mainWindow->owner->aboutWindow); - break; } break; } @@ -722,39 +683,6 @@ return false; } -static void ResizeSurface(cairo_surface_t** surface, int w, int h) -{ - int ow = cairo_image_surface_get_width(*surface); - int oh = cairo_image_surface_get_height(*surface); - - if ((ow == w && oh == h) || w == 0 || h == 0 || ow == 0 || oh == 0) - return; - - double scalex = (double)w / ow; - double scaley = (double)h / oh; - double scale = (scalex > scaley) ? scaley : scalex; - - int nw = ow * scale; - int nh = oh * scale; - - cairo_surface_t* newsurface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, w, h); - cairo_t* c = cairo_create(newsurface); - cairo_set_operator(c, CAIRO_OPERATOR_SOURCE); - cairo_set_source_rgba(c ,1, 1, 1, 0.0); - cairo_paint(c); - cairo_translate(c, (w - nw) / 2.0 , (h - nh) / 2.0); - cairo_scale(c, scale, scale); - cairo_set_source_surface(c, *surface, 0, 0); - cairo_rectangle(c, 0, 0, ow, oh); - cairo_clip(c); - cairo_paint(c); - cairo_destroy(c); - - cairo_surface_destroy(*surface); - - *surface = newsurface; -} - static void UpdateMenuGeometry(MainWindow* mainWindow, XlibMenu* menuWindow) { FcitxClassicUI* classicui = mainWindow->owner; @@ -762,6 +690,7 @@ unsigned int height; int sheight; XWindowAttributes attr; + FcitxMenuUpdate(menuWindow->menushell); GetMenuSize(menuWindow); GetScreenSize(classicui, NULL, &sheight); XGetWindowAttributes(classicui->dpy, mainWindow->window, &attr); diff -Nru fcitx-4.2.2/src/ui/classic/MainWindow.h fcitx-4.2.4.1/src/ui/classic/MainWindow.h --- fcitx-4.2.2/src/ui/classic/MainWindow.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/ui/classic/MainWindow.h 2012-06-10 14:34:48.000000000 +0000 @@ -41,6 +41,7 @@ MouseE mouse; int x, y; int w, h; + boolean avail; } FcitxClassicUIStatus; typedef struct _MainWindow { @@ -48,7 +49,6 @@ Window window; cairo_surface_t* cs_main_bar; cairo_surface_t* cs_x_main_bar; - boolean bMainWindowHidden; FcitxClassicUIStatus logostat; FcitxClassicUIStatus imiconstat; struct _FcitxSkin* skin; diff -Nru fcitx-4.2.2/src/ui/classic/MessageWindow.c fcitx-4.2.4.1/src/ui/classic/MessageWindow.c --- fcitx-4.2.2/src/ui/classic/MessageWindow.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/ui/classic/MessageWindow.c 2012-06-10 14:34:48.000000000 +0000 @@ -31,7 +31,7 @@ #include #include #include "module/x11/x11stuff.h" -#include +#include "fcitx-utils/utils.h" #define MESSAGE_WINDOW_MARGIN 20 diff -Nru fcitx-4.2.2/src/ui/classic/skin.c fcitx-4.2.4.1/src/ui/classic/skin.c --- fcitx-4.2.2/src/ui/classic/skin.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/ui/classic/skin.c 2012-06-10 14:34:48.000000000 +0000 @@ -64,6 +64,7 @@ static boolean SkinMenuAction(FcitxUIMenu* menu, int index); static void UpdateSkinMenu(FcitxUIMenu* menu); static void UnloadImage(FcitxSkin* skin); +static void UnloadSingleImage(FcitxSkin* sc, const char* name); CONFIG_DESC_DEFINE(GetSkinDesc, "skin.desc") @@ -157,85 +158,134 @@ } -SkinImage* LoadImageWithText(FcitxClassicUI *classicui, FcitxSkin* sc, const char* name, const char* text, int w, int h) +SkinImage* LoadImageWithText(FcitxClassicUI* classicui, FcitxSkin* sc, const char* name, const char* text, int w, int h, boolean active) { if (!text || strlen(text) == 0) return NULL; - + + UnloadSingleImage(sc, name); + + int len = fcitx_utf8_char_len(text); - + char* iconText = strndup(text, len); - + FcitxLog(DEBUG, "%s", iconText); cairo_surface_t* newsurface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, w, h); cairo_t* c = cairo_create(newsurface); - + int min = w > h? h: w; min = min * 0.8; - + cairo_set_operator(c, CAIRO_OPERATOR_SOURCE); cairo_set_source_rgba(c ,1, 1, 1, 0.0); cairo_paint(c); - - OutputString(c, iconText, classicui->font, min, 0, 0, &sc->skinFont.menuFontColor[1]); - + + FcitxConfigColor color; + if (sc->skinMainBar.bUseCustomTextIconColor) { + if (active) + color = sc->skinMainBar.textIconColor[0]; + else + color = sc->skinMainBar.textIconColor[1]; + } + else + color = sc->skinFont.menuFontColor[1]; + + int textw, texth; + StringSizeStrict(iconText, classicui->font, min, &textw, &texth); + + int fh = FontHeight(classicui->font, min); + OutputString(c, iconText, classicui->font, min, (w - textw) * 0.5, (h - texth) * 0.5 - (fh - texth), &color); + cairo_destroy(c); SkinImage* image = fcitx_utils_malloc0(sizeof(SkinImage)); image->name = strdup(name); image->image = newsurface; + image->textIcon = true; HASH_ADD_KEYPTR(hh, sc->imageTable, image->name, strlen(image->name), image); return image; } -SkinImage* LoadImage(FcitxSkin* sc, const char* name, boolean fallback) +SkinImage* LoadImageFromTable(SkinImage** imageTable, const char* skinType, const char* name, int flag) { cairo_surface_t *png = NULL; SkinImage *image = NULL; + char* buf = NULL; + asprintf(&buf, "skin/%s", skinType); + const char* fallbackChainNoFallback[] = { buf }; + const char* fallbackChainPanel[] = { buf, "skin/default" }; + const char* fallbackChainTray[] = { "imicon" }; + const char* fallbackChainPanelIMIcon[] = { buf, "imicon" }; - HASH_FIND_STR(sc->imageTable, name, image); - if (image != NULL) + HASH_FIND_STR(*imageTable, name, image); + if (image != NULL) { return image; - if (strlen(name) > 0 && strcmp(name , "NONE") != 0) { - char *skintype = strdup(*sc->skinType); - char *filename; - while (true) { - char* buf = NULL; - asprintf(&buf, "skin/%s", skintype); + } - FILE* fp = FcitxXDGGetFileWithPrefix(buf, name, "r", &filename); - free(buf); + const char** fallbackChain; + int fallbackSize; + switch(flag) { + case 1: + fallbackChain = fallbackChainPanel; + fallbackSize = 2; + break; + case 2: + fallbackChain = fallbackChainTray; + fallbackSize = 1; + break; + case 3: + fallbackChain = fallbackChainPanelIMIcon; + fallbackSize = 3; + break; + case 0: + default: + /* fall through */ + fallbackChain = fallbackChainNoFallback; + fallbackSize = 1; + break; + } - Bool flagNoFile = (fp == NULL); - if (fp) { - fclose(fp); + if (strlen(name) > 0 && strcmp(name , "NONE") != 0) { + int i = 0; + for (i = 0; i < fallbackSize; i ++) { + char* filename; + const char* skintype = fallbackChain[i]; + FILE* fp = FcitxXDGGetFileWithPrefix(skintype, name, "r", &filename); + if (fp) { png = cairo_image_surface_create_from_png(filename); - break; - } - if (flagNoFile && (!fallback || strcmp(skintype, "default") == 0)) { - png = NULL; - break; + if (cairo_surface_status (png)) { + png = NULL; + } } free(filename); - free(skintype); - skintype = strdup("default"); + + if (png) + break; } - free(filename); - free(skintype); } + free(buf); if (png != NULL) { image = fcitx_utils_malloc0(sizeof(SkinImage)); image->name = strdup(name); image->image = png; - HASH_ADD_KEYPTR(hh, sc->imageTable, image->name, strlen(image->name), image); + HASH_ADD_KEYPTR(hh, *imageTable, image->name, strlen(image->name), image); return image; } return NULL; } +SkinImage* LoadImage(FcitxSkin* sc, const char* name, int flag) +{ + if (flag == 2) + return LoadImageFromTable(&sc->trayImageTable, *sc->skinType, name, flag); + else + return LoadImageFromTable(&sc->imageTable, *sc->skinType, name, flag); +} + void DrawResizableBackground(cairo_t *c, cairo_surface_t *background, int height, @@ -673,7 +723,7 @@ } else { newWidth = (newWidth < INPUT_BAR_HMIN_WIDTH) ? INPUT_BAR_HMIN_WIDTH : newWidth; } - + *iwidth = newWidth; *iheight = newHeight; @@ -779,9 +829,9 @@ SaveClassicUIConfig(classicui); } -void UnloadImage(FcitxSkin* skin) +void FreeImageTable(SkinImage* table) { - SkinImage *images = skin->imageTable; + SkinImage *images = table; while (images) { SkinImage* curimage = images; HASH_DEL(images, curimage); @@ -789,7 +839,28 @@ cairo_surface_destroy(curimage->image); free(curimage); } +} + +void UnloadImage(FcitxSkin* skin) +{ + FreeImageTable(skin->imageTable); skin->imageTable = NULL; + + FreeImageTable(skin->trayImageTable); + skin->trayImageTable = NULL; +} + +void UnloadSingleImage(FcitxSkin* sc, const char* name) +{ + SkinImage *image; + HASH_FIND_STR(sc->imageTable, name, image); + if (image != NULL) { + SkinImage* curimage = image; + HASH_DEL(sc->imageTable, image); + free(curimage->name); + cairo_surface_destroy(curimage->image); + free(curimage); + } } //图片文件加载函数完成 @@ -849,7 +920,7 @@ { utarray_init(&classicui->skinBuf, &ut_str_icd); FcitxMenuInit(&classicui->skinMenu); - classicui->skinMenu.candStatusBind = strdup("skin"); + classicui->skinMenu.candStatusBind = NULL; classicui->skinMenu.name = strdup(_("Skin")); classicui->skinMenu.UpdateMenu = UpdateSkinMenu; @@ -911,4 +982,28 @@ utarray_free(array); } + +SkinImage* GetIMIcon(FcitxInstance* instance, FcitxSkin *sc, const char* fallbackIcon, int flag, boolean fallbackToDefault) +{ + FcitxIM* im = FcitxInstanceGetCurrentIM(instance); + char* path; + if (im->strIconName[0] == '/') + path = strdup(im->strIconName); + else + asprintf(&path, "%s.png", im->strIconName); + SkinImage* imicon = LoadImage(sc, path, flag); + if (imicon == NULL) + imicon = LoadImage(sc, fallbackIcon, fallbackToDefault); + else { + SkinImage* activeIcon = LoadImage(sc, fallbackIcon, fallbackToDefault); + if (activeIcon) { + ResizeSurface(&imicon->image, + cairo_image_surface_get_width(activeIcon->image), + cairo_image_surface_get_height(activeIcon->image)); + } + } + free(path); + return imicon; +} + // kate: indent-mode cstyle; space-indent on; indent-width 0; diff -Nru fcitx-4.2.2/src/ui/classic/skinconfig.c fcitx-4.2.4.1/src/ui/classic/skinconfig.c --- fcitx-4.2.2/src/ui/classic/skinconfig.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/ui/classic/skinconfig.c 2012-06-10 14:34:48.000000000 +0000 @@ -57,6 +57,9 @@ CONFIG_BINDING_REGISTER("SkinMainBar", "FillVertical", skinMainBar.fillV) CONFIG_BINDING_REGISTER("SkinMainBar", "FillHorizontal", skinMainBar.fillH) CONFIG_BINDING_REGISTER_WITH_FILTER("SkinMainBar", "Placement", skinMainBar.placement, FilterPlacement) +CONFIG_BINDING_REGISTER("SkinMainBar", "UseCustomTextIconColor", skinMainBar.bUseCustomTextIconColor) +CONFIG_BINDING_REGISTER("SkinMainBar", "ActiveTextIconColor", skinMainBar.textIconColor[0]) +CONFIG_BINDING_REGISTER("SkinMainBar", "InactiveTextIconColor", skinMainBar.textIconColor[1]) CONFIG_BINDING_REGISTER("SkinInputBar", "BackImg", skinInputBar.backImg) CONFIG_BINDING_REGISTER("SkinInputBar", "MarginTop", skinInputBar.marginTop) diff -Nru fcitx-4.2.2/src/ui/classic/skin.desc fcitx-4.2.4.1/src/ui/classic/skin.desc --- fcitx-4.2.2/src/ui/classic/skin.desc 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/ui/classic/skin.desc 2012-06-10 14:34:48.000000000 +0000 @@ -73,7 +73,7 @@ [SkinMainBar/Active] Type=String -Description=Chinese Mode Icon +Description=Active Mode Icon [SkinMainBar/MarginLeft] Type=Integer @@ -107,6 +107,21 @@ Enum1=Resize DefaultValue=Resize +[SkinMainBar/UseCustomTextIconColor] +Type=Boolean +Description=Use Custom text icon color +DefaultValue=False + +[SkinMainBar/ActiveTextIconColor] +Type=Color +Description=Active Text Icon Color +DefaultValue=0 0 0 + +[SkinMainBar/InactiveTextIconColor] +Type=Color +Description=Inactive Text Icon Color +DefaultValue=0 0 0 + [SkinMainBar/Placement] Type=String Description=Special Icon position diff -Nru fcitx-4.2.2/src/ui/classic/skin.h fcitx-4.2.4.1/src/ui/classic/skin.h --- fcitx-4.2.2/src/ui/classic/skin.h 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/ui/classic/skin.h 2012-06-10 14:34:48.000000000 +0000 @@ -56,6 +56,7 @@ typedef struct _SkinImage { char *name; cairo_surface_t *image; + boolean textIcon; UT_hash_handle hh; } SkinImage; @@ -101,6 +102,8 @@ UT_array skinPlacement; FillRule fillV; FillRule fillH; + boolean bUseCustomTextIconColor; + FcitxConfigColor textIconColor[2]; } SkinMainBar; typedef struct _SkinInputBar { @@ -165,18 +168,20 @@ char** skinType; SkinImage* imageTable; + SkinImage* trayImageTable; } FcitxSkin; FcitxConfigFileDesc* GetSkinDesc(); int LoadSkinConfig(FcitxSkin* sc, char** skinType); void DrawImage(cairo_t* c, cairo_surface_t* png, int x, int y, MouseE mouse); void DrawInputBar(FcitxSkin* sc, struct _InputWindow* inputWindow, int cursorPos, struct _FcitxMessages * msgup, struct _FcitxMessages *msgdown , unsigned int * iheight, unsigned int *iwidth); -SkinImage* LoadImage(FcitxSkin* sc, const char* name, boolean fallback); -SkinImage* LoadImageWithText(struct _FcitxClassicUI *classicui, FcitxSkin* sc, const char* name, const char* text, int w, int h); +SkinImage* LoadImage(FcitxSkin* sc, const char* name, int fallback); +SkinImage* LoadImageWithText(struct _FcitxClassicUI *classicui, FcitxSkin* sc, const char* name, const char* text, int w, int h, boolean active); void LoadInputMessage(FcitxSkin* sc, struct _InputWindow* inputWindow, const char* font); void InitSkinMenu(struct _FcitxClassicUI* classicui); void DisplaySkin(struct _FcitxClassicUI* classicui, char * skinname); void ParsePlacement(UT_array* sps, char* placment); +SkinImage* GetIMIcon(struct _FcitxInstance* instance, FcitxSkin* sc, const char* fallbackIcon, int flag, boolean fallbackToDefault); void DrawResizableBackground(cairo_t *c, cairo_surface_t *background, int height, diff -Nru fcitx-4.2.2/src/ui/classic/TrayWindow.c fcitx-4.2.4.1/src/ui/classic/TrayWindow.c --- fcitx-4.2.2/src/ui/classic/TrayWindow.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/ui/classic/TrayWindow.c 2012-06-10 14:34:48.000000000 +0000 @@ -39,7 +39,7 @@ #include "fcitx/module.h" #include "MenuWindow.h" #include "fcitx/instance.h" -#include +#include "fcitx-utils/utils.h" static boolean TrayEventHandler(void *arg, XEvent* event); @@ -146,12 +146,16 @@ /* 画png */ if (f_state) { - image = LoadImage(sc, sc->skinTrayIcon.active, true); + image = GetIMIcon(classicui->owner, sc, sc->skinTrayIcon.active, 2, true); } else { image = LoadImage(sc, sc->skinTrayIcon.inactive, true); } if (image == NULL) return; + /* active, try draw im icon on tray */ + if (f_state && image) { + + } png_surface = image->image; c = cairo_create(trayWindow->cs); @@ -177,7 +181,7 @@ } int aw = scaleW * w; int ah = scaleH * h; - + cairo_scale(c, scaleW, scaleH); cairo_set_source_surface(c, png_surface, (trayWindow->size - aw) / 2 , (trayWindow->size - ah) / 2); cairo_set_operator(c, CAIRO_OPERATOR_OVER); @@ -250,15 +254,12 @@ if (event->xbutton.window == trayWindow->window) { switch (event->xbutton.button) { case Button1: - if (FcitxInstanceGetCurrentState(instance) == IS_CLOSED) { - FcitxInstanceEnableIM(instance, FcitxInstanceGetCurrentIC(instance), false); - } else { - FcitxInstanceCloseIM(instance, FcitxInstanceGetCurrentIC(instance)); - } + FcitxInstanceChangeIMState(instance, FcitxInstanceGetCurrentIC(instance)); break; case Button3: { XlibMenu *mainMenuWindow = classicui->mainMenuWindow; int dwidth, dheight; + FcitxMenuUpdate(mainMenuWindow->menushell); GetScreenSize(classicui, &dwidth, &dheight); GetMenuSize(mainMenuWindow); if (event->xbutton.x_root - event->xbutton.x + diff -Nru fcitx-4.2.2/src/ui/kimpanel/kimpanel.c fcitx-4.2.4.1/src/ui/kimpanel/kimpanel.c --- fcitx-4.2.2/src/ui/kimpanel/kimpanel.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/src/ui/kimpanel/kimpanel.c 2012-06-10 14:34:48.000000000 +0000 @@ -1,6 +1,6 @@ /*************************************************************************** * Copyright (C) 2008~2010 by Zealot.Hoi * - * Copyright (C) 2010~2011 by CSSlayer * + * Copyright (C) 2010~2012 by CSSlayer * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -115,6 +115,10 @@ int iCursorPos; int lastUpdateY; int lastUpdateX; + int version; + int lastUpdateW; + int lastUpdateH; + int lastCursor; } FcitxKimpanelUI; static void* KimpanelCreate(FcitxInstance* instance); @@ -130,11 +134,14 @@ static void KimpanelOnInputUnFocus(void *arg); static void KimpanelOnTriggerOn(void *arg); static void KimpanelOnTriggerOff(void *arg); +static void KimpanelSuspend(void* arg); static void KimpanelDestroy(void* arg); +static void KimUpdateLookupTableCursor(FcitxKimpanelUI* kimpanel, int cursor); static void KimShowAux(FcitxKimpanelUI* kimpanel, boolean toShow); static void KimShowPreedit(FcitxKimpanelUI* kimpanel, boolean toShow); static void KimUpdateSpotLocation(FcitxKimpanelUI* kimpanel, int x, int y); +static void KimSetSpotRect(FcitxKimpanelUI* kimpanel, int x, int y, int w, int h); static void KimShowLookupTable(FcitxKimpanelUI* kimpanel, boolean toShow); static void KimUpdateLookupTable(FcitxKimpanelUI* kimpanel, char *labels[], int nLabel, char *texts[], int nText, boolean has_prev, boolean has_next); static void KimUpdatePreeditText(FcitxKimpanelUI* kimpanel, char *text); @@ -153,6 +160,8 @@ static void KimpanelSetIMStatus(FcitxKimpanelUI* kimpanel); static void KimExecMenu(FcitxKimpanelUI* kimpanel, char *props[], int n); static void KimpanelServiceExistCallback(DBusPendingCall *call, void *data); +static void KimpanelIntrospect(FcitxKimpanelUI* kimpanel); +static void KimpanelIntrospectCallback(DBusPendingCall *call, void *data); #define KIMPANEL_BUFFER_SIZE 4096 @@ -172,7 +181,7 @@ NULL, NULL, NULL, - NULL, + KimpanelSuspend, NULL, KimpanelDestroy, KimpanelRegisterComplexStatus, @@ -188,6 +197,8 @@ FcitxKimpanelUI *kimpanel = fcitx_utils_malloc0(sizeof(FcitxKimpanelUI)); FcitxModuleFunctionArg arg; + kimpanel->lastCursor = -2; + kimpanel->version = 1; kimpanel->iCursorPos = 0; kimpanel->owner = instance; kimpanel->conn = InvokeFunction(instance, FCITX_DBUS, GETCONNECTION, arg); @@ -209,6 +220,14 @@ FcitxLog(ERROR, "Match Error (%s)", err.message); break; } + dbus_bus_add_match(kimpanel->conn, + "type='signal',interface='org.kde.impanel2'", + &err); + dbus_connection_flush(kimpanel->conn); + if (dbus_error_is_set(&err)) { + FcitxLog(ERROR, "Match Error (%s)", err.message); + break; + } dbus_bus_add_match(kimpanel->conn, "type='signal'," @@ -243,7 +262,6 @@ const char* kimpanelServiceName = "org.kde.impanel"; DBusMessage* message = dbus_message_new_method_call(DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS, "NameHasOwner"); dbus_message_append_args(message, DBUS_TYPE_STRING, &kimpanelServiceName, DBUS_TYPE_INVALID); - dbus_connection_send(kimpanel->conn, message, NULL); DBusPendingCall* call = NULL; dbus_bool_t reply = dbus_connection_send_with_reply(kimpanel->conn, message, @@ -256,6 +274,7 @@ NULL); } dbus_connection_flush(kimpanel->conn); + dbus_message_unref(message); KimpanelRegisterAllStatus(kimpanel); dbus_error_free(&err); @@ -294,7 +313,7 @@ imname = _("Disabled"); description = _("Input Method Disabled"); } - /* add fcitx- prefix */ + /* add fcitx- prefix, unless icon name is an absolute path */ if (icon[0] == '/') asprintf(&prop[1], "/Fcitx/im:%s:%s:%s", imname, icon, description); else @@ -337,7 +356,13 @@ char* icon; char* imname; char* description; - if (FcitxInstanceGetCurrentStatev2(instance) == IS_ACTIVE) { + FcitxInputContext* ic = FcitxInstanceGetCurrentIC(instance); + if (ic == NULL) { + icon = "kbd"; + imname = _("No input window"); + description = _("No input window"); + } + else if (FcitxInstanceGetCurrentStatev2(instance) == IS_ACTIVE) { FcitxIM* im = FcitxInstanceGetCurrentIM(instance); if (im) { icon = im->strIconName; @@ -414,12 +439,15 @@ kimpanel->iOffsetX = 12; kimpanel->iOffsetY = 0; - int x = 0, y = 0; + int x = 0, y = 0, w = 0, h = 0; FcitxInputContext* ic = FcitxInstanceGetCurrentIC(kimpanel->owner); - FcitxInstanceGetWindowPosition(kimpanel->owner, ic, &x, &y); + FcitxInstanceGetWindowRect(kimpanel->owner, ic, &x, &y, &w, &h); - KimUpdateSpotLocation(kimpanel, x, y); + if (kimpanel->version == 1) + KimUpdateSpotLocation(kimpanel, x, y + h); + else + KimSetSpotRect(kimpanel, x, y, w, h); } void KimpanelRegisterMenu(void* arg, FcitxUIMenu* menu) @@ -460,8 +488,21 @@ { const char* iconName = status->getIconName(status->arg); + const char* templ; + switch(iconName[0]) { + case '/': + templ = "/Fcitx/%s:%s:%s:%s"; + break; + case '\0': + templ = "/Fcitx/%s:%s:%s:%s"; + break; + default: + templ = "/Fcitx/%s:%s:fcitx-%s:%s"; + break; + } + char *result = NULL; - asprintf(&result, iconName[0] == '/' ? "/Fcitx/%s:%s:%s:%s" : "/Fcitx/%s:%s:fcitx-%s:%s", + asprintf(&result, templ, status->name, status->shortDescription, iconName, @@ -480,6 +521,7 @@ FcitxMessages* messageDown = kimpanel->messageDown; FcitxMessages* messageUp = kimpanel->messageUp; FcitxLog(DEBUG, "KimpanelShowInputWindow"); + KimpanelMoveInputWindow(kimpanel); int n = FcitxMessagesGetMessageCount(messageDown); int nLabels = 0; @@ -488,6 +530,7 @@ char *text[33]; char cmb[KIMPANEL_BUFFER_SIZE] = ""; int i; + int pos = -1; if (n) { for (i = 0; i < n; i++) { @@ -518,6 +561,8 @@ strcat(cmb, msgstr); if (needfree) free(needfree); + if (FcitxMessagesGetMessageType(messageDown, i) == MSG_FIRSTCAND) + pos = nTexts; } } text[nTexts++] = strdup(cmb); @@ -557,6 +602,7 @@ FcitxCandidateWordHasNext(FcitxInputStateGetCandidateList(input))); KimShowLookupTable(kimpanel, false); } + KimUpdateLookupTableCursor(kimpanel, pos); n = FcitxMessagesGetMessageCount(messageUp); char aux[MESSAGE_MAX_LENGTH] = ""; @@ -624,6 +670,15 @@ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } +void KimpanelReset(FcitxKimpanelUI* kimpanel) +{ + kimpanel->lastCursor = -2; + kimpanel->lastUpdateH = -2; + kimpanel->lastUpdateW = -2; + kimpanel->lastUpdateX = -2; + kimpanel->lastUpdateY = -2; +} + DBusHandlerResult KimpanelDBusFilter(DBusConnection* connection, DBusMessage* msg, void* user_data) { FCITX_UNUSED(connection); @@ -671,38 +726,18 @@ if (strlen(s0) > len) { s0 += len; if (strcmp("logo", s0) == 0) { - if (FcitxInstanceGetCurrentState(instance) == IS_CLOSED) { - FcitxInstanceEnableIM(instance, FcitxInstanceGetCurrentIC(instance), false); - } else { - FcitxInstanceCloseIM(instance, FcitxInstanceGetCurrentIC(instance)); - } + FcitxInstanceChangeIMState(instance, FcitxInstanceGetCurrentIC(instance)); } else if (strcmp("keyboard", s0) == 0) { FcitxInstanceCloseIM(instance, FcitxInstanceGetCurrentIC(instance)); } else if (strncmp("im/", s0, strlen("im/")) == 0) { s0 += strlen("im/"); - int index = FcitxInstanceGetIMIndexByName(instance, s0); - - if (index == 0 && FcitxInstanceGetGlobalConfig(instance)->firstAsInactive) - FcitxInstanceCloseIM(instance, FcitxInstanceGetCurrentIC(instance)); - else { - FcitxInstanceSwitchIM(instance, index); - if (FcitxInstanceGetCurrentState(instance) != IS_ACTIVE) { - FcitxInstanceEnableIM(instance, FcitxInstanceGetCurrentIC(instance), false); - } - } + FcitxInstanceSwitchIMByName(instance, s0); } else if (strncmp("im", s0, strlen("im")) == 0) { UT_array* imes = FcitxInstanceGetIMEs(instance); FcitxIM* pim; int index = 0; size_t len = utarray_len(imes); - if (!FcitxInstanceGetGlobalConfig(instance)->firstAsInactive) { - index++; - len ++; - } char **prop = fcitx_utils_malloc0(len * sizeof(char*)); - if (!FcitxInstanceGetGlobalConfig(instance)->firstAsInactive) { - asprintf(&prop[0], "/Fcitx/keyboard:%s:fcitx-%s:%s", _("Disabled"), "kbd", _("Input Method Disabled")); - } for (pim = (FcitxIM *) utarray_front(imes); pim != NULL; pim = (FcitxIM *) utarray_next(imes, pim)) { @@ -759,6 +794,14 @@ } else if (dbus_message_is_signal(msg, "org.kde.impanel", "PanelCreated")) { FcitxLog(DEBUG, "PanelCreated"); FcitxUIResumeFromFallback(instance); + KimpanelReset(kimpanel); + KimpanelRegisterAllStatus(kimpanel); + return DBUS_HANDLER_RESULT_HANDLED; + } else if (dbus_message_is_signal(msg, "org.kde.impanel2", "PanelCreated2")) { + FcitxLog(DEBUG, "PanelCreated2"); + FcitxUIResumeFromFallback(instance); + kimpanel->version = 2; + KimpanelReset(kimpanel); KimpanelRegisterAllStatus(kimpanel); return DBUS_HANDLER_RESULT_HANDLED; } else if (dbus_message_is_signal(msg, "org.kde.impanel", "Exit")) { @@ -771,14 +814,7 @@ return DBUS_HANDLER_RESULT_HANDLED; } else if (dbus_message_is_signal(msg, "org.kde.impanel", "Configure")) { FcitxLog(DEBUG, "Configure"); - - char* command = fcitx_utils_get_fcitx_path_with_filename("bindir", "/fcitx-configtool &"); - FILE* p = popen(command, "r"); - free(command); - if (p) - pclose(p); - else - FcitxLog(ERROR, _("Unable to create process")); + fcitx_utils_launch_configure_tool(); return DBUS_HANDLER_RESULT_HANDLED; } else if (dbus_message_is_signal(msg, DBUS_INTERFACE_DBUS, "NameOwnerChanged")) { const char* service, *oldowner, *newowner; @@ -917,7 +953,6 @@ if (!dbus_connection_send(kimpanel->conn, msg, &serial)) { FcitxLog(DEBUG, "Out Of Memory!"); } - dbus_connection_flush(kimpanel->conn); // free the message dbus_message_unref(msg); @@ -950,7 +985,6 @@ if (!dbus_connection_send(kimpanel->conn, msg, &serial)) { FcitxLog(DEBUG, "Out Of Memory!"); } - dbus_connection_flush(kimpanel->conn); // free the message dbus_message_unref(msg); @@ -983,7 +1017,6 @@ if (!dbus_connection_send(kimpanel->conn, msg, &serial)) { FcitxLog(DEBUG, "Out Of Memory!"); } - dbus_connection_flush(kimpanel->conn); // free the message dbus_message_unref(msg); @@ -1015,7 +1048,6 @@ if (!dbus_connection_send(kimpanel->conn, msg, &serial)) { FcitxLog(DEBUG, "Out Of Memory!"); } - dbus_connection_flush(kimpanel->conn); // free the message dbus_message_unref(msg); @@ -1048,7 +1080,6 @@ if (!dbus_connection_send(kimpanel->conn, msg, &serial)) { FcitxLog(DEBUG, "Out Of Memory!"); } - dbus_connection_flush(kimpanel->conn); // free the message dbus_message_unref(msg); @@ -1081,13 +1112,46 @@ if (!dbus_connection_send(kimpanel->conn, msg, &serial)) { FcitxLog(DEBUG, "Out Of Memory!"); } - dbus_connection_flush(kimpanel->conn); // free the message dbus_message_unref(msg); } +void KimUpdateLookupTableCursor(FcitxKimpanelUI* kimpanel, int cursor) +{ + if (kimpanel->lastCursor != cursor) + kimpanel->lastCursor = cursor; + else + return; + dbus_uint32_t serial = 0; // unique number to associate replies with requests + DBusMessage* msg; + DBusMessageIter args; + + // create a signal and check for errors + msg = dbus_message_new_signal(FCITX_KIMPANEL_PATH, // object name of the signal + FCITX_KIMPANEL_INTERFACE, // interface name of the signal + "UpdateLookupTableCursor"); // name of the signal + if (NULL == msg) { + FcitxLog(DEBUG, "Message Null"); + return; + } + + // append arguments onto signal + dbus_message_iter_init_append(msg, &args); + if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_INT32, &cursor)) { + FcitxLog(DEBUG, "Out Of Memory!"); + } + + // send the message and flush the connection + if (!dbus_connection_send(kimpanel->conn, msg, &serial)) { + FcitxLog(DEBUG, "Out Of Memory!"); + } + + // free the message + dbus_message_unref(msg); +} + void KimShowLookupTable(FcitxKimpanelUI* kimpanel, boolean toShow) { @@ -1114,7 +1178,6 @@ if (!dbus_connection_send(kimpanel->conn, msg, &serial)) { FcitxLog(DEBUG, "Out Of Memory!"); } - dbus_connection_flush(kimpanel->conn); // free the message dbus_message_unref(msg); @@ -1175,7 +1238,6 @@ if (!dbus_connection_send(kimpanel->conn, msg, &serial)) { FcitxLog(DEBUG, "Out Of Memory!"); } - dbus_connection_flush(kimpanel->conn); // free the message dbus_message_unref(msg); @@ -1208,7 +1270,6 @@ if (!dbus_connection_send(kimpanel->conn, msg, &serial)) { FcitxLog(DEBUG, "Out Of Memory!"); } - dbus_connection_flush(kimpanel->conn); // free the message dbus_message_unref(msg); @@ -1245,7 +1306,6 @@ if (!dbus_connection_send(kimpanel->conn, msg, &serial)) { FcitxLog(DEBUG, "Out Of Memory!"); } - dbus_connection_flush(kimpanel->conn); // free the message dbus_message_unref(msg); @@ -1283,7 +1343,6 @@ if (!dbus_connection_send(kimpanel->conn, msg, &serial)) { FcitxLog(DEBUG, "Out Of Memory!"); } - dbus_connection_flush(kimpanel->conn); // free the message dbus_message_unref(msg); @@ -1322,13 +1381,54 @@ if (!dbus_connection_send(kimpanel->conn, msg, &serial)) { FcitxLog(DEBUG, "Out Of Memory!"); } - dbus_connection_flush(kimpanel->conn); // free the message dbus_message_unref(msg); } +void KimSetSpotRect(FcitxKimpanelUI* kimpanel, int x, int y, int w, int h) +{ + if (kimpanel->lastUpdateX == x && kimpanel->lastUpdateY == y && kimpanel->lastUpdateW == w && kimpanel->lastUpdateH == h) + return; + kimpanel->lastUpdateX = x; + kimpanel->lastUpdateY = y; + kimpanel->lastUpdateW = w; + kimpanel->lastUpdateH = h; + dbus_uint32_t serial = 0; // unique number to associate replies with requests + DBusMessage* msg; + + // create a signal and check for errors + msg = dbus_message_new_method_call("org.kde.impanel", + "/org/kde/impanel", + "org.kde.impanel2", + "SetSpotRect"); // name of the signal + if (NULL == msg) { + FcitxLog(DEBUG, "Message Null"); + return; + } + + if (!dbus_message_append_args( + msg, + DBUS_TYPE_INT32, &x, + DBUS_TYPE_INT32, &y, + DBUS_TYPE_INT32, &w, + DBUS_TYPE_INT32, &h, + DBUS_TYPE_INVALID + )) { + FcitxLog(DEBUG, "Out Of Memory!"); + } + + // send the message and flush the connection + if (!dbus_connection_send(kimpanel->conn, msg, &serial)) { + FcitxLog(DEBUG, "Out Of Memory!"); + } + + // free the message + dbus_message_unref(msg); +} + + void KimUpdateScreen(FcitxKimpanelUI* kimpanel, int id) { @@ -1355,7 +1455,6 @@ if (!dbus_connection_send(kimpanel->conn, msg, &serial)) { FcitxLog(DEBUG, "Out Of Memory!"); } - dbus_connection_flush(kimpanel->conn); // free the message dbus_message_unref(msg); @@ -1404,8 +1503,53 @@ DBusError error; dbus_error_init(&error); dbus_message_get_args(msg, &error, DBUS_TYPE_BOOLEAN, &has , DBUS_TYPE_INVALID); - if (!has) + if (!has) { FcitxUISwitchToFallback(kimpanel->owner); + } + else { + KimpanelIntrospect(kimpanel); + } + dbus_message_unref(msg); + dbus_error_free(&error); + } + + dbus_pending_call_cancel(call); + dbus_pending_call_unref(call); +} + +void KimpanelIntrospect(FcitxKimpanelUI* kimpanel) +{ + const char* kimpanelServiceName = "org.kde.impanel"; + DBusMessage* message = dbus_message_new_method_call(kimpanelServiceName, "/org/kde/impanel", DBUS_INTERFACE_INTROSPECTABLE, "Introspect"); + + DBusPendingCall* call = NULL; + dbus_bool_t reply = dbus_connection_send_with_reply(kimpanel->conn, message, + &call, + 0); + if (reply == TRUE) { + dbus_pending_call_set_notify(call, + KimpanelIntrospectCallback, + kimpanel, + NULL); + } + dbus_connection_flush(kimpanel->conn); + dbus_message_unref(message); +} + +void KimpanelIntrospectCallback(DBusPendingCall* call, void* data) +{ + FcitxKimpanelUI* kimpanel = (FcitxKimpanelUI*) data; + + DBusMessage* msg = dbus_pending_call_steal_reply(call); + + if (msg) { + const char* s; + DBusError error; + dbus_error_init(&error); + if (dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &s , DBUS_TYPE_INVALID)) { + if (strstr(s, "org.kde.impanel2")) + kimpanel->version = 2; + } dbus_message_unref(msg); dbus_error_free(&error); } @@ -1414,6 +1558,14 @@ dbus_pending_call_unref(call); } + +void KimpanelSuspend(void* arg) +{ + FcitxKimpanelUI* kimpanel = (FcitxKimpanelUI*) arg; + kimpanel->version = 1; +} + + void KimpanelDestroy(void* arg) { FcitxKimpanelUI* kimpanel = (FcitxKimpanelUI*) arg; diff -Nru fcitx-4.2.2/test/CMakeLists.txt fcitx-4.2.4.1/test/CMakeLists.txt --- fcitx-4.2.2/test/CMakeLists.txt 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/test/CMakeLists.txt 2012-06-10 14:34:48.000000000 +0000 @@ -1,3 +1,7 @@ +include_directories(${PROJECT_SOURCE_DIR}/src) +include_directories(${PROJECT_SOURCE_DIR}/src/lib) +include_directories(${PROJECT_SOURCE_DIR}/src/im/pinyin) + add_executable(testconfig testconfig.c) target_link_libraries(testconfig fcitx-config) @@ -7,15 +11,30 @@ add_executable(teststring teststring.c) target_link_libraries(teststring fcitx-utils) -include_directories(${PROJECT_SOURCE_DIR}/src) -include_directories(${PROJECT_SOURCE_DIR}/src/lib) +add_executable(testutf8 testutf8.c) +target_link_libraries(testutf8 fcitx-utils) + +add_executable(testpinyin + ../src/im/pinyin/pyParser.c + ../src/im/pinyin/pyMapTable.c + ../src/im/pinyin/PYFA.c + ../src/im/pinyin/sp.c + testpinyin.c +) +target_link_libraries(testpinyin fcitx-config) add_test(NAME testconfig COMMAND testconfig ${CMAKE_CURRENT_SOURCE_DIR}/test.desc ${CMAKE_CURRENT_SOURCE_DIR}/test.conf ${CMAKE_CURRENT_BINARY_DIR}/test.conf) add_test(NAME testmessage COMMAND testmessage) - + +add_test(NAME testpinyin + COMMAND testpinyin) + add_test(NAME teststring COMMAND teststring) - \ No newline at end of file + +add_test(NAME testutf8 + COMMAND testutf8) + diff -Nru fcitx-4.2.2/test/testpinyin.c fcitx-4.2.4.1/test/testpinyin.c --- fcitx-4.2.2/test/testpinyin.c 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/test/testpinyin.c 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,49 @@ +#include + +#include "pyParser.h" +#include "pyconfig.h" +#include "PYFA.h" + + +void PrintParsedPY(ParsePYStruct* parse, const char* expect) +{ + /* only test, so don't care too much about size */ + int i; + char* buf = fcitx_utils_malloc0(1024); + for (i = 0; i < parse->iHZCount; i ++) + { + if (i != 0) + strcat(buf, " "); + strcat(buf, parse->strPYParsed[i]); + } + fprintf(stderr, "%s\n", buf); + assert(strcmp(expect, buf) == 0); + free(buf); +} + +int main(int argc, char* argv[]) +{ + FcitxPinyinConfig pyconfig; + ParsePYStruct parse; + memset(&pyconfig, 0, sizeof(pyconfig)); + memset(&parse, 0, sizeof(parse)); + InitPYTable(&pyconfig); + InitPYSplitData(&pyconfig); + ParsePY(&pyconfig, "wanan", &parse, PY_PARSE_INPUT_USER, false); + PrintParsedPY(&parse, "wan an"); + ParsePY(&pyconfig, "dier", &parse, PY_PARSE_INPUT_USER, false); + PrintParsedPY(&parse, "di er"); + ParsePY(&pyconfig, "dierge", &parse, PY_PARSE_INPUT_USER, false); + PrintParsedPY(&parse, "di er ge"); + ParsePY(&pyconfig, "dieru", &parse, PY_PARSE_INPUT_USER, false); + PrintParsedPY(&parse, "die ru"); + ParsePY(&pyconfig, "diepian", &parse, PY_PARSE_INPUT_USER, false); + PrintParsedPY(&parse, "die pian"); + ParsePY(&pyconfig, "bier", &parse, PY_PARSE_INPUT_USER, false); + PrintParsedPY(&parse, "bi er"); + ParsePY(&pyconfig, "bingan", &parse, PY_PARSE_INPUT_USER, false); + PrintParsedPY(&parse, "bing an"); + ParsePY(&pyconfig, "xiai", &parse, PY_PARSE_INPUT_USER, false); + PrintParsedPY(&parse, "xi ai"); + return 0; +} diff -Nru fcitx-4.2.2/test/teststring.c fcitx-4.2.4.1/test/teststring.c --- fcitx-4.2.2/test/teststring.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/test/teststring.c 2012-06-10 14:34:48.000000000 +0000 @@ -1,16 +1,16 @@ +#include #include "fcitx-utils/utils.h" -#include "assert.h" int main() { char *test = "a,b,c,d"; - + UT_array* list = fcitx_utils_split_string(test, ','); assert(utarray_len(list) == 4); char* join = fcitx_utils_join_string_list(list, ','); assert(strcmp(join, test) == 0); free(join); fcitx_utils_free_string_list(list); - + return 0; } \ No newline at end of file diff -Nru fcitx-4.2.2/test/testutf8.c fcitx-4.2.4.1/test/testutf8.c --- fcitx-4.2.2/test/testutf8.c 1970-01-01 00:00:00.000000000 +0000 +++ fcitx-4.2.4.1/test/testutf8.c 2012-06-10 14:34:48.000000000 +0000 @@ -0,0 +1,25 @@ +#include +#include +#include "fcitx-utils/utf8.h" + +#define BUF_SIZE 9 + +int main() +{ + char buf[BUF_SIZE]; + const char string[] = "\xe4\xbd\xa0\xe5\xa5\xbd\xe6\xb5\x8b\xe8\xaf\x95\xe5\xb8\x8c\xe6"; + const char result[] = {'\xe4', '\xbd', '\xa0', '\xe5', '\xa5', '\xbd', '\0', '\0', '\0'}; + fcitx_utf8_strncpy(buf, string, BUF_SIZE - 1); + buf[BUF_SIZE - 1] = 0; + assert(memcmp(buf, result, BUF_SIZE) == 0); + + assert(fcitx_utf8_strnlen(string, 0) == 0); + assert(fcitx_utf8_strnlen(string, 1) == 0); + assert(fcitx_utf8_strnlen(string, 2) == 0); + assert(fcitx_utf8_strnlen(string, 3) == 1); + assert(fcitx_utf8_strnlen(string, 6) == 2); + assert(fcitx_utf8_strnlen(string, 8) == 2); + assert(fcitx_utf8_strnlen(string, 9) == 3); + + return 0; +} \ No newline at end of file diff -Nru fcitx-4.2.2/tools/createPYMB.c fcitx-4.2.4.1/tools/createPYMB.c --- fcitx-4.2.2/tools/createPYMB.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/tools/createPYMB.c 2012-06-10 14:34:48.000000000 +0000 @@ -20,8 +20,6 @@ #include #include -#define PARSE_INPUT_SYSTEM ' ' - #include "im/pinyin/pyParser.h" #include "im/pinyin/pyMapTable.h" #include "im/pinyin/PYFA.h" @@ -307,7 +305,7 @@ fscanf(fps, "%s", strPY); fscanf(fps, "%s\n", strHZ); - if (MapPY(&pyconfig, strPY, strMap, PARSE_INPUT_SYSTEM)) { + if (MapPY(&pyconfig, strPY, strMap, PY_PARSE_INPUT_SYSTEM)) { for (i = 0; i < iBaseCount; i++) if ((!strcmp(PYTable_template[i].strPY, strPY)) && PYTable_template[i].control == PYTABLE_NONE) YY[i] += 1; diff -Nru fcitx-4.2.2/tools/fcitx-remote.c fcitx-4.2.4.1/tools/fcitx-remote.c --- fcitx-4.2.2/tools/fcitx-remote.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/tools/fcitx-remote.c 2012-06-10 14:34:48.000000000 +0000 @@ -69,12 +69,10 @@ void usage() { printf("Usage: fcitx-remote [OPTION]\n" - "\t-c\t\tclose input method\n" - "\t-o\t\topen input method\n" - "\t-i\t\tset input method to inactive\n" + "\t-c\t\tinactivate input method\n" + "\t-o\t\tactivate input method\n" "\t-r\t\treload fcitx config\n" - "\t-t\t\tswitch On/Off\n" - "\t-T\t\tswitch Active/Inactive\n" + "\t-t,-T\t\tswitch Active/Inactive\n" "\t[no option]\tdisplay fcitx state, %d for close, %d for inactive, %d for acitve\n" "\t-h\t\tdisplay this help and exit\n", IS_CLOSED, IS_INACTIVE, IS_ACTIVE); @@ -88,13 +86,8 @@ int o = 0; char c; - while ((c = getopt(argc, argv, "ichortT")) != -1) { + while ((c = getopt(argc, argv, "chortT")) != -1) { switch (c) { - case 'i': - o = 1; - o |= (2 << 16); - break; - case 'o': o = 1; o |= (1 << 16); @@ -109,11 +102,8 @@ break; case 't': - o = 3; - break; - case 'T': - o = 4; + o = 3; break; case 'h': diff -Nru fcitx-4.2.2/tools/mb2txt.c fcitx-4.2.4.1/tools/mb2txt.c --- fcitx-4.2.2/tools/mb2txt.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/tools/mb2txt.c 2012-06-10 14:34:48.000000000 +0000 @@ -23,6 +23,8 @@ #include #include #include +#include +#include #include "im/table/tabledict.h" #ifdef HAVE_STDLIB_H @@ -31,6 +33,76 @@ #define MAX_CODE_LENGTH 30 +enum { + TEMPL_VERNEW = 0, + TEMPL_VEROLD, + TEMPL_KEYCODE, + TEMPL_LEN, + TEMPL_PY, + TEMPL_PYLEN, + TEMPL_PROMPT, + TEMPL_CONSTRUCTPHRASE, + TEMPL_INVALIDCHAR, + TEMPL_RULE, + TEMPL_DATA, + TEMPL_PROMPT2, + TEMPL_CONSTRUCTPHRASE2, +}; + +const char* templateOld[] = { + ";fcitx 版本 0x%02x 码表文件\n", + ";fcitx 版本 0x02 码表文件\n", + "键码=%s\n", + "码长=%d\n", + "拼音=%c\n", + "拼音长度=%d\n", + "提示=%c\n", + "构词=%c\n", + "规避字符=%s\n", + "[组词规则]\n", + "[数据]\n", + "提示=\n", + "构词=\n", +}; +const char* templateNew[] = { + ";fcitx Version 0x%02x Table file\n", + ";fcitx Version 0x02 Table file\n", + "KeyCode=%s\n", + "Length=%d\n", + "Pinyin=%c\n", + "PinyinLength=%d\n", + "Prompt=%c\n", + "ConstructPhrase=%c\n", + "InvalidChar=%s\n", + "[Rule]\n", + "[Data]\n", + "Prompt=\n", + "ConstructPhrase=\n", +}; + +char guessValidChar(char prefer, const char* invalid) { + if (!strchr(invalid, prefer)) + return prefer; + unsigned char c = 0; + for (c = 0; c <= 127; c ++) { + if (ispunct(c) || isalnum(c)) { + if (!strchr(invalid, c)) + break; + } + } + if (c == 128) + return 0; + else + return c; +} + +void usage() +{ + printf("Usage: mb2txt [-o] \n"); + printf("\t-o\t\tOld format table file\n\n"); + exit(1); +} + int main(int argc, char *argv[]) { char strCode[100]; @@ -43,13 +115,29 @@ unsigned char iRule; unsigned char iPYLen; char iVersion = 0; + boolean old = false; + const char** templ = NULL; - if (argc != 2) { - printf("\nUsage: mb2txt \n\n"); - exit(1); + int c; + while ((c = getopt(argc, argv, "oh")) != -1) { + switch (c) { + case 'o': + old = true; + break; + case 'h': + + default: + usage(); + } } - fpDict = fopen(argv[1], "r"); + templ = old ? templateOld : templateNew; + + if (optind + 1 != argc) { + usage(); + } + + fpDict = fopen(argv[optind], "r"); if (!fpDict) { printf("\nCan not read source file!\n\n"); @@ -61,40 +149,63 @@ if (iTemp == 0) { fread(&iVersion, sizeof(char), 1, fpDict); - printf(";fcitx 版本 0x%02x 码表文件\n", iVersion); + printf(templ[TEMPL_VERNEW], iVersion); fread(&iTemp, sizeof(unsigned int), 1, fpDict); } else - printf(";fcitx 版本 0x02 码表文件\n"); + printf("%s", templ[TEMPL_VEROLD]); fread(strCode, sizeof(char), iTemp + 1, fpDict); - printf("键码=%s\n", strCode); + printf(templ[TEMPL_KEYCODE], strCode); + char cPinyin = '\0'; fread(&iLen, sizeof(unsigned char), 1, fpDict); - printf("码长=%d\n", iLen); + printf(templ[TEMPL_LEN], iLen); if (iVersion) { fread(&iPYLen, sizeof(unsigned char), 1, fpDict); if (iPYLen) { - printf("拼音=@\n"); - printf("拼音长度=%d\n", iPYLen); + cPinyin = guessValidChar('@', strCode); + printf(templ[TEMPL_PY], cPinyin); + printf(templ[TEMPL_PYLEN], iPYLen); } } + char* temp = malloc(strlen(strCode) * sizeof(char) + 3); + strcpy(temp, strCode); + char pyStr[] = {cPinyin, '\0'}; + strcat(temp, pyStr); + char cPrompt = guessValidChar('&', temp); + char prStr[] = {cPrompt, '\0'}; + strcat(temp, prStr); + char cPhrase = guessValidChar('^', temp); + free(temp); + if (cPrompt == 0) { + printf("%s", templ[TEMPL_PROMPT2]); + } + else { + printf(templ[TEMPL_PROMPT], cPrompt); + } + if (cPhrase == 0) { + printf("%s", templ[TEMPL_CONSTRUCTPHRASE2]); + } + else { + printf(templ[TEMPL_CONSTRUCTPHRASE], cPhrase); + } fread(&iTemp, sizeof(unsigned int), 1, fpDict); fread(strCode, sizeof(char), iTemp + 1, fpDict); if (iTemp) - printf("规避字符=%s\n", strCode); + printf(templ[TEMPL_INVALIDCHAR], strCode); fread(&iRule, sizeof(unsigned char), 1, fpDict); if (iRule) { //表示有组词规则 - printf("[组词规则]\n"); + printf("%s", templ[TEMPL_RULE]); for (i = 0; i < iLen - 1; i++) { fread(&iRule, sizeof(unsigned char), 1, fpDict); @@ -118,7 +229,7 @@ } } - printf("[数据]\n"); + printf("%s", templ[TEMPL_DATA]); fread(&j, sizeof(unsigned int), 1, fpDict); @@ -134,11 +245,22 @@ fread(&iRule, sizeof(unsigned char), 1, fpDict); if (iRule == RECORDTYPE_PINYIN) - printf("@%s %s\n", strCode, strHZ); - else if (iRule == RECORDTYPE_CONSTRUCT) - printf("^%s %s\n", strCode, strHZ); + printf("%c%s %s\n", cPinyin, strCode, strHZ); + else if (iRule == RECORDTYPE_CONSTRUCT) { + if (cPhrase == 0) { + fprintf(stderr, "Could not find a valid char for construct phrase\n"); + exit(1); + } + else + printf("%c%s %s\n", cPhrase, strCode, strHZ); + } else if (iRule == RECORDTYPE_PROMPT) - printf("&%s %s\n", strCode, strHZ); + if (cPrompt == 0) { + fprintf(stderr, "Could not find a valid char for prompt\n"); + exit(1); + } + else + printf("%c%s %s\n", cPrompt, strCode, strHZ); else printf("%s %s\n", strCode, strHZ); } diff -Nru fcitx-4.2.2/tools/txt2mb.c fcitx-4.2.4.1/tools/txt2mb.c --- fcitx-4.2.2/tools/txt2mb.c 2012-04-07 06:34:09.000000000 +0000 +++ fcitx-4.2.4.1/tools/txt2mb.c 2012-06-10 14:34:48.000000000 +0000 @@ -23,6 +23,7 @@ #include #include #include +#include #ifdef HAVE_STDLIB_H #include #endif @@ -32,6 +33,9 @@ #include "fcitx-config/fcitx-config.h" #include "im/table/tabledict.h" +#define CHECK_OPTION(str, x) ((strstr((str), strConst[x]) == (str)) || (strstr((str), strConstNew[x]) == (str))) +#define ADD_LENGTH(str, x) ((strstr((str), strConst[x]) == (str)) ? (strlen(strConst[x])) : (strlen(strConstNew[x]))) + #define STR_KEYCODE 0 #define STR_CODELEN 1 #define STR_IGNORECHAR 2 @@ -39,30 +43,25 @@ #define STR_PINYINLEN 4 #define STR_DATA 5 #define STR_RULE 6 +#define STR_PROMPT 7 +#define STR_CONSTRUCTPHRASE 8 -#define CONST_STR_SIZE 7 +#define CONST_STR_SIZE 9 #define MAX_CODE_LENGTH 30 -#define PHRASE_MAX_LENGTH 10 #define FH_MAX_LENGTH 10 #define TABLE_AUTO_SAVE_AFTER 1024 #define AUTO_PHRASE_COUNT 10000 #define SINGLE_HZ_COUNT 66000 -char* strConst[CONST_STR_SIZE] = { "键码=", "码长=", "规避字符=", "拼音=", "拼音长度=" , "[数据]", "[组词规则]"}; -int strLength[CONST_STR_SIZE]; +char* strConst[CONST_STR_SIZE] = { "键码=", "码长=", "规避字符=", "拼音=", "拼音长度=" , "[数据]", "[组词规则]", "提示=", "构词="}; +char* strConstNew[CONST_STR_SIZE] = { "KeyCode=", "Length=", "InvalidChar=", "Pinyin=", "PinyinLength=" , "[Data]", "[Rule]", "Prompt=", "ConstructPhrase="}; char strInputCode[100] = "\0"; char strIgnoreChars[100] = "\0"; char cPinyinKey = '\0'; - -void InitStrLength() -{ - int i; - - for (i = 0; i < CONST_STR_SIZE; i++) - strLength[i] = strlen(strConst[i]); -} +char cPromptKey = '&'; +char cPhraseKey = '^'; boolean IsValidCode(char cChar) { @@ -86,7 +85,7 @@ p++; } - if (cChar == cPinyinKey || cChar == '^' || cChar == '&') + if (cChar == cPinyinKey || cChar == cPhraseKey || cChar == cPromptKey) return true; return false; @@ -94,9 +93,6 @@ int main(int argc, char *argv[]) { - char strCode[100]; - char strHZ[100]; - char *p; FILE *fpDict, *fpNew; RECORD *temp, *head, *newRec, *current; unsigned int s = 0; @@ -125,8 +121,6 @@ exit(2); } - InitStrLength(); - head = (RECORD *) malloc(sizeof(RECORD)); head->next = head; head->prev = head; @@ -135,18 +129,20 @@ bRule = 0; l = 0; + char* buf = NULL, *buf1 = NULL; + size_t len; for (;;) { l++; - if (!fgets(strCode, 100, fpDict)) + if (getline(&buf, &len, fpDict) == -1) break; - i = strlen(strCode) - 1; + i = strlen(buf) - 1; - while ((i >= 0) && (strCode[i] == ' ' || strCode[i] == '\n' || strCode[i] == '\r')) - strCode[i--] = '\0'; + while ((i >= 0) && (buf[i] == ' ' || buf[i] == '\n' || buf[i] == '\r')) + buf[i--] = '\0'; - pstr = strCode; + pstr = buf; if (*pstr == ' ') pstr++; @@ -154,35 +150,49 @@ if (pstr[0] == '#') continue; - if (strstr(pstr, strConst[STR_KEYCODE])) { - pstr += strLength[STR_KEYCODE]; + if (CHECK_OPTION(pstr, STR_KEYCODE)) { + pstr += ADD_LENGTH(pstr, STR_KEYCODE); strcpy(strInputCode, pstr); - } else if (strstr(pstr, strConst[STR_CODELEN])) { - pstr += strLength[STR_CODELEN]; + } else if (CHECK_OPTION(pstr, STR_CODELEN)) { + pstr += ADD_LENGTH(pstr, STR_CODELEN); iCodeLength = atoi(pstr); if (iCodeLength > MAX_CODE_LENGTH) { iCodeLength = MAX_CODE_LENGTH; printf("Max Code Length is %d\n", MAX_CODE_LENGTH); } - } else if (strstr(pstr, strConst[STR_IGNORECHAR])) { - pstr += strLength[STR_IGNORECHAR]; + } else if (CHECK_OPTION(pstr, STR_IGNORECHAR)) { + pstr += ADD_LENGTH(pstr, STR_IGNORECHAR); strcpy(strIgnoreChars, pstr); - } else if (strstr(pstr, strConst[STR_PINYIN])) { - pstr += strLength[STR_PINYIN]; + } else if (CHECK_OPTION(pstr, STR_PINYIN)) { + pstr += ADD_LENGTH(pstr, STR_PINYIN); - while (*pstr == ' ') + while (*pstr == ' ' && *pstr != '\0') pstr++; cPinyinKey = *pstr; - } else if (strstr(pstr, strConst[STR_PINYINLEN])) { - pstr += strLength[STR_PINYINLEN]; + } else if (CHECK_OPTION(pstr, STR_PROMPT)) { + pstr += ADD_LENGTH(pstr, STR_PROMPT); + + while (*pstr == ' ' && *pstr != '\0') + pstr++; + + cPromptKey = *pstr; + } else if (CHECK_OPTION(pstr, STR_CONSTRUCTPHRASE)) { + pstr += ADD_LENGTH(pstr, STR_CONSTRUCTPHRASE); + + while (*pstr == ' ' && *pstr != '\0') + pstr++; + + cPhraseKey = *pstr; + } else if (CHECK_OPTION(pstr, STR_PINYINLEN)) { + pstr += ADD_LENGTH(pstr, STR_PINYINLEN); iPYCodeLength = atoi(pstr); } - else if (strstr(pstr, strConst[STR_DATA])) + else if (CHECK_OPTION(pstr, STR_DATA)) break; - else if (strstr(pstr, strConst[STR_RULE])) { + else if (CHECK_OPTION(pstr, STR_RULE)) { bRule = 1; break; } @@ -202,17 +212,17 @@ for (iTemp = 0; iTemp < (iCodeLength - 1); iTemp++) { l++; - if (!fgets(strCode, 100, fpDict)) + if (getline(&buf, &len, fpDict) == -1) break; rule[iTemp].rule = (RULE_RULE *) malloc(sizeof(RULE_RULE) * iCodeLength); - i = strlen(strCode) - 1; + i = strlen(buf) - 1; - while ((i >= 0) && (strCode[i] == ' ' || strCode[i] == '\n' || strCode[i] == '\r')) - strCode[i--] = '\0'; + while ((i >= 0) && (buf[i] == ' ' || buf[i] == '\n' || buf[i] == '\r')) + buf[i--] = '\0'; - pstr = strCode; + pstr = buf; if (*pstr == ' ') pstr++; @@ -220,7 +230,7 @@ if (pstr[0] == '#') continue; - if (strstr(pstr, strConst[STR_DATA])) + if (CHECK_OPTION(pstr, STR_DATA)) break; switch (*pstr) { @@ -239,20 +249,20 @@ default: printf("2 Phrase rules are not suitable!\n"); - printf("\t\t%s\n", strCode); + printf("\t\t%s\n", buf); exit(1); } pstr++; - p = pstr; + char* p = pstr; while (*p && *p != '=') p++; if (!(*p)) { printf("3 Phrase rules are not suitable!\n"); - printf("\t\t%s\n", strCode); + printf("\t\t%s\n", buf); exit(1); } @@ -283,7 +293,7 @@ default: printf("4 Phrase rules are not suitable!\n"); - printf("\t\t%s\n", strCode); + printf("\t\t%s\n", buf); exit(1); } @@ -298,7 +308,7 @@ if (i != (iCodeLength - 1)) { if (*p != '+') { printf("5 Phrase rules are not suitable!\n"); - printf("\t\t%s %d\n", strCode, iCodeLength); + printf("\t\t%s %d\n", buf, iCodeLength); exit(1); } @@ -315,15 +325,15 @@ for (iTemp = 0; iTemp < (iCodeLength - 1); iTemp++) { l++; - if (!fgets(strCode, 100, fpDict)) + if (getline(&buf, &len, fpDict) == -1) break; - i = strlen(strCode) - 1; + i = strlen(buf) - 1; - while ((i >= 0) && (strCode[i] == ' ' || strCode[i] == '\n' || strCode[i] == '\r')) - strCode[i--] = '\0'; + while ((i >= 0) && (buf[i] == ' ' || buf[i] == '\n' || buf[i] == '\r')) + buf[i--] = '\0'; - pstr = strCode; + pstr = buf; if (*pstr == ' ') pstr++; @@ -331,7 +341,7 @@ if (pstr[0] == '#') continue; - if (strstr(pstr, strConst[STR_DATA])) + if (CHECK_OPTION(pstr, STR_DATA)) break; } } @@ -339,50 +349,63 @@ if (iPYCodeLength < iCodeLength) iPYCodeLength = iCodeLength; - if (!strstr(pstr, strConst[STR_DATA])) { + if (!CHECK_OPTION(pstr, STR_DATA)) { printf("Source File Format Error!\n"); exit(1); } - for (;;) { + while (getline(&buf, &len, fpDict) != -1) { l++; + if (buf1) + free(buf1); + buf1 = fcitx_utils_trim(buf); + char *p = buf1; - if (EOF == fscanf(fpDict, "%s %s\n", strCode, strHZ)) - break; + while (*p && !isspace(*p)) + p ++; - if (!IsValidCode(strCode[0])) { - printf("Invalid Format: Line-%d %s %s\n", l, strCode, strHZ); + if (*p == '\0') + continue; + + while (isspace(*p)) { + *p = '\0'; + p ++; + } + + char* strHZ = p; + + if (!IsValidCode(buf1[0])) { + printf("Invalid Format: Line-%d %s %s\n", l, buf1, strHZ); exit(1); } - if (((strCode[0] != cPinyinKey) && (strlen(strCode) > iCodeLength)) - || ((strCode[0] == cPinyinKey) && (strlen(strCode) > (iPYCodeLength + 1))) - || ((strCode[0] == '^') && (strlen(strCode) > (iCodeLength + 1))) - || ((strCode[0] == '&') && (strlen(strCode) > (iPYCodeLength + 1))) + if (((buf1[0] != cPinyinKey) && (strlen(buf1) > iCodeLength)) + || ((buf1[0] == cPinyinKey) && (strlen(buf1) > (iPYCodeLength + 1))) + || ((buf1[0] == cPhraseKey) && (strlen(buf1) > (iCodeLength + 1))) + || ((buf1[0] == cPromptKey) && (strlen(buf1) > (iPYCodeLength + 1))) ) { - printf("Delete: %s %s, Too long\n", strCode, strHZ); + printf("Delete: %s %s, Too long\n", buf1, strHZ); continue; } size_t hzLen = fcitx_utf8_strlen(strHZ); - // Utf-8 Longest Phrase Length is 10, longest construct code length is 1 - if (hzLen > PHRASE_MAX_LENGTH || (strCode[0] == '^' && hzLen != 1)) { - printf("Delete: %s %s, Too long\n", strCode, strHZ); + if (buf1[0] == cPhraseKey && hzLen != 1) { + printf("Delete: %s %s, Too long\n", buf1, strHZ); continue; } type = RECORDTYPE_NORMAL; - pstr = strCode; + pstr = buf1; - if (strCode[0] == cPinyinKey) { + if (buf1[0] == cPinyinKey) { pstr ++; type = RECORDTYPE_PINYIN; - } else if (strCode[0] == '^') { + } else if (buf1[0] == cPhraseKey) { pstr ++; type = RECORDTYPE_CONSTRUCT; - } else if (strCode[0] == '&') { + } else if (buf1[0] == cPromptKey) { pstr ++; type = RECORDTYPE_PROMPT; } @@ -419,11 +442,11 @@ } //插在temp的前面 - newRec = (RECORD *) malloc(sizeof(RECORD)); + newRec = (RECORD *) fcitx_utils_malloc0(sizeof(RECORD)); - newRec->strCode = (char *) malloc(sizeof(char) * (iPYCodeLength + 1)); + newRec->strCode = (char *) fcitx_utils_malloc0(sizeof(char) * (iPYCodeLength + 1)); - newRec->strHZ = (char *) malloc(sizeof(char) * strlen(strHZ) + 1); + newRec->strHZ = (char *) fcitx_utils_malloc0(sizeof(char) * strlen(strHZ) + 1); strcpy(newRec->strCode, pstr); @@ -449,8 +472,15 @@ _next: continue; + } + + if (buf) + free(buf); + if (buf1) + free(buf1); + fclose(fpDict); printf("\nReading %d records.\n\n", s);