Skip to content
Snippets Groups Projects
Commit accb91dd authored by George Kiagiadakis's avatar George Kiagiadakis
Browse files

tools: port wpctl to the new APIs

parent 20da8a94
No related branches found
No related tags found
No related merge requests found
...@@ -320,7 +320,7 @@ wp_object_interest_validate (WpObjectInterest * self, GError ** error) ...@@ -320,7 +320,7 @@ wp_object_interest_validate (WpObjectInterest * self, GError ** error)
if (self->valid) if (self->valid)
return TRUE; return TRUE;
if (!G_TYPE_IS_OBJECT (self->gtype)) { if (!G_TYPE_IS_OBJECT (self->gtype) && !G_TYPE_IS_INTERFACE (self->gtype)) {
g_set_error (error, WP_DOMAIN_LIBRARY, WP_LIBRARY_ERROR_INVARIANT, g_set_error (error, WP_DOMAIN_LIBRARY, WP_LIBRARY_ERROR_INVARIANT,
"type '%s' is not a GObject", g_type_name (self->gtype)); "type '%s' is not a GObject", g_type_name (self->gtype));
return FALSE; return FALSE;
......
...@@ -75,4 +75,4 @@ subdir('docs') ...@@ -75,4 +75,4 @@ subdir('docs')
subdir('modules') subdir('modules')
subdir('src') subdir('src')
subdir('tests') subdir('tests')
#subdir('tools') subdir('tools')
...@@ -32,11 +32,11 @@ static struct { ...@@ -32,11 +32,11 @@ static struct {
gboolean show_referenced; gboolean show_referenced;
gboolean show_associated; gboolean show_associated;
} inspect; } inspect;
#if 0
struct { struct {
guint32 id; guint32 id;
} set_default; } set_default;
#endif
struct { struct {
guint32 id; guint32 id;
gfloat volume; gfloat volume;
...@@ -78,10 +78,12 @@ status_prepare (WpCtl * self, GError ** error) ...@@ -78,10 +78,12 @@ status_prepare (WpCtl * self, GError ** error)
{ {
wp_object_manager_add_interest (self->om, WP_TYPE_SESSION, NULL); wp_object_manager_add_interest (self->om, WP_TYPE_SESSION, NULL);
wp_object_manager_add_interest (self->om, WP_TYPE_CLIENT, NULL); wp_object_manager_add_interest (self->om, WP_TYPE_CLIENT, NULL);
wp_object_manager_request_proxy_features (self->om, WP_TYPE_SESSION, wp_object_manager_request_object_features (self->om, WP_TYPE_SESSION,
WP_SESSION_FEATURES_STANDARD); WP_PIPEWIRE_OBJECT_FEATURES_MINIMAL |
wp_object_manager_request_proxy_features (self->om, WP_TYPE_CLIENT, WP_SESSION_FEATURE_ENDPOINTS |
WP_PROXY_FEATURES_STANDARD); WP_SESSION_FEATURE_LINKS);
wp_object_manager_request_object_features (self->om, WP_TYPE_CLIENT,
WP_PIPEWIRE_OBJECT_FEATURES_MINIMAL);
return TRUE; return TRUE;
} }
...@@ -91,21 +93,21 @@ status_prepare (WpCtl * self, GError ** error) ...@@ -91,21 +93,21 @@ status_prepare (WpCtl * self, GError ** error)
#define TREE_INDENT_EMPTY " " #define TREE_INDENT_EMPTY " "
static void static void
print_controls (WpProxy * proxy) print_controls (WpPipewireObject * pwobj)
{ {
g_autoptr (WpSpaPod) ctrl = NULL; g_autoptr (WpIterator) it = NULL;
gboolean has_audio_controls = FALSE; g_auto (GValue) value = G_VALUE_INIT;
gboolean has_audio_controls = TRUE;
gfloat volume = 0.0; gfloat volume = 0.0;
gboolean mute = FALSE; gboolean mute = FALSE;
if ((ctrl = wp_proxy_get_prop (proxy, "volume"))) { it = wp_pipewire_object_enum_params_sync (pwobj, "Props", NULL);
wp_spa_pod_get_float (ctrl, &volume); if (!it || !wp_iterator_next (it, &value) ||
has_audio_controls = TRUE; !wp_spa_pod_get_object (g_value_get_boxed (&value), "Props", NULL,
} "volume", "f", &volume,
if ((ctrl = wp_proxy_get_prop (proxy, "mute"))) { "mute", "b", &mute,
wp_spa_pod_get_boolean (ctrl, &mute); NULL))
has_audio_controls = TRUE; has_audio_controls = FALSE;
}
if (has_audio_controls) if (has_audio_controls)
printf (" vol: %.2f %s\n", volume, mute ? "MUTED" : ""); printf (" vol: %.2f %s\n", volume, mute ? "MUTED" : "");
...@@ -123,14 +125,14 @@ print_stream (const GValue *item, gpointer data) ...@@ -123,14 +125,14 @@ print_stream (const GValue *item, gpointer data)
printf (TREE_INDENT_LINE TREE_INDENT_EMPTY " %s%4u. %-53s", printf (TREE_INDENT_LINE TREE_INDENT_EMPTY " %s%4u. %-53s",
(--(*n_streams) == 0) ? TREE_INDENT_END : TREE_INDENT_NODE, (--(*n_streams) == 0) ? TREE_INDENT_END : TREE_INDENT_NODE,
id, wp_endpoint_stream_get_name (stream)); id, wp_endpoint_stream_get_name (stream));
print_controls (WP_PROXY (stream)); print_controls (WP_PIPEWIRE_OBJECT (stream));
} }
static const gchar * static const gchar *
get_endpoint_friendly_name (WpEndpoint * ep) get_endpoint_friendly_name (WpEndpoint * ep)
{ {
const gchar *name = const gchar *name = wp_pipewire_object_get_property (WP_PIPEWIRE_OBJECT (ep),
wp_proxy_get_property (WP_PROXY (ep), "endpoint.description"); "endpoint.description");
if (!name) if (!name)
name = wp_endpoint_get_name (ep); name = wp_endpoint_get_name (ep);
return name; return name;
...@@ -145,7 +147,7 @@ print_endpoint (const GValue *item, gpointer data) ...@@ -145,7 +147,7 @@ print_endpoint (const GValue *item, gpointer data)
printf (TREE_INDENT_LINE "%c %4u. %-60s", printf (TREE_INDENT_LINE "%c %4u. %-60s",
(default_id == id) ? '*' : ' ', id, get_endpoint_friendly_name (ep)); (default_id == id) ? '*' : ' ', id, get_endpoint_friendly_name (ep));
print_controls (WP_PROXY (ep)); print_controls (WP_PIPEWIRE_OBJECT (ep));
if (cmdline.status.show_streams) { if (cmdline.status.show_streams) {
g_autoptr (WpIterator) it = wp_endpoint_iterate_streams (ep); g_autoptr (WpIterator) it = wp_endpoint_iterate_streams (ep);
...@@ -205,7 +207,8 @@ status_run (WpCtl * self) ...@@ -205,7 +207,8 @@ status_run (WpCtl * self)
it = wp_object_manager_iterate_filtered (self->om, WP_TYPE_CLIENT, NULL); it = wp_object_manager_iterate_filtered (self->om, WP_TYPE_CLIENT, NULL);
for (; wp_iterator_next (it, &val); g_value_unset (&val)) { for (; wp_iterator_next (it, &val); g_value_unset (&val)) {
WpProxy *client = g_value_get_object (&val); WpProxy *client = g_value_get_object (&val);
g_autoptr (WpProperties) properties = wp_proxy_get_properties (client); g_autoptr (WpProperties) properties =
wp_pipewire_object_get_properties (WP_PIPEWIRE_OBJECT (client));
printf (TREE_INDENT_EMPTY " %4u. %-35s [%s, %s@%s, pid:%s]\n", printf (TREE_INDENT_EMPTY " %4u. %-35s [%s, %s@%s, pid:%s]\n",
wp_proxy_get_bound_id (client), wp_proxy_get_bound_id (client),
...@@ -223,10 +226,10 @@ status_run (WpCtl * self) ...@@ -223,10 +226,10 @@ status_run (WpCtl * self)
for (; wp_iterator_next (it, &val); g_value_unset (&val)) { for (; wp_iterator_next (it, &val); g_value_unset (&val)) {
WpSession *session = g_value_get_object (&val); WpSession *session = g_value_get_object (&val);
g_autoptr (WpIterator) child_it = NULL; g_autoptr (WpIterator) child_it = NULL;
guint32 default_sink = guint32 default_sink = 0;
wp_session_get_default_endpoint (session, WP_DIRECTION_INPUT); // wp_session_get_default_endpoint (session, WP_DIRECTION_INPUT);
guint32 default_source = guint32 default_source = 0;
wp_session_get_default_endpoint (session, WP_DIRECTION_OUTPUT); // wp_session_get_default_endpoint (session, WP_DIRECTION_OUTPUT);
printf ("Session %u (%s)\n", printf ("Session %u (%s)\n",
wp_proxy_get_bound_id (WP_PROXY (session)), wp_proxy_get_bound_id (WP_PROXY (session)),
...@@ -306,9 +309,9 @@ static gboolean ...@@ -306,9 +309,9 @@ static gboolean
inspect_prepare (WpCtl * self, GError ** error) inspect_prepare (WpCtl * self, GError ** error)
{ {
/* collect all objects */ /* collect all objects */
wp_object_manager_add_interest (self->om, WP_TYPE_PROXY, NULL); wp_object_manager_add_interest (self->om, WP_TYPE_GLOBAL_PROXY, NULL);
wp_object_manager_request_proxy_features (self->om, WP_TYPE_PROXY, wp_object_manager_request_object_features (self->om, WP_TYPE_GLOBAL_PROXY,
WP_PROXY_FEATURES_STANDARD); WP_PIPEWIRE_OBJECT_FEATURES_MINIMAL);
return TRUE; return TRUE;
} }
...@@ -381,8 +384,10 @@ property_item_compare (gconstpointer a, gconstpointer b) ...@@ -381,8 +384,10 @@ property_item_compare (gconstpointer a, gconstpointer b)
static void static void
inspect_print_object (WpCtl * self, WpProxy * proxy, guint nest_level) inspect_print_object (WpCtl * self, WpProxy * proxy, guint nest_level)
{ {
g_autoptr (WpProperties) properties = wp_proxy_get_properties (proxy); g_autoptr (WpProperties) properties =
g_autoptr (WpProperties) global_p = wp_proxy_get_global_properties (proxy); wp_pipewire_object_get_properties (WP_PIPEWIRE_OBJECT (proxy));
g_autoptr (WpProperties) global_p =
wp_global_proxy_get_global_properties (WP_GLOBAL_PROXY (proxy));
g_autoptr (GArray) array = g_autoptr (GArray) array =
g_array_new (FALSE, FALSE, sizeof (struct property_item)); g_array_new (FALSE, FALSE, sizeof (struct property_item));
...@@ -433,9 +438,8 @@ inspect_print_object (WpCtl * self, WpProxy * proxy, guint nest_level) ...@@ -433,9 +438,8 @@ inspect_print_object (WpCtl * self, WpProxy * proxy, guint nest_level)
{ {
guint id = (guint) strtol (prop_item->value, NULL, 10); guint id = (guint) strtol (prop_item->value, NULL, 10);
g_autoptr (WpProxy) refer_proxy = g_autoptr (WpProxy) refer_proxy =
wp_object_manager_lookup (self->om, WP_TYPE_PROXY, wp_object_manager_lookup (self->om, WP_TYPE_GLOBAL_PROXY,
WP_CONSTRAINT_TYPE_G_PROPERTY, WP_CONSTRAINT_TYPE_G_PROPERTY, "bound-id", "=u", id, NULL);
"bound-id", "=u", id, NULL);
if (refer_proxy) if (refer_proxy)
inspect_print_object (self, refer_proxy, nest_level + 1); inspect_print_object (self, refer_proxy, nest_level + 1);
...@@ -447,8 +451,8 @@ inspect_print_object (WpCtl * self, WpProxy * proxy, guint nest_level) ...@@ -447,8 +451,8 @@ inspect_print_object (WpCtl * self, WpProxy * proxy, guint nest_level)
const gchar *lookup_key = get_association_key (proxy); const gchar *lookup_key = get_association_key (proxy);
if (lookup_key) { if (lookup_key) {
g_autoptr (WpIterator) it = g_autoptr (WpIterator) it =
wp_object_manager_iterate_filtered (self->om, WP_TYPE_PROXY, wp_object_manager_iterate_filtered (self->om,
WP_CONSTRAINT_TYPE_PW_PROPERTY, WP_TYPE_PIPEWIRE_OBJECT, WP_CONSTRAINT_TYPE_PW_PROPERTY,
lookup_key, "=u", wp_proxy_get_bound_id (proxy), NULL); lookup_key, "=u", wp_proxy_get_bound_id (proxy), NULL);
g_auto (GValue) item = G_VALUE_INIT; g_auto (GValue) item = G_VALUE_INIT;
...@@ -469,7 +473,7 @@ inspect_run (WpCtl * self) ...@@ -469,7 +473,7 @@ inspect_run (WpCtl * self)
g_autoptr (WpProxy) proxy = NULL; g_autoptr (WpProxy) proxy = NULL;
guint32 id = cmdline.inspect.id; guint32 id = cmdline.inspect.id;
proxy = wp_object_manager_lookup (self->om, WP_TYPE_PROXY, proxy = wp_object_manager_lookup (self->om, WP_TYPE_GLOBAL_PROXY,
WP_CONSTRAINT_TYPE_G_PROPERTY, "bound-id", "=u", id, NULL); WP_CONSTRAINT_TYPE_G_PROPERTY, "bound-id", "=u", id, NULL);
if (!proxy) { if (!proxy) {
printf ("Object '%d' not found\n", id); printf ("Object '%d' not found\n", id);
...@@ -488,7 +492,7 @@ out_err: ...@@ -488,7 +492,7 @@ out_err:
} }
/* set-default */ /* set-default */
#if 0
static gboolean static gboolean
set_default_parse_positional (gint argc, gchar ** argv, GError **error) set_default_parse_positional (gint argc, gchar ** argv, GError **error)
{ {
...@@ -516,10 +520,10 @@ set_default_prepare (WpCtl * self, GError ** error) ...@@ -516,10 +520,10 @@ set_default_prepare (WpCtl * self, GError ** error)
WP_CONSTRAINT_TYPE_PW_GLOBAL_PROPERTY, WP_CONSTRAINT_TYPE_PW_GLOBAL_PROPERTY,
"object.id", "=u", cmdline.set_default.id, "object.id", "=u", cmdline.set_default.id,
NULL); NULL);
wp_object_manager_request_proxy_features (self->om, WP_TYPE_SESSION, wp_object_manager_request_object_features (self->om, WP_TYPE_SESSION,
WP_PROXY_FEATURES_STANDARD | WP_PROXY_FEATURE_PROPS); WP_PIPEWIRE_OBJECT_FEATURES_MINIMAL);
wp_object_manager_request_proxy_features (self->om, WP_TYPE_ENDPOINT, wp_object_manager_request_object_features (self->om, WP_TYPE_ENDPOINT,
WP_PROXY_FEATURES_STANDARD); WP_PIPEWIRE_OBJECT_FEATURES_MINIMAL);
return TRUE; return TRUE;
} }
...@@ -567,6 +571,7 @@ out: ...@@ -567,6 +571,7 @@ out:
self->exit_code = 3; self->exit_code = 3;
g_main_loop_quit (self->loop); g_main_loop_quit (self->loop);
} }
#endif
/* set-volume */ /* set-volume */
...@@ -607,32 +612,36 @@ set_volume_prepare (WpCtl * self, GError ** error) ...@@ -607,32 +612,36 @@ set_volume_prepare (WpCtl * self, GError ** error)
WP_CONSTRAINT_TYPE_PW_GLOBAL_PROPERTY, WP_CONSTRAINT_TYPE_PW_GLOBAL_PROPERTY,
"object.id", "=u", cmdline.set_volume.id, "object.id", "=u", cmdline.set_volume.id,
NULL); NULL);
wp_object_manager_request_proxy_features (self->om, WP_TYPE_PROXY, wp_object_manager_request_object_features (self->om, WP_TYPE_GLOBAL_PROXY,
WP_PROXY_FEATURES_STANDARD | WP_PROXY_FEATURE_PROPS); WP_PIPEWIRE_OBJECT_FEATURES_MINIMAL |
WP_PIPEWIRE_OBJECT_FEATURE_PARAM_PROPS);
return TRUE; return TRUE;
} }
static void static void
set_volume_run (WpCtl * self) set_volume_run (WpCtl * self)
{ {
g_autoptr (WpProxy) proxy = NULL; g_autoptr (WpPipewireObject) proxy = NULL;
g_autoptr (WpSpaPod) pod = NULL; g_autoptr (WpIterator) it = NULL;
g_auto (GValue) value = G_VALUE_INIT;
gfloat volume; gfloat volume;
proxy = wp_object_manager_lookup (self->om, WP_TYPE_PROXY, NULL); proxy = wp_object_manager_lookup (self->om, WP_TYPE_GLOBAL_PROXY, NULL);
if (!proxy) { if (!proxy) {
printf ("Object '%d' not found\n", cmdline.set_volume.id); printf ("Object '%d' not found\n", cmdline.set_volume.id);
goto out; goto out;
} }
pod = wp_proxy_get_prop (proxy, "volume"); it = wp_pipewire_object_enum_params_sync (proxy, "Props", NULL);
if (!pod || !wp_spa_pod_get_float (pod, &volume)) { if (!it || !wp_iterator_next (it, &value) ||
!wp_spa_pod_get_object (g_value_get_boxed (&value), "Props", NULL,
"volume", "f", &volume, NULL)) {
printf ("Object '%d' does not support volume\n", cmdline.set_volume.id); printf ("Object '%d' does not support volume\n", cmdline.set_volume.id);
goto out; goto out;
} }
wp_proxy_set_prop (proxy, "volume", wp_pipewire_object_set_param (proxy, "Props", 0, wp_spa_pod_new_object (
wp_spa_pod_new_float (cmdline.set_volume.volume)); "Props", "Props", "volume", "f", cmdline.set_volume.volume, NULL));
wp_core_sync (self->core, NULL, (GAsyncReadyCallback) async_quit, self); wp_core_sync (self->core, NULL, (GAsyncReadyCallback) async_quit, self);
return; return;
...@@ -690,26 +699,30 @@ set_mute_prepare (WpCtl * self, GError ** error) ...@@ -690,26 +699,30 @@ set_mute_prepare (WpCtl * self, GError ** error)
WP_CONSTRAINT_TYPE_PW_GLOBAL_PROPERTY, WP_CONSTRAINT_TYPE_PW_GLOBAL_PROPERTY,
"object.id", "=u", cmdline.set_mute.id, "object.id", "=u", cmdline.set_mute.id,
NULL); NULL);
wp_object_manager_request_proxy_features (self->om, WP_TYPE_PROXY, wp_object_manager_request_object_features (self->om, WP_TYPE_GLOBAL_PROXY,
WP_PROXY_FEATURES_STANDARD | WP_PROXY_FEATURE_PROPS); WP_PIPEWIRE_OBJECT_FEATURES_MINIMAL |
WP_PIPEWIRE_OBJECT_FEATURE_PARAM_PROPS);
return TRUE; return TRUE;
} }
static void static void
set_mute_run (WpCtl * self) set_mute_run (WpCtl * self)
{ {
g_autoptr (WpProxy) proxy = NULL; g_autoptr (WpPipewireObject) proxy = NULL;
g_autoptr (WpSpaPod) pod = NULL; g_autoptr (WpIterator) it = NULL;
g_auto (GValue) value = G_VALUE_INIT;
gboolean mute; gboolean mute;
proxy = wp_object_manager_lookup (self->om, WP_TYPE_PROXY, NULL); proxy = wp_object_manager_lookup (self->om, WP_TYPE_GLOBAL_PROXY, NULL);
if (!proxy) { if (!proxy) {
printf ("Object '%d' not found\n", cmdline.set_mute.id); printf ("Object '%d' not found\n", cmdline.set_mute.id);
goto out; goto out;
} }
pod = wp_proxy_get_prop (proxy, "mute"); it = wp_pipewire_object_enum_params_sync (proxy, "Props", NULL);
if (!pod || !wp_spa_pod_get_boolean (pod, &mute)) { if (!it || !wp_iterator_next (it, &value) ||
!wp_spa_pod_get_object (g_value_get_boxed (&value), "Props", NULL,
"mute", "b", &mute, NULL)) {
printf ("Object '%d' does not support mute\n", cmdline.set_mute.id); printf ("Object '%d' does not support mute\n", cmdline.set_mute.id);
goto out; goto out;
} }
...@@ -719,7 +732,8 @@ set_mute_run (WpCtl * self) ...@@ -719,7 +732,8 @@ set_mute_run (WpCtl * self)
else else
mute = !!cmdline.set_mute.mute; mute = !!cmdline.set_mute.mute;
wp_proxy_set_prop (proxy, "mute", wp_spa_pod_new_boolean (mute)); wp_pipewire_object_set_param (proxy, "Props", 0, wp_spa_pod_new_object (
"Props", "Props", "mute", "b", mute, NULL));
wp_core_sync (self->core, NULL, (GAsyncReadyCallback) async_quit, self); wp_core_sync (self->core, NULL, (GAsyncReadyCallback) async_quit, self);
return; return;
...@@ -755,31 +769,30 @@ set_profile_parse_positional (gint argc, gchar ** argv, GError **error) ...@@ -755,31 +769,30 @@ set_profile_parse_positional (gint argc, gchar ** argv, GError **error)
static gboolean static gboolean
set_profile_prepare (WpCtl * self, GError ** error) set_profile_prepare (WpCtl * self, GError ** error)
{ {
wp_object_manager_add_interest (self->om, WP_TYPE_PROXY, wp_object_manager_add_interest (self->om, WP_TYPE_GLOBAL_PROXY,
WP_CONSTRAINT_TYPE_PW_GLOBAL_PROPERTY, WP_CONSTRAINT_TYPE_PW_GLOBAL_PROPERTY,
"object.id", "=u", cmdline.set_profile.id, "object.id", "=u", cmdline.set_profile.id,
NULL); NULL);
wp_object_manager_request_proxy_features (self->om, WP_TYPE_PROXY, wp_object_manager_request_object_features (self->om, WP_TYPE_GLOBAL_PROXY,
WP_PROXY_FEATURES_STANDARD | WP_PROXY_FEATURE_PROPS); WP_PIPEWIRE_OBJECT_FEATURES_MINIMAL);
return TRUE; return TRUE;
} }
static void static void
set_profile_run (WpCtl * self) set_profile_run (WpCtl * self)
{ {
g_autoptr (WpProxy) proxy = NULL; g_autoptr (WpPipewireObject) proxy = NULL;
g_autoptr (WpSpaPod) pod = NULL;
proxy = wp_object_manager_lookup (self->om, WP_TYPE_PROXY, NULL); proxy = wp_object_manager_lookup (self->om, WP_TYPE_GLOBAL_PROXY, NULL);
if (!proxy) { if (!proxy) {
printf ("Object '%d' not found\n", cmdline.set_profile.id); printf ("Object '%d' not found\n", cmdline.set_profile.id);
goto out; goto out;
} }
pod = wp_spa_pod_new_object ( wp_pipewire_object_set_param (proxy, "Profile", 0,
"Profile", "Profile", wp_spa_pod_new_object (
"index", "i", cmdline.set_profile.index, "Profile", "Profile",
NULL); "index", "i", cmdline.set_profile.index,
wp_proxy_set_param (proxy, "Profile", pod); NULL));
wp_core_sync (self->core, NULL, (GAsyncReadyCallback) async_quit, self); wp_core_sync (self->core, NULL, (GAsyncReadyCallback) async_quit, self);
return; return;
...@@ -839,6 +852,7 @@ static const struct subcommand { ...@@ -839,6 +852,7 @@ static const struct subcommand {
.prepare = inspect_prepare, .prepare = inspect_prepare,
.run = inspect_run, .run = inspect_run,
}, },
#if 0
{ {
.name = "set-default", .name = "set-default",
.positional_args = "ID", .positional_args = "ID",
...@@ -850,6 +864,7 @@ static const struct subcommand { ...@@ -850,6 +864,7 @@ static const struct subcommand {
.prepare = set_default_prepare, .prepare = set_default_prepare,
.run = set_default_run, .run = set_default_run,
}, },
#endif
{ {
.name = "set-volume", .name = "set-volume",
.positional_args = "ID VOL", .positional_args = "ID VOL",
...@@ -889,8 +904,6 @@ main (gint argc, gchar **argv) ...@@ -889,8 +904,6 @@ main (gint argc, gchar **argv)
const struct subcommand *cmd = NULL; const struct subcommand *cmd = NULL;
g_autoptr (GError) error = NULL; g_autoptr (GError) error = NULL;
g_autofree gchar *summary = NULL; g_autofree gchar *summary = NULL;
g_autofree gchar *group_desc = NULL;
g_autofree gchar *group_help_desc = NULL;
wp_init (WP_INIT_ALL); wp_init (WP_INIT_ALL);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment