From 2eed279c9d3f50632513902511e56bf71197db45 Mon Sep 17 00:00:00 2001 From: George Kiagiadakis Date: Tue, 10 May 2022 15:10:52 +0300 Subject: [PATCH] i18n: remove the module and embed the gettext calls into the lua api There is no need to have this as an optional module, since libintl is a hard dependency of both PipeWire and GLib. This way we can keep things a bit simpler and faster (no string copies and plugin lookups) Bump meson dependency to 0.59 to benefit of the libintl lookup that is now built into meson's dependency() function. --- lib/wp/meson.build | 3 +- lib/wp/wp.c | 4 + meson.build | 14 ++-- modules/meson.build | 15 +--- modules/module-i18n.c | 97 ----------------------- modules/module-lua-scripting/api/api.c | 30 +++++++ modules/module-lua-scripting/api/api.lua | 25 +----- src/config/main.lua.d/30-alsa-monitor.lua | 2 - 8 files changed, 45 insertions(+), 145 deletions(-) delete mode 100644 modules/module-i18n.c diff --git a/lib/wp/meson.build b/lib/wp/meson.build index 3f08aa0c..cf674953 100644 --- a/lib/wp/meson.build +++ b/lib/wp/meson.build @@ -106,11 +106,12 @@ wp_lib = library('wireplumber-' + wireplumber_api_version, '-DWIREPLUMBER_DEFAULT_MODULE_DIR="@0@"'.format(wireplumber_module_dir), '-DWIREPLUMBER_DEFAULT_CONFIG_DIR="@0@"'.format(wireplumber_config_dir), '-DWIREPLUMBER_DEFAULT_DATA_DIR="@0@"'.format(wireplumber_data_dir), + '-DLOCALE_DIR="@0@"'.format(wireplumber_locale_dir), '-DBUILDING_WP', ], install: true, include_directories: wp_lib_include_dir, - dependencies : [gobject_dep, gmodule_dep, gio_dep, pipewire_dep], + dependencies : [gobject_dep, gmodule_dep, gio_dep, pipewire_dep, libintl_dep], soversion: wireplumber_so_version, version: meson.project_version(), ) diff --git a/lib/wp/wp.c b/lib/wp/wp.c index c356133e..2175aae0 100644 --- a/lib/wp/wp.c +++ b/lib/wp/wp.c @@ -10,6 +10,7 @@ #include "wp.h" #include +#include /*! * \defgroup wp Library Initialization @@ -51,6 +52,9 @@ wp_init (WpInitFlags flags) if (flags & WP_INIT_SPA_TYPES) wp_spa_dynamic_type_init (); + bindtextdomain (GETTEXT_PACKAGE, LOCALE_DIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + /* ensure WpProxy subclasses are loaded, which is needed to be able to autodetect the GType of proxies created through wp_proxy_new_global() */ g_type_ensure (WP_TYPE_CLIENT); diff --git a/meson.build b/meson.build index fd6be856..e2975b9a 100644 --- a/meson.build +++ b/meson.build @@ -1,7 +1,7 @@ project('wireplumber', ['c'], version : '0.4.9', license : 'MIT', - meson_version : '>= 0.56.0', + meson_version : '>= 0.59.0', default_options : [ 'warning_level=1', 'buildtype=debugoptimized', @@ -28,6 +28,11 @@ add_project_arguments([ ], language: 'c' ) +add_project_arguments([ + '-DGETTEXT_PACKAGE="@0@"'.format(meson.project_name()), + ], language: 'c' +) + glib_dep = dependency('glib-2.0', version : glib_req_version) gobject_dep = dependency('gobject-2.0', version : glib_req_version) gmodule_dep = dependency('gmodule-2.0', version : glib_req_version) @@ -37,6 +42,7 @@ spa_dep = dependency('libspa-0.2', version: '>= 0.2') pipewire_dep = dependency('libpipewire-0.3', version: '>= 0.3.48') mathlib = cc.find_library('m') threads_dep = dependency('threads') +libintl_dep = dependency('intl') system_lua = get_option('system-lua') if system_lua @@ -87,12 +93,6 @@ summary({'systemd conf data': systemd.found(), 'libsystemd': libsystemd_dep.found(), 'libelogind': libelogind_dep.found()}, bool_yn: true) -libintl_dep = dependency('intl', required: false) -if not libintl_dep.found() - libintl_dep = cc.find_library('intl', required: false) -endif -summary({'libintl': libintl_dep.found()}, bool_yn: true) - gnome = import('gnome') pkgconfig = import('pkgconfig') fs = import('fs') diff --git a/modules/meson.build b/modules/meson.build index c9fa565a..6db7de4e 100644 --- a/modules/meson.build +++ b/modules/meson.build @@ -137,7 +137,7 @@ shared_library( c_args : [common_c_args, '-DG_LOG_DOMAIN="m-lua-scripting"'], install : true, install_dir : wireplumber_module_dir, - dependencies : [wp_dep, pipewire_dep, wplua_dep], + dependencies : [wp_dep, pipewire_dep, wplua_dep, libintl_dep], ) shared_library( @@ -162,19 +162,6 @@ shared_library( dependencies : [wp_dep, pipewire_dep], ) -shared_library( - 'wireplumber-module-i18n', - [ - 'module-i18n.c', - ], - c_args : [common_c_args, '-DG_LOG_DOMAIN="m-i18n"', - '-DGETTEXT_PACKAGE="@0@"'.format(meson.project_name()), - '-DLOCALEDIR="@0@"'.format(wireplumber_locale_dir)], - install : true, - install_dir : wireplumber_module_dir, - dependencies : [wp_dep, pipewire_dep, libintl_dep], -) - if libsystemd_dep.found() or libelogind_dep.found() shared_library( 'wireplumber-module-logind', diff --git a/modules/module-i18n.c b/modules/module-i18n.c deleted file mode 100644 index 5c82a9c3..00000000 --- a/modules/module-i18n.c +++ /dev/null @@ -1,97 +0,0 @@ -/* WirePlumber - * - * Copyright © 2022 Collabora Ltd. - * @author Pauli Virtanen - * - * SPDX-License-Identifier: MIT - */ - -#include -#include - -#include - -#define NAME "i18n" - -struct _WpI18n -{ - WpPlugin parent; -}; - -enum { - ACTION_GETTEXT, - ACTION_NGETTEXT, - N_SIGNALS -}; - -static guint signals[N_SIGNALS] = {0}; - -G_DECLARE_FINAL_TYPE (WpI18n, wp_i18n, - WP, I18N, WpPlugin) -G_DEFINE_TYPE (WpI18n, wp_i18n, WP_TYPE_PLUGIN) - -static void -wp_i18n_init (WpI18n * self) -{ -} - -static gchar * -wp_i18n_gettext (WpI18n * self, const gchar * msgid) -{ - return g_strdup (dgettext (GETTEXT_PACKAGE, msgid)); -} - -static gchar * -wp_i18n_ngettext (WpI18n * self, const gchar * msgid, const gchar *msgid_plural, gulong n) -{ - return g_strdup (dngettext (GETTEXT_PACKAGE, msgid, msgid_plural, n)); -} - -static void -wp_i18n_enable (WpPlugin * plugin, WpTransition * transition) -{ - WpI18n * self = WP_I18N (plugin); - - wp_object_update_features (WP_OBJECT (self), WP_PLUGIN_FEATURE_ENABLED, 0); -} - -static void -wp_i18n_disable (WpPlugin * plugin) -{ -} - -static void -wp_i18n_class_init (WpI18nClass * klass) -{ - WpPluginClass *plugin_class = (WpPluginClass *) klass; - - bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); - bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); - - plugin_class->enable = wp_i18n_enable; - plugin_class->disable = wp_i18n_disable; - - signals[ACTION_GETTEXT] = g_signal_new_class_handler ( - "gettext", G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, - (GCallback) wp_i18n_gettext, - NULL, NULL, NULL, G_TYPE_STRING, 1, - G_TYPE_STRING); - - signals[ACTION_NGETTEXT] = g_signal_new_class_handler ( - "ngettext", G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, - (GCallback) wp_i18n_ngettext, - NULL, NULL, NULL, G_TYPE_STRING, 3, - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_ULONG); -} - -WP_PLUGIN_EXPORT gboolean -wireplumber__module_init (WpCore * core, GVariant * args, GError ** error) -{ - wp_plugin_register (g_object_new (wp_i18n_get_type (), - "name", NAME, - "core", core, - NULL)); - return TRUE; -} diff --git a/modules/module-lua-scripting/api/api.c b/modules/module-lua-scripting/api/api.c index d8fe5775..b1e240b3 100644 --- a/modules/module-lua-scripting/api/api.c +++ b/modules/module-lua-scripting/api/api.c @@ -10,6 +10,7 @@ #include #include #include +#include #define URI_API "resource:///org/freedesktop/pipewire/wireplumber/m-lua-scripting/api.lua" @@ -113,6 +114,32 @@ static const luaL_Reg source_methods[] = { { NULL, NULL } }; +/* i18n */ + +static int +i18n_gettext (lua_State *L) +{ + const gchar * msgid = luaL_checkstring (L, 1); + lua_pushstring (L, dgettext (GETTEXT_PACKAGE, msgid)); + return 1; +} + +static int +i18n_ngettext (lua_State *L) +{ + const gchar * msgid = luaL_checkstring (L, 1); + const gchar *msgid_plural = luaL_checkstring (L, 2); + gulong n = luaL_checkinteger (L, 3); + lua_pushstring (L, dngettext (GETTEXT_PACKAGE, msgid, msgid_plural, n)); + return 1; +} + +static const luaL_Reg i18n_funcs[] = { + { "gettext", i18n_gettext }, + { "ngettext", i18n_ngettext }, + { NULL, NULL } +}; + /* WpCore */ static int @@ -1434,6 +1461,9 @@ wp_lua_scripting_api_init (lua_State *L) luaL_newlib (L, glib_methods); lua_setglobal (L, "GLib"); + luaL_newlib (L, i18n_funcs); + lua_setglobal (L, "I18n"); + luaL_newlib (L, log_funcs); lua_setglobal (L, "WpLog"); diff --git a/modules/module-lua-scripting/api/api.lua b/modules/module-lua-scripting/api/api.lua index 4e6cc1ef..81c4a0af 100644 --- a/modules/module-lua-scripting/api/api.lua +++ b/modules/module-lua-scripting/api/api.lua @@ -186,35 +186,13 @@ local Feature = { }, } -local I18n = { - gettext = function (msgid) - local i18n = WpPlugin.find("i18n") - if i18n then - return i18n:call("gettext", msgid) - else - return msgid - end - end, - ngettext = function (msgid, msgid_plural, n) - local i18n = WpPlugin.find("i18n") - if i18n then - return i18n:call("ngettext", msgid, msgid_plural, n) - else - if n == 1 then - return msgid - else - return msgid_plural - end - end - end -} - SANDBOX_EXPORT = { Debug = Debug, Id = Id, Features = Features, Feature = Feature, GLib = GLib, + I18n = I18n, Log = WpLog, Core = WpCore, Plugin = WpPlugin, @@ -232,5 +210,4 @@ SANDBOX_EXPORT = { State = WpState_new, LocalModule = WpImplModule_new, ImplMetadata = WpImplMetadata_new, - I18n = I18n } diff --git a/src/config/main.lua.d/30-alsa-monitor.lua b/src/config/main.lua.d/30-alsa-monitor.lua index bda8efda..da0b2c70 100644 --- a/src/config/main.lua.d/30-alsa-monitor.lua +++ b/src/config/main.lua.d/30-alsa-monitor.lua @@ -12,8 +12,6 @@ function alsa_monitor.enable() load_module("reserve-device") end - load_module("i18n") - load_monitor("alsa", { properties = alsa_monitor.properties, rules = alsa_monitor.rules,