From 5f8335c1e49ce108ef3481863833c98efa00411b Mon Sep 17 00:00:00 2001 From: manuel Date: Thu, 2 Jul 2020 23:09:26 +0200 Subject: sync with upstream --- .../kodi-addon-dev-kit/include/kodi/General.h | 409 +++++++++++++-------- 1 file changed, 257 insertions(+), 152 deletions(-) (limited to 'xbmc/addons/kodi-addon-dev-kit/include/kodi/General.h') diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/General.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/General.h index 999ff6a..878eaa4 100644 --- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/General.h +++ b/xbmc/addons/kodi-addon-dev-kit/include/kodi/General.h @@ -9,68 +9,9 @@ #pragma once #include "AddonBase.h" +#include "c-api/general.h" -/* - * For interface between add-on and kodi. - * - * This structure defines the addresses of functions stored inside Kodi which - * are then available for the add-on to call - * - * All function pointers there are used by the C++ interface functions below. - * You find the set of them on xbmc/addons/interfaces/General.cpp - * - * Note: For add-on development itself this is not needed - */ -typedef struct AddonToKodiFuncTable_kodi -{ - char* (*get_addon_info)(void* kodiBase, const char* id); - bool (*open_settings_dialog)(void* kodiBase); - char* (*unknown_to_utf8)(void* kodiBase, const char* source, bool* ret, bool failOnBadChar); - char* (*get_localized_string)(void* kodiBase, long label_id); - char* (*get_language)(void* kodiBase, int format, bool region); - bool (*queue_notification)(void* kodiBase, int type, const char* header, const char* message, const char* imageFile, unsigned int displayTime, bool withSound, unsigned int messageTime); - void (*get_md5)(void* kodiBase, const char* text, char* md5); - char* (*get_temp_path)(void* kodiBase); - char* (*get_region)(void* kodiBase, const char* id); - void (*get_free_mem)(void* kodiBase, long* free, long* total, bool as_bytes); - int (*get_global_idle_time)(void* kodiBase); - void (*kodi_version)(void* kodiBase, char** compile_name, int* major, int* minor, char** revision, char** tag, char** tagversion); - char* (*get_current_skin_id)(void* kodiBase); -} AddonToKodiFuncTable_kodi; - -//============================================================================== -/// \ingroup cpp_kodi_Defs -/// @brief For kodi::QueueNotification() used message types -/// -typedef enum QueueMsg -{ - /// Show info notification message - QUEUE_INFO, - /// Show warning notification message - QUEUE_WARNING, - /// Show error notification message - QUEUE_ERROR, - /// Show with own given image and parts if set on values - QUEUE_OWN_STYLE -} QueueMsg; -//------------------------------------------------------------------------------ - -//============================================================================== -/// \ingroup cpp_kodi_Defs -/// @brief Format codes to get string from them. -/// -/// Used on kodi::GetLanguage(). -/// -typedef enum LangFormats -{ - /// two letter code as defined in ISO 639-1 - LANG_FMT_ISO_639_1, - /// three letter code as defined in ISO 639-2/T or ISO 639-2/B - LANG_FMT_ISO_639_2, - /// full language name in English - LANG_FMT_ENGLISH_NAME -} LangFormats; -//------------------------------------------------------------------------------ +#ifdef __cplusplus //============================================================================== /// \ingroup cpp_kodi_Defs @@ -93,9 +34,10 @@ typedef struct kodi_version_t } kodi_version_t; //------------------------------------------------------------------------------ +namespace kodi +{ + //============================================================================== -namespace kodi { -/// /// \ingroup cpp_kodi /// @brief Returns the value of an addon property as a string /// @@ -121,9 +63,11 @@ namespace kodi { /// ... /// ~~~~~~~~~~~~~ /// -inline std::string GetAddonInfo(const std::string& id) +inline std::string ATTRIBUTE_HIDDEN GetAddonInfo(const std::string& id) { - AddonToKodiFuncTable_Addon* toKodi = ::kodi::addon::CAddonBase::m_interface->toKodi; + using namespace kodi::addon; + + AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi; std::string strReturn; char* strMsg = toKodi->kodi->get_addon_info(toKodi->kodiBase, id.c_str()); @@ -135,12 +79,9 @@ inline std::string GetAddonInfo(const std::string& id) } return strReturn; } -} /* namespace kodi */ //------------------------------------------------------------------------------ //============================================================================== -namespace kodi { -/// /// \ingroup cpp_kodi /// @brief Opens this Add-Ons settings dialog. /// @@ -157,16 +98,15 @@ namespace kodi { /// .. /// ~~~~~~~~~~~~~ /// -inline bool OpenSettings() +inline bool ATTRIBUTE_HIDDEN OpenSettings() { - return ::kodi::addon::CAddonBase::m_interface->toKodi->kodi->open_settings_dialog(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase); + using namespace kodi::addon; + return CAddonBase::m_interface->toKodi->kodi->open_settings_dialog( + CAddonBase::m_interface->toKodi->kodiBase); } -} /* namespace kodi */ //------------------------------------------------------------------------------ //============================================================================== -namespace kodi { -/// /// \ingroup cpp_kodi /// @brief Returns an addon's localized 'unicode string'. /// @@ -193,24 +133,25 @@ namespace kodi { /// ... /// ~~~~~~~~~~~~~ /// -inline std::string GetLocalizedString(uint32_t labelId, const std::string& defaultStr = "") +inline std::string ATTRIBUTE_HIDDEN GetLocalizedString(uint32_t labelId, + const std::string& defaultStr = "") { + using namespace kodi::addon; + std::string retString = defaultStr; - char* strMsg = ::kodi::addon::CAddonBase::m_interface->toKodi->kodi->get_localized_string(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase, labelId); + char* strMsg = CAddonBase::m_interface->toKodi->kodi->get_localized_string( + CAddonBase::m_interface->toKodi->kodiBase, labelId); if (strMsg != nullptr) { if (std::strlen(strMsg)) retString = strMsg; - ::kodi::addon::CAddonBase::m_interface->toKodi->free_string(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase, strMsg); + CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, strMsg); } return retString; } -} /* namespace kodi */ //------------------------------------------------------------------------------ //============================================================================== -namespace kodi { -/// /// \ingroup cpp_kodi /// @brief Translate a string with an unknown encoding to UTF8. /// @@ -232,25 +173,27 @@ namespace kodi { /// ... /// ~~~~~~~~~~~~~ /// -inline bool UnknownToUTF8(const std::string& stringSrc, std::string& utf8StringDst, bool failOnBadChar = false) +inline bool ATTRIBUTE_HIDDEN UnknownToUTF8(const std::string& stringSrc, + std::string& utf8StringDst, + bool failOnBadChar = false) { + using namespace kodi::addon; + bool ret = false; - char* retString = ::kodi::addon::CAddonBase::m_interface->toKodi->kodi->unknown_to_utf8(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase, - stringSrc.c_str(), &ret, failOnBadChar); + char* retString = CAddonBase::m_interface->toKodi->kodi->unknown_to_utf8( + CAddonBase::m_interface->toKodi->kodiBase, stringSrc.c_str(), &ret, failOnBadChar); if (retString != nullptr) { if (ret) utf8StringDst = retString; - ::kodi::addon::CAddonBase::m_interface->toKodi->free_string(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase, retString); + CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, + retString); } return ret; } -} /* namespace kodi */ //------------------------------------------------------------------------------ //============================================================================== -namespace kodi { -/// /// \ingroup cpp_kodi /// @brief Returns the active language as a string. /// @@ -274,24 +217,26 @@ namespace kodi { /// ... /// ~~~~~~~~~~~~~ /// -inline std::string GetLanguage(LangFormats format = LANG_FMT_ENGLISH_NAME, bool region = false) +inline std::string ATTRIBUTE_HIDDEN GetLanguage(LangFormats format = LANG_FMT_ENGLISH_NAME, + bool region = false) { + using namespace kodi::addon; + std::string language; - char* retString = ::kodi::addon::CAddonBase::m_interface->toKodi->kodi->get_language(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase, format, region); + char* retString = CAddonBase::m_interface->toKodi->kodi->get_language( + CAddonBase::m_interface->toKodi->kodiBase, format, region); if (retString != nullptr) { if (std::strlen(retString)) language = retString; - ::kodi::addon::CAddonBase::m_interface->toKodi->free_string(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase, retString); + CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, + retString); } return language; } -} /* namespace kodi */ //------------------------------------------------------------------------------ //============================================================================== -namespace kodi { -/// /// \ingroup cpp_kodi /// @brief Writes the C string pointed by format in the GUI. If format includes /// format specifiers (subsequences beginning with %), the additional arguments @@ -367,22 +312,21 @@ namespace kodi { /// ... /// ~~~~~~~~~~~~~ /// -inline void QueueFormattedNotification(QueueMsg type, const char* format, ... ) +inline void ATTRIBUTE_HIDDEN QueueFormattedNotification(QueueMsg type, const char* format, ...) { + using namespace kodi::addon; + va_list args; char buffer[16384]; va_start(args, format); vsprintf(buffer, format, args); va_end(args); - ::kodi::addon::CAddonBase::m_interface->toKodi->kodi->queue_notification(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase, - type, "", buffer, "", 5000, false, 1000); + CAddonBase::m_interface->toKodi->kodi->queue_notification( + CAddonBase::m_interface->toKodi->kodiBase, type, "", buffer, "", 5000, false, 1000); } -} /* namespace kodi */ //------------------------------------------------------------------------------ //============================================================================== -namespace kodi { -/// /// \ingroup cpp_kodi /// @brief Queue a notification in the GUI. /// @@ -427,21 +371,23 @@ namespace kodi { /// ... /// ~~~~~~~~~~~~~ /// -inline void QueueNotification(QueueMsg type, const std::string& header, - const std::string& message, const std::string& imageFile = "", - unsigned int displayTime = 5000, bool withSound = true, - unsigned int messageTime = 1000) +inline void ATTRIBUTE_HIDDEN QueueNotification(QueueMsg type, + const std::string& header, + const std::string& message, + const std::string& imageFile = "", + unsigned int displayTime = 5000, + bool withSound = true, + unsigned int messageTime = 1000) { - ::kodi::addon::CAddonBase::m_interface->toKodi->kodi->queue_notification(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase, - type, header.c_str(), message.c_str(), imageFile.c_str(), displayTime, - withSound, messageTime); + using namespace kodi::addon; + + CAddonBase::m_interface->toKodi->kodi->queue_notification( + CAddonBase::m_interface->toKodi->kodiBase, type, header.c_str(), message.c_str(), + imageFile.c_str(), displayTime, withSound, messageTime); } -} /* namespace kodi */ //------------------------------------------------------------------------------ //============================================================================ -namespace kodi { -/// /// \ingroup cpp_kodi /// @brief Get the MD5 digest of the given text /// @@ -460,20 +406,20 @@ namespace kodi { /// ... /// ~~~~~~~~~~~~~ /// -inline std::string GetMD5(const std::string& text) +inline std::string ATTRIBUTE_HIDDEN GetMD5(const std::string& text) { - char* md5ret = static_cast(malloc(40*sizeof(char))); // md5 size normally 32 bytes - ::kodi::addon::CAddonBase::m_interface->toKodi->kodi->get_md5(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase, text.c_str(), md5ret); + using namespace kodi::addon; + + char* md5ret = static_cast(malloc(40 * sizeof(char))); // md5 size normally 32 bytes + CAddonBase::m_interface->toKodi->kodi->get_md5(CAddonBase::m_interface->toKodi->kodiBase, + text.c_str(), md5ret); std::string md5 = md5ret; free(md5ret); return md5; } -} /* namespace kodi */ //---------------------------------------------------------------------------- //============================================================================== -namespace kodi { -/// /// \ingroup cpp_kodi /// @brief To get a temporary path for the addon /// @@ -484,15 +430,17 @@ namespace kodi { /// @param[in] append A string to append to returned temporary path /// @return Individual path for the addon /// -inline std::string GetTempAddonPath(const std::string& append = "") +inline std::string ATTRIBUTE_HIDDEN GetTempAddonPath(const std::string& append = "") { - char* str = ::kodi::addon::CAddonBase::m_interface->toKodi->kodi->get_temp_path(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase); + using namespace kodi::addon; + + char* str = CAddonBase::m_interface->toKodi->kodi->get_temp_path( + CAddonBase::m_interface->toKodi->kodiBase); std::string ret = str; - ::kodi::addon::CAddonBase::m_interface->toKodi->free_string(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase, str); + CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, str); if (!append.empty()) { - if (append.at(0) != '\\' && - append.at(0) != '/') + if (append.at(0) != '\\' && append.at(0) != '/') #ifdef TARGET_WINDOWS ret.append("\\"); #else @@ -502,12 +450,9 @@ inline std::string GetTempAddonPath(const std::string& append = "") } return ret; } -} /* namespace kodi */ //------------------------------------------------------------------------------ //============================================================================== -namespace kodi { -/// /// \ingroup cpp_kodi /// @brief Returns your regions setting as a string for the specified id /// @@ -530,9 +475,11 @@ namespace kodi { /// ... /// ~~~~~~~~~~~~~ /// -inline std::string GetRegion(const std::string& id) +inline std::string ATTRIBUTE_HIDDEN GetRegion(const std::string& id) { - AddonToKodiFuncTable_Addon* toKodi = ::kodi::addon::CAddonBase::m_interface->toKodi; + using namespace kodi::addon; + + AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi; std::string strReturn; char* strMsg = toKodi->kodi->get_region(toKodi->kodiBase, id.c_str()); @@ -544,12 +491,9 @@ inline std::string GetRegion(const std::string& id) } return strReturn; } -} /* namespace kodi */ //------------------------------------------------------------------------------ //============================================================================== -namespace kodi { -/// /// \ingroup cpp_kodi /// @brief Returns the amount of free memory in MByte (or as bytes) as an long /// integer @@ -572,19 +516,18 @@ namespace kodi { /// ... /// ~~~~~~~~~~~~~ /// -inline void GetFreeMem(long& free, long& total, bool asBytes = false) +inline void ATTRIBUTE_HIDDEN GetFreeMem(long& free, long& total, bool asBytes = false) { + using namespace kodi::addon; + free = -1; total = -1; - AddonToKodiFuncTable_Addon* toKodi = ::kodi::addon::CAddonBase::m_interface->toKodi; + AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi; toKodi->kodi->get_free_mem(toKodi->kodiBase, &free, &total, asBytes); } -} /* namespace kodi */ //------------------------------------------------------------------------------ //============================================================================== -namespace kodi { -/// /// \ingroup cpp_kodi /// @brief Returns the elapsed idle time in seconds as an integer /// @@ -601,20 +544,18 @@ namespace kodi { /// ... /// ~~~~~~~~~~~~~ /// -inline int GetGlobalIdleTime() +inline int ATTRIBUTE_HIDDEN GetGlobalIdleTime() { - AddonToKodiFuncTable_Addon* toKodi = ::kodi::addon::CAddonBase::m_interface->toKodi; + using namespace kodi::addon; + + AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi; return toKodi->kodi->get_global_idle_time(toKodi->kodiBase); } -} /* namespace kodi */ //------------------------------------------------------------------------------ //============================================================================== -namespace kodi { -/// /// \ingroup cpp_kodi /// @brief Get the currently used skin identification name from Kodi -///----------------------------------------------------------------------- /// /// @return The active skin id name as a string /// @@ -633,9 +574,11 @@ namespace kodi { /// .. /// ~~~~~~~~~~~~~ /// -inline std::string GetCurrentSkinId() +inline std::string ATTRIBUTE_HIDDEN GetCurrentSkinId() { - AddonToKodiFuncTable_Addon* toKodi = ::kodi::addon::CAddonBase::m_interface->toKodi; + using namespace kodi::addon; + + AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi; std::string strReturn; char* strMsg = toKodi->kodi->get_current_skin_id(toKodi->kodiBase); @@ -647,12 +590,50 @@ inline std::string GetCurrentSkinId() } return strReturn; } -} /* namespace kodi */ //------------------------------------------------------------------------------ //============================================================================== -namespace kodi { +/// @brief To check another addon is available and usable inside Kodi. +/// +/// @param[in] id The wanted addon identification string to check +/// @param[out] version Version string of addon if **installed** inside Kodi +/// @param[out] enabled Set to true `true* if addon is enabled +/// @return Returns `true* if addon is installed +/// +/// +/// ------------------------------------------------------------------------ +/// +/// **Example:** +/// ~~~~~~~~~~~~~{.cpp} +/// #include /// +/// bool enabled = false; +/// std::string version; +/// bool ret = kodi::IsAddonAvailable("inputstream.adaptive", version, enabled); +/// fprintf(stderr, "Available inputstream.adaptive version '%s' and enabled '%s'\n", +/// ret ? version.c_str() : "not installed", enabled ? "yes" : "no"); +/// ~~~~~~~~~~~~~ +/// +inline bool ATTRIBUTE_HIDDEN IsAddonAvailable(const std::string& id, + std::string& version, + bool& enabled) +{ + using namespace kodi::addon; + + AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi; + + char* cVersion = nullptr; + bool ret = toKodi->kodi->is_addon_avilable(toKodi->kodiBase, id.c_str(), &cVersion, &enabled); + if (cVersion) + { + version = cVersion; + toKodi->free_string(toKodi->kodiBase, cVersion); + } + return ret; +} +//------------------------------------------------------------------------------ + +//============================================================================== /// \ingroup cpp_kodi /// @brief Get current Kodi informations and versions, returned data from the following /// kodi_version_t version; kodi::KodiVersion(version); @@ -691,23 +672,22 @@ namespace kodi { /// ... /// ~~~~~~~~~~~~~ /// -inline void KodiVersion(kodi_version_t& version) +inline void ATTRIBUTE_HIDDEN KodiVersion(kodi_version_t& version) { + using namespace kodi::addon; + char* compile_name = nullptr; char* revision = nullptr; char* tag = nullptr; char* tag_revision = nullptr; - AddonToKodiFuncTable_Addon* toKodi = ::kodi::addon::CAddonBase::m_interface->toKodi; - toKodi->kodi->kodi_version(toKodi->kodiBase, &compile_name, &version.major, &version.minor, &revision, &tag, &tag_revision); + AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi; + toKodi->kodi->kodi_version(toKodi->kodiBase, &compile_name, &version.major, &version.minor, + &revision, &tag, &tag_revision); if (compile_name != nullptr) { - version.compile_name = compile_name; - toKodi->free_string - ( - toKodi->kodiBase, - compile_name - ); + version.compile_name = compile_name; + toKodi->free_string(toKodi->kodiBase, compile_name); } if (revision != nullptr) { @@ -725,5 +705,130 @@ inline void KodiVersion(kodi_version_t& version) toKodi->free_string(toKodi->kodiBase, tag_revision); } } -} /* namespace kodi */ //------------------------------------------------------------------------------ + +//============================================================================== +/// \ingroup cpp_kodi +/// @brief To get keyboard layout characters +/// +/// This is used to get the keyboard layout currently used from Kodi by the +/// there set language. +/// +/// @param[in] modifierKey the key to define the needed layout (uppercase, symbols...) +/// @param[out] layout_name name of used layout +/// @param[out] layout list of selected keyboard layout +/// @return true if request successed +/// +/// +/// ------------------------------------------------------------------------ +/// +/// **Example:** +/// ~~~~~~~~~~~~~{.cpp} +/// #include +/// ... +/// std::string layout_name; +/// std::vector> layout; +/// kodi::GetKeyboardLayout(STD_KB_MODIFIER_KEY_SHIFT | STD_KB_MODIFIER_KEY_SYMBOL, layout_name, layout); +/// fprintf(stderr, "Layout: '%s'\n", layout_name.c_str()); +/// for (unsigned int row = 0; row < STD_KB_BUTTONS_MAX_ROWS; row++) +/// { +/// for (unsigned int column = 0; column < STD_KB_BUTTONS_PER_ROW; column++) +/// { +/// fprintf(stderr, " - Row: '%02i'; Column: '%02i'; Text: '%s'\n", row, column, layout[row][column].c_str()); +/// } +/// } +/// ... +/// ~~~~~~~~~~~~~ +/// +inline bool ATTRIBUTE_HIDDEN GetKeyboardLayout(int modifierKey, + std::string& layout_name, + std::vector>& layout) +{ + using namespace kodi::addon; + + AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi; + AddonKeyboardKeyTable c_layout; + char* c_layout_name = nullptr; + bool ret = + toKodi->kodi->get_keyboard_layout(toKodi->kodiBase, &c_layout_name, modifierKey, &c_layout); + if (ret) + { + if (c_layout_name) + { + layout_name = c_layout_name; + toKodi->free_string(toKodi->kodiBase, c_layout_name); + } + + layout.resize(STD_KB_BUTTONS_MAX_ROWS); + for (unsigned int row = 0; row < STD_KB_BUTTONS_MAX_ROWS; row++) + { + layout[row].resize(STD_KB_BUTTONS_PER_ROW); + for (unsigned int column = 0; column < STD_KB_BUTTONS_PER_ROW; column++) + { + char* button = c_layout.keys[row][column]; + if (button) + { + layout[row][column] = button; + toKodi->free_string(toKodi->kodiBase, button); + } + } + } + } + return ret; +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// \ingroup cpp_kodi +/// @brief To change keyboard layout characters +/// +/// This is used to change the keyboard layout currently used from Kodi +/// +/// @param[out] layout_name new name of used layout (input string not used!) +/// @return true if request successed +/// +/// @note \ref GetKeyboardLayout must be called afterwards. +/// +/// +/// ------------------------------------------------------------------------ +/// +/// **Example:** +/// ~~~~~~~~~~~~~{.cpp} +/// #include +/// ... +/// std::string layout_name; +/// kodi::ChangeKeyboardLayout(layout_name); +/// +/// std::vector> layout; +/// kodi::GetKeyboardLayout(STD_KB_MODIFIER_KEY_SHIFT | STD_KB_MODIFIER_KEY_SYMBOL, layout_name, layout); +/// fprintf(stderr, "Layout: '%s'\n", layout_name.c_str()); +/// for (unsigned int row = 0; row < STD_KB_BUTTONS_MAX_ROWS; row++) +/// { +/// for (unsigned int column = 0; column < STD_KB_BUTTONS_PER_ROW; column++) +/// { +/// fprintf(stderr, " - Row: '%02i'; Column: '%02i'; Text: '%s'\n", row, column, layout[row][column].c_str()); +/// } +/// } +/// ... +/// ~~~~~~~~~~~~~ +/// +inline bool ATTRIBUTE_HIDDEN ChangeKeyboardLayout(std::string& layout_name) +{ + using namespace kodi::addon; + + AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi; + char* c_layout_name = nullptr; + bool ret = toKodi->kodi->change_keyboard_layout(toKodi->kodiBase, &c_layout_name); + if (c_layout_name) + { + layout_name = c_layout_name; + toKodi->free_string(toKodi->kodiBase, c_layout_name); + } + + return ret; +} +//------------------------------------------------------------------------------ + +} /* namespace kodi */ + +#endif /* __cplusplus */ -- cgit v1.2.3