2 * Copyright © 2010 Codethink Limited
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the licence, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
19 * Author: Ryan Lortie <desrt@desrt.ca>
31 contained (const gchar
* const *items
,
35 if (strcmp (*items
++, item
) == 0)
42 is_schema (const gchar
*schema
)
44 return contained (g_settings_list_schemas (), schema
);
48 is_relocatable_schema (const gchar
*schema
)
50 return contained (g_settings_list_relocatable_schemas (), schema
);
54 check_relocatable_schema (const gchar
*schema
)
56 if (is_relocatable_schema (schema
))
59 if (is_schema (schema
))
60 g_printerr (_("Schema '%s' is not relocatable "
61 "(path must not be specified)\n"),
65 g_printerr (_("No such schema '%s'\n"), schema
);
71 check_schema (const gchar
*schema
)
73 if (is_schema (schema
))
76 if (is_relocatable_schema (schema
))
77 g_printerr (_("Schema '%s' is relocatable "
78 "(path must be specified)\n"),
82 g_printerr (_("No such schema '%s'\n"), schema
);
88 check_path (const gchar
*path
)
92 g_printerr (_("Empty path given.\n"));
98 g_printerr (_("Path must begin with a slash (/)\n"));
102 if (!g_str_has_suffix (path
, "/"))
104 g_printerr (_("Path must end with a slash (/)\n"));
108 if (strstr (path
, "//"))
110 g_printerr (_("Path must not contain two adjacent slashes (//)\n"));
118 check_key (GSettings
*settings
,
124 keys
= g_settings_list_keys (settings
);
125 good
= contained ((const gchar
**) keys
, key
);
131 g_printerr (_("No such key '%s'\n"), key
);
137 output_list (const gchar
* const *list
)
141 for (i
= 0; list
[i
]; i
++)
142 g_print ("%s\n", list
[i
]);
146 gsettings_list_schemas (GSettings
*settings
,
150 output_list (g_settings_list_schemas ());
154 gsettings_list_relocatable_schemas (GSettings
*settings
,
158 output_list (g_settings_list_relocatable_schemas ());
162 gsettings_list_keys (GSettings
*settings
,
168 keys
= g_settings_list_keys (settings
);
169 output_list ((const gchar
**) keys
);
174 gsettings_list_children (GSettings
*settings
,
182 children
= g_settings_list_children (settings
);
183 for (i
= 0; children
[i
]; i
++)
184 if (strlen (children
[i
]) > max
)
185 max
= strlen (children
[i
]);
187 for (i
= 0; children
[i
]; i
++)
193 child
= g_settings_get_child (settings
, children
[i
]);
199 if (is_schema (schema
))
200 g_print ("%-*s %s\n", max
, children
[i
], schema
);
202 g_print ("%-*s %s:%s\n", max
, children
[i
], schema
, path
);
204 g_object_unref (child
);
209 g_strfreev (children
);
213 enumerate (GSettings
*settings
)
219 g_object_get (settings
, "schema", &schema
, NULL
);
221 keys
= g_settings_list_keys (settings
);
222 for (i
= 0; keys
[i
]; i
++)
227 value
= g_settings_get_value (settings
, keys
[i
]);
228 printed
= g_variant_print (value
, TRUE
);
229 g_print ("%s %s %s\n", schema
, keys
[i
], printed
);
230 g_variant_unref (value
);
239 gsettings_list_recursively (GSettings
*settings
,
248 enumerate (settings
);
249 children
= g_settings_list_children (settings
);
250 for (i
= 0; children
[i
]; i
++)
255 child
= g_settings_get_child (settings
, children
[i
]);
256 g_object_get (child
, "schema", &schema
, NULL
);
258 if (is_schema (schema
))
261 g_object_unref (child
);
265 g_strfreev (children
);
269 const gchar
* const *schemas
;
272 schemas
= g_settings_list_schemas ();
274 for (i
= 0; schemas
[i
]; i
++)
276 settings
= g_settings_new (schemas
[i
]);
277 enumerate (settings
);
278 g_object_unref (settings
);
284 gsettings_range (GSettings
*settings
,
288 GVariant
*range
, *detail
;
291 range
= g_settings_get_range (settings
, key
);
292 g_variant_get (range
, "(&sv)", &type
, &detail
);
294 if (strcmp (type
, "type") == 0)
295 g_print ("type %s\n", g_variant_get_type_string (detail
) + 1);
297 else if (strcmp (type
, "range") == 0)
302 g_variant_get (detail
, "(**)", &min
, &max
);
303 smin
= g_variant_print (min
, FALSE
);
304 smax
= g_variant_print (max
, FALSE
);
306 g_print ("range %s %s %s\n",
307 g_variant_get_type_string (min
), smin
, smax
);
308 g_variant_unref (min
);
309 g_variant_unref (max
);
314 else if (strcmp (type
, "enum") == 0 || strcmp (type
, "flags") == 0)
319 g_print ("%s\n", type
);
321 g_variant_iter_init (&iter
, detail
);
322 while (g_variant_iter_loop (&iter
, "*", &item
))
326 printed
= g_variant_print (item
, FALSE
);
327 g_print ("%s\n", printed
);
332 g_variant_unref (detail
);
333 g_variant_unref (range
);
337 gsettings_get (GSettings
*settings
,
344 value
= g_settings_get_value (settings
, key
);
345 printed
= g_variant_print (value
, TRUE
);
346 g_print ("%s\n", printed
);
347 g_variant_unref (value
);
352 gsettings_reset (GSettings
*settings
,
356 g_settings_reset (settings
, key
);
361 reset_all_keys (GSettings
*settings
)
366 keys
= g_settings_list_keys (settings
);
367 for (i
= 0; keys
[i
]; i
++)
369 g_settings_reset (settings
, keys
[i
]);
376 gsettings_reset_recursively (GSettings
*settings
,
383 g_settings_delay (settings
);
385 reset_all_keys (settings
);
386 children
= g_settings_list_children (settings
);
387 for (i
= 0; children
[i
]; i
++)
392 child
= g_settings_get_child (settings
, children
[i
]);
393 g_object_get (child
, "schema", &schema
, NULL
);
395 if (is_schema (schema
))
396 reset_all_keys (child
);
398 g_object_unref (child
);
402 g_strfreev (children
);
404 g_settings_apply (settings
);
409 gsettings_writable (GSettings
*settings
,
414 g_settings_is_writable (settings
, key
) ?
419 value_changed (GSettings
*settings
,
426 value
= g_settings_get_value (settings
, key
);
427 printed
= g_variant_print (value
, TRUE
);
428 g_print ("%s: %s\n", key
, printed
);
429 g_variant_unref (value
);
434 gsettings_monitor (GSettings
*settings
,
442 name
= g_strdup_printf ("changed::%s", key
);
443 g_signal_connect (settings
, name
, G_CALLBACK (value_changed
), NULL
);
446 g_signal_connect (settings
, "changed", G_CALLBACK (value_changed
), NULL
);
448 g_main_loop_run (g_main_loop_new (NULL
, FALSE
));
452 gsettings_set (GSettings
*settings
,
456 const GVariantType
*type
;
457 GError
*error
= NULL
;
460 gchar
*freeme
= NULL
;
462 existing
= g_settings_get_value (settings
, key
);
463 type
= g_variant_get_type (existing
);
465 new = g_variant_parse (type
, value
, NULL
, NULL
, &error
);
467 /* If that didn't work and the type is string then we should assume
468 * that the user is just trying to set a string directly and forgot
469 * the quotes (or had them consumed by the shell).
471 * If the user started with a quote then we assume that some deeper
472 * problem is at play and we want the failure in that case.
476 * gsettings set x.y.z key "'i don't expect this to work'"
478 * Note that we should not just add quotes and try parsing again, but
479 * rather assume that the user is providing us with a bare string.
480 * Assume we added single quotes, then consider this case:
482 * gsettings set x.y.z key "i'd expect this to work"
484 * A similar example could be given for double quotes.
486 * Avoid that whole mess by just using g_variant_new_string().
489 g_variant_type_equal (type
, G_VARIANT_TYPE_STRING
) &&
490 value
[0] != '\'' && value
[0] != '"')
492 g_clear_error (&error
);
493 new = g_variant_new_string (value
);
498 g_printerr ("%s\n", error
->message
);
502 if (!g_settings_range_check (settings
, key
, new))
504 g_printerr (_("The provided value is outside of the valid range\n"));
505 g_variant_unref (new);
509 g_settings_set_value (settings
, key
, new);
510 g_variant_unref (existing
);
511 g_variant_unref (new);
519 gsettings_help (gboolean requested
,
520 const gchar
*command
)
522 const gchar
*description
;
523 const gchar
*synopsis
;
526 string
= g_string_new (NULL
);
531 else if (strcmp (command
, "help") == 0)
533 description
= _("Print help");
534 synopsis
= "[COMMAND]";
537 else if (strcmp (command
, "list-schemas") == 0)
539 description
= _("List the installed (non-relocatable) schemas");
543 else if (strcmp (command
, "list-relocatable-schemas") == 0)
545 description
= _("List the installed relocatable schemas");
549 else if (strcmp (command
, "list-keys") == 0)
551 description
= _("List the keys in SCHEMA");
552 synopsis
= N_("SCHEMA[:PATH]");
555 else if (strcmp (command
, "list-children") == 0)
557 description
= _("List the children of SCHEMA");
558 synopsis
= N_("SCHEMA[:PATH]");
561 else if (strcmp (command
, "list-recursively") == 0)
563 description
= _("List keys and values, recursively\n"
564 "If no SCHEMA is given, list all keys\n");
565 synopsis
= N_("[SCHEMA[:PATH]]");
568 else if (strcmp (command
, "get") == 0)
570 description
= _("Get the value of KEY");
571 synopsis
= N_("SCHEMA[:PATH] KEY");
574 else if (strcmp (command
, "range") == 0)
576 description
= _("Query the range of valid values for KEY");
577 synopsis
= N_("SCHEMA[:PATH] KEY");
580 else if (strcmp (command
, "set") == 0)
582 description
= _("Set the value of KEY to VALUE");
583 synopsis
= N_("SCHEMA[:PATH] KEY VALUE");
586 else if (strcmp (command
, "reset") == 0)
588 description
= _("Reset KEY to its default value");
589 synopsis
= N_("SCHEMA[:PATH] KEY");
592 else if (strcmp (command
, "reset-recursively") == 0)
594 description
= _("Reset all keys in SCHEMA to their defaults");
595 synopsis
= N_("SCHEMA[:PATH]");
598 else if (strcmp (command
, "writable") == 0)
600 description
= _("Check if KEY is writable");
601 synopsis
= N_("SCHEMA[:PATH] KEY");
604 else if (strcmp (command
, "monitor") == 0)
606 description
= _("Monitor KEY for changes.\n"
607 "If no KEY is specified, monitor all keys in SCHEMA.\n"
608 "Use ^C to stop monitoring.\n");
609 synopsis
= N_("SCHEMA[:PATH] [KEY]");
613 g_string_printf (string
, _("Unknown command %s\n\n"), command
);
620 g_string_append (string
,
622 " gsettings COMMAND [ARGS...]\n"
625 " help Show this information\n"
626 " list-schemas List installed schemas\n"
627 " list-relocatable-schemas List relocatable schemas\n"
628 " list-keys List keys in a schema\n"
629 " list-children List children of a schema\n"
630 " list-recursively List keys and values, recursively\n"
631 " range Queries the range of a key\n"
632 " get Get the value of a key\n"
633 " set Set the value of a key\n"
634 " reset Reset the value of a key\n"
635 " reset-recursively Reset all values in a given schema\n"
636 " writable Check if a key is writable\n"
637 " monitor Watch for changes\n"
639 "Use 'gsettings help COMMAND' to get detailed help.\n\n"));
643 g_string_append_printf (string
, _("Usage:\n gsettings %s %s\n\n%s\n\n"),
644 command
, synopsis
[0] ? _(synopsis
) : "", description
);
648 g_string_append (string
, _("Arguments:\n"));
650 if (strstr (synopsis
, "[COMMAND]"))
651 g_string_append (string
,
652 _(" COMMAND The (optional) command to explain\n"));
654 else if (strstr (synopsis
, "SCHEMA"))
655 g_string_append (string
,
656 _(" SCHEMA The name of the schema\n"
657 " PATH The path, for relocatable schemas\n"));
659 if (strstr (synopsis
, "[KEY]"))
660 g_string_append (string
,
661 _(" KEY The (optional) key within the schema\n"));
663 else if (strstr (synopsis
, "KEY"))
664 g_string_append (string
,
665 _(" KEY The key within the schema\n"));
667 if (strstr (synopsis
, "VALUE"))
668 g_string_append (string
,
669 _(" VALUE The value to set\n"));
671 g_string_append (string
, "\n");
676 g_print ("%s", string
->str
);
678 g_printerr ("%s\n", string
->str
);
680 g_string_free (string
, TRUE
);
682 return requested
? 0 : 1;
687 main (int argc
, char **argv
)
689 void (* function
) (GSettings
*, const gchar
*, const gchar
*);
694 extern gchar
*_glib_get_locale_dir (void);
698 setlocale (LC_ALL
, "");
699 textdomain (GETTEXT_PACKAGE
);
702 tmp
= _glib_get_locale_dir ();
703 bindtextdomain (GETTEXT_PACKAGE
, tmp
);
706 bindtextdomain (GETTEXT_PACKAGE
, GLIB_LOCALE_DIR
);
709 #ifdef HAVE_BIND_TEXTDOMAIN_CODESET
710 bind_textdomain_codeset (GETTEXT_PACKAGE
, "UTF-8");
714 return gsettings_help (FALSE
, NULL
);
716 else if (strcmp (argv
[1], "help") == 0)
717 return gsettings_help (TRUE
, argv
[2]);
719 else if (argc
== 2 && strcmp (argv
[1], "list-schemas") == 0)
720 function
= gsettings_list_schemas
;
722 else if (argc
== 2 && strcmp (argv
[1], "list-relocatable-schemas") == 0)
723 function
= gsettings_list_relocatable_schemas
;
725 else if (argc
== 3 && strcmp (argv
[1], "list-keys") == 0)
726 function
= gsettings_list_keys
;
728 else if (argc
== 3 && strcmp (argv
[1], "list-children") == 0)
729 function
= gsettings_list_children
;
731 else if ((argc
== 2 || argc
== 3) && strcmp (argv
[1], "list-recursively") == 0)
732 function
= gsettings_list_recursively
;
734 else if (argc
== 4 && strcmp (argv
[1], "range") == 0)
735 function
= gsettings_range
;
737 else if (argc
== 4 && strcmp (argv
[1], "get") == 0)
738 function
= gsettings_get
;
740 else if (argc
== 5 && strcmp (argv
[1], "set") == 0)
741 function
= gsettings_set
;
743 else if (argc
== 4 && strcmp (argv
[1], "reset") == 0)
744 function
= gsettings_reset
;
746 else if (argc
== 3 && strcmp (argv
[1], "reset-recursively") == 0)
747 function
= gsettings_reset_recursively
;
749 else if (argc
== 4 && strcmp (argv
[1], "writable") == 0)
750 function
= gsettings_writable
;
752 else if ((argc
== 3 || argc
== 4) && strcmp (argv
[1], "monitor") == 0)
753 function
= gsettings_monitor
;
756 return gsettings_help (FALSE
, argv
[1]);
764 if (argv
[2][0] == '\0')
766 g_printerr (_("Empty schema name given\n"));
770 parts
= g_strsplit (argv
[2], ":", 2);
774 if (!check_relocatable_schema (parts
[0]) || !check_path (parts
[1]))
777 settings
= g_settings_new_with_path (parts
[0], parts
[1]);
781 if (!check_schema (parts
[0]))
784 settings
= g_settings_new (parts
[0]);
794 if (!check_key (settings
, argv
[3]))
802 (* function
) (settings
, key
, argc
> 4 ? argv
[4] : NULL
);
804 if (settings
!= NULL
)
805 g_object_unref (settings
);