summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS41
-rw-r--r--README.md12
-rw-r--r--README.win32.md13
-rw-r--r--docs/reference/gio/gio-docs.xml132
-rw-r--r--docs/reference/gio/gio-sections-win32.txt10
-rw-r--r--docs/reference/glib/glib-docs.xml166
-rw-r--r--docs/reference/glib/glib-sections.txt.in2
-rw-r--r--docs/reference/gobject/gobject-docs.xml132
-rw-r--r--docs/reference/gobject/tut_gobject.xml2
-rw-r--r--docs/reference/gobject/tut_gtype.xml16
-rw-r--r--docs/reference/gobject/tut_howto.xml2
-rw-r--r--fuzzing/fuzz_utf8_normalize.c48
-rw-r--r--fuzzing/meson.build1
-rw-r--r--gio/gactiongroup.c25
-rw-r--r--gio/gactiongroup.h2
-rw-r--r--gio/gappinfo.c35
-rw-r--r--gio/gdbusconnection.c46
-rw-r--r--gio/gdbusprivate.c82
-rw-r--r--gio/gdebugcontrollerdbus.c7
-rw-r--r--gio/gfileenumerator.c59
-rw-r--r--gio/gfileinfo.c9
-rw-r--r--gio/gio-tool-info.c8
-rw-r--r--gio/gio-tool-list.c9
-rw-r--r--gio/gio-tool-tree.c11
-rw-r--r--gio/gioenums.h3
-rw-r--r--gio/giomodule.c2
-rw-r--r--gio/glocalfile.c37
-rw-r--r--gio/gpollableinputstream.c14
-rw-r--r--gio/gpollableoutputstream.c17
-rw-r--r--gio/gpollfilemonitor.c4
-rw-r--r--gio/gregistrysettingsbackend.c432
-rw-r--r--gio/gregistrysettingsbackend.h4
-rw-r--r--gio/gsettingsbackendinternal.h4
-rw-r--r--gio/gsocket.c93
-rw-r--r--gio/gtestdbus.c2
-rw-r--r--gio/gwin32appinfo.c2
-rw-r--r--gio/inotify/inotify-kernel.c15
-rw-r--r--gio/inotify/inotify-sub.c2
-rw-r--r--gio/meson.build8
-rw-r--r--gio/tests/.gitignore146
-rw-r--r--gio/tests/appmonitor.c100
-rw-r--r--gio/tests/file.c85
-rw-r--r--gio/tests/gdbus-example-proxy-subclass.c102
-rw-r--r--gio/tests/meson.build4
-rw-r--r--gio/tests/testfilemonitor.c31
-rw-r--r--glib/gbacktrace.c4
-rw-r--r--glib/gdatetime.c142
-rw-r--r--glib/ghash.c5
-rw-r--r--glib/glib-unix.c20
-rw-r--r--glib/glib-unixprivate.h56
-rw-r--r--glib/gmacros.h8
-rw-r--r--glib/gmarkup.c5
-rw-r--r--glib/goption.c2
-rw-r--r--glib/gspawn-win32.c90
-rw-r--r--glib/gstrfuncs.c2
-rw-r--r--glib/gstrfuncs.h43
-rw-r--r--glib/gtestutils.c6
-rw-r--r--glib/gthread-posix.c27
-rw-r--r--glib/gtimer.c3
-rw-r--r--glib/gunicode.h2
-rw-r--r--glib/gunidecomp.c39
-rw-r--r--glib/gvariant.c9
-rw-r--r--glib/gvariant.h10
-rw-r--r--glib/gwakeup.c2
-rw-r--r--glib/gwin32.c4
-rw-r--r--glib/meson.build4
-rw-r--r--glib/msvc_recommended_pragmas.h (renamed from msvc_recommended_pragmas.h)0
-rw-r--r--glib/tests/.gitignore89
-rw-r--r--glib/tests/NormalizationTest.txt92
-rw-r--r--glib/tests/cxx.cpp32
-rw-r--r--glib/tests/mainloop.c5
-rw-r--r--glib/tests/markup-example.c168
-rw-r--r--glib/tests/meson.build1
-rw-r--r--glib/tests/queue.c344
-rw-r--r--glib/tests/spawn-test.c151
-rw-r--r--glib/tests/strfuncs.c10
-rw-r--r--glib/tests/timer.c24
-rw-r--r--glib/tests/unicode-normalize.c38
-rw-r--r--glib/tests/unicode.c52
-rw-r--r--gmodule/meson.build6
-rw-r--r--gobject/gsignal.c45
-rw-r--r--gobject/gtype.h45
-rw-r--r--gobject/gvalue.c2
-rw-r--r--gobject/tests/.gitignore18
-rw-r--r--gobject/tests/signals.c16
-rw-r--r--gobject/tests/type-flags.c37
-rw-r--r--meson.build25
-rw-r--r--po/bg.po2
-rw-r--r--po/fa.po1064
-rw-r--r--po/zh_CN.po1085
-rwxr-xr-xtools/check-abis.sh23
91 files changed, 3507 insertions, 2327 deletions
diff --git a/NEWS b/NEWS
index fdee84b7f..5e202bd0f 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,44 @@
+Overview of changes in GLib 2.76.1, 2023-03-22
+==============================================
+
+* Fix build failures in third party C++ projects using `g_strdup()` via C++
+ qualified symbol lookup (#2936, work by Xi Ruoyao)
+
+* Downgrade critical warnings from `GFileInfo` about missing attributes to debug
+ messages, as it was affecting too many apps; the critical warnings will be
+ reinstated early in the 2.78 cycle, so apps should continue to fix their
+ ambiguous use of `GFileInfo` API (#2948, work by Philip Withnall)
+
+* Bugs fixed:
+ - #159 g_strstr_len() ignores haystack_len (Philip Withnall)
+ - #352 Docs for g_file_enumerator_next_files_async () are unclear about end
+ condition (Owen Taylor)
+ - #919 g_variant_dict_lookup is unclear about what happens on failure (Philip
+ Withnall)
+ - #2922 GWin32AppInfo: Missing NULL string check (Luca Bacci)
+ - #2936 Possible regression in 2.75.3 when used from C++ due to g_strdup
+ becoming a macro
+ - #2943 Meson fails TAP test when g_test_message is called before g_test_init
+ (Philip Withnall)
+ - #2948 gio list triggers 'GFileInfo created without …' warnings for trash,
+ smb and google-drive GVFS backends (Philip Withnall)
+ - !3241 inotify: Avoid empty root directory string
+ - !3315 tests: Change the time function used in the bookmark tests
+ - !3318 gmacros: Add GCC < 5 fallback for __always_inline__
+ - !3319 fuzzing: do not build tests if build_tests is false
+ - !3321 tests: only build messages-low-memory if RTLD_NEXT is available
+ - !3323 tests: Fix timeout sources in gdbus-auth and gapplication tests
+ - !3324 tests: Reduce number of iterations in queue test
+ - !3325 gdesktopappinfo: Add a missing NULL check
+ - !3330 tests: Check a few results in strfuncs tests
+ - !3338 gfileinfo: Temporarily downgrade missing attribute criticals to debugs
+
+* Translation updates:
+ - French (Guillaume Bernard)
+ - Persian (Danial Behzadi)
+ - Turkish (Sabri Ünal)
+
+
Overview of changes in GLib 2.76.0, 2023-03-10
==============================================
diff --git a/README.md b/README.md
index e78a28c2c..acf2e0f83 100644
--- a/README.md
+++ b/README.md
@@ -79,15 +79,3 @@ Closes: #123
Otherwise, create a new merge request that introduces the change. Filing a
separate issue is not required.
-## Default branch renamed to `main`
-
-The default development branch of GLib has been renamed to `main`. To update
-your local checkout, use:
-```sh
-git checkout master
-git branch -m master main
-git fetch
-git branch --unset-upstream
-git branch -u origin/main
-git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/main
-```
diff --git a/README.win32.md b/README.win32.md
index 65f9e78e7..7f11e571e 100644
--- a/README.win32.md
+++ b/README.win32.md
@@ -30,17 +30,16 @@ On Windows setting up a correct build environment is very similar to typing
The following preprocessor macros are to be used for conditional
compilation related to Win32 in GLib-using code:
-- `G_OS_WIN32` is defined when compiling for native Win32, without
- any POSIX emulation, other than to the extent provided by the
- bundled Microsoft C library.
+- `G_OS_WIN32` and `G_PLATFORM_WIN32` are defined when compiling for native
+ Win32, without any POSIX emulation, other than to the extent provided by
+ the bundled Microsoft C library. Either can be used to check when
+ conditionally compiling GLib-using code for Win32.
- `G_WITH_CYGWIN` is defined if compiling for the Cygwin
environment. Note that `G_OS_WIN32` is *not* defined in that case, as
Cygwin is supposed to behave like Unix. `G_OS_UNIX` *is* defined by a GLib
- for Cygwin.
-
-- `G_PLATFORM_WIN32` is defined when either `G_OS_WIN32` or `G_WITH_CYGWIN`
- is defined.
+ for Cygwin, but `G_PLATFORM_WIN32` is *no longer* defined by GLib for
+ Cygwin.
These macros are defined in `glibconfig.h`, and are thus available in
all source files that include `<glib.h>`.
diff --git a/docs/reference/gio/gio-docs.xml b/docs/reference/gio/gio-docs.xml
index b3dd9f0c9..c68bf8a08 100644
--- a/docs/reference/gio/gio-docs.xml
+++ b/docs/reference/gio/gio-docs.xml
@@ -280,134 +280,138 @@
<xi:include href="xml/tree_index.sgml"/>
</chapter>
- <index id="api-index-full">
+ <chapter id="api-index-full">
<title id="index-all">Index</title>
<xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-deprecated" role="deprecated">
+ </chapter>
+ <chapter id="api-index-deprecated" role="deprecated">
<title>Index of deprecated symbols</title>
<xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-18" role="2.18">
+ </chapter>
+ <chapter id="api-index-2-18" role="2.18">
<title>Index of new symbols in 2.18</title>
<xi:include href="xml/api-index-2.18.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-20" role="2.20">
+ </chapter>
+ <chapter id="api-index-2-20" role="2.20">
<title>Index of new symbols in 2.20</title>
<xi:include href="xml/api-index-2.20.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-22" role="2.22">
+ </chapter>
+ <chapter id="api-index-2-22" role="2.22">
<title>Index of new symbols in 2.22</title>
<xi:include href="xml/api-index-2.22.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-24" role="2.24">
+ </chapter>
+ <chapter id="api-index-2-24" role="2.24">
<title>Index of new symbols in 2.24</title>
<xi:include href="xml/api-index-2.24.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-26" role="2.26">
+ </chapter>
+ <chapter id="api-index-2-26" role="2.26">
<title>Index of new symbols in 2.26</title>
<xi:include href="xml/api-index-2.26.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-28" role="2.28">
+ </chapter>
+ <chapter id="api-index-2-28" role="2.28">
<title>Index of new symbols in 2.28</title>
<xi:include href="xml/api-index-2.28.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-30" role="2.30">
+ </chapter>
+ <chapter id="api-index-2-30" role="2.30">
<title>Index of new symbols in 2.30</title>
<xi:include href="xml/api-index-2.30.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-32" role="2.32">
+ </chapter>
+ <chapter id="api-index-2-32" role="2.32">
<title>Index of new symbols in 2.32</title>
<xi:include href="xml/api-index-2.32.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-34" role="2.34">
+ </chapter>
+ <chapter id="api-index-2-34" role="2.34">
<title>Index of new symbols in 2.34</title>
<xi:include href="xml/api-index-2.34.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-36" role="2.36">
+ </chapter>
+ <chapter id="api-index-2-36" role="2.36">
<title>Index of new symbols in 2.36</title>
<xi:include href="xml/api-index-2.36.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-38" role="2.38">
+ </chapter>
+ <chapter id="api-index-2-38" role="2.38">
<title>Index of new symbols in 2.38</title>
<xi:include href="xml/api-index-2.38.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-40" role="2.40">
+ </chapter>
+ <chapter id="api-index-2-40" role="2.40">
<title>Index of new symbols in 2.40</title>
<xi:include href="xml/api-index-2.40.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-42" role="2.42">
+ </chapter>
+ <chapter id="api-index-2-42" role="2.42">
<title>Index of new symbols in 2.42</title>
<xi:include href="xml/api-index-2.42.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-44" role="2.44">
+ </chapter>
+ <chapter id="api-index-2-44" role="2.44">
<title>Index of new symbols in 2.44</title>
<xi:include href="xml/api-index-2.44.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-46" role="2.46">
+ </chapter>
+ <chapter id="api-index-2-46" role="2.46">
<title>Index of new symbols in 2.46</title>
<xi:include href="xml/api-index-2.46.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-48" role="2.48">
+ </chapter>
+ <chapter id="api-index-2-48" role="2.48">
<title>Index of new symbols in 2.48</title>
<xi:include href="xml/api-index-2.48.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-50" role="2.50">
+ </chapter>
+ <chapter id="api-index-2-50" role="2.50">
<title>Index of new symbols in 2.50</title>
<xi:include href="xml/api-index-2.50.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-52" role="2.52">
+ </chapter>
+ <chapter id="api-index-2-52" role="2.52">
<title>Index of new symbols in 2.52</title>
<xi:include href="xml/api-index-2.52.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-54" role="2.54">
+ </chapter>
+ <chapter id="api-index-2-54" role="2.54">
<title>Index of new symbols in 2.54</title>
<xi:include href="xml/api-index-2.54.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-56" role="2.56">
+ </chapter>
+ <chapter id="api-index-2-56" role="2.56">
<title>Index of new symbols in 2.56</title>
<xi:include href="xml/api-index-2.56.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-58" role="2.58">
+ </chapter>
+ <chapter id="api-index-2-58" role="2.58">
<title>Index of new symbols in 2.58</title>
<xi:include href="xml/api-index-2.58.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-60" role="2.60">
+ </chapter>
+ <chapter id="api-index-2-60" role="2.60">
<title>Index of new symbols in 2.60</title>
<xi:include href="xml/api-index-2.60.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-62" role="2.62">
+ </chapter>
+ <chapter id="api-index-2-62" role="2.62">
<title>Index of new symbols in 2.62</title>
<xi:include href="xml/api-index-2.62.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-64" role="2.64">
+ </chapter>
+ <chapter id="api-index-2-64" role="2.64">
<title>Index of new symbols in 2.64</title>
<xi:include href="xml/api-index-2.64.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-66" role="2.66">
+ </chapter>
+ <chapter id="api-index-2-66" role="2.66">
<title>Index of new symbols in 2.66</title>
<xi:include href="xml/api-index-2.66.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-68" role="2.68">
+ </chapter>
+ <chapter id="api-index-2-68" role="2.68">
<title>Index of new symbols in 2.68</title>
<xi:include href="xml/api-index-2.68.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-70" role="2.70">
+ </chapter>
+ <chapter id="api-index-2-70" role="2.70">
<title>Index of new symbols in 2.70</title>
<xi:include href="xml/api-index-2.70.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-72" role="2.72">
+ </chapter>
+ <chapter id="api-index-2-72" role="2.72">
<title>Index of new symbols in 2.72</title>
<xi:include href="xml/api-index-2.72.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-74" role="2.74">
+ </chapter>
+ <chapter id="api-index-2-74" role="2.74">
<title>Index of new symbols in 2.74</title>
<xi:include href="xml/api-index-2.74.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-76" role="2.76">
+ </chapter>
+ <chapter id="api-index-2-76" role="2.76">
<title>Index of new symbols in 2.76</title>
<xi:include href="xml/api-index-2.76.xml"><xi:fallback /></xi:include>
- </index>
+ </chapter>
+ <chapter id="api-index-2-78" role="2.78">
+ <title>Index of new symbols in 2.78</title>
+ <xi:include href="xml/api-index-2.78.xml"><xi:fallback /></xi:include>
+ </chapter>
<xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
diff --git a/docs/reference/gio/gio-sections-win32.txt b/docs/reference/gio/gio-sections-win32.txt
index 52d137e93..de60cddc8 100644
--- a/docs/reference/gio/gio-sections-win32.txt
+++ b/docs/reference/gio/gio-sections-win32.txt
@@ -110,3 +110,13 @@ G_WIN32_REGISTRY_KEY_GET_CLASS
G_TYPE_WIN32_REGISTRY_SUBKEY_ITER
G_TYPE_WIN32_REGISTRY_VALUE_ITER
</SECTION>
+
+<SECTION>
+<FILE>gregistrysettingsbackend</FILE>
+<TITLE>GRegistrySettingsBackend</TITLE>
+GRegistrySettingsBackend
+g_registry_settings_backend_new
+
+<SUBSECTION Private>
+g_registry_settings_backend_get_type
+</SECTION>
diff --git a/docs/reference/glib/glib-docs.xml b/docs/reference/glib/glib-docs.xml
index a21bfde98..07b096f22 100644
--- a/docs/reference/glib/glib-docs.xml
+++ b/docs/reference/glib/glib-docs.xml
@@ -85,7 +85,7 @@
<xi:include href="xml/guri.xml" />
<xi:include href="xml/ghostutils.xml" />
<xi:include href="xml/shell.xml" />
- <xi:include href="xml/option.xml" />
+ <xi:include href="xml/goptioncontext.xml" />
<xi:include href="xml/patterns.xml" />
<xi:include href="xml/gregex.xml" />
<xi:include href="regex-syntax.xml" />
@@ -145,166 +145,170 @@
<xi:include href="gtester-report.xml" />
</chapter>
- <index id="api-index-full">
+ <chapter id="api-index-full">
<title>Index</title>
<xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-deprecated" role="deprecated">
+ </chapter>
+ <chapter id="api-index-deprecated" role="deprecated">
<title>Index of deprecated symbols</title>
<xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-2" role="2.2">
+ </chapter>
+ <chapter id="api-index-2-2" role="2.2">
<title>Index of new symbols in 2.2</title>
<xi:include href="xml/api-index-2.2.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-4" role="2.4">
+ </chapter>
+ <chapter id="api-index-2-4" role="2.4">
<title>Index of new symbols in 2.4</title>
<xi:include href="xml/api-index-2.4.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-6" role="2.6">
+ </chapter>
+ <chapter id="api-index-2-6" role="2.6">
<title>Index of new symbols in 2.6</title>
<xi:include href="xml/api-index-2.6.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-8" role="2.8">
+ </chapter>
+ <chapter id="api-index-2-8" role="2.8">
<title>Index of new symbols in 2.8</title>
<xi:include href="xml/api-index-2.8.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-10" role="2.10">
+ </chapter>
+ <chapter id="api-index-2-10" role="2.10">
<title>Index of new symbols in 2.10</title>
<xi:include href="xml/api-index-2.10.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-12" role="2.12">
+ </chapter>
+ <chapter id="api-index-2-12" role="2.12">
<title>Index of new symbols in 2.12</title>
<xi:include href="xml/api-index-2.12.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-14" role="2.14">
+ </chapter>
+ <chapter id="api-index-2-14" role="2.14">
<title>Index of new symbols in 2.14</title>
<xi:include href="xml/api-index-2.14.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-16" role="2.16">
+ </chapter>
+ <chapter id="api-index-2-16" role="2.16">
<title>Index of new symbols in 2.16</title>
<xi:include href="xml/api-index-2.16.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-18" role="2.18">
+ </chapter>
+ <chapter id="api-index-2-18" role="2.18">
<title>Index of new symbols in 2.18</title>
<xi:include href="xml/api-index-2.18.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-20" role="2.20">
+ </chapter>
+ <chapter id="api-index-2-20" role="2.20">
<title>Index of new symbols in 2.20</title>
<xi:include href="xml/api-index-2.20.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-22" role="2.22">
+ </chapter>
+ <chapter id="api-index-2-22" role="2.22">
<title>Index of new symbols in 2.22</title>
<xi:include href="xml/api-index-2.22.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-24" role="2.24">
+ </chapter>
+ <chapter id="api-index-2-24" role="2.24">
<title>Index of new symbols in 2.24</title>
<xi:include href="xml/api-index-2.24.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-26" role="2.26">
+ </chapter>
+ <chapter id="api-index-2-26" role="2.26">
<title>Index of new symbols in 2.26</title>
<xi:include href="xml/api-index-2.26.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-28" role="2.28">
+ </chapter>
+ <chapter id="api-index-2-28" role="2.28">
<title>Index of new symbols in 2.28</title>
<xi:include href="xml/api-index-2.28.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-30" role="2.30">
+ </chapter>
+ <chapter id="api-index-2-30" role="2.30">
<title>Index of new symbols in 2.30</title>
<xi:include href="xml/api-index-2.30.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-32" role="2.32">
+ </chapter>
+ <chapter id="api-index-2-32" role="2.32">
<title>Index of new symbols in 2.32</title>
<xi:include href="xml/api-index-2.32.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-34" role="2.34">
+ </chapter>
+ <chapter id="api-index-2-34" role="2.34">
<title>Index of new symbols in 2.34</title>
<xi:include href="xml/api-index-2.34.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-36" role="2.36">
+ </chapter>
+ <chapter id="api-index-2-36" role="2.36">
<title>Index of new symbols in 2.36</title>
<xi:include href="xml/api-index-2.36.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-38" role="2.38">
+ </chapter>
+ <chapter id="api-index-2-38" role="2.38">
<title>Index of new symbols in 2.38</title>
<xi:include href="xml/api-index-2.38.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-40" role="2.40">
+ </chapter>
+ <chapter id="api-index-2-40" role="2.40">
<title>Index of new symbols in 2.40</title>
<xi:include href="xml/api-index-2.40.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-42" role="2.42">
+ </chapter>
+ <chapter id="api-index-2-42" role="2.42">
<title>Index of new symbols in 2.42</title>
<xi:include href="xml/api-index-2.42.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-44" role="2.44">
+ </chapter>
+ <chapter id="api-index-2-44" role="2.44">
<title>Index of new symbols in 2.44</title>
<xi:include href="xml/api-index-2.44.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-46" role="2.46">
+ </chapter>
+ <chapter id="api-index-2-46" role="2.46">
<title>Index of new symbols in 2.46</title>
<xi:include href="xml/api-index-2.46.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-48" role="2.48">
+ </chapter>
+ <chapter id="api-index-2-48" role="2.48">
<title>Index of new symbols in 2.48</title>
<xi:include href="xml/api-index-2.48.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-50" role="2.50">
+ </chapter>
+ <chapter id="api-index-2-50" role="2.50">
<title>Index of new symbols in 2.50</title>
<xi:include href="xml/api-index-2.50.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-52" role="2.52">
+ </chapter>
+ <chapter id="api-index-2-52" role="2.52">
<title>Index of new symbols in 2.52</title>
<xi:include href="xml/api-index-2.52.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-54" role="2.54">
+ </chapter>
+ <chapter id="api-index-2-54" role="2.54">
<title>Index of new symbols in 2.54</title>
<xi:include href="xml/api-index-2.54.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-56" role="2.56">
+ </chapter>
+ <chapter id="api-index-2-56" role="2.56">
<title>Index of new symbols in 2.56</title>
<xi:include href="xml/api-index-2.56.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-58" role="2.58">
+ </chapter>
+ <chapter id="api-index-2-58" role="2.58">
<title>Index of new symbols in 2.58</title>
<xi:include href="xml/api-index-2.58.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-60" role="2.60">
+ </chapter>
+ <chapter id="api-index-2-60" role="2.60">
<title>Index of new symbols in 2.60</title>
<xi:include href="xml/api-index-2.60.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-62" role="2.62">
+ </chapter>
+ <chapter id="api-index-2-62" role="2.62">
<title>Index of new symbols in 2.62</title>
<xi:include href="xml/api-index-2.62.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-64" role="2.64">
+ </chapter>
+ <chapter id="api-index-2-64" role="2.64">
<title>Index of new symbols in 2.64</title>
<xi:include href="xml/api-index-2.64.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-66" role="2.66">
+ </chapter>
+ <chapter id="api-index-2-66" role="2.66">
<title>Index of new symbols in 2.66</title>
<xi:include href="xml/api-index-2.66.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-68" role="2.68">
+ </chapter>
+ <chapter id="api-index-2-68" role="2.68">
<title>Index of new symbols in 2.68</title>
<xi:include href="xml/api-index-2.68.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-70" role="2.70">
+ </chapter>
+ <chapter id="api-index-2-70" role="2.70">
<title>Index of new symbols in 2.70</title>
<xi:include href="xml/api-index-2.70.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-72" role="2.72">
+ </chapter>
+ <chapter id="api-index-2-72" role="2.72">
<title>Index of new symbols in 2.72</title>
<xi:include href="xml/api-index-2.72.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-74" role="2.74">
+ </chapter>
+ <chapter id="api-index-2-74" role="2.74">
<title>Index of new symbols in 2.74</title>
<xi:include href="xml/api-index-2.74.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-76" role="2.76">
+ </chapter>
+ <chapter id="api-index-2-76" role="2.76">
<title>Index of new symbols in 2.76</title>
<xi:include href="xml/api-index-2.76.xml"><xi:fallback /></xi:include>
- </index>
+ </chapter>
+ <chapter id="api-index-2-78" role="2.78">
+ <title>Index of new symbols in 2.78</title>
+ <xi:include href="xml/api-index-2.78.xml"><xi:fallback /></xi:include>
+ </chapter>
<xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
diff --git a/docs/reference/glib/glib-sections.txt.in b/docs/reference/glib/glib-sections.txt.in
index f617bbd4b..3703198bd 100644
--- a/docs/reference/glib/glib-sections.txt.in
+++ b/docs/reference/glib/glib-sections.txt.in
@@ -1353,7 +1353,7 @@ g_shell_error_quark
<SECTION>
<TITLE>Commandline option parser</TITLE>
-<FILE>option</FILE>
+<FILE>goptioncontext</FILE>
GOptionError
G_OPTION_ERROR
GOptionArgFunc
diff --git a/docs/reference/gobject/gobject-docs.xml b/docs/reference/gobject/gobject-docs.xml
index ed32c3e97..69147e276 100644
--- a/docs/reference/gobject/gobject-docs.xml
+++ b/docs/reference/gobject/gobject-docs.xml
@@ -98,134 +98,138 @@
<xi:include href="tut_howto.xml" />
<xi:include href="tut_tools.xml" />
- <index id="api-index-full">
+ <chapter id="api-index-full">
<title>Index</title>
<xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-deprecated" role="deprecated">
+ </chapter>
+ <chapter id="api-index-deprecated" role="deprecated">
<title>Index of deprecated symbols</title>
<xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-2" role="2.2">
+ </chapter>
+ <chapter id="api-index-2-2" role="2.2">
<title>Index of new symbols in 2.2</title>
<xi:include href="xml/api-index-2.2.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-4" role="2.4">
+ </chapter>
+ <chapter id="api-index-2-4" role="2.4">
<title>Index of new symbols in 2.4</title>
<xi:include href="xml/api-index-2.4.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-6" role="2.6">
+ </chapter>
+ <chapter id="api-index-2-6" role="2.6">
<title>Index of new symbols in 2.6</title>
<xi:include href="xml/api-index-2.6.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-8" role="2.8">
+ </chapter>
+ <chapter id="api-index-2-8" role="2.8">
<title>Index of new symbols in 2.8</title>
<xi:include href="xml/api-index-2.8.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-10" role="2.10">
+ </chapter>
+ <chapter id="api-index-2-10" role="2.10">
<title>Index of new symbols in 2.10</title>
<xi:include href="xml/api-index-2.10.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-12" role="2.12">
+ </chapter>
+ <chapter id="api-index-2-12" role="2.12">
<title>Index of new symbols in 2.12</title>
<xi:include href="xml/api-index-2.12.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-14" role="2.14">
+ </chapter>
+ <chapter id="api-index-2-14" role="2.14">
<title>Index of new symbols in 2.14</title>
<xi:include href="xml/api-index-2.14.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-18" role="2.18">
+ </chapter>
+ <chapter id="api-index-2-18" role="2.18">
<title>Index of new symbols in 2.18</title>
<xi:include href="xml/api-index-2.18.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-22" role="2.22">
+ </chapter>
+ <chapter id="api-index-2-22" role="2.22">
<title>Index of new symbols in 2.22</title>
<xi:include href="xml/api-index-2.22.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-24" role="2.24">
+ </chapter>
+ <chapter id="api-index-2-24" role="2.24">
<title>Index of new symbols in 2.24</title>
<xi:include href="xml/api-index-2.24.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-26" role="2.26">
+ </chapter>
+ <chapter id="api-index-2-26" role="2.26">
<title>Index of new symbols in 2.26</title>
<xi:include href="xml/api-index-2.26.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-28" role="2.28">
+ </chapter>
+ <chapter id="api-index-2-28" role="2.28">
<title>Index of new symbols in 2.28</title>
<xi:include href="xml/api-index-2.28.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-30" role="2.30">
+ </chapter>
+ <chapter id="api-index-2-30" role="2.30">
<title>Index of new symbols in 2.30</title>
<xi:include href="xml/api-index-2.30.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-32" role="2.32">
+ </chapter>
+ <chapter id="api-index-2-32" role="2.32">
<title>Index of new symbols in 2.32</title>
<xi:include href="xml/api-index-2.32.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-34" role="2.34">
+ </chapter>
+ <chapter id="api-index-2-34" role="2.34">
<title>Index of new symbols in 2.34</title>
<xi:include href="xml/api-index-2.34.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-36" role="2.36">
+ </chapter>
+ <chapter id="api-index-2-36" role="2.36">
<title>Index of new symbols in 2.36</title>
<xi:include href="xml/api-index-2.36.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-38" role="2.38">
+ </chapter>
+ <chapter id="api-index-2-38" role="2.38">
<title>Index of new symbols in 2.38</title>
<xi:include href="xml/api-index-2.38.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-40" role="2.40">
+ </chapter>
+ <chapter id="api-index-2-40" role="2.40">
<title>Index of new symbols in 2.40</title>
<xi:include href="xml/api-index-2.40.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-42" role="2.42">
+ </chapter>
+ <chapter id="api-index-2-42" role="2.42">
<title>Index of new symbols in 2.42</title>
<xi:include href="xml/api-index-2.42.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-44" role="2.44">
+ </chapter>
+ <chapter id="api-index-2-44" role="2.44">
<title>Index of new symbols in 2.44</title>
<xi:include href="xml/api-index-2.44.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-46" role="2.46">
+ </chapter>
+ <chapter id="api-index-2-46" role="2.46">
<title>Index of new symbols in 2.46</title>
<xi:include href="xml/api-index-2.46.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-54" role="2.54">
+ </chapter>
+ <chapter id="api-index-2-54" role="2.54">
<title>Index of new symbols in 2.54</title>
<xi:include href="xml/api-index-2.54.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-56" role="2.56">
+ </chapter>
+ <chapter id="api-index-2-56" role="2.56">
<title>Index of new symbols in 2.56</title>
<xi:include href="xml/api-index-2.56.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-62" role="2.62">
+ </chapter>
+ <chapter id="api-index-2-62" role="2.62">
<title>Index of new symbols in 2.62</title>
<xi:include href="xml/api-index-2.62.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-66" role="2.66">
+ </chapter>
+ <chapter id="api-index-2-66" role="2.66">
<title>Index of new symbols in 2.66</title>
<xi:include href="xml/api-index-2.66.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-68" role="2.68">
+ </chapter>
+ <chapter id="api-index-2-68" role="2.68">
<title>Index of new symbols in 2.68</title>
<xi:include href="xml/api-index-2.68.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-70" role="2.70">
+ </chapter>
+ <chapter id="api-index-2-70" role="2.70">
<title>Index of new symbols in 2.70</title>
<xi:include href="xml/api-index-2.70.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-72" role="2.72">
+ </chapter>
+ <chapter id="api-index-2-72" role="2.72">
<title>Index of new symbols in 2.72</title>
<xi:include href="xml/api-index-2.72.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-74" role="2.74">
+ </chapter>
+ <chapter id="api-index-2-74" role="2.74">
<title>Index of new symbols in 2.74</title>
<xi:include href="xml/api-index-2.74.xml"><xi:fallback /></xi:include>
- </index>
- <index id="api-index-2-76" role="2.76">
+ </chapter>
+ <chapter id="api-index-2-76" role="2.76">
<title>Index of new symbols in 2.76</title>
<xi:include href="xml/api-index-2.76.xml"><xi:fallback /></xi:include>
- </index>
+ </chapter>
+ <chapter id="api-index-2-78" role="2.78">
+ <title>Index of new symbols in 2.78</title>
+ <xi:include href="xml/api-index-2.78.xml"><xi:fallback /></xi:include>
+ </chapter>
<xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
diff --git a/docs/reference/gobject/tut_gobject.xml b/docs/reference/gobject/tut_gobject.xml
index 7a2ecc77e..7754fec1e 100644
--- a/docs/reference/gobject/tut_gobject.xml
+++ b/docs/reference/gobject/tut_gobject.xml
@@ -294,7 +294,7 @@ ViewerFile *file = g_object_new (VIEWER_TYPE_FILE, NULL);
memory will be freed or returned to the object pool for this type.
Once the object has been freed, if it was the last instance of the type, the type's class
will be destroyed as described in <xref linkend="gtype-instantiatable-classed"/> and
- <xref linkend="gtype-non-instantiatable-classed"/>.
+ <xref linkend="gtype-non-instantiatable-non-classed"/>.
</para>
<para>
diff --git a/docs/reference/gobject/tut_gtype.xml b/docs/reference/gobject/tut_gtype.xml
index ee042889d..c2d51b9a5 100644
--- a/docs/reference/gobject/tut_gtype.xml
+++ b/docs/reference/gobject/tut_gtype.xml
@@ -599,7 +599,7 @@ B *b;
<row>
<!--entry>First call to <function><link linkend="g-type-create-instance">g_type_create_instance</link></function> for target type</entry-->
<entry>interface initialization, see
- <xref linkend="gtype-non-instantiatable-classed-init"/></entry>
+ <xref linkend="gtype-non-instantiatable-non-classed-init"/></entry>
<entry></entry>
</row>
<row>
@@ -610,7 +610,7 @@ B *b;
<row>
<entry morerows="2">Last call to <function><link linkend="g-type-free-instance">g_type_free_instance</link></function> for target type</entry>
<entry>interface destruction, see
- <xref linkend="gtype-non-instantiatable-classed-dest"/></entry>
+ <xref linkend="gtype-non-instantiatable-non-classed-dest"/></entry>
<entry></entry>
</row>
<row>
@@ -633,8 +633,8 @@ B *b;
</sect1>
- <sect1 id="gtype-non-instantiatable-classed">
- <title>Non-instantiatable classed types: interfaces</title>
+ <sect1 id="gtype-non-instantiatable-non-classed">
+ <title>Non-instantiatable non-classed types: interfaces</title>
<para>
This section covers the theory behind interfaces. See
@@ -649,7 +649,7 @@ B *b;
be seen as a playback interface. Once you know what they do, you can
control your CD player, MP3 player or anything that uses these symbols.
To declare an interface you have to register a non-instantiatable
- classed type which derives from
+ non-classed type which derives from
<link linkend="GTypeInterface"><type>GTypeInterface</type></link>. The following piece of code declares such an interface.
<informalexample><programlisting>
#define VIEWER_TYPE_EDITABLE viewer_editable_get_type ()
@@ -792,7 +792,7 @@ struct _GInterfaceInfo
</programlisting></informalexample>
</para>
- <sect2 id="gtype-non-instantiatable-classed-init">
+ <sect2 id="gtype-non-instantiatable-non-classed-init">
<title>Interface Initialization</title>
<para>
@@ -937,7 +937,7 @@ viewer_editable_default_init (ViewerEditableInterface *iface)
</sect2>
- <sect2 id="gtype-non-instantiatable-classed-dest">
+ <sect2 id="gtype-non-instantiatable-non-classed-dest">
<title>Interface Destruction</title>
<para>
@@ -955,7 +955,7 @@ viewer_editable_default_init (ViewerEditableInterface *iface)
<para>
Again, it is important to understand, as in
- <xref linkend="gtype-non-instantiatable-classed-init"/>,
+ <xref linkend="gtype-non-instantiatable-non-classed-init"/>,
that both <function>interface_finalize</function> and <function>base_finalize</function>
are invoked exactly once for the destruction of each implementation of an interface. Thus,
if you were to use one of these functions, you would need to use a static integer variable
diff --git a/docs/reference/gobject/tut_howto.xml b/docs/reference/gobject/tut_howto.xml
index 4ed178cec..9bff49b56 100644
--- a/docs/reference/gobject/tut_howto.xml
+++ b/docs/reference/gobject/tut_howto.xml
@@ -854,7 +854,7 @@ b_method_to_call (B *obj, gint some_param)
<para>
The theory behind how GObject interfaces work is given in
- <xref linkend="gtype-non-instantiatable-classed"/>; this section covers how to
+ <xref linkend="gtype-non-instantiatable-non-classed"/>; this section covers how to
define and implement an interface.
</para>
diff --git a/fuzzing/fuzz_utf8_normalize.c b/fuzzing/fuzz_utf8_normalize.c
new file mode 100644
index 000000000..2075fe504
--- /dev/null
+++ b/fuzzing/fuzz_utf8_normalize.c
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2023 Todd Carson
+ *
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ *
+ * 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.1 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 library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "fuzz.h"
+
+int
+LLVMFuzzerTestOneInput (const unsigned char *data, size_t size)
+{
+ char *bounded, *terminated, *buf;
+
+ fuzz_set_logging_func ();
+
+ buf = g_malloc (size + 1);
+ memcpy (buf, data, size);
+ buf[size] = '\0';
+
+ terminated = g_utf8_normalize (buf, -1, G_NORMALIZE_ALL);
+ g_free (buf);
+
+ bounded = g_utf8_normalize ((const char *) data, size, G_NORMALIZE_ALL);
+
+ if (terminated && bounded)
+ {
+ g_assert (strcmp (terminated, bounded) == 0);
+ g_free (terminated);
+ g_free (bounded);
+ }
+ else
+ g_assert (!(terminated || bounded));
+
+ return 0;
+}
diff --git a/fuzzing/meson.build b/fuzzing/meson.build
index cd1e4c762..24d9d2554 100644
--- a/fuzzing/meson.build
+++ b/fuzzing/meson.build
@@ -33,6 +33,7 @@ fuzz_targets = [
'fuzz_uri_escape',
'fuzz_uri_parse',
'fuzz_uri_parse_params',
+ 'fuzz_utf8_normalize',
'fuzz_utf8_validate',
'fuzz_uuid_string_is_valid',
'fuzz_variant_binary',
diff --git a/gio/gactiongroup.c b/gio/gactiongroup.c
index 73f8faf5f..a327195cc 100644
--- a/gio/gactiongroup.c
+++ b/gio/gactiongroup.c
@@ -133,9 +133,10 @@ static gboolean
g_action_group_real_get_action_enabled (GActionGroup *action_group,
const gchar *action_name)
{
- gboolean enabled = FALSE;
+ gboolean enabled;
- g_action_group_query_action (action_group, action_name, &enabled, NULL, NULL, NULL, NULL);
+ if (!g_action_group_query_action (action_group, action_name, &enabled, NULL, NULL, NULL, NULL))
+ return FALSE;
return enabled;
}
@@ -144,9 +145,10 @@ static const GVariantType *
g_action_group_real_get_action_parameter_type (GActionGroup *action_group,
const gchar *action_name)
{
- const GVariantType *type = NULL;
+ const GVariantType *type;
- g_action_group_query_action (action_group, action_name, NULL, &type, NULL, NULL, NULL);
+ if (!g_action_group_query_action (action_group, action_name, NULL, &type, NULL, NULL, NULL))
+ return NULL;
return type;
}
@@ -155,9 +157,10 @@ static const GVariantType *
g_action_group_real_get_action_state_type (GActionGroup *action_group,
const gchar *action_name)
{
- const GVariantType *type = NULL;
+ const GVariantType *type;
- g_action_group_query_action (action_group, action_name, NULL, NULL, &type, NULL, NULL);
+ if (!g_action_group_query_action (action_group, action_name, NULL, NULL, &type, NULL, NULL))
+ return NULL;
return type;
}
@@ -166,9 +169,10 @@ static GVariant *
g_action_group_real_get_action_state_hint (GActionGroup *action_group,
const gchar *action_name)
{
- GVariant *hint = NULL;
+ GVariant *hint;
- g_action_group_query_action (action_group, action_name, NULL, NULL, NULL, &hint, NULL);
+ if (!g_action_group_query_action (action_group, action_name, NULL, NULL, NULL, &hint, NULL))
+ return NULL;
return hint;
}
@@ -177,9 +181,10 @@ static GVariant *
g_action_group_real_get_action_state (GActionGroup *action_group,
const gchar *action_name)
{
- GVariant *state = NULL;
+ GVariant *state;
- g_action_group_query_action (action_group, action_name, NULL, NULL, NULL, NULL, &state);
+ if (!g_action_group_query_action (action_group, action_name, NULL, NULL, NULL, NULL, &state))
+ return NULL;
return state;
}
diff --git a/gio/gactiongroup.h b/gio/gactiongroup.h
index f8d20ae69..06213df8a 100644
--- a/gio/gactiongroup.h
+++ b/gio/gactiongroup.h
@@ -156,7 +156,7 @@ gboolean g_action_group_query_action (GAction
const GVariantType **parameter_type,
const GVariantType **state_type,
GVariant **state_hint,
- GVariant **state);
+ GVariant **state) G_GNUC_WARN_UNUSED_RESULT;
G_END_DECLS
diff --git a/gio/gappinfo.c b/gio/gappinfo.c
index 2a8ca8481..42feb9d7c 100644
--- a/gio/gappinfo.c
+++ b/gio/gappinfo.c
@@ -1658,19 +1658,34 @@ g_app_launch_context_launch_failed (GAppLaunchContext *context,
* @short_description: Monitor application information for changes
*
* #GAppInfoMonitor is a very simple object used for monitoring the app
- * info database for changes (ie: newly installed or removed
- * applications).
+ * info database for changes (newly installed or removed applications).
*
* Call g_app_info_monitor_get() to get a #GAppInfoMonitor and connect
- * to the "changed" signal.
+ * to the #GAppInfoMonitor::changed signal. The signal will be emitted once when
+ * the app info database changes, and will not be emitted again until after the
+ * next call to g_app_info_get_all() or another `g_app_info_*()` function. This
+ * is because monitoring the app info database for changes is expensive.
+ *
+ * The following functions will re-arm the #GAppInfoMonitor::changed signal so
+ * it can be emitted again:
+ * - g_app_info_get_all()
+ * - g_app_info_get_all_for_type()
+ * - g_app_info_get_default_for_type()
+ * - g_app_info_get_fallback_for_type()
+ * - g_app_info_get_recommended_for_type()
+ * - g_desktop_app_info_get_implementations()
+ * - g_desktop_app_info_new()
+ * - g_desktop_app_info_new_from_filename()
+ * - g_desktop_app_info_new_from_keyfile()
+ * - g_desktop_app_info_search()
*
* In the usual case, applications should try to make note of the change
* (doing things like invalidating caches) but not act on it. In
* particular, applications should avoid making calls to #GAppInfo APIs
* in response to the change signal, deferring these until the time that
- * the data is actually required. The exception to this case is when
+ * the updated data is actually required. The exception to this case is when
* application information is actually being displayed on the screen
- * (eg: during a search or when the list of all applications is shown).
+ * (for example, during a search or when the list of all applications is shown).
* The reason for this is that changes to the list of installed
* applications often come in groups (like during system updates) and
* rescanning the list on every change is pointless and expensive.
@@ -1728,8 +1743,10 @@ g_app_info_monitor_class_init (GAppInfoMonitorClass *class)
/**
* GAppInfoMonitor::changed:
*
- * Signal emitted when the app info database for changes (ie: newly installed
- * or removed applications).
+ * Signal emitted when the app info database changes, when applications are
+ * installed or removed.
+ *
+ * Since: 2.40
**/
g_app_info_monitor_changed_signal = g_signal_new (I_("changed"), G_TYPE_APP_INFO_MONITOR, G_SIGNAL_RUN_FIRST,
0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
@@ -1747,6 +1764,10 @@ g_app_info_monitor_class_init (GAppInfoMonitorClass *class)
* thread-default main context whenever the list of installed
* applications (as reported by g_app_info_get_all()) may have changed.
*
+ * The #GAppInfoMonitor::changed signal will only be emitted once until
+ * g_app_info_get_all() (or another `g_app_info_*()` function) is called. Doing
+ * so will re-arm the signal ready to notify about the next change.
+ *
* You must only call g_object_unref() on the return value from under
* the same main context as you created it.
*
diff --git a/gio/gdbusconnection.c b/gio/gdbusconnection.c
index ccca4e98c..65ece54b2 100644
--- a/gio/gdbusconnection.c
+++ b/gio/gdbusconnection.c
@@ -409,7 +409,7 @@ struct _GDBusConnection
GDBusConnectionFlags flags;
/* Map used for managing method replies, protected by @lock */
- GHashTable *map_method_serial_to_task; /* guint32 -> GTask* */
+ GHashTable *map_method_serial_to_task; /* guint32 -> owned GTask* */
/* Maps used for managing signal subscription, protected by @lock */
GHashTable *map_rule_to_signal_data; /* match rule (gchar*) -> SignalData */
@@ -1061,7 +1061,7 @@ g_dbus_connection_init (GDBusConnection *connection)
g_mutex_init (&connection->lock);
g_mutex_init (&connection->init_lock);
- connection->map_method_serial_to_task = g_hash_table_new (g_direct_hash, g_direct_equal);
+ connection->map_method_serial_to_task = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_object_unref);
connection->map_rule_to_signal_data = g_hash_table_new (g_str_hash,
g_str_equal);
@@ -1752,7 +1752,7 @@ typedef struct
gulong cancellable_handler_id;
GSource *cancelled_idle_source; /* (owned) (nullable) */
- GSource *timeout_source;
+ GSource *timeout_source; /* (owned) (nullable) */
gboolean delivered;
} SendMessageData;
@@ -1761,6 +1761,7 @@ typedef struct
static void
send_message_data_free (SendMessageData *data)
{
+ /* These should already have been cleared by send_message_with_reply_cleanup(). */
g_assert (data->timeout_source == NULL);
g_assert (data->cancellable_handler_id == 0);
@@ -1769,7 +1770,7 @@ send_message_data_free (SendMessageData *data)
/* ---------------------------------------------------------------------------------------------------- */
-/* can be called from any thread with lock held; @task is (transfer full) */
+/* can be called from any thread with lock held; @task is (transfer none) */
static void
send_message_with_reply_cleanup (GTask *task, gboolean remove)
{
@@ -1785,7 +1786,7 @@ send_message_with_reply_cleanup (GTask *task, gboolean remove)
if (data->timeout_source != NULL)
{
g_source_destroy (data->timeout_source);
- data->timeout_source = NULL;
+ g_clear_pointer (&data->timeout_source, g_source_unref);
}
if (data->cancellable_handler_id > 0)
{
@@ -1804,13 +1805,11 @@ send_message_with_reply_cleanup (GTask *task, gboolean remove)
GUINT_TO_POINTER (data->serial));
g_warn_if_fail (removed);
}
-
- g_object_unref (task);
}
/* ---------------------------------------------------------------------------------------------------- */
-/* Called from GDBus worker thread with lock held; @task is (transfer full). */
+/* Called from GDBus worker thread with lock held; @task is (transfer none). */
static void
send_message_data_deliver_reply_unlocked (GTask *task,
GDBusMessage *reply)
@@ -1828,7 +1827,7 @@ send_message_data_deliver_reply_unlocked (GTask *task,
;
}
-/* Called from a user thread, lock is not held */
+/* Called from a user thread, lock is not held; @task is (transfer none) */
static void
send_message_data_deliver_error (GTask *task,
GQuark domain,
@@ -1845,7 +1844,10 @@ send_message_data_deliver_error (GTask *task,
return;
}
+ /* Hold a ref on @task as send_message_with_reply_cleanup() will remove it
+ * from the task map and could end up dropping the last reference */
g_object_ref (task);
+
send_message_with_reply_cleanup (task, TRUE);
CONNECTION_UNLOCK (connection);
@@ -1855,7 +1857,7 @@ send_message_data_deliver_error (GTask *task,
/* ---------------------------------------------------------------------------------------------------- */
-/* Called from a user thread, lock is not held; @task is (transfer full) */
+/* Called from a user thread, lock is not held; @task is (transfer none) */
static gboolean
send_message_with_reply_cancelled_idle_cb (gpointer user_data)
{
@@ -1887,7 +1889,7 @@ send_message_with_reply_cancelled_cb (GCancellable *cancellable,
/* ---------------------------------------------------------------------------------------------------- */
-/* Called from a user thread, lock is not held; @task is (transfer full) */
+/* Called from a user thread, lock is not held; @task is (transfer none) */
static gboolean
send_message_with_reply_timeout_cb (gpointer user_data)
{
@@ -1895,7 +1897,7 @@ send_message_with_reply_timeout_cb (gpointer user_data)
send_message_data_deliver_error (task, G_IO_ERROR, G_IO_ERROR_TIMED_OUT,
_("Timeout was reached"));
- return FALSE;
+ return G_SOURCE_REMOVE;
}
/* ---------------------------------------------------------------------------------------------------- */
@@ -1956,7 +1958,6 @@ g_dbus_connection_send_message_with_reply_unlocked (GDBusConnection *connect
g_source_set_static_name (data->timeout_source, "[gio] send_message_with_reply_unlocked");
g_task_attach_source (task, data->timeout_source,
(GSourceFunc) send_message_with_reply_timeout_cb);
- g_source_unref (data->timeout_source);
}
g_hash_table_insert (connection->map_method_serial_to_task,
@@ -2397,7 +2398,8 @@ on_worker_message_about_to_be_sent (GDBusWorker *worker,
return message;
}
-/* called with connection lock held, in GDBusWorker thread */
+/* called with connection lock held, in GDBusWorker thread
+ * @key, @value and @user_data are (transfer none) */
static gboolean
cancel_method_on_close (gpointer key, gpointer value, gpointer user_data)
{
@@ -3749,7 +3751,7 @@ g_dbus_connection_signal_unsubscribe (GDBusConnection *connection,
typedef struct
{
SignalSubscriber *subscriber; /* (owned) */
- GDBusMessage *message;
+ GDBusMessage *message; /* (owned) */
GDBusConnection *connection;
const gchar *sender; /* (nullable) for peer-to-peer connections */
const gchar *path;
@@ -3813,7 +3815,7 @@ emit_signal_instance_in_idle_cb (gpointer data)
static void
signal_instance_free (SignalInstance *signal_instance)
{
- g_object_unref (signal_instance->message);
+ g_clear_object (&signal_instance->message);
g_object_unref (signal_instance->connection);
signal_subscriber_unref (signal_instance->subscriber);
g_free (signal_instance);
@@ -4225,7 +4227,7 @@ has_object_been_unregistered (GDBusConnection *connection,
typedef struct
{
GDBusConnection *connection;
- GDBusMessage *message;
+ GDBusMessage *message; /* (owned) */
gpointer user_data;
const gchar *property_name;
const GDBusInterfaceVTable *vtable;
@@ -4239,7 +4241,7 @@ static void
property_data_free (PropertyData *data)
{
g_object_unref (data->connection);
- g_object_unref (data->message);
+ g_clear_object (&data->message);
g_free (data);
}
@@ -4581,7 +4583,7 @@ handle_getset_property (GDBusConnection *connection,
typedef struct
{
GDBusConnection *connection;
- GDBusMessage *message;
+ GDBusMessage *message; /* (owned) */
gpointer user_data;
const GDBusInterfaceVTable *vtable;
GDBusInterfaceInfo *interface_info;
@@ -4590,10 +4592,10 @@ typedef struct
} PropertyGetAllData;
static void
-property_get_all_data_free (PropertyData *data)
+property_get_all_data_free (PropertyGetAllData *data)
{
g_object_unref (data->connection);
- g_object_unref (data->message);
+ g_clear_object (&data->message);
g_free (data);
}
@@ -6821,7 +6823,7 @@ typedef struct
static void
subtree_deferred_data_free (SubtreeDeferredData *data)
{
- g_object_unref (data->message);
+ g_clear_object (&data->message);
exported_subtree_unref (data->es);
g_free (data);
}
diff --git a/gio/gdbusprivate.c b/gio/gdbusprivate.c
index 762afcee4..2c9238c63 100644
--- a/gio/gdbusprivate.c
+++ b/gio/gdbusprivate.c
@@ -889,21 +889,25 @@ _g_dbus_worker_do_initial_read (gpointer data)
struct _MessageToWriteData
{
GDBusWorker *worker;
- GDBusMessage *message;
+ GDBusMessage *message; /* (owned) */
gchar *blob;
gsize blob_size;
gsize total_written;
- GTask *task;
+ GTask *task; /* (owned) and (nullable) before writing starts and after g_task_return_*() is called */
};
static void
message_to_write_data_free (MessageToWriteData *data)
{
_g_dbus_worker_unref (data->worker);
- if (data->message)
- g_object_unref (data->message);
+ g_clear_object (&data->message);
g_free (data->blob);
+
+ /* The task must either not have been created, or have been created, returned
+ * and finalised by now. */
+ g_assert (data->task == NULL);
+
g_slice_free (MessageToWriteData, data);
}
@@ -915,21 +919,22 @@ static void write_message_continue_writing (MessageToWriteData *data);
*
* write-lock is not held on entry
* output_pending is PENDING_WRITE on entry
+ * @user_data is (transfer full)
*/
static void
write_message_async_cb (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
- MessageToWriteData *data = user_data;
- GTask *task;
+ MessageToWriteData *data = g_steal_pointer (&user_data);
gssize bytes_written;
GError *error;
- /* Note: we can't access data->task after calling g_task_return_* () because the
- * callback can free @data and we're not completing in idle. So use a copy of the pointer.
- */
- task = data->task;
+ /* The ownership of @data is a bit odd in this function: it’s (transfer full)
+ * when the function is called, but the code paths which call g_task_return_*()
+ * on @data->task will indirectly cause it to be freed, because @data is
+ * always guaranteed to be the user_data in the #GTask. So that’s why it looks
+ * like @data is not always freed on every code path in this function. */
error = NULL;
bytes_written = g_output_stream_write_finish (G_OUTPUT_STREAM (source_object),
@@ -937,8 +942,9 @@ write_message_async_cb (GObject *source_object,
&error);
if (bytes_written == -1)
{
+ GTask *task = g_steal_pointer (&data->task);
g_task_return_error (task, error);
- g_object_unref (task);
+ g_clear_object (&task);
goto out;
}
g_assert (bytes_written > 0); /* zero is never returned */
@@ -949,12 +955,13 @@ write_message_async_cb (GObject *source_object,
g_assert (data->total_written <= data->blob_size);
if (data->total_written == data->blob_size)
{
+ GTask *task = g_steal_pointer (&data->task);
g_task_return_boolean (task, TRUE);
- g_object_unref (task);
+ g_clear_object (&task);
goto out;
}
- write_message_continue_writing (data);
+ write_message_continue_writing (g_steal_pointer (&data));
out:
;
@@ -971,9 +978,9 @@ on_socket_ready (GSocket *socket,
GIOCondition condition,
gpointer user_data)
{
- MessageToWriteData *data = user_data;
- write_message_continue_writing (data);
- return FALSE; /* remove source */
+ MessageToWriteData *data = g_steal_pointer (&user_data);
+ write_message_continue_writing (g_steal_pointer (&data));
+ return G_SOURCE_REMOVE;
}
#endif
@@ -981,22 +988,21 @@ on_socket_ready (GSocket *socket,
*
* write-lock is not held on entry
* output_pending is PENDING_WRITE on entry
+ * @data is (transfer full)
*/
static void
write_message_continue_writing (MessageToWriteData *data)
{
GOutputStream *ostream;
#ifdef G_OS_UNIX
- GTask *task;
GUnixFDList *fd_list;
#endif
-#ifdef G_OS_UNIX
- /* Note: we can't access data->task after calling g_task_return_* () because the
- * callback can free @data and we're not completing in idle. So use a copy of the pointer.
- */
- task = data->task;
-#endif
+ /* The ownership of @data is a bit odd in this function: it’s (transfer full)
+ * when the function is called, but the code paths which call g_task_return_*()
+ * on @data->task will indirectly cause it to be freed, because @data is
+ * always guaranteed to be the user_data in the #GTask. So that’s why it looks
+ * like @data is not always freed on every code path in this function. */
ostream = g_io_stream_get_output_stream (data->worker->stream);
#ifdef G_OS_UNIX
@@ -1025,11 +1031,12 @@ write_message_continue_writing (MessageToWriteData *data)
{
if (!(data->worker->capabilities & G_DBUS_CAPABILITY_FLAGS_UNIX_FD_PASSING))
{
+ GTask *task = g_steal_pointer (&data->task);
g_task_return_new_error (task,
G_IO_ERROR,
G_IO_ERROR_FAILED,
"Tried sending a file descriptor but remote peer does not support this capability");
- g_object_unref (task);
+ g_clear_object (&task);
goto out;
}
control_message = g_unix_fd_message_new_with_fd_list (fd_list);
@@ -1059,16 +1066,20 @@ write_message_continue_writing (MessageToWriteData *data)
data->worker->cancellable);
g_source_set_callback (source,
(GSourceFunc) on_socket_ready,
- data,
+ g_steal_pointer (&data),
NULL); /* GDestroyNotify */
g_source_attach (source, g_main_context_get_thread_default ());
g_source_unref (source);
g_error_free (error);
goto out;
}
- g_task_return_error (task, error);
- g_object_unref (task);
- goto out;
+ else
+ {
+ GTask *task = g_steal_pointer (&data->task);
+ g_task_return_error (task, error);
+ g_clear_object (&task);
+ goto out;
+ }
}
g_assert (bytes_written > 0); /* zero is never returned */
@@ -1078,12 +1089,13 @@ write_message_continue_writing (MessageToWriteData *data)
g_assert (data->total_written <= data->blob_size);
if (data->total_written == data->blob_size)
{
+ GTask *task = g_steal_pointer (&data->task);
g_task_return_boolean (task, TRUE);
- g_object_unref (task);
+ g_clear_object (&task);
goto out;
}
- write_message_continue_writing (data);
+ write_message_continue_writing (g_steal_pointer (&data));
}
#endif
else
@@ -1094,12 +1106,13 @@ write_message_continue_writing (MessageToWriteData *data)
/* We were trying to write byte 0 of the message, which needs
* the fd list to be attached to it, but this connection doesn't
* support doing that. */
+ GTask *task = g_steal_pointer (&data->task);
g_task_return_new_error (task,
G_IO_ERROR,
G_IO_ERROR_FAILED,
"Tried sending a file descriptor on unsupported stream of type %s",
g_type_name (G_TYPE_FROM_INSTANCE (ostream)));
- g_object_unref (task);
+ g_clear_object (&task);
goto out;
}
#endif
@@ -1110,7 +1123,7 @@ write_message_continue_writing (MessageToWriteData *data)
G_PRIORITY_DEFAULT,
data->worker->cancellable,
write_message_async_cb,
- data);
+ data); /* steal @data */
}
#ifdef G_OS_UNIX
out:
@@ -1133,7 +1146,7 @@ write_message_async (GDBusWorker *worker,
g_task_set_source_tag (data->task, write_message_async);
g_task_set_name (data->task, "[gio] D-Bus write message");
data->total_written = 0;
- write_message_continue_writing (data);
+ write_message_continue_writing (g_steal_pointer (&data));
}
/* called in private thread shared by all GDBusConnection instances (with write-lock held) */
@@ -1322,6 +1335,7 @@ prepare_flush_unlocked (GDBusWorker *worker)
*
* write-lock is not held on entry
* output_pending is PENDING_WRITE on entry
+ * @user_data is (transfer full)
*/
static void
write_message_cb (GObject *source_object,
@@ -1540,7 +1554,7 @@ continue_writing (GDBusWorker *worker)
write_message_async (worker,
data,
write_message_cb,
- data);
+ data); /* takes ownership of @data as user_data */
}
}
diff --git a/gio/gdebugcontrollerdbus.c b/gio/gdebugcontrollerdbus.c
index 84d2e6499..ce0f70383 100644
--- a/gio/gdebugcontrollerdbus.c
+++ b/gio/gdebugcontrollerdbus.c
@@ -50,9 +50,10 @@
* #GDebugController:debug-enabled and, by default, g_log_get_debug_enabled().
* default.
*
- * By default, all processes will be able to call `SetDebugEnabled()`. If this
- * process is privileged, or might expose sensitive information in its debug
- * output, you may want to restrict the ability to enable debug output to
+ * By default, no processes are allowed to call `SetDebugEnabled()` unless a
+ * #GDebugControllerDBus::authorize signal handler is installed. This is because
+ * the process may be privileged, or might expose sensitive information in its
+ * debug output. You may want to restrict the ability to enable debug output to
* privileged users or processes.
*
* One option is to install a D-Bus security policy which restricts access to
diff --git a/gio/gfileenumerator.c b/gio/gfileenumerator.c
index 6fd03eb44..c4b44d1ce 100644
--- a/gio/gfileenumerator.c
+++ b/gio/gfileenumerator.c
@@ -318,22 +318,67 @@ next_async_callback_wrapper (GObject *source_object,
* @user_data: (closure): the data to pass to callback function
*
* Request information for a number of files from the enumerator asynchronously.
- * When all i/o for the operation is finished the @callback will be called with
+ * When all I/O for the operation is finished the @callback will be called with
* the requested information.
*
* See the documentation of #GFileEnumerator for information about the
* order of returned files.
*
- * The callback can be called with less than @num_files files in case of error
- * or at the end of the enumerator. In case of a partial error the callback will
- * be called with any succeeding items and no error, and on the next request the
- * error will be reported. If a request is cancelled the callback will be called
- * with %G_IO_ERROR_CANCELLED.
+ * Once the end of the enumerator is reached, or if an error occurs, the
+ * @callback will be called with an empty list. In this case, the previous call
+ * to g_file_enumerator_next_files_async() will typically have returned fewer
+ * than @num_files items.
+ *
+ * If a request is cancelled the callback will be called with
+ * %G_IO_ERROR_CANCELLED.
+ *
+ * This leads to the following pseudo-code usage:
+ * |[
+ * g_autoptr(GFile) dir = get_directory ();
+ * g_autoptr(GFileEnumerator) enumerator = NULL;
+ * g_autolist(GFileInfo) files = NULL;
+ * g_autoptr(GError) local_error = NULL;
+ *
+ * enumerator = yield g_file_enumerate_children_async (dir,
+ * G_FILE_ATTRIBUTE_STANDARD_NAME ","
+ * G_FILE_ATTRIBUTE_STANDARD_TYPE,
+ * G_FILE_QUERY_INFO_NONE,
+ * G_PRIORITY_DEFAULT,
+ * cancellable,
+ * …,
+ * &local_error);
+ * if (enumerator == NULL)
+ * g_error ("Error enumerating: %s", local_error->message);
+ *
+ * // Loop until no files are returned, either because the end of the enumerator
+ * // has been reached, or an error was returned.
+ * do
+ * {
+ * files = yield g_file_enumerator_next_files_async (enumerator,
+ * 5, // number of files to request
+ * G_PRIORITY_DEFAULT,
+ * cancellable,
+ * …,
+ * &local_error);
+ *
+ * // Process the returned files, but don’t assume that exactly 5 were returned.
+ * for (GList *l = files; l != NULL; l = l->next)
+ * {
+ * GFileInfo *info = l->data;
+ * handle_file_info (info);
+ * }
+ * }
+ * while (files != NULL);
+ *
+ * if (local_error != NULL &&
+ * !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ * g_error ("Error while enumerating: %s", local_error->message);
+ * ]|
*
* During an async request no other sync and async calls are allowed, and will
* result in %G_IO_ERROR_PENDING errors.
*
- * Any outstanding i/o request with higher priority (lower numerical value) will
+ * Any outstanding I/O request with higher priority (lower numerical value) will
* be executed before an outstanding request with lower priority. Default
* priority is %G_PRIORITY_DEFAULT.
**/
diff --git a/gio/gfileinfo.c b/gio/gfileinfo.c
index ad196d0ec..d9c7d70f9 100644
--- a/gio/gfileinfo.c
+++ b/gio/gfileinfo.c
@@ -1500,8 +1500,8 @@ g_file_info_set_attribute_int64 (GFileInfo *info,
*value_ptr = g_file_info_find_value (info, attr); \
if (G_UNLIKELY (*value_ptr == NULL)) \
{ \
- g_critical ("GFileInfo created without " attribute_name); \
- g_return_val_if_reached (error_value); \
+ g_debug ("GFileInfo created without " attribute_name); \
+ return error_value; \
} \
} G_STMT_END
@@ -1837,8 +1837,9 @@ g_file_info_get_modification_time (GFileInfo *info,
if (G_UNLIKELY (value == NULL))
{
- g_critical ("GFileInfo created without " G_FILE_ATTRIBUTE_TIME_MODIFIED);
- g_return_if_reached ();
+ g_debug ("GFileInfo created without " G_FILE_ATTRIBUTE_TIME_MODIFIED);
+ result->tv_sec = result->tv_usec = 0;
+ return;
}
result->tv_sec = _g_file_attribute_value_get_uint64 (value);
diff --git a/gio/gio-tool-info.c b/gio/gio-tool-info.c
index d51edb47b..59568ae7a 100644
--- a/gio/gio-tool-info.c
+++ b/gio/gio-tool-info.c
@@ -157,7 +157,8 @@ show_info (GFile *file, GFileInfo *info)
GUnixMountEntry *entry;
#endif
- name = g_file_info_get_display_name (info);
+ name = g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME) ?
+ g_file_info_get_display_name (info) : NULL;
if (name)
{
/* Translators: This is a noun and represents and attribute of a file */
@@ -166,12 +167,13 @@ show_info (GFile *file, GFileInfo *info)
g_free (flatten);
}
- name = g_file_info_get_edit_name (info);
+ name = g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME) ?
+ g_file_info_get_edit_name (info) : NULL;
if (name)
{
/* Translators: This is a noun and represents and attribute of a file */
flatten = flatten_string (name);
- g_print (_("display name: %s\n"), flatten);
+ g_print (_("edit name: %s\n"), flatten);
g_free (flatten);
}
diff --git a/gio/gio-tool-list.c b/gio/gio-tool-list.c
index 24e3dac3c..0da86269d 100644
--- a/gio/gio-tool-list.c
+++ b/gio/gio-tool-list.c
@@ -54,10 +54,12 @@ show_file_listing (GFileInfo *info, GFile *parent)
gboolean first_attr;
GFile *child;
- if ((g_file_info_get_is_hidden (info)) && !show_hidden)
+ if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN) &&
+ g_file_info_get_is_hidden (info) &&
+ !show_hidden)
return;
- if (print_display_names)
+ if (print_display_names && g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME))
name = g_file_info_get_display_name (info);
else
name = g_file_info_get_name (info);
@@ -71,7 +73,8 @@ show_file_listing (GFileInfo *info, GFile *parent)
g_object_unref (child);
}
- size = g_file_info_get_size (info);
+ size = g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_SIZE) ?
+ g_file_info_get_size (info) : 0;
type = file_type_to_string (g_file_info_get_file_type (info));
if (show_long)
g_print ("%s\t%"G_GUINT64_FORMAT"\t(%s)", print_uris? uri: name, (guint64)size, type);
diff --git a/gio/gio-tool-tree.c b/gio/gio-tool-tree.c
index 071588240..28fad051f 100644
--- a/gio/gio-tool-tree.c
+++ b/gio/gio-tool-tree.c
@@ -95,7 +95,9 @@ do_tree (GFile *f, unsigned int level, guint64 pattern)
info_list = NULL;
while ((info = g_file_enumerator_next_file (enumerator, NULL, NULL)) != NULL)
{
- if (g_file_info_get_is_hidden (info) && !show_hidden)
+ if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN) &&
+ g_file_info_get_is_hidden (info) &&
+ !show_hidden)
{
g_object_unref (info);
}
@@ -151,7 +153,8 @@ do_tree (GFile *f, unsigned int level, guint64 pattern)
}
else
{
- if (g_file_info_get_is_symlink (info))
+ if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_IS_SYMLINK) &&
+ g_file_info_get_is_symlink (info))
{
const char *target;
target = g_file_info_get_symlink_target (info);
@@ -162,7 +165,9 @@ do_tree (GFile *f, unsigned int level, guint64 pattern)
g_print ("\n");
if ((type & G_FILE_TYPE_DIRECTORY) &&
- (follow_symlinks || !g_file_info_get_is_symlink (info)))
+ (follow_symlinks ||
+ !(g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_IS_SYMLINK) &&
+ g_file_info_get_is_symlink (info))))
{
guint64 new_pattern;
GFile *child;
diff --git a/gio/gioenums.h b/gio/gioenums.h
index 7fd74a43e..c820cd36d 100644
--- a/gio/gioenums.h
+++ b/gio/gioenums.h
@@ -224,6 +224,9 @@ typedef enum {
* sizes. Normally, the block-size is used, if available, as this is a
* more accurate representation of disk space used.
* Compare with `du --apparent-size`.
+ * Since GLib 2.78. and similarly to `du` since GNU Coreutils 9.2, this will
+ * ignore the sizes of file types other than regular files and links, as the
+ * sizes of other file types are not specified in a standard way.
* @G_FILE_MEASURE_NO_XDEV: Do not cross mount point boundaries.
* Compare with `du -x`.
*
diff --git a/gio/giomodule.c b/gio/giomodule.c
index 11ce7d8b9..47b8de27e 100644
--- a/gio/giomodule.c
+++ b/gio/giomodule.c
@@ -1355,7 +1355,7 @@ _g_io_modules_ensure_loaded (void)
#ifdef G_OS_WIN32
g_type_ensure (_g_win32_volume_monitor_get_type ());
g_type_ensure (g_win32_file_monitor_get_type ());
- g_type_ensure (g_registry_backend_get_type ());
+ g_type_ensure (g_registry_settings_backend_get_type ());
#endif
#ifdef HAVE_COCOA
g_type_ensure (g_nextstep_settings_backend_get_type ());
diff --git a/gio/glocalfile.c b/gio/glocalfile.c
index 67d4b99fb..dbb56902d 100644
--- a/gio/glocalfile.c
+++ b/gio/glocalfile.c
@@ -86,6 +86,9 @@
#define FILE_READ_ONLY_VOLUME 0x00080000
#endif
+#ifndef S_ISREG
+#define S_ISREG(m) (((m) & _S_IFMT) == _S_IFREG)
+#endif
#ifndef S_ISDIR
#define S_ISDIR(m) (((m) & _S_IFMT) == _S_IFDIR)
#endif
@@ -2777,6 +2780,39 @@ g_local_file_measure_size_of_contents (gint fd,
MeasureState *state,
GError **error);
+/*
+ * _g_stat_is_size_usable:
+ * @buf: a #GLocalFileStat.
+ *
+ * Checks if the file type is such that the `st_size` field of `struct stat` is
+ * well-defined by POSIX.
+ * (see https://pubs.opengroup.org/onlinepubs/009696799/basedefs/sys/stat.h.html)
+ *
+ * This behaviour is aligned with `du` from GNU Coreutils 9.2+
+ * (see https://lists.gnu.org/archive/html/bug-coreutils/2023-03/msg00007.html)
+ * and makes apparent size sums well-defined; formerly, they depended on the
+ * implementation, and could differ across filesystems.
+ *
+ * Returns: %TRUE if the size field is well-defined, %FALSE otherwise.
+ **/
+inline static gboolean
+_g_stat_is_size_usable (const GLocalFileStat *buf)
+{
+#ifndef HAVE_STATX
+ /* Memory objects are defined by POSIX, but are not supported by statx nor Windows */
+#ifdef S_TYPEISSHM
+ if (S_TYPEISSHM (buf))
+ return TRUE;
+#endif
+#ifdef S_TYPEISTMO
+ if (S_TYPEISTMO (buf))
+ return TRUE;
+#endif
+#endif
+
+ return S_ISREG (_g_stat_mode (buf)) || S_ISLNK (_g_stat_mode (buf));
+}
+
static gboolean
g_local_file_measure_size_of_file (gint parent_fd,
GSList *name,
@@ -2836,6 +2872,7 @@ g_local_file_measure_size_of_file (gint parent_fd,
state->disk_usage += _g_stat_blocks (&buf) * G_GUINT64_CONSTANT (512);
else
#endif
+ if (_g_stat_is_size_usable (&buf))
state->disk_usage += _g_stat_size (&buf);
if (S_ISDIR (_g_stat_mode (&buf)))
diff --git a/gio/gpollableinputstream.c b/gio/gpollableinputstream.c
index ac8ac492b..3f76cb6d4 100644
--- a/gio/gpollableinputstream.c
+++ b/gio/gpollableinputstream.c
@@ -37,6 +37,11 @@
* interfacing with a non-GIO API that expects
* UNIX-file-descriptor-style asynchronous I/O rather than GIO-style.
*
+ * Some classes may implement #GPollableInputStream but have only certain
+ * instances of that class be pollable. If g_pollable_input_stream_can_poll()
+ * returns %FALSE, then the behavior of other #GPollableInputStream methods is
+ * undefined.
+ *
* Since: 2.28
*/
@@ -98,6 +103,9 @@ g_pollable_input_stream_can_poll (GPollableInputStream *stream)
* g_pollable_input_stream_read_nonblocking(), which will return a
* %G_IO_ERROR_WOULD_BLOCK error rather than blocking.
*
+ * The behaviour of this method is undefined if
+ * g_pollable_input_stream_can_poll() returns %FALSE for @stream.
+ *
* Returns: %TRUE if @stream is readable, %FALSE if not. If an error
* has occurred on @stream, this will result in
* g_pollable_input_stream_is_readable() returning %TRUE, and the
@@ -127,6 +135,9 @@ g_pollable_input_stream_is_readable (GPollableInputStream *stream)
* triggers, so you should use g_pollable_input_stream_read_nonblocking()
* rather than g_input_stream_read() from the callback.
*
+ * The behaviour of this method is undefined if
+ * g_pollable_input_stream_can_poll() returns %FALSE for @stream.
+ *
* Returns: (transfer full): a new #GSource
*
* Since: 2.28
@@ -179,6 +190,9 @@ g_pollable_input_stream_default_read_nonblocking (GPollableInputStream *stream,
* may happen if you call this method after a source triggers due
* to having been cancelled.
*
+ * The behaviour of this method is undefined if
+ * g_pollable_input_stream_can_poll() returns %FALSE for @stream.
+ *
* Virtual: read_nonblocking
* Returns: the number of bytes read, or -1 on error (including
* %G_IO_ERROR_WOULD_BLOCK).
diff --git a/gio/gpollableoutputstream.c b/gio/gpollableoutputstream.c
index fd9860d6e..f33267aa1 100644
--- a/gio/gpollableoutputstream.c
+++ b/gio/gpollableoutputstream.c
@@ -38,6 +38,11 @@
* interfacing with a non-GIO API that expects
* UNIX-file-descriptor-style asynchronous I/O rather than GIO-style.
*
+ * Some classes may implement #GPollableOutputStream but have only certain
+ * instances of that class be pollable. If g_pollable_output_stream_can_poll()
+ * returns %FALSE, then the behavior of other #GPollableOutputStream methods is
+ * undefined.
+ *
* Since: 2.28
*/
@@ -105,6 +110,9 @@ g_pollable_output_stream_can_poll (GPollableOutputStream *stream)
* g_pollable_output_stream_write_nonblocking(), which will return a
* %G_IO_ERROR_WOULD_BLOCK error rather than blocking.
*
+ * The behaviour of this method is undefined if
+ * g_pollable_output_stream_can_poll() returns %FALSE for @stream.
+ *
* Returns: %TRUE if @stream is writable, %FALSE if not. If an error
* has occurred on @stream, this will result in
* g_pollable_output_stream_is_writable() returning %TRUE, and the
@@ -134,6 +142,9 @@ g_pollable_output_stream_is_writable (GPollableOutputStream *stream)
* triggers, so you should use g_pollable_output_stream_write_nonblocking()
* rather than g_output_stream_write() from the callback.
*
+ * The behaviour of this method is undefined if
+ * g_pollable_output_stream_can_poll() returns %FALSE for @stream.
+ *
* Returns: (transfer full): a new #GSource
*
* Since: 2.28
@@ -251,6 +262,9 @@ g_pollable_output_stream_default_writev_nonblocking (GPollableOutputStream *str
* transports like D/TLS require that you re-send the same @buffer and
* @count in the next write call.
*
+ * The behaviour of this method is undefined if
+ * g_pollable_output_stream_can_poll() returns %FALSE for @stream.
+ *
* Virtual: write_nonblocking
* Returns: the number of bytes written, or -1 on error (including
* %G_IO_ERROR_WOULD_BLOCK).
@@ -319,6 +333,9 @@ g_pollable_output_stream_write_nonblocking (GPollableOutputStream *stream,
* transports like D/TLS require that you re-send the same @vectors and
* @n_vectors in the next write call.
*
+ * The behaviour of this method is undefined if
+ * g_pollable_output_stream_can_poll() returns %FALSE for @stream.
+ *
* Virtual: writev_nonblocking
*
* Returns: %@G_POLLABLE_RETURN_OK on success, %G_POLLABLE_RETURN_WOULD_BLOCK
diff --git a/gio/gpollfilemonitor.c b/gio/gpollfilemonitor.c
index c4dfd9913..2a8473630 100644
--- a/gio/gpollfilemonitor.c
+++ b/gio/gpollfilemonitor.c
@@ -94,7 +94,9 @@ calc_event_type (GFileInfo *last,
g_strcmp0 (g_file_info_get_etag (last), g_file_info_get_etag (new)) != 0)
return G_FILE_MONITOR_EVENT_CHANGED;
- if (g_file_info_get_size (last) != g_file_info_get_size (new))
+ if (g_file_info_has_attribute (last, G_FILE_ATTRIBUTE_STANDARD_SIZE) &&
+ g_file_info_has_attribute (new, G_FILE_ATTRIBUTE_STANDARD_SIZE) &&
+ g_file_info_get_size (last) != g_file_info_get_size (new))
return G_FILE_MONITOR_EVENT_CHANGED;
return -1;
diff --git a/gio/gregistrysettingsbackend.c b/gio/gregistrysettingsbackend.c
index 625039877..772fae037 100644
--- a/gio/gregistrysettingsbackend.c
+++ b/gio/gregistrysettingsbackend.c
@@ -19,13 +19,11 @@
* Author: Sam Thursfield <ssssam@gmail.com>
*/
-/* GRegistryBackend implementation notes:
+/* GRegistrySettingsBackend implementation notes:
*
- * - All settings are stored under the path:
- * HKEY_CURRENT_USER\Software\GSettings\
- * This means all settings are per-user. Permissions and system-wide
- * defaults are not implemented and will probably always be out of scope of
- * the Windows port of GLib.
+ * - All settings are stored under the registry path given at construction
+ * time. Permissions and system-wide defaults are not implemented and will
+ * probably always be out of scope of the Windows port of GLib.
*
* - The registry type system is limited. Most GVariant types are stored as
* literals via g_variant_print/parse(). Strings are stored without the
@@ -93,8 +91,11 @@
#include "gregistrysettingsbackend.h"
#include "gsettingsbackend.h"
+#include "gsettingsbackendinternal.h"
#include "giomodule-priv.h"
+#include <glibintl.h>
+
#include <windows.h>
//#define TRACE
@@ -154,17 +155,22 @@ typedef struct
HANDLE message_sent_event, message_received_event;
} WatchThreadState;
-#define G_TYPE_REGISTRY_BACKEND (g_registry_backend_get_type ())
-#define G_REGISTRY_BACKEND(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \
- G_TYPE_REGISTRY_BACKEND, GRegistryBackend))
-#define G_IS_REGISTRY_BACKEND(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \
- G_TYPE_REGISTRY_BACKEND))
+#define G_TYPE_REGISTRY_SETTINGS_BACKEND (g_registry_settings_backend_get_type ())
+#define G_REGISTRY_SETTINGS_BACKEND(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \
+ G_TYPE_REGISTRY_SETTINGS_BACKEND, GRegistrySettingsBackend))
+#define G_IS_REGISTRY_SETTINGS_BACKEND(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \
+ G_TYPE_REGISTRY_SETTINGS_BACKEND))
+
+typedef enum {
+ PROP_REGISTRY_KEY = 1,
+} GRegistrySettingsBackendProperty;
-typedef GSettingsBackendClass GRegistryBackendClass;
+typedef GSettingsBackendClass GRegistrySettingsBackendClass;
typedef struct {
GSettingsBackend parent_instance;
+ HKEY base_key;
gchar *base_path;
gunichar2 *base_pathw;
@@ -174,10 +180,10 @@ typedef struct {
GNode *cache_root;
WatchThreadState *watch;
-} GRegistryBackend;
+} GRegistrySettingsBackend;
-G_DEFINE_TYPE_WITH_CODE (GRegistryBackend,
- g_registry_backend,
+G_DEFINE_TYPE_WITH_CODE (GRegistrySettingsBackend,
+ g_registry_settings_backend,
G_TYPE_SETTINGS_BACKEND,
_g_io_modules_ensure_extension_points_registered ();
g_io_extension_point_implement (G_SETTINGS_BACKEND_EXTENSION_POINT_NAME,
@@ -231,8 +237,8 @@ g_message_win32_error (DWORD result_code,
g_free (win32_message);
}
-/* Make gsettings key into a registry path & value pair.
- *
+/* Make gsettings key into a registry path & value pair.
+ *
* Note that the return value *only* needs freeing - registry_value_name
* is a pointer to further inside the same block of memory.
*/
@@ -319,6 +325,59 @@ handle_read_error (LONG result,
path_name, value_name);
}
+typedef struct {
+ HKEY handle;
+ const char *name;
+} HandleNamePair;
+
+static const HandleNamePair predefined_key_names[] = {
+ { HKEY_CLASSES_ROOT, "HKEY_CLASSES_ROOT" },
+ { HKEY_CURRENT_CONFIG, "HKEY_CURRENT_CONFIG" },
+ { HKEY_CURRENT_USER, "HKEY_CURRENT_USER" },
+ { HKEY_LOCAL_MACHINE, "HKEY_LOCAL_MACHINE" },
+ { HKEY_USERS, "HKEY_USERS" }
+};
+
+static const gchar*
+predefined_key_to_string (HKEY key)
+{
+ for (gsize i = 0; i < G_N_ELEMENTS (predefined_key_names); i++)
+ {
+ if (predefined_key_names[i].handle == key)
+ return predefined_key_names[i].name;
+ }
+
+ g_warning ("gregistrysettingsbackend: unexpected root key (%p)", key);
+ return "";
+}
+
+static const gchar*
+split_registry_path (const gchar *full_path,
+ HKEY *root_key)
+{
+ g_assert (full_path != NULL);
+
+ for (gsize i = 0; i < G_N_ELEMENTS (predefined_key_names); i++)
+ {
+ const gchar *root_name = predefined_key_names[i].name;
+
+ if (g_str_has_prefix (full_path, root_name))
+ {
+ const gchar *rest = full_path + strlen (root_name);
+
+ if (*rest == '\\')
+ {
+ if (root_key != NULL)
+ *root_key = predefined_key_names[i].handle;
+
+ return ++rest;
+ }
+ }
+ }
+
+ return NULL;
+}
+
/***************************************************************************
* Cache of registry values
***************************************************************************/
@@ -381,7 +440,7 @@ typedef struct
/* Number of times g_settings_subscribe has been called for this location
* (I guess you can't subscribe more than 16383 times) */
gint32 subscription_count : 14;
-
+
gint32 ref_count : 9;
gint32 readable : 1;
@@ -693,7 +752,7 @@ registry_cache_update_node (GNode *cache_node,
cache_item->value = registry_value;
return TRUE;
}
-
+
switch (registry_value.type)
{
case REG_DWORD:
@@ -742,7 +801,7 @@ registry_cache_update_node (GNode *cache_node,
}
}
default:
- g_warning ("gregistrybackend: registry_cache_update_node: Unhandled value type");
+ g_warning ("gregistrysettingsbackend: registry_cache_update_node: Unhandled value type");
return FALSE;
}
}
@@ -838,12 +897,12 @@ registry_read (HKEY hpath,
}
static GVariant *
-g_registry_backend_read (GSettingsBackend *backend,
- const gchar *key_name,
- const GVariantType *expected_type,
- gboolean default_value)
+g_registry_settings_backend_read (GSettingsBackend *backend,
+ const gchar *key_name,
+ const GVariantType *expected_type,
+ gboolean default_value)
{
- GRegistryBackend *self = G_REGISTRY_BACKEND (backend);
+ GRegistrySettingsBackend *self = G_REGISTRY_SETTINGS_BACKEND (backend);
GNode *cache_node;
RegistryValue registry_value;
GVariant *gsettings_value = NULL;
@@ -924,16 +983,16 @@ g_registry_backend_read (GSettingsBackend *backend,
typedef struct
{
- GRegistryBackend *self;
+ GRegistrySettingsBackend *self;
HKEY hroot;
} RegistryWrite;
static gboolean
-g_registry_backend_write_one (const char *key_name,
- GVariant *variant,
- gpointer user_data)
+g_registry_settings_backend_write_one (const char *key_name,
+ GVariant *variant,
+ gpointer user_data)
{
- GRegistryBackend *self;
+ GRegistrySettingsBackend *self;
RegistryWrite *action;
RegistryValue value;
HKEY hroot;
@@ -952,7 +1011,7 @@ g_registry_backend_write_one (const char *key_name,
type_string = g_variant_get_type_string (variant);
action = user_data;
- self = G_REGISTRY_BACKEND (action->self);
+ self = G_REGISTRY_SETTINGS_BACKEND (action->self);
hroot = action->hroot;
value.type = REG_NONE;
@@ -1002,7 +1061,7 @@ g_registry_backend_write_one (const char *key_name,
/* First update the cache, because the value may not have changed and we can
* save a write.
- *
+ *
* If 'value' has changed then its memory will not be freed by update_node(),
* because it will be stored in the node.
*/
@@ -1030,7 +1089,7 @@ g_registry_backend_write_one (const char *key_name,
result = RegCreateKeyExW (hroot, path_namew, 0, NULL, 0, KEY_WRITE, NULL, &hpath, NULL);
if (result != ERROR_SUCCESS)
{
- g_message_win32_error (result, "gregistrybackend: opening key %s failed",
+ g_message_win32_error (result, "gregistrysettingsbackend: opening key %s failed",
path_name + 1);
registry_value_free (value);
g_free (path_namew);
@@ -1065,7 +1124,8 @@ g_registry_backend_write_one (const char *key_name,
result = RegSetValueExW (hpath, value_namew, 0, value.type, value_data, value_data_size);
if (result != ERROR_SUCCESS)
- g_message_win32_error (result, "gregistrybackend: setting value %s\\%s\\%s failed.\n",
+ g_message_win32_error (result, "gregistrysettingsbackend: setting value %s\\%s\\%s\\%s failed.\n",
+ predefined_key_to_string (self->base_key),
self->base_path, path_name, value_name);
/* If the write fails then it will seem like the value has changed until the
@@ -1081,32 +1141,34 @@ g_registry_backend_write_one (const char *key_name,
return FALSE;
}
-/* The dconf write policy is to do the write while making out it succeeded,
+/* The dconf write policy is to do the write while making out it succeeded,
* and then backtrack if it didn't. The registry functions are synchronous so
* we can't do that. */
static gboolean
-g_registry_backend_write (GSettingsBackend *backend,
- const gchar *key_name,
- GVariant *value,
- gpointer origin_tag)
+g_registry_settings_backend_write (GSettingsBackend *backend,
+ const gchar *key_name,
+ GVariant *value,
+ gpointer origin_tag)
{
- GRegistryBackend *self = G_REGISTRY_BACKEND (backend);
+ GRegistrySettingsBackend *self = G_REGISTRY_SETTINGS_BACKEND (backend);
LONG result;
HKEY hroot;
RegistryWrite action;
- result = RegCreateKeyExW (HKEY_CURRENT_USER, self->base_pathw, 0, NULL, 0,
+ result = RegCreateKeyExW (self->base_key, self->base_pathw, 0, NULL, 0,
KEY_WRITE, NULL, &hroot, NULL);
if (result != ERROR_SUCCESS)
{
- trace ("Error opening/creating key %s.\n", self->base_path);
+ trace ("Error opening/creating key %s\\%s.\n",
+ predefined_key_to_string (self->base_key),
+ self->base_path);
return FALSE;
}
action.self = self;
action.hroot = hroot;
- g_registry_backend_write_one (key_name, value, &action);
+ g_registry_settings_backend_write_one (key_name, value, &action);
g_settings_backend_changed (backend, key_name, origin_tag);
RegCloseKey (hroot);
@@ -1115,26 +1177,28 @@ g_registry_backend_write (GSettingsBackend *backend,
}
static gboolean
-g_registry_backend_write_tree (GSettingsBackend *backend,
- GTree *values,
- gpointer origin_tag)
+g_registry_settings_backend_write_tree (GSettingsBackend *backend,
+ GTree *values,
+ gpointer origin_tag)
{
- GRegistryBackend *self = G_REGISTRY_BACKEND (backend);
+ GRegistrySettingsBackend *self = G_REGISTRY_SETTINGS_BACKEND (backend);
LONG result;
HKEY hroot;
RegistryWrite action;
- result = RegCreateKeyExW (HKEY_CURRENT_USER, self->base_pathw, 0, NULL, 0,
+ result = RegCreateKeyExW (self->base_key, self->base_pathw, 0, NULL, 0,
KEY_WRITE, NULL, &hroot, NULL);
if (result != ERROR_SUCCESS)
{
- trace ("Error opening/creating key %s.\n", self->base_path);
+ trace ("Error opening/creating key %s\\%s.\n",
+ predefined_key_to_string (self->base_key),
+ self->base_path);
return FALSE;
}
action.self = self;
action.hroot = hroot;
- g_tree_foreach (values, (GTraverseFunc)g_registry_backend_write_one,
+ g_tree_foreach (values, (GTraverseFunc)g_registry_settings_backend_write_one,
&action);
g_settings_backend_changed_tree (backend, values, origin_tag);
@@ -1144,11 +1208,11 @@ g_registry_backend_write_tree (GSettingsBackend *backend,
}
static void
-g_registry_backend_reset (GSettingsBackend *backend,
- const gchar *key_name,
- gpointer origin_tag)
+g_registry_settings_backend_reset (GSettingsBackend *backend,
+ const gchar *key_name,
+ gpointer origin_tag)
{
- GRegistryBackend *self = G_REGISTRY_BACKEND (backend);
+ GRegistrySettingsBackend *self = G_REGISTRY_SETTINGS_BACKEND (backend);
gchar *path_name;
gunichar2 *path_namew;
gchar *value_name = NULL;
@@ -1168,12 +1232,14 @@ g_registry_backend_reset (GSettingsBackend *backend,
path_name = parse_key (key_name, self->base_path, &value_name);
path_namew = g_utf8_to_utf16 (path_name, -1, NULL, NULL, NULL);
- result = RegOpenKeyExW (HKEY_CURRENT_USER, path_namew, 0, KEY_SET_VALUE, &hpath);
+ result = RegOpenKeyExW (self->base_key, path_namew, 0, KEY_SET_VALUE, &hpath);
g_free (path_namew);
if (result != ERROR_SUCCESS)
{
- g_message_win32_error (result, "Registry: resetting key '%s'", path_name);
+ g_message_win32_error (result, "Registry: resetting key '%s\\%s'",
+ predefined_key_to_string (self->base_key),
+ path_name);
g_free (path_name);
return;
}
@@ -1186,7 +1252,9 @@ g_registry_backend_reset (GSettingsBackend *backend,
if (result != ERROR_SUCCESS)
{
- g_message_win32_error (result, "Registry: resetting key '%s'", path_name);
+ g_message_win32_error (result, "Registry: resetting key '%s\\%s'",
+ predefined_key_to_string (self->base_key),
+ path_name);
g_free (path_name);
return;
}
@@ -1197,10 +1265,10 @@ g_registry_backend_reset (GSettingsBackend *backend,
}
static gboolean
-g_registry_backend_get_writable (GSettingsBackend *backend,
- const gchar *key_name)
+g_registry_settings_backend_get_writable (GSettingsBackend *backend,
+ const gchar *key_name)
{
- GRegistryBackend *self = G_REGISTRY_BACKEND (backend);
+ GRegistrySettingsBackend *self = G_REGISTRY_SETTINGS_BACKEND (backend);
gchar *path_name;
gunichar2 *path_namew;
gchar *value_name = NULL;
@@ -1214,13 +1282,14 @@ g_registry_backend_get_writable (GSettingsBackend *backend,
* of a problem since at the end of the day we have to create it anyway
* to read or to write from it
*/
- result = RegCreateKeyExW (HKEY_CURRENT_USER, path_namew, 0, NULL, 0,
+ result = RegCreateKeyExW (self->base_key, path_namew, 0, NULL, 0,
KEY_WRITE, NULL, &hpath, NULL);
g_free (path_namew);
if (result != ERROR_SUCCESS)
{
- trace ("Error opening/creating key to check writability: %s.\n",
+ trace ("Error opening/creating key to check writability: %s\\%s.\n",
+ predefined_key_to_string (self->base_key),
path_name);
g_free (path_name);
@@ -1291,7 +1360,7 @@ registry_cache_destroy_tree (GNode *node,
/* One of these is sent down the pipe when something happens in the registry. */
typedef struct
{
- GRegistryBackend *self;
+ GRegistrySettingsBackend *self;
gchar *prefix; /* prefix is a gsettings path, all items are subkeys of this. */
GPtrArray *items; /* each item is a subkey below prefix that has changed. */
} RegistryEvent;
@@ -1348,9 +1417,9 @@ registry_cache_remove_deleted (GNode *node,
}
/* Update cache from registry, and optionally report on the changes.
- *
+ *
* This function is sometimes called from the watch thread, with no locking. It
- * does call g_registry_backend functions, but this is okay because they only
+ * does call g_registry_settings_backend functions, but this is okay because they only
* access self->base which is constant.
*
* When looking at this code bear in mind the terminology: in the registry, keys
@@ -1362,13 +1431,13 @@ registry_cache_remove_deleted (GNode *node,
* there are notifications that are watching them.
*/
static void
-registry_cache_update (GRegistryBackend *self,
- HKEY hpath,
- const gchar *prefix,
- const gchar *partial_key_name,
- GNode *cache_node,
- int n_watches,
- RegistryEvent *event)
+registry_cache_update (GRegistrySettingsBackend *self,
+ HKEY hpath,
+ const gchar *prefix,
+ const gchar *partial_key_name,
+ GNode *cache_node,
+ int n_watches,
+ RegistryEvent *event)
{
gunichar2 bufferw[MAX_KEY_NAME_LENGTH + 1];
gchar *buffer;
@@ -1439,7 +1508,7 @@ registry_cache_update (GRegistryBackend *self,
}
if (result != ERROR_NO_MORE_ITEMS)
- g_message_win32_error (result, "gregistrybackend: error enumerating subkeys for cache.");
+ g_message_win32_error (result, "gregistrysettingsbackend: error enumerating subkeys for cache.");
/* Enumerate each value at 'path' and check if it has changed */
i = 0;
@@ -1512,7 +1581,7 @@ registry_cache_update (GRegistryBackend *self,
}
if (result != ERROR_NO_MORE_ITEMS)
- g_message_win32_error (result, "gregistrybackend: error enumerating values for cache");
+ g_message_win32_error (result, "gregistrysettingsbackend: error enumerating values for cache");
/* Any nodes now left unreadable must have been deleted, remove them from cache */
g_node_children_foreach (cache_node, G_TRAVERSE_ALL,
@@ -1572,7 +1641,7 @@ _free_watch (WatchThreadState *self,
prefix = g_ptr_array_index (self->prefixes, index);
trace ("Freeing watch %i [%s]\n", index, prefix);
-
+
/* These can be NULL if the watch was already dead, this can happen when eg.
* a key is deleted but GSettings is still subscribed to it - the watch is
* kept alive so that the unsubscribe function works properly, but does not
@@ -1583,7 +1652,7 @@ _free_watch (WatchThreadState *self,
if (cache_node != NULL)
{
- //registry_cache_dump (G_REGISTRY_BACKEND (self->owner)->cache_root, NULL);
+ //registry_cache_dump (G_REGISTRY_SETTINGS_BACKEND (self->owner)->cache_root, NULL);
registry_cache_unref_tree (cache_node);
}
@@ -1803,14 +1872,14 @@ watch_thread_function (LPVOID parameter)
* likely to block (only when changing notification subscriptions).
*/
event = g_slice_new (RegistryEvent);
- event->self = G_REGISTRY_BACKEND (g_object_ref (self->owner));
+ event->self = G_REGISTRY_SETTINGS_BACKEND (g_object_ref (self->owner));
event->prefix = g_strdup (prefix);
event->items = g_ptr_array_new_with_free_func (g_free);
- EnterCriticalSection (G_REGISTRY_BACKEND (self->owner)->cache_lock);
- registry_cache_update (G_REGISTRY_BACKEND (self->owner), hpath,
+ EnterCriticalSection (G_REGISTRY_SETTINGS_BACKEND (self->owner)->cache_lock);
+ registry_cache_update (G_REGISTRY_SETTINGS_BACKEND (self->owner), hpath,
prefix, NULL, cache_node, 0, event);
- LeaveCriticalSection (G_REGISTRY_BACKEND (self->owner)->cache_lock);
+ LeaveCriticalSection (G_REGISTRY_SETTINGS_BACKEND (self->owner)->cache_lock);
if (event->items->len > 0)
g_idle_add ((GSourceFunc) watch_handler, event);
@@ -1833,7 +1902,7 @@ watch_thread_function (LPVOID parameter)
}
static gboolean
-watch_start (GRegistryBackend *self)
+watch_start (GRegistrySettingsBackend *self)
{
WatchThreadState *watch;
@@ -1850,7 +1919,7 @@ watch_start (GRegistryBackend *self)
watch->message_received_event = CreateEvent (NULL, FALSE, FALSE, NULL);
if (watch->message_sent_event == NULL || watch->message_received_event == NULL)
{
- g_message_win32_error (GetLastError (), "gregistrybackend: Failed to create sync objects.");
+ g_message_win32_error (GetLastError (), "gregistrysettingsbackend: Failed to create sync objects.");
goto fail;
}
@@ -1858,7 +1927,7 @@ watch_start (GRegistryBackend *self)
watch->thread = CreateThread (NULL, 1024, watch_thread_function, watch, 0, NULL);
if (watch->thread == NULL)
{
- g_message_win32_error (GetLastError (), "gregistrybackend: Failed to create notify watch thread.");
+ g_message_win32_error (GetLastError (), "gregistrysettingsbackend: Failed to create notify watch thread.");
goto fail;
}
@@ -1880,7 +1949,7 @@ fail:
/* This function assumes you hold the message lock! */
static void
-watch_stop_unlocked (GRegistryBackend *self)
+watch_stop_unlocked (GRegistrySettingsBackend *self)
{
WatchThreadState *watch = self->watch;
DWORD result;
@@ -1897,7 +1966,7 @@ watch_stop_unlocked (GRegistryBackend *self)
result = WaitForSingleObject (watch->message_received_event, INFINITE);
if (result != WAIT_OBJECT_0)
{
- g_warning ("gregistrybackend: unable to stop watch thread.");
+ g_warning ("gregistrysettingsbackend: unable to stop watch thread.");
return;
}
@@ -1914,10 +1983,10 @@ watch_stop_unlocked (GRegistryBackend *self)
}
static gboolean
-watch_add_notify (GRegistryBackend *self,
- HANDLE event,
- HKEY hpath,
- gchar *gsettings_prefix)
+watch_add_notify (GRegistrySettingsBackend *self,
+ HANDLE event,
+ HKEY hpath,
+ gchar *gsettings_prefix)
{
WatchThreadState *watch = self->watch;
GNode *cache_node;
@@ -1942,7 +2011,7 @@ watch_add_notify (GRegistryBackend *self,
g_warn_if_reached ();
return FALSE;
}
-
+
cache_item = cache_node->data;
cache_item->subscription_count++;
@@ -1987,8 +2056,8 @@ watch_add_notify (GRegistryBackend *self,
}
static void
-watch_remove_notify (GRegistryBackend *self,
- const gchar *key_name)
+watch_remove_notify (GRegistrySettingsBackend *self,
+ const gchar *key_name)
{
WatchThreadState *watch = self->watch;
LONG result;
@@ -2025,10 +2094,10 @@ watch_remove_notify (GRegistryBackend *self,
* key. Our job is easier because keys and values are separate.
*/
static void
-g_registry_backend_subscribe (GSettingsBackend *backend,
- const char *key_name)
+g_registry_settings_backend_subscribe (GSettingsBackend *backend,
+ const char *key_name)
{
- GRegistryBackend *self = G_REGISTRY_BACKEND (backend);
+ GRegistrySettingsBackend *self = G_REGISTRY_SETTINGS_BACKEND (backend);
gchar *path_name;
gunichar2 *path_namew;
gchar *value_name = NULL;
@@ -2062,13 +2131,13 @@ g_registry_backend_subscribe (GSettingsBackend *backend,
/* Give the caller the benefit of the doubt if the key doesn't exist and create it. The caller
* is almost certainly a new g_settings with this path as base path. */
- result = RegCreateKeyExW (HKEY_CURRENT_USER, path_namew, 0, NULL, 0, KEY_READ, NULL, &hpath,
+ result = RegCreateKeyExW (self->base_key, path_namew, 0, NULL, 0, KEY_READ, NULL, &hpath,
NULL);
g_free (path_namew);
if (result != ERROR_SUCCESS)
{
- g_message_win32_error (result, "gregistrybackend: Unable to subscribe to key %s.", key_name);
+ g_message_win32_error (result, "gregistrysettingsbackend: Unable to subscribe to key %s.", key_name);
g_atomic_int_inc (&self->watch->watches_remaining);
return;
}
@@ -2076,7 +2145,7 @@ g_registry_backend_subscribe (GSettingsBackend *backend,
event = CreateEvent (NULL, FALSE, FALSE, NULL);
if (event == NULL)
{
- g_message_win32_error (result, "gregistrybackend: CreateEvent failed.");
+ g_message_win32_error (result, "gregistrysettingsbackend: CreateEvent failed.");
g_atomic_int_inc (&self->watch->watches_remaining);
RegCloseKey (hpath);
return;
@@ -2093,12 +2162,12 @@ g_registry_backend_subscribe (GSettingsBackend *backend,
}
static void
-g_registry_backend_unsubscribe (GSettingsBackend *backend,
- const char *key_name)
+g_registry_settings_backend_unsubscribe (GSettingsBackend *backend,
+ const char *key_name)
{
trace ("unsubscribe: %s.\n", key_name);
- watch_remove_notify (G_REGISTRY_BACKEND (backend), key_name);
+ watch_remove_notify (G_REGISTRY_SETTINGS_BACKEND (backend), key_name);
}
/********************************************************************************
@@ -2106,9 +2175,9 @@ g_registry_backend_unsubscribe (GSettingsBackend *backend,
********************************************************************************/
static void
-g_registry_backend_finalize (GObject *object)
+g_registry_settings_backend_finalize (GObject *object)
{
- GRegistryBackend *self = G_REGISTRY_BACKEND (object);
+ GRegistrySettingsBackend *self = G_REGISTRY_SETTINGS_BACKEND (object);
RegistryCacheItem *item;
item = self->cache_root->data;
@@ -2131,30 +2200,137 @@ g_registry_backend_finalize (GObject *object)
}
static void
-g_registry_backend_class_init (GRegistryBackendClass *class)
+g_registry_settings_backend_constructed (GObject *object)
+{
+ GRegistrySettingsBackend *self = G_REGISTRY_SETTINGS_BACKEND (object);
+
+ if (self->base_key == NULL || self->base_path == NULL || self->base_pathw == NULL)
+ {
+ self->base_key = HKEY_CURRENT_USER;
+ self->base_path = g_strdup ("Software\\GSettings");
+ self->base_pathw = g_utf8_to_utf16 (self->base_path, -1, NULL, NULL, NULL);
+ }
+}
+
+static void
+g_registry_settings_backend_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GRegistrySettingsBackend *self = G_REGISTRY_SETTINGS_BACKEND (object);
+
+ switch ((GRegistrySettingsBackendProperty) prop_id)
+ {
+ case PROP_REGISTRY_KEY:
+ g_value_take_string (value,
+ g_strdup_printf ("%s\\%s",
+ predefined_key_to_string (self->base_key),
+ self->base_path));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+g_registry_settings_backend_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GRegistrySettingsBackend *self = G_REGISTRY_SETTINGS_BACKEND (object);
+ const gchar *reg_path;
+
+ switch ((GRegistrySettingsBackendProperty) prop_id)
+ {
+ case PROP_REGISTRY_KEY:
+ /* Construct only. */
+ g_assert (self->base_key == NULL);
+ g_assert (self->base_path == NULL);
+ g_assert (self->base_pathw == NULL);
+
+ reg_path = g_value_get_string (value);
+ if (reg_path != NULL)
+ {
+ HKEY base_key;
+ const gchar *base_path = split_registry_path (reg_path, &base_key);
+
+ if (base_path != NULL)
+ {
+ gunichar2 *base_pathw = g_utf8_to_utf16 (base_path, -1, NULL, NULL, NULL);
+
+ if (base_pathw != NULL)
+ {
+ self->base_key = g_steal_pointer (&base_key);
+ self->base_path = g_strdup (base_path);
+ self->base_pathw = g_steal_pointer (&base_pathw);
+ }
+ else
+ g_warning ("gregistrysettingsbackend: invalid base registry path '%s'", reg_path);
+ }
+ else
+ g_warning ("gregistrysettingsbackend: base registry path '%s' does not start with a valid root key", reg_path);
+ }
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+g_registry_settings_backend_class_init (GRegistrySettingsBackendClass *class)
{
GSettingsBackendClass *backend_class = G_SETTINGS_BACKEND_CLASS (class);
GObjectClass *object_class = G_OBJECT_CLASS (class);
- object_class->finalize = g_registry_backend_finalize;
-
- backend_class->read = g_registry_backend_read;
- backend_class->write = g_registry_backend_write;
- backend_class->write_tree = g_registry_backend_write_tree;
- backend_class->reset = g_registry_backend_reset;
- backend_class->get_writable = g_registry_backend_get_writable;
- backend_class->subscribe = g_registry_backend_subscribe;
- backend_class->unsubscribe = g_registry_backend_unsubscribe;
+ object_class->finalize = g_registry_settings_backend_finalize;
+ object_class->constructed = g_registry_settings_backend_constructed;
+ object_class->get_property = g_registry_settings_backend_get_property;
+ object_class->set_property = g_registry_settings_backend_set_property;
+
+ backend_class->read = g_registry_settings_backend_read;
+ backend_class->write = g_registry_settings_backend_write;
+ backend_class->write_tree = g_registry_settings_backend_write_tree;
+ backend_class->reset = g_registry_settings_backend_reset;
+ backend_class->get_writable = g_registry_settings_backend_get_writable;
+ backend_class->subscribe = g_registry_settings_backend_subscribe;
+ backend_class->unsubscribe = g_registry_settings_backend_unsubscribe;
+
+ /**
+ * GRegistrySettingsBackend:registry-key:
+ *
+ * The location where settings are stored in the registry. Must
+ * start with one of the following:
+ * - `HKEY_CLASSES_ROOT`
+ * - `HKEY_CURRENT_CONFIG`
+ * - `HKEY_CURRENT_USER`
+ * - `HKEY_LOCAL_MACHINE`
+ * - `HKEY_USERS`
+ *
+ * Defaults to `HKEY_CURRENT_USER\Software\GSettings`.
+ *
+ * Since: 2.78
+ */
+ g_object_class_install_property (object_class,
+ PROP_REGISTRY_KEY,
+ g_param_spec_string ("registry-key",
+ P_("Root registry key"),
+ P_("The path to the registry key where settings are stored"),
+ "HKEY_CURRENT_USER\\Software\\GSettings",
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS));
}
static void
-g_registry_backend_init (GRegistryBackend *self)
+g_registry_settings_backend_init (GRegistrySettingsBackend *self)
{
RegistryCacheItem *item;
- self->base_path = g_strdup_printf ("Software\\GSettings");
- self->base_pathw = g_utf8_to_utf16 (self->base_path, -1, NULL, NULL, NULL);
-
item = g_slice_new (RegistryCacheItem);
item->value.type = REG_NONE;
item->value.ptr = NULL;
@@ -2167,3 +2343,25 @@ g_registry_backend_init (GRegistryBackend *self)
self->watch = NULL;
}
+
+/**
+ * g_registry_settings_backend_new:
+ * @registry_key: (nullable): the path to the registry key where
+ * settings are stored, or %NULL.
+ *
+ * If @registry_key is %NULL then the default path
+ * `HKEY_CURRENT_USER\Software\GSettings` is used.
+ *
+ * Returns: (transfer full): a registry-backed #GSettingsBackend
+ *
+ * Since: 2.78
+ **/
+GSettingsBackend *
+g_registry_settings_backend_new (const gchar *registry_key)
+{
+ g_return_val_if_fail (registry_key == NULL || split_registry_path (registry_key, NULL), NULL);
+
+ return G_SETTINGS_BACKEND (g_object_new (G_TYPE_REGISTRY_SETTINGS_BACKEND,
+ "registry-key", registry_key,
+ NULL));
+}
diff --git a/gio/gregistrysettingsbackend.h b/gio/gregistrysettingsbackend.h
index 34fdff0ed..77685885a 100644
--- a/gio/gregistrysettingsbackend.h
+++ b/gio/gregistrysettingsbackend.h
@@ -24,7 +24,9 @@
#include <glib-object.h>
-GType g_registry_backend_get_type (void);
+#include <gio/gsettingsbackend.h>
+GIO_AVAILABLE_IN_2_78
+GSettingsBackend * g_registry_settings_backend_new (const gchar *registry_key);
#endif /* __G_REGISTRY_SETTINGS_BACKEND_H__ */
diff --git a/gio/gsettingsbackendinternal.h b/gio/gsettingsbackendinternal.h
index 049dc4724..3b9b6ebc3 100644
--- a/gio/gsettingsbackendinternal.h
+++ b/gio/gsettingsbackendinternal.h
@@ -95,4 +95,8 @@ GType g_keyfile_settings_backend_get_type (void);
GType g_nextstep_settings_backend_get_type (void);
#endif
+#ifdef G_OS_WIN32
+GType g_registry_settings_backend_get_type (void);
+#endif
+
#endif /* __G_SETTINGS_BACKEND_INTERNAL_H__ */
diff --git a/gio/gsocket.c b/gio/gsocket.c
index 2dc005b63..d25591a17 100644
--- a/gio/gsocket.c
+++ b/gio/gsocket.c
@@ -587,7 +587,38 @@ g_socket_details_from_fd (GSocket *socket)
socket_strerror (errsv));
}
-/* Wrapper around socket() that is shared with gnetworkmonitornetlink.c */
+static void
+socket_set_nonblock (int fd)
+{
+#ifndef G_OS_WIN32
+ GError *error = NULL;
+#else
+ gulong arg;
+#endif
+
+ /* Always use native nonblocking sockets, as Windows sets sockets to
+ * nonblocking automatically in certain operations. This way we make
+ * things work the same on all platforms.
+ */
+#ifndef G_OS_WIN32
+ if (!g_unix_set_fd_nonblocking (fd, TRUE, &error))
+ {
+ g_warning ("Error setting socket to nonblocking mode: %s", error->message);
+ g_clear_error (&error);
+ }
+#else
+ arg = TRUE;
+
+ if (ioctlsocket (fd, FIONBIO, &arg) == SOCKET_ERROR)
+ {
+ int errsv = get_socket_errno ();
+ g_warning ("Error setting socket status flags: %s", socket_strerror (errsv));
+ }
+#endif
+}
+
+/* Wrapper around socket() that is shared with gnetworkmonitornetlink.c.
+ * It always sets SOCK_CLOEXEC | SOCK_NONBLOCK. */
gint
g_socket (gint domain,
gint type,
@@ -596,13 +627,13 @@ g_socket (gint domain,
{
int fd, errsv;
-#ifdef SOCK_CLOEXEC
- fd = socket (domain, type | SOCK_CLOEXEC, protocol);
+#if defined(SOCK_CLOEXEC) && defined(SOCK_NONBLOCK)
+ fd = socket (domain, type | SOCK_CLOEXEC | SOCK_NONBLOCK, protocol);
errsv = errno;
if (fd != -1)
return fd;
- /* It's possible that libc has SOCK_CLOEXEC but the kernel does not */
+ /* It's possible that libc has SOCK_CLOEXEC and/or SOCK_NONBLOCK but the kernel does not */
if (fd < 0 && (errsv == EINVAL || errsv == EPROTOTYPE))
#endif
fd = socket (domain, type, protocol);
@@ -644,9 +675,13 @@ g_socket (gint domain,
}
#endif
+ /* Ensure the socket is non-blocking. */
+ socket_set_nonblock (fd);
+
return fd;
}
+/* Returned socket has SOCK_CLOEXEC | SOCK_NONBLOCK set. */
static gint
g_socket_create_socket (GSocketFamily family,
GSocketType type,
@@ -696,44 +731,22 @@ g_socket_constructed (GObject *object)
GSocket *socket = G_SOCKET (object);
if (socket->priv->fd >= 0)
- /* create socket->priv info from the fd */
- g_socket_details_from_fd (socket);
-
+ {
+ /* create socket->priv info from the fd and ensure it’s non-blocking */
+ g_socket_details_from_fd (socket);
+ socket_set_nonblock (socket->priv->fd);
+ }
else
- /* create the fd from socket->priv info */
- socket->priv->fd = g_socket_create_socket (socket->priv->family,
- socket->priv->type,
- socket->priv->protocol,
- &socket->priv->construct_error);
+ {
+ /* create the fd from socket->priv info; this sets it non-blocking by construction */
+ socket->priv->fd = g_socket_create_socket (socket->priv->family,
+ socket->priv->type,
+ socket->priv->protocol,
+ &socket->priv->construct_error);
+ }
if (socket->priv->fd != -1)
{
-#ifndef G_OS_WIN32
- GError *error = NULL;
-#else
- gulong arg;
-#endif
-
- /* Always use native nonblocking sockets, as Windows sets sockets to
- * nonblocking automatically in certain operations. This way we make
- * things work the same on all platforms.
- */
-#ifndef G_OS_WIN32
- if (!g_unix_set_fd_nonblocking (socket->priv->fd, TRUE, &error))
- {
- g_warning ("Error setting socket nonblocking: %s", error->message);
- g_clear_error (&error);
- }
-#else
- arg = TRUE;
-
- if (ioctlsocket (socket->priv->fd, FIONBIO, &arg) == SOCKET_ERROR)
- {
- int errsv = get_socket_errno ();
- g_warning ("Error setting socket status flags: %s", socket_strerror (errsv));
- }
-#endif
-
#ifdef SO_NOSIGPIPE
/* See note about SIGPIPE below. */
g_socket_set_option (socket, SOL_SOCKET, SO_NOSIGPIPE, TRUE, NULL);
@@ -3304,7 +3317,7 @@ g_socket_receive_with_timeout (GSocket *socket,
* @socket: a #GSocket
* @buffer: (array length=size) (element-type guint8) (out caller-allocates):
* a buffer to read data into (which should be at least @size bytes long).
- * @size: the number of bytes you want to read from the socket
+ * @size: (in): the number of bytes you want to read from the socket
* @cancellable: (nullable): a %GCancellable or %NULL
* @error: #GError for error reporting, or %NULL to ignore.
*
@@ -3354,7 +3367,7 @@ g_socket_receive (GSocket *socket,
* @socket: a #GSocket
* @buffer: (array length=size) (element-type guint8) (out caller-allocates):
* a buffer to read data into (which should be at least @size bytes long).
- * @size: the number of bytes you want to read from the socket
+ * @size: (in): the number of bytes you want to read from the socket
* @blocking: whether to do blocking or non-blocking I/O
* @cancellable: (nullable): a %GCancellable or %NULL
* @error: #GError for error reporting, or %NULL to ignore.
diff --git a/gio/gtestdbus.c b/gio/gtestdbus.c
index 34cead176..8c5de3355 100644
--- a/gio/gtestdbus.c
+++ b/gio/gtestdbus.c
@@ -249,7 +249,7 @@ watcher_init (void)
gint pipe_fds[2];
/* fork a child to clean up when we are killed */
- if (!g_unix_open_pipe_internal (pipe_fds, TRUE))
+ if (!g_unix_open_pipe_internal (pipe_fds, TRUE, FALSE))
{
errsv = errno;
g_warning ("pipe() failed: %s", g_strerror (errsv));
diff --git a/gio/gwin32appinfo.c b/gio/gwin32appinfo.c
index 332960cdf..49e76ca9a 100644
--- a/gio/gwin32appinfo.c
+++ b/gio/gwin32appinfo.c
@@ -4357,7 +4357,7 @@ expand_macro_single (char macro, file_or_uri *obj)
const char *prefix = "file:///";
const size_t prefix_len = strlen (prefix);
- if (g_str_has_prefix (obj->uri, prefix) == 0 && obj->uri[prefix_len] != 0)
+ if (g_str_has_prefix (obj->uri, prefix) && obj->uri[prefix_len] != 0)
{
GFile *file = g_file_new_for_uri (obj->uri);
result = g_file_get_path (file);
diff --git a/gio/inotify/inotify-kernel.c b/gio/inotify/inotify-kernel.c
index 92d61fc31..7733d398e 100644
--- a/gio/inotify/inotify-kernel.c
+++ b/gio/inotify/inotify-kernel.c
@@ -377,6 +377,7 @@ ik_source_new (gboolean (* callback) (ik_event_t *event))
};
InotifyKernelSource *iks;
GSource *source;
+ gboolean should_set_nonblock = FALSE;
source = g_source_new (&source_funcs, sizeof (InotifyKernelSource));
iks = (InotifyKernelSource *) source;
@@ -384,17 +385,23 @@ ik_source_new (gboolean (* callback) (ik_event_t *event))
g_source_set_static_name (source, "inotify kernel source");
iks->unmatched_moves = g_hash_table_new (NULL, NULL);
- iks->fd = inotify_init1 (IN_CLOEXEC);
+ iks->fd = inotify_init1 (IN_CLOEXEC | IN_NONBLOCK);
if (iks->fd < 0)
- iks->fd = inotify_init ();
+ {
+ should_set_nonblock = TRUE;
+ iks->fd = inotify_init ();
+ }
if (iks->fd >= 0)
{
GError *error = NULL;
- g_unix_set_fd_nonblocking (iks->fd, TRUE, &error);
- g_assert_no_error (error);
+ if (should_set_nonblock)
+ {
+ g_unix_set_fd_nonblocking (iks->fd, TRUE, &error);
+ g_assert_no_error (error);
+ }
iks->fd_tag = g_source_add_unix_fd (source, iks->fd, G_IO_IN);
}
diff --git a/gio/inotify/inotify-sub.c b/gio/inotify/inotify-sub.c
index b161557db..baa6b6e11 100644
--- a/gio/inotify/inotify-sub.c
+++ b/gio/inotify/inotify-sub.c
@@ -36,7 +36,7 @@ dup_dirname (const gchar *dirname)
gchar *d_dirname = g_strdup (dirname);
size_t len = strlen (d_dirname);
- if (d_dirname[len - 1] == '/')
+ if (len > 1 && d_dirname[len - 1] == '/')
d_dirname[len - 1] = '\0';
return d_dirname;
diff --git a/gio/meson.build b/gio/meson.build
index b056546ed..b19c59fa0 100644
--- a/gio/meson.build
+++ b/gio/meson.build
@@ -276,10 +276,6 @@ settings_sources = files(
'gsettings.c',
)
-if host_system == 'windows'
- settings_sources += files('gregistrysettingsbackend.c')
-endif
-
application_headers = files(
'gapplication.h',
'gapplicationcommandline.h',
@@ -444,6 +440,7 @@ else
win32_sources += files(
'gmemorymonitorwin32.c',
+ 'gregistrysettingsbackend.c',
'gwin32registrykey.c',
'gwin32mount.c',
'gwin32volumemonitor.c',
@@ -467,6 +464,7 @@ else
win32_sources += [gio_win_res]
gio_win32_include_headers = files(
+ 'gregistrysettingsbackend.h',
'gwin32inputstream.h',
'gwin32outputstream.h',
)
@@ -932,7 +930,7 @@ endif
# Dependencies used by executables below
have_libelf = false
-libelf = dependency('libelf', version : '>= 0.8.12', required : get_option ('libelf'))
+libelf = dependency('libelf', version : '>= 0.8.12', required : false)
if libelf.found()
have_libelf = true
else
diff --git a/gio/tests/.gitignore b/gio/tests/.gitignore
deleted file mode 100644
index e6c9124a4..000000000
--- a/gio/tests/.gitignore
+++ /dev/null
@@ -1,146 +0,0 @@
-actions
-appinfo
-appinfo-test
-appmonitor
-apps
-async-close-output-stream
-async-splice-output-stream
-autoptr
-basic-application
-buffered-input-stream
-buffered-output-stream
-cancellable
-connectable
-contenttype
-contexts
-converter-stream
-credentials
-data-input-stream
-data-output-stream
-dbus-appinfo
-dbus-launch
-de/
-defaultvalue
-desktop-app-info
-echo-server
-file
-fileattributematcher
-filter-cat
-filter-streams
-gapplication
-gapplication-example-actions
-gapplication-example-cmdline
-gapplication-example-cmdline2
-gapplication-example-cmdline3
-gapplication-example-dbushooks
-gapplication-example-menu
-gapplication-example-open
-gdbus-addresses
-gdbus-auth
-gdbus-bz627724
-gdbus-close-pending
-gdbus-connection
-gdbus-connection-flush
-gdbus-connection-flush-helper
-gdbus-connection-loss
-gdbus-connection-slow
-gdbus-daemon
-gdbus-error
-gdbus-example-export
-gdbus-example-objectmanager-client
-gdbus-example-objectmanager-server
-gdbus-example-own-name
-gdbus-example-peer
-gdbus-example-proxy-subclass
-gdbus-example-server
-gdbus-example-subtree
-gdbus-example-unix-fd-client
-gdbus-example-watch-name
-gdbus-example-watch-proxy
-gdbus-exit-on-close
-gdbus-export
-gdbus-introspection
-gdbus-message
-gdbus-names
-gdbus-non-socket
-gdbus-overflow
-gdbus-peer
-gdbus-peer-object-manager
-gdbus-proxy
-gdbus-proxy-threads
-gdbus-proxy-well-known-name
-gdbus-serialization
-gdbus-test-codegen
-gdbus-test-codegen-generated*
-gdbus-test-codegen-old
-gdbus-test-fixture
-gdbus-testserver
-gdbus-threading
-gdbus-address-get-session
-glistmodel
-gio-du
-giomodule
-giotypefuncs.inc
-gnotification
-gsubprocess
-gsubprocess-testprog
-g-file
-g-file-info
-g-icon
-gmenumodel
-gschemas.compiled
-gsettings
-gsettings.store
-httpd
-icons
-inet-address
-io-stream
-live-g-file
-memory-input-stream
-memory-output-stream
-mimeapps
-monitor
-network-address
-network-monitor
-org.gtk.test.enums.xml
-org.gtk.test.gschema.xml
-permission
-pollable
-plugin_resources.c
-proxy
-proxy-test
-readwrite
-resolver
-resources
-send-data
-services/org.gtk.GDBus.Examples.ObjectManager.service
-simple-async-result
-simple-proxy
-sleepy-stream
-stream-rw_all
-socket
-socket-address
-socket-client
-socket-listener
-socket-service
-socket-server
-srvtarget
-task
-test-generated.txt
-test.gresource
-test.mo
-test_resources.c
-test_resources2.c
-test_resources2.h
-testfilemonitor
-thumbnail-verification
-tls-certificate
-tls-database
-tls-interaction
-unix-fd
-unix-streams
-vfs
-volumemonitor
-xgen-gio
-xgen-giosrc.c
-gresource-big-test.txt
diff --git a/gio/tests/appmonitor.c b/gio/tests/appmonitor.c
index 9db8c4dea..c1d68b889 100644
--- a/gio/tests/appmonitor.c
+++ b/gio/tests/appmonitor.c
@@ -1,6 +1,31 @@
+/* GLib testing framework examples and tests
+ *
+ * Copyright © 2013 Red Hat, Inc.
+ * Copyright © 2015, 2017, 2018 Endless Mobile, Inc.
+ *
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ *
+ * 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.1 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 library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
#include <gio/gio.h>
#include <gstdio.h>
+#ifdef G_OS_UNIX
+#include <gio/gdesktopappinfo.h>
+#endif
+
typedef struct
{
gchar *applications_dir;
@@ -24,6 +49,7 @@ teardown (Fixture *fixture,
g_clear_pointer (&fixture->applications_dir, g_free);
}
+#ifdef G_OS_UNIX
static gboolean
create_app (gpointer data)
{
@@ -50,73 +76,95 @@ delete_app (gpointer data)
g_remove (path);
}
-static gboolean changed_fired;
-
static void
-changed_cb (GAppInfoMonitor *monitor, GMainLoop *loop)
+changed_cb (GAppInfoMonitor *monitor,
+ gpointer user_data)
{
- changed_fired = TRUE;
- g_main_loop_quit (loop);
+ gboolean *changed_fired = user_data;
+
+ *changed_fired = TRUE;
+ g_main_context_wakeup (g_main_context_get_thread_default ());
}
static gboolean
-quit_loop (gpointer data)
+timeout_cb (gpointer user_data)
{
- GMainLoop *loop = data;
+ gboolean *timed_out = user_data;
- if (g_main_loop_is_running (loop))
- g_main_loop_quit (loop);
+ g_assert (!timed_out);
+ *timed_out = TRUE;
+ g_main_context_wakeup (g_main_context_get_thread_default ());
return G_SOURCE_REMOVE;
}
+#endif /* G_OS_UNIX */
static void
test_app_monitor (Fixture *fixture,
gconstpointer user_data)
{
+#ifdef G_OS_UNIX
gchar *app_path;
GAppInfoMonitor *monitor;
- GMainLoop *loop;
-
-#ifdef G_OS_WIN32
- g_test_skip (".desktop monitor on win32");
- return;
-#endif
+ GMainContext *context = NULL; /* use the global default main context */
+ GSource *timeout_source = NULL;
+ GDesktopAppInfo *app = NULL;
+ gboolean changed_fired = FALSE;
+ gboolean timed_out = FALSE;
app_path = g_build_filename (fixture->applications_dir, "app.desktop", NULL);
/* FIXME: this shouldn't be required */
g_list_free_full (g_app_info_get_all (), g_object_unref);
+ /* Create an app monitor and check that its ::changed signal is emitted when
+ * a new app is installed. */
monitor = g_app_info_monitor_get ();
- loop = g_main_loop_new (NULL, FALSE);
- g_signal_connect (monitor, "changed", G_CALLBACK (changed_cb), loop);
+ g_signal_connect (monitor, "changed", G_CALLBACK (changed_cb), &changed_fired);
g_idle_add (create_app, app_path);
- g_timeout_add_seconds (3, quit_loop, loop);
+ timeout_source = g_timeout_source_new_seconds (3);
+ g_source_set_callback (timeout_source, timeout_cb, &timed_out, NULL);
+ g_source_attach (timeout_source, NULL);
+
+ while (!changed_fired && !timed_out)
+ g_main_context_iteration (context, TRUE);
- g_main_loop_run (loop);
- g_assert (changed_fired);
+ g_assert_true (changed_fired);
changed_fired = FALSE;
- /* FIXME: this shouldn't be required */
- g_list_free_full (g_app_info_get_all (), g_object_unref);
+ g_source_destroy (timeout_source);
+ g_clear_pointer (&timeout_source, g_source_unref);
+
+ /* Check that the app is now queryable. This has the side-effect of re-arming
+ * the #GAppInfoMonitor::changed signal for the next part of the test. */
+ app = g_desktop_app_info_new ("app.desktop");
+ g_assert_nonnull (app);
+ g_clear_object (&app);
- g_timeout_add_seconds (3, quit_loop, loop);
+ /* Now check that ::changed is emitted when an app is uninstalled. */
+ timeout_source = g_timeout_source_new_seconds (3);
+ g_source_set_callback (timeout_source, timeout_cb, &timed_out, NULL);
+ g_source_attach (timeout_source, NULL);
delete_app (app_path);
- g_main_loop_run (loop);
+ while (!changed_fired && !timed_out)
+ g_main_context_iteration (context, TRUE);
- g_assert (changed_fired);
+ g_assert_true (changed_fired);
- g_main_loop_unref (loop);
+ g_source_destroy (timeout_source);
+ g_clear_pointer (&timeout_source, g_source_unref);
g_remove (app_path);
g_object_unref (monitor);
g_free (app_path);
+#else /* if !G_OS_UNIX */
+ g_test_skip (".desktop monitor on win32");
+#endif /* !G_OS_UNIX */
}
int
diff --git a/gio/tests/file.c b/gio/tests/file.c
index d16eda5c0..ad2f945f9 100644
--- a/gio/tests/file.c
+++ b/gio/tests/file.c
@@ -2515,75 +2515,10 @@ test_copy_preserve_mode (void)
#endif
}
-static gchar *
-splice_to_string (GInputStream *stream,
- GError **error)
-{
- GMemoryOutputStream *buffer = NULL;
- char *ret = NULL;
-
- buffer = (GMemoryOutputStream*)g_memory_output_stream_new (NULL, 0, g_realloc, g_free);
- if (g_output_stream_splice ((GOutputStream*)buffer, stream, 0, NULL, error) < 0)
- goto out;
-
- if (!g_output_stream_write ((GOutputStream*)buffer, "\0", 1, NULL, error))
- goto out;
-
- if (!g_output_stream_close ((GOutputStream*)buffer, NULL, error))
- goto out;
-
- ret = g_memory_output_stream_steal_data (buffer);
- out:
- g_clear_object (&buffer);
- return ret;
-}
-
-static gboolean
-get_size_from_du (const gchar *path, guint64 *size)
-{
- GSubprocess *du;
- gboolean ok;
- gchar *result;
- gchar *endptr;
- GError *error = NULL;
- gchar *du_path = NULL;
-
-#ifndef __APPLE__
- du_path = g_find_program_in_path ("du");
-#endif
-
- /* If we can’t find du, don’t try and run the test. */
- if (du_path == NULL)
- return FALSE;
-
- g_free (du_path);
-
- du = g_subprocess_new (G_SUBPROCESS_FLAGS_STDOUT_PIPE,
- &error,
- "du", "--bytes", "-s", path, NULL);
- g_assert_no_error (error);
-
- result = splice_to_string (g_subprocess_get_stdout_pipe (du), &error);
- g_assert_no_error (error);
-
- *size = g_ascii_strtoll (result, &endptr, 10);
-
- g_subprocess_wait (du, NULL, &error);
- g_assert_no_error (error);
-
- ok = g_subprocess_get_successful (du);
-
- g_object_unref (du);
- g_free (result);
-
- return ok;
-}
-
static void
test_measure (void)
{
GFile *file;
- guint64 size;
guint64 num_bytes;
guint64 num_dirs;
guint64 num_files;
@@ -2594,12 +2529,6 @@ test_measure (void)
path = g_test_build_filename (G_TEST_DIST, "desktop-files", NULL);
file = g_file_new_for_path (path);
- if (!get_size_from_du (path, &size))
- {
- g_test_message ("du not found or fail to run, skipping byte measurement");
- size = 0;
- }
-
ok = g_file_measure_disk_usage (file,
G_FILE_MEASURE_APPARENT_SIZE,
NULL,
@@ -2612,8 +2541,7 @@ test_measure (void)
g_assert_true (ok);
g_assert_no_error (error);
- if (size > 0)
- g_assert_cmpuint (num_bytes, ==, size);
+ g_assert_cmpuint (num_bytes, ==, 74478);
g_assert_cmpuint (num_dirs, ==, 6);
g_assert_cmpuint (num_files, ==, 32);
@@ -2665,8 +2593,7 @@ measure_done (GObject *source,
g_assert_true (ok);
g_assert_no_error (error);
- if (data->expected_bytes > 0)
- g_assert_cmpuint (data->expected_bytes, ==, num_bytes);
+ g_assert_cmpuint (data->expected_bytes, ==, num_bytes);
g_assert_cmpuint (data->expected_dirs, ==, num_dirs);
g_assert_cmpuint (data->expected_files, ==, num_files);
@@ -2695,15 +2622,9 @@ test_measure_async (void)
path = g_test_build_filename (G_TEST_DIST, "desktop-files", NULL);
file = g_file_new_for_path (path);
-
- if (!get_size_from_du (path, &data->expected_bytes))
- {
- g_test_message ("du not found or fail to run, skipping byte measurement");
- data->expected_bytes = 0;
- }
-
g_free (path);
+ data->expected_bytes = 74478;
data->expected_dirs = 6;
data->expected_files = 32;
diff --git a/gio/tests/gdbus-example-proxy-subclass.c b/gio/tests/gdbus-example-proxy-subclass.c
index 05314ba2a..91b377c48 100644
--- a/gio/tests/gdbus-example-proxy-subclass.c
+++ b/gio/tests/gdbus-example-proxy-subclass.c
@@ -340,9 +340,111 @@ accounts_user_frobnicate_finish (AccountsUser *user,
}
/* ---------------------------------------------------------------------------------------------------- */
+/* Example usage of the AccountsUser type */
+/* ---------------------------------------------------------------------------------------------------- */
+
+static void
+print_user (AccountsUser *user)
+{
+ g_print (" user-name = `%s'\n", accounts_user_get_user_name (user));
+ g_print (" real-name = `%s'\n", accounts_user_get_real_name (user));
+ g_print (" automatic-login = %s\n", accounts_user_get_automatic_login (user) ? "true" : "false");
+}
+
+static void
+on_changed (AccountsUser *user,
+ gpointer user_data)
+{
+ g_print ("+++ Received the AccountsUser::changed signal\n");
+ print_user (user);
+}
+
+static void
+on_notify (GObject *object,
+ GParamSpec *pspec,
+ gpointer user_data)
+{
+ AccountsUser *user = ACCOUNTS_USER (object);
+ g_print ("+++ Received the GObject::notify signal for property `%s'\n",
+ pspec->name);
+ print_user (user);
+}
+
+static void
+on_accounts_proxy_available (GObject *object,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GError *error = NULL;
+ GObject *user_object;
+ AccountsUser *user;
+
+ user_object = g_async_initable_new_finish (G_ASYNC_INITABLE (object),
+ result,
+ &error);
+ if (!user_object)
+ {
+ g_error ("Failed to create proxy: %s", error->message);
+ g_clear_error (&error);
+ return;
+ }
+ user = ACCOUNTS_USER (user_object);
+
+ g_print ("+++ Acquired proxy for user\n");
+ print_user (user);
+
+ g_signal_connect (user,
+ "notify",
+ G_CALLBACK (on_notify),
+ NULL);
+ g_signal_connect (user,
+ "changed",
+ G_CALLBACK (on_changed),
+ NULL);
+}
+
+static void
+on_accounts_appeared (GDBusConnection *connection,
+ const gchar *name,
+ const gchar *name_owner,
+ gpointer user_data)
+{
+ g_async_initable_new_async (ACCOUNTS_TYPE_USER, 0, NULL,
+ on_accounts_proxy_available,
+ "g-flags", 0,
+ "g-interface-info", NULL,
+ "g-unique-bus-name", name_owner,
+ "g-connection", connection,
+ "g-object-path", "/org/freedesktop/Accounts/User500",
+ "g-interface-name", "org.freedesktop.Accounts.User");
+}
+
+static void
+on_accounts_vanished (GDBusConnection *connection,
+ const gchar *name,
+ gpointer user_data)
+{
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
gint
main (gint argc, gchar *argv[])
{
+ guint watcher_id;
+ GMainLoop *loop;
+
+ watcher_id = g_bus_watch_name (G_BUS_TYPE_SYSTEM,
+ "org.freedesktop.Accounts",
+ G_BUS_NAME_WATCHER_FLAGS_AUTO_START,
+ on_accounts_appeared,
+ on_accounts_vanished,
+ NULL, NULL);
+
+ loop = g_main_loop_new (NULL, FALSE);
+ g_main_loop_run (loop);
+ g_main_loop_unref (loop);
+ g_bus_unwatch_name (watcher_id);
+
return 0;
}
diff --git a/gio/tests/meson.build b/gio/tests/meson.build
index 751bd6e9b..8da884001 100644
--- a/gio/tests/meson.build
+++ b/gio/tests/meson.build
@@ -767,7 +767,7 @@ if not meson.is_cross_build()
resource_plugin += shared_module('resourceplugin',
sources: ['resourceplugin.c', plugin_resources_c],
- link_args : export_dynamic_ldflags,
+ c_args : export_dynamic_cflags,
dependencies : common_gio_tests_deps,
install_dir : installed_tests_execdir,
install_tag : 'tests',
@@ -929,7 +929,7 @@ if not meson.is_cross_build()
input : test_gresource_binary,
output : 'test_resources.o',
command : cc.cmd_array() + ['-Wl,-z,noexecstack', '-r', '-Wl,-b,binary',
- '@INPUT@', '-o','@OUTPUT@'])
+ '-nostdlib', '@INPUT@', '-o','@OUTPUT@'])
# Rename symbol to match the one in the C file
if cc.get_id() == 'gcc' and host_system == 'windows'
diff --git a/gio/tests/testfilemonitor.c b/gio/tests/testfilemonitor.c
index 7274f792e..52a530244 100644
--- a/gio/tests/testfilemonitor.c
+++ b/gio/tests/testfilemonitor.c
@@ -1087,6 +1087,36 @@ test_finalize_in_callback (Fixture *fixture,
g_object_unref (file);
}
+static void
+test_root (Fixture *fixture,
+ gconstpointer user_data)
+{
+ GFile *file = NULL;
+ GFileMonitor *monitor = NULL;
+ GError *local_error = NULL;
+
+ g_test_summary ("Test that GFileMonitor can monitor the root directory.");
+ g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3241");
+
+#if defined(G_OS_UNIX)
+ file = g_file_new_for_path ("/");
+#elif defined(G_OS_WIN32)
+ file = g_file_new_for_path ("C:\\");
+#else
+ g_test_skip ("Unsupported root directory");
+ return;
+#endif
+
+ /* We can’t test for any monitor events, but we can at least check that this
+ * doesn’t crash or error. */
+ monitor = g_file_monitor_directory (file, G_FILE_MONITOR_NONE, NULL, &local_error);
+ g_assert_no_error (local_error);
+ g_assert_nonnull (monitor);
+
+ g_clear_object (&monitor);
+ g_clear_object (&file);
+}
+
int
main (int argc, char *argv[])
{
@@ -1099,6 +1129,7 @@ main (int argc, char *argv[])
g_test_add ("/monitor/cross-dir-moves", Fixture, NULL, setup, test_cross_dir_moves, teardown);
g_test_add ("/monitor/file/hard-links", Fixture, NULL, setup, test_file_hard_links, teardown);
g_test_add ("/monitor/finalize-in-callback", Fixture, NULL, setup, test_finalize_in_callback, teardown);
+ g_test_add ("/monitor/root", Fixture, NULL, setup, test_root, teardown);
return g_test_run ();
}
diff --git a/glib/gbacktrace.c b/glib/gbacktrace.c
index b708b1636..0f81502e5 100644
--- a/glib/gbacktrace.c
+++ b/glib/gbacktrace.c
@@ -398,8 +398,8 @@ stack_trace (const char * const *args)
stack_trace_done = FALSE;
signal (SIGCHLD, stack_trace_sigchld);
- if (!g_unix_open_pipe_internal (in_fd, TRUE) ||
- !g_unix_open_pipe_internal (out_fd, TRUE))
+ if (!g_unix_open_pipe_internal (in_fd, TRUE, FALSE) ||
+ !g_unix_open_pipe_internal (out_fd, TRUE, FALSE))
{
perror ("unable to open pipe");
_exit (0);
diff --git a/glib/gdatetime.c b/glib/gdatetime.c
index a9c472e55..2640e3b24 100644
--- a/glib/gdatetime.c
+++ b/glib/gdatetime.c
@@ -3340,103 +3340,103 @@ g_date_time_format_utf8 (GDateTime *datetime,
* Creates a newly allocated string representing the requested @format.
*
* The format strings understood by this function are a subset of the
- * strftime() format language as specified by C99. The \%D, \%U and \%W
- * conversions are not supported, nor is the 'E' modifier. The GNU
- * extensions \%k, \%l, \%s and \%P are supported, however, as are the
- * '0', '_' and '-' modifiers. The Python extension \%f is also supported.
+ * `strftime()` format language as specified by C99. The `%D`, `%U` and `%W`
+ * conversions are not supported, nor is the `E` modifier. The GNU
+ * extensions `%k`, `%l`, `%s` and `%P` are supported, however, as are the
+ * `0`, `_` and `-` modifiers. The Python extension `%f` is also supported.
*
- * In contrast to strftime(), this function always produces a UTF-8
+ * In contrast to `strftime()`, this function always produces a UTF-8
* string, regardless of the current locale. Note that the rendering of
- * many formats is locale-dependent and may not match the strftime()
+ * many formats is locale-dependent and may not match the `strftime()`
* output exactly.
*
* The following format specifiers are supported:
*
- * - \%a: the abbreviated weekday name according to the current locale
- * - \%A: the full weekday name according to the current locale
- * - \%b: the abbreviated month name according to the current locale
- * - \%B: the full month name according to the current locale
- * - \%c: the preferred date and time representation for the current locale
- * - \%C: the century number (year/100) as a 2-digit integer (00-99)
- * - \%d: the day of the month as a decimal number (range 01 to 31)
- * - \%e: the day of the month as a decimal number (range 1 to 31);
- * single digits are preceded by a figure space
- * - \%F: equivalent to `%Y-%m-%d` (the ISO 8601 date format)
- * - \%g: the last two digits of the ISO 8601 week-based year as a
- * decimal number (00-99). This works well with \%V and \%u.
- * - \%G: the ISO 8601 week-based year as a decimal number. This works
- * well with \%V and \%u.
- * - \%h: equivalent to \%b
- * - \%H: the hour as a decimal number using a 24-hour clock (range 00 to 23)
- * - \%I: the hour as a decimal number using a 12-hour clock (range 01 to 12)
- * - \%j: the day of the year as a decimal number (range 001 to 366)
- * - \%k: the hour (24-hour clock) as a decimal number (range 0 to 23);
- * single digits are preceded by a figure space
- * - \%l: the hour (12-hour clock) as a decimal number (range 1 to 12);
- * single digits are preceded by a figure space
- * - \%m: the month as a decimal number (range 01 to 12)
- * - \%M: the minute as a decimal number (range 00 to 59)
- * - \%f: the microsecond as a decimal number (range 000000 to 999999)
- * - \%p: either "AM" or "PM" according to the given time value, or the
+ * - `%a`: the abbreviated weekday name according to the current locale
+ * - `%A`: the full weekday name according to the current locale
+ * - `%b`: the abbreviated month name according to the current locale
+ * - `%B`: the full month name according to the current locale
+ * - `%c`: the preferred date and time representation for the current locale
+ * - `%C`: the century number (year/100) as a 2-digit integer (00-99)
+ * - `%d`: the day of the month as a decimal number (range 01 to 31)
+ * - `%e`: the day of the month as a decimal number (range 1 to 31);
+ * single digits are preceded by a figure space (U+2007)
+ * - `%F`: equivalent to `%Y-%m-%d` (the ISO 8601 date format)
+ * - `%g`: the last two digits of the ISO 8601 week-based year as a
+ * decimal number (00-99). This works well with `%V` and `%u`.
+ * - `%G`: the ISO 8601 week-based year as a decimal number. This works
+ * well with `%V` and `%u`.
+ * - `%h`: equivalent to `%b`
+ * - `%H`: the hour as a decimal number using a 24-hour clock (range 00 to 23)
+ * - `%I`: the hour as a decimal number using a 12-hour clock (range 01 to 12)
+ * - `%j`: the day of the year as a decimal number (range 001 to 366)
+ * - `%k`: the hour (24-hour clock) as a decimal number (range 0 to 23);
+ * single digits are preceded by a figure space (U+2007)
+ * - `%l`: the hour (12-hour clock) as a decimal number (range 1 to 12);
+ * single digits are preceded by a figure space (U+2007)
+ * - `%m`: the month as a decimal number (range 01 to 12)
+ * - `%M`: the minute as a decimal number (range 00 to 59)
+ * - `%f`: the microsecond as a decimal number (range 000000 to 999999)
+ * - `%p`: either ‘AM’ or ‘PM’ according to the given time value, or the
* corresponding strings for the current locale. Noon is treated as
- * "PM" and midnight as "AM". Use of this format specifier is discouraged, as
- * many locales have no concept of AM/PM formatting. Use \%c or \%X instead.
- * - \%P: like \%p but lowercase: "am" or "pm" or a corresponding string for
+ * ‘PM’ and midnight as ‘AM’. Use of this format specifier is discouraged, as
+ * many locales have no concept of AM/PM formatting. Use `%c` or `%X` instead.
+ * - `%P`: like `%p` but lowercase: ‘am’ or ‘pm’ or a corresponding string for
* the current locale. Use of this format specifier is discouraged, as
- * many locales have no concept of AM/PM formatting. Use \%c or \%X instead.
- * - \%r: the time in a.m. or p.m. notation. Use of this format specifier is
- * discouraged, as many locales have no concept of AM/PM formatting. Use \%c
- * or \%X instead.
- * - \%R: the time in 24-hour notation (\%H:\%M)
- * - \%s: the number of seconds since the Epoch, that is, since 1970-01-01
+ * many locales have no concept of AM/PM formatting. Use `%c` or `%X` instead.
+ * - `%r`: the time in a.m. or p.m. notation. Use of this format specifier is
+ * discouraged, as many locales have no concept of AM/PM formatting. Use `%c`
+ * or `%X` instead.
+ * - `%R`: the time in 24-hour notation (`%H:%M`)
+ * - `%s`: the number of seconds since the Epoch, that is, since 1970-01-01
* 00:00:00 UTC
- * - \%S: the second as a decimal number (range 00 to 60)
- * - \%t: a tab character
- * - \%T: the time in 24-hour notation with seconds (\%H:\%M:\%S)
- * - \%u: the ISO 8601 standard day of the week as a decimal, range 1 to 7,
- * Monday being 1. This works well with \%G and \%V.
- * - \%V: the ISO 8601 standard week number of the current year as a decimal
+ * - `%S`: the second as a decimal number (range 00 to 60)
+ * - `%t`: a tab character
+ * - `%T`: the time in 24-hour notation with seconds (`%H:%M:%S`)
+ * - `%u`: the ISO 8601 standard day of the week as a decimal, range 1 to 7,
+ * Monday being 1. This works well with `%G` and `%V`.
+ * - `%V`: the ISO 8601 standard week number of the current year as a decimal
* number, range 01 to 53, where week 1 is the first week that has at
* least 4 days in the new year. See g_date_time_get_week_of_year().
- * This works well with \%G and \%u.
- * - \%w: the day of the week as a decimal, range 0 to 6, Sunday being 0.
- * This is not the ISO 8601 standard format -- use \%u instead.
- * - \%x: the preferred date representation for the current locale without
+ * This works well with `%G` and `%u`.
+ * - `%w`: the day of the week as a decimal, range 0 to 6, Sunday being 0.
+ * This is not the ISO 8601 standard format — use `%u` instead.
+ * - `%x`: the preferred date representation for the current locale without
* the time
- * - \%X: the preferred time representation for the current locale without
+ * - `%X`: the preferred time representation for the current locale without
* the date
- * - \%y: the year as a decimal number without the century
- * - \%Y: the year as a decimal number including the century
- * - \%z: the time zone as an offset from UTC (+hhmm)
- * - \%:z: the time zone as an offset from UTC (+hh:mm).
- * This is a gnulib strftime() extension. Since: 2.38
- * - \%::z: the time zone as an offset from UTC (+hh:mm:ss). This is a
- * gnulib strftime() extension. Since: 2.38
- * - \%:::z: the time zone as an offset from UTC, with : to necessary
- * precision (e.g., -04, +05:30). This is a gnulib strftime() extension. Since: 2.38
- * - \%Z: the time zone or name or abbreviation
- * - \%\%: a literal \% character
+ * - `%y`: the year as a decimal number without the century
+ * - `%Y`: the year as a decimal number including the century
+ * - `%z`: the time zone as an offset from UTC (`+hhmm`)
+ * - `%:z`: the time zone as an offset from UTC (`+hh:mm`).
+ * This is a gnulib `strftime()` extension. Since: 2.38
+ * - `%::z`: the time zone as an offset from UTC (`+hh:mm:ss`). This is a
+ * gnulib `strftime()` extension. Since: 2.38
+ * - `%:::z`: the time zone as an offset from UTC, with `:` to necessary
+ * precision (e.g., `-04`, `+05:30`). This is a gnulib `strftime()` extension. Since: 2.38
+ * - `%Z`: the time zone or name or abbreviation
+ * - `%%`: a literal `%` character
*
* Some conversion specifications can be modified by preceding the
* conversion specifier by one or more modifier characters. The
* following modifiers are supported for many of the numeric
* conversions:
*
- * - O: Use alternative numeric symbols, if the current locale supports those.
- * - _: Pad a numeric result with spaces. This overrides the default padding
+ * - `O`: Use alternative numeric symbols, if the current locale supports those.
+ * - `_`: Pad a numeric result with spaces. This overrides the default padding
* for the specifier.
- * - -: Do not pad a numeric result. This overrides the default padding
+ * - `-`: Do not pad a numeric result. This overrides the default padding
* for the specifier.
- * - 0: Pad a numeric result with zeros. This overrides the default padding
+ * - `0`: Pad a numeric result with zeros. This overrides the default padding
* for the specifier.
*
- * Additionally, when O is used with B, b, or h, it produces the alternative
+ * Additionally, when `O` is used with `B`, `b`, or `h`, it produces the alternative
* form of a month name. The alternative form should be used when the month
* name is used without a day number (e.g., standalone). It is required in
* some languages (Baltic, Slavic, Greek, and more) due to their grammatical
- * rules. For other languages there is no difference. \%OB is a GNU and BSD
- * strftime() extension expected to be added to the future POSIX specification,
- * \%Ob and \%Oh are GNU strftime() extensions. Since: 2.56
+ * rules. For other languages there is no difference. `%OB` is a GNU and BSD
+ * `strftime()` extension expected to be added to the future POSIX specification,
+ * `%Ob` and `%Oh` are GNU `strftime()` extensions. Since: 2.56
*
* Returns: (transfer full) (nullable): a newly allocated string formatted to
* the requested format or %NULL in the case that there was an error (such
diff --git a/glib/ghash.c b/glib/ghash.c
index 132e3ac5e..500d503c3 100644
--- a/glib/ghash.c
+++ b/glib/ghash.c
@@ -251,7 +251,8 @@
#define BIG_ENTRY_SIZE (SIZEOF_VOID_P)
#define SMALL_ENTRY_SIZE (SIZEOF_INT)
-#if SMALL_ENTRY_SIZE < BIG_ENTRY_SIZE
+/* NB: The USE_SMALL_ARRAYS code assumes pointers are at most 8 bytes. */
+#if SMALL_ENTRY_SIZE < BIG_ENTRY_SIZE && BIG_ENTRY_SIZE <= 8
# define USE_SMALL_ARRAYS
#endif
@@ -292,7 +293,7 @@ typedef struct
gpointer dummy2;
gint position;
gboolean dummy3;
- gint version;
+ gintptr version;
} RealIter;
G_STATIC_ASSERT (sizeof (GHashTableIter) == sizeof (RealIter));
diff --git a/glib/glib-unix.c b/glib/glib-unix.c
index 1c9f12599..ef0d1fbfb 100644
--- a/glib/glib-unix.c
+++ b/glib/glib-unix.c
@@ -74,11 +74,16 @@ g_unix_set_error_from_errno (GError **error,
*
* Similar to the UNIX pipe() call, but on modern systems like Linux
* uses the pipe2() system call, which atomically creates a pipe with
- * the configured flags. The only supported flag currently is
- * %FD_CLOEXEC. If for example you want to configure %O_NONBLOCK, that
- * must still be done separately with fcntl().
+ * the configured flags.
*
- * This function does not take %O_CLOEXEC, it takes %FD_CLOEXEC as if
+ * As of GLib 2.78, the supported flags are `FD_CLOEXEC` and `O_NONBLOCK`. Prior
+ * to GLib 2.78, only `FD_CLOEXEC` was supported — if you wanted to configure
+ * `O_NONBLOCK` then that had to be done separately with `fcntl()`.
+ *
+ * It is a programmer error to call this function with unsupported flags, and a
+ * critical warning will be raised.
+ *
+ * This function does not take `O_CLOEXEC`, it takes `FD_CLOEXEC` as if
* for fcntl(); these are different on Linux/glibc.
*
* Returns: %TRUE on success, %FALSE if not (and errno will be set).
@@ -90,11 +95,12 @@ g_unix_open_pipe (int *fds,
int flags,
GError **error)
{
- /* We only support FD_CLOEXEC */
- g_return_val_if_fail ((flags & (FD_CLOEXEC)) == flags, FALSE);
+ /* We only support FD_CLOEXEC and O_NONBLOCK */
+ g_return_val_if_fail ((flags & (FD_CLOEXEC | O_NONBLOCK)) == flags, FALSE);
if (!g_unix_open_pipe_internal (fds,
- (flags & FD_CLOEXEC) != 0))
+ (flags & FD_CLOEXEC) != 0,
+ (flags & O_NONBLOCK) != 0))
return g_unix_set_error_from_errno (error, errno);
return TRUE;
diff --git a/glib/glib-unixprivate.h b/glib/glib-unixprivate.h
index d4c64bd1e..fa13fe861 100644
--- a/glib/glib-unixprivate.h
+++ b/glib/glib-unixprivate.h
@@ -41,15 +41,22 @@ G_BEGIN_DECLS
static inline gboolean
g_unix_open_pipe_internal (int *fds,
- gboolean close_on_exec)
+ gboolean close_on_exec,
+ gboolean nonblock)
{
#ifdef HAVE_PIPE2
do
{
int ecode;
+ int flags = 0;
+
+ if (close_on_exec)
+ flags |= O_CLOEXEC;
+ if (nonblock)
+ flags |= O_NONBLOCK;
/* Atomic */
- ecode = pipe2 (fds, close_on_exec ? O_CLOEXEC : 0);
+ ecode = pipe2 (fds, flags);
if (ecode == -1 && errno != ENOSYS)
return FALSE;
else if (ecode == 0)
@@ -62,21 +69,44 @@ g_unix_open_pipe_internal (int *fds,
if (pipe (fds) == -1)
return FALSE;
- if (!close_on_exec)
- return TRUE;
+ if (close_on_exec)
+ {
+ if (fcntl (fds[0], F_SETFD, FD_CLOEXEC) == -1 ||
+ fcntl (fds[1], F_SETFD, FD_CLOEXEC) == -1)
+ {
+ int saved_errno = errno;
+
+ close (fds[0]);
+ close (fds[1]);
+ fds[0] = -1;
+ fds[1] = -1;
+
+ errno = saved_errno;
+ return FALSE;
+ }
+ }
- if (fcntl (fds[0], F_SETFD, FD_CLOEXEC) == -1 ||
- fcntl (fds[1], F_SETFD, FD_CLOEXEC) == -1)
+ if (nonblock)
{
- int saved_errno = errno;
+#ifdef O_NONBLOCK
+ int flags = O_NONBLOCK;
+#else
+ int flags = O_NDELAY;
+#endif
+
+ if (fcntl (fds[0], F_SETFL, flags) == -1 ||
+ fcntl (fds[1], F_SETFL, flags) == -1)
+ {
+ int saved_errno = errno;
- close (fds[0]);
- close (fds[1]);
- fds[0] = -1;
- fds[1] = -1;
+ close (fds[0]);
+ close (fds[1]);
+ fds[0] = -1;
+ fds[1] = -1;
- errno = saved_errno;
- return FALSE;
+ errno = saved_errno;
+ return FALSE;
+ }
}
return TRUE;
diff --git a/glib/gmacros.h b/glib/gmacros.h
index 30dc03fdb..02ed33417 100644
--- a/glib/gmacros.h
+++ b/glib/gmacros.h
@@ -863,18 +863,18 @@
#ifndef __GI_SCANNER__ /* The static assert macro really confuses the introspection parser */
#define G_PASTE_ARGS(identifier1,identifier2) identifier1 ## identifier2
#define G_PASTE(identifier1,identifier2) G_PASTE_ARGS (identifier1, identifier2)
-#if (G_C_STD_CHECK_VERSION (11) || \
+#if G_CXX_STD_CHECK_VERSION (11)
+#define G_STATIC_ASSERT(expr) static_assert (expr, "Expression evaluates to false")
+#elif (G_C_STD_CHECK_VERSION (11) || \
g_macro__has_feature(c_static_assert) || g_macro__has_extension(c_static_assert))
#define G_STATIC_ASSERT(expr) _Static_assert (expr, "Expression evaluates to false")
-#elif G_CXX_STD_CHECK_VERSION (11)
-#define G_STATIC_ASSERT(expr) static_assert (expr, "Expression evaluates to false")
#else
#ifdef __COUNTER__
#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
#else
#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __LINE__)[(expr) ? 1 : -1] G_GNUC_UNUSED
#endif
-#endif /* G_C_STD_CHECK_VERSION (11) */
+#endif /* G_CXX_STD_CHECK_VERSION (11) */
#define G_STATIC_ASSERT_EXPR(expr) ((void) sizeof (char[(expr) ? 1 : -1]))
#endif /* !__GI_SCANNER__ */
diff --git a/glib/gmarkup.c b/glib/gmarkup.c
index 0c2a9bece..9422abde4 100644
--- a/glib/gmarkup.c
+++ b/glib/gmarkup.c
@@ -85,6 +85,11 @@
* - Character references
*
* - Sections marked as CDATA
+
+ * ## An example parser # {#example}
+ *
+ * Here is an example for a markup parser:
+ * [markup-example.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/glib/tests/markup-example.c)
*/
G_DEFINE_QUARK (g-markup-error-quark, g_markup_error)
diff --git a/glib/goption.c b/glib/goption.c
index 0b3a05e90..64aed7a03 100644
--- a/glib/goption.c
+++ b/glib/goption.c
@@ -20,7 +20,7 @@
*/
/**
- * SECTION:option
+ * SECTION:goptioncontext
* @Short_description: parses commandline options
* @Title: Commandline option parser
*
diff --git a/glib/gspawn-win32.c b/glib/gspawn-win32.c
index e8bc10e9a..f14911b1b 100644
--- a/glib/gspawn-win32.c
+++ b/glib/gspawn-win32.c
@@ -65,8 +65,10 @@
#include <wchar.h>
#ifdef _MSC_VER
+#ifdef HAVE_VCRUNTIME_H
#include <vcruntime.h> /* for _UCRT */
#endif
+#endif
#ifndef GSPAWN_HELPER
#ifdef G_SPAWN_WIN32_DEBUG
@@ -163,8 +165,85 @@ safe_wspawnvpe (int _Mode,
#else
-#define safe_wspawnve _wspawnve
-#define safe_wspawnvpe _wspawnvpe
+/**< private >
+ * ensure_cmd_environment:
+ *
+ * Workaround for an issue in the universal C Runtime library (UCRT). This adds
+ * a custom environment variable to this process's environment block that looks
+ * like the cmd.exe's shell-related environment variables, i.e the name starts
+ * with an equal sign character: '='. This is needed because the UCRT may crash
+ * if those environment variables are missing from the calling process's block.
+ *
+ * Reference:
+ *
+ * https://developercommunity.visualstudio.com/t/UCRT-Crash-in-_wspawne-functions/10262748
+ */
+static void
+ensure_cmd_environment (void)
+{
+ static gsize initialization_value = 0;
+
+ if (g_once_init_enter (&initialization_value))
+ {
+ wchar_t *block = GetEnvironmentStringsW ();
+ gboolean have_cmd_environment = FALSE;
+
+ if (block)
+ {
+ const wchar_t *p = block;
+
+ while (*p != L'\0')
+ {
+ if (*p == L'=')
+ {
+ have_cmd_environment = TRUE;
+ break;
+ }
+
+ p += wcslen (p) + 1;
+ }
+
+ if (!FreeEnvironmentStringsW (block))
+ g_warning ("%s failed with error code %u",
+ "FreeEnvironmentStrings",
+ (guint) GetLastError ());
+ }
+
+ if (!have_cmd_environment)
+ {
+ if (!SetEnvironmentVariableW (L"=GLIB", L"GLIB"))
+ {
+ g_critical ("%s failed with error code %u",
+ "SetEnvironmentVariable",
+ (guint) GetLastError ());
+ }
+ }
+
+ g_once_init_leave (&initialization_value, 1);
+ }
+}
+
+static intptr_t
+safe_wspawnve (int _mode,
+ const wchar_t * _filename,
+ const wchar_t *const *_args,
+ const wchar_t *const *_env)
+{
+ ensure_cmd_environment ();
+
+ return _wspawnve (_mode, _filename, _args, _env);;
+}
+
+static intptr_t
+safe_wspawnvpe (int _mode,
+ const wchar_t * _filename,
+ const wchar_t *const *_args,
+ const wchar_t *const *_env)
+{
+ ensure_cmd_environment ();
+
+ return _wspawnvpe (_mode, _filename, _args, _env);
+}
#endif /* _UCRT */
@@ -686,13 +765,6 @@ fork_exec (gint *exit_status,
argc = protect_argv (argv, &protected_argv);
- /*
- * FIXME: Workaround broken spawnvpe functions that SEGV when "=X:="
- * environment variables are missing. Calling chdir() will set the magic
- * environment variable again.
- */
- _chdir (".");
-
if (stdin_fd == -1 && stdout_fd == -1 && stderr_fd == -1 &&
(flags & G_SPAWN_CHILD_INHERITS_STDIN) &&
!(flags & G_SPAWN_STDOUT_TO_DEV_NULL) &&
diff --git a/glib/gstrfuncs.c b/glib/gstrfuncs.c
index af552da55..391cf569b 100644
--- a/glib/gstrfuncs.c
+++ b/glib/gstrfuncs.c
@@ -2768,7 +2768,7 @@ g_strjoin (const gchar *separator,
*
* Searches the string @haystack for the first occurrence
* of the string @needle, limiting the length of the search
- * to @haystack_len.
+ * to @haystack_len or a nul terminator byte (whichever is reached first).
*
* Returns: a pointer to the found occurrence, or
* %NULL if not found.
diff --git a/glib/gstrfuncs.h b/glib/gstrfuncs.h
index 8a6830294..cb021b658 100644
--- a/glib/gstrfuncs.h
+++ b/glib/gstrfuncs.h
@@ -204,23 +204,6 @@ gboolean (g_str_has_prefix) (const gchar *str,
(g_str_has_suffix) (STR, SUFFIX) \
)
-#define g_strdup(STR) \
- (__builtin_constant_p ((STR)) ? \
- (G_LIKELY ((STR) != NULL) ? \
- G_GNUC_EXTENSION ({ \
- const char *const ___str = ((STR)); \
- const char *const __str = _G_STR_NONNULL (___str); \
- const size_t __str_len = strlen (__str) + 1; \
- char *__dup_str = (char *) g_malloc (__str_len); \
- (char *) memcpy (__dup_str, __str, __str_len); \
- }) \
- : \
- (char *) (NULL) \
- ) \
- : \
- (g_strdup) ((STR)) \
- )
-
#endif /* !defined (__GI_SCANNER__) */
#endif /* !defined (__GTK_DOC_IGNORE__) */
#endif /* G_GNUC_CHECK_VERSION (2, 0) */
@@ -318,6 +301,32 @@ GLIB_AVAILABLE_IN_ALL
gchar* g_strjoin (const gchar *separator,
...) G_GNUC_MALLOC G_GNUC_NULL_TERMINATED;
+#if G_GNUC_CHECK_VERSION(2, 0)
+#ifndef __GTK_DOC_IGNORE__
+#ifndef __GI_SCANNER__
+
+G_ALWAYS_INLINE static inline char *
+g_strdup_inline (const char *str)
+{
+ if (__builtin_constant_p (!str) && !str)
+ return NULL;
+
+ if (__builtin_constant_p (!!str) && !!str && __builtin_constant_p (strlen (str)))
+ {
+ const size_t len = strlen (str) + 1;
+ char *dup_str = (char *) g_malloc (len);
+ return (char *) memcpy (dup_str, str, len);
+ }
+
+ return g_strdup (str);
+}
+
+#define g_strdup(x) g_strdup_inline (x)
+
+#endif /* !defined (__GI_SCANNER__) */
+#endif /* !defined (__GTK_DOC_IGNORE__) */
+#endif /* G_GNUC_CHECK_VERSION (2, 0) */
+
/* Make a copy of a string interpreting C string -style escape
* sequences. Inverse of g_strescape. The recognized sequences are \b
* \f \n \r \t \\ \" and the octal format.
diff --git a/glib/gtestutils.c b/glib/gtestutils.c
index fcf1caff3..e98294ed3 100644
--- a/glib/gtestutils.c
+++ b/glib/gtestutils.c
@@ -89,11 +89,15 @@
* The API is designed to handle creation and registration of test suites
* and test cases implicitly. A simple call like
* |[<!-- language="C" -->
+ * g_test_init (&argc, &argv, G_TEST_OPTION_ISOLATE_DIRS, NULL);
+ *
* g_test_add_func ("/misc/assertions", test_assertions);
* ]|
* creates a test suite called "misc" with a single test case named
* "assertions", which consists of running the test_assertions function.
*
+ * g_test_init() should be called before calling any other test functions.
+ *
* In addition to the traditional g_assert_true(), the test framework provides
* an extended set of assertions for comparisons: g_assert_cmpfloat(),
* g_assert_cmpfloat_with_epsilon(), g_assert_cmpint(), g_assert_cmpuint(),
@@ -1684,6 +1688,8 @@ test_rm_isolate_dirs (void)
* test random number generator, the name for g_get_prgname()
* and parsing test related command line args.
*
+ * This should be called before calling any other `g_test_*()` functions.
+ *
* So far, the following arguments are understood:
*
* - `-l`: List test cases available in a test executable.
diff --git a/glib/gthread-posix.c b/glib/gthread-posix.c
index be960d3c4..721dea5c2 100644
--- a/glib/gthread-posix.c
+++ b/glib/gthread-posix.c
@@ -1523,16 +1523,18 @@ g_cond_wait_until (GCond *cond,
* have any relation to the one used by the kernel for the `futex` syscall.
*
* Specifically, the libc headers might use 64-bit `time_t` while the kernel
- * headers use 32-bit `__kernel_old_time_t` on certain systems.
+ * headers use 32-bit types on certain systems.
*
* To get around this problem we
* a) check if `futex_time64` is available, which only exists on 32-bit
* platforms and always uses 64-bit `time_t`.
* b) otherwise (or if that returns `ENOSYS`), we call the normal `futex`
- * syscall with the `struct timespec` used by the kernel, which uses
- * `__kernel_long_t` for both its fields. We use that instead of
- * `__kernel_old_time_t` because it is equivalent and available in the
- * kernel headers for a longer time.
+ * syscall with the `struct timespec` used by the kernel. By default, we
+ * use `__kernel_long_t` for both its fields, which is equivalent to
+ * `__kernel_old_time_t` and is available in the kernel headers for a
+ * longer time.
+ * c) With very old headers (~2.6.x), `__kernel_long_t` is not available, and
+ * we use an older definition that uses `__kernel_time_t` and `long`.
*
* Also some 32-bit systems do not define `__NR_futex` at all and only
* define `__NR_futex_time64`.
@@ -1572,14 +1574,24 @@ g_cond_wait_until (GCond *cond,
#ifdef __NR_futex
{
+# ifdef __kernel_long_t
+# define KERNEL_SPAN_SEC_TYPE __kernel_long_t
struct
{
__kernel_long_t tv_sec;
__kernel_long_t tv_nsec;
} span_arg;
-
+# else
+ /* Very old kernel headers: version 2.6.32 and thereabouts */
+# define KERNEL_SPAN_SEC_TYPE __kernel_time_t
+ struct
+ {
+ __kernel_time_t tv_sec;
+ long tv_nsec;
+ } span_arg;
+# endif
/* Make sure to only ever call this if the end time actually fits into the target type */
- if (G_UNLIKELY (sizeof (__kernel_long_t) < 8 && span.tv_sec > G_MAXINT32))
+ if (G_UNLIKELY (sizeof (KERNEL_SPAN_SEC_TYPE) < 8 && span.tv_sec > G_MAXINT32))
g_error ("%s: Can’t wait for more than %us", G_STRFUNC, G_MAXINT32);
span_arg.tv_sec = span.tv_sec;
@@ -1591,6 +1603,7 @@ g_cond_wait_until (GCond *cond,
return success;
}
+# undef KERNEL_SPAN_SEC_TYPE
#endif /* defined(__NR_futex) */
/* We can't end up here because of the checks above */
diff --git a/glib/gtimer.c b/glib/gtimer.c
index d2d259918..dde502a15 100644
--- a/glib/gtimer.c
+++ b/glib/gtimer.c
@@ -269,6 +269,9 @@ g_timer_is_active (GTimer *timer)
void
g_usleep (gulong microseconds)
{
+ if G_UNLIKELY (microseconds == 0)
+ return;
+
#ifdef G_OS_WIN32
/* Round up to the next millisecond */
Sleep (microseconds ? (1 + (microseconds - 1) / 1000) : 0);
diff --git a/glib/gunicode.h b/glib/gunicode.h
index 63117ea28..38e29b84f 100644
--- a/glib/gunicode.h
+++ b/glib/gunicode.h
@@ -210,7 +210,7 @@ typedef enum
* Since new unicode versions may add new types here, applications should be ready
* to handle unknown values. They may be regarded as %G_UNICODE_BREAK_UNKNOWN.
*
- * See [Unicode Line Breaking Algorithm](http://www.unicode.org/unicode/reports/tr14/).
+ * See [Unicode Line Breaking Algorithm](https://www.unicode.org/reports/tr14/).
*/
typedef enum
{
diff --git a/glib/gunidecomp.c b/glib/gunidecomp.c
index 07bc3cb22..f14944397 100644
--- a/glib/gunidecomp.c
+++ b/glib/gunidecomp.c
@@ -388,9 +388,33 @@ _g_utf8_normalize_wc (const gchar *str,
while ((max_len < 0 || p < str + max_len) && *p)
{
const gchar *decomp;
- gunichar wc = g_utf8_get_char (p);
+ const char *next, *between;
+ gunichar wc;
- if (wc >= SBase && wc < SBase + SCount)
+ next = g_utf8_next_char (p);
+ /* Avoid reading truncated multibyte characters
+ which run past the end of the buffer */
+ if (max_len < 0)
+ {
+ /* Does the character contain a NUL terminator? */
+ for (between = &p[1]; between < next; between++)
+ {
+ if (G_UNLIKELY (!*between))
+ return NULL;
+ }
+ }
+ else
+ {
+ if (G_UNLIKELY (next > str + max_len))
+ return NULL;
+ }
+ wc = g_utf8_get_char (p);
+
+ if (G_UNLIKELY (wc == (gunichar) -1))
+ {
+ return NULL;
+ }
+ else if (wc >= SBase && wc < SBase + SCount)
{
gsize result_len;
decompose_hangul (wc, NULL, &result_len);
@@ -406,7 +430,7 @@ _g_utf8_normalize_wc (const gchar *str,
n_wc++;
}
- p = g_utf8_next_char (p);
+ p = next;
}
wc_buffer = g_new (gunichar, n_wc + 1);
@@ -548,10 +572,13 @@ g_utf8_normalize (const gchar *str,
GNormalizeMode mode)
{
gunichar *result_wc = _g_utf8_normalize_wc (str, len, mode);
- gchar *result;
+ gchar *result = NULL;
- result = g_ucs4_to_utf8 (result_wc, -1, NULL, NULL, NULL);
- g_free (result_wc);
+ if (G_LIKELY (result_wc != NULL))
+ {
+ result = g_ucs4_to_utf8 (result_wc, -1, NULL, NULL, NULL);
+ g_free (result_wc);
+ }
return result;
}
diff --git a/glib/gvariant.c b/glib/gvariant.c
index cd4c21ced..d7b305188 100644
--- a/glib/gvariant.c
+++ b/glib/gvariant.c
@@ -2951,6 +2951,8 @@ struct heap_iter
gsize magic;
};
+G_STATIC_ASSERT (sizeof (struct heap_iter) <= sizeof (GVariantIter));
+
#define GVSI(i) ((struct stack_iter *) (i))
#define GVHI(i) ((struct heap_iter *) (i))
#define GVSI_MAGIC ((gsize) 3579507750u)
@@ -3220,7 +3222,7 @@ struct heap_builder
/* Just to make sure that by adding a union to GVariantBuilder, we
* didn't accidentally change ABI. */
-G_STATIC_ASSERT (sizeof (GVariantBuilder) == sizeof (gsize[16]));
+G_STATIC_ASSERT (sizeof (GVariantBuilder) == sizeof (guintptr[16]));
static gboolean
ensure_valid_builder (GVariantBuilder *builder)
@@ -3907,7 +3909,7 @@ struct heap_dict
/* Just to make sure that by adding a union to GVariantDict, we didn't
* accidentally change ABI. */
-G_STATIC_ASSERT (sizeof (GVariantDict) == sizeof (gsize[16]));
+G_STATIC_ASSERT (sizeof (GVariantDict) == sizeof (guintptr[16]));
static gboolean
ensure_valid_dict (GVariantDict *dict)
@@ -4036,7 +4038,8 @@ g_variant_dict_init (GVariantDict *dict,
*
* This function is a wrapper around g_variant_dict_lookup_value() and
* g_variant_get(). In the case that %NULL would have been returned,
- * this function returns %FALSE. Otherwise, it unpacks the returned
+ * this function returns %FALSE and does not modify the values of the arguments
+ * passed in to @.... Otherwise, it unpacks the returned
* value and returns %TRUE.
*
* @format_string determines the C types that are used for unpacking the
diff --git a/glib/gvariant.h b/glib/gvariant.h
index e7087a1f6..bdc37951d 100644
--- a/glib/gvariant.h
+++ b/glib/gvariant.h
@@ -270,7 +270,7 @@ GVariant * g_variant_new_from_data (const G
typedef struct _GVariantIter GVariantIter;
struct _GVariantIter {
/*< private >*/
- gsize x[16];
+ guintptr x[16];
};
GLIB_AVAILABLE_IN_ALL
@@ -304,9 +304,9 @@ struct _GVariantBuilder {
struct {
gsize partial_magic;
const GVariantType *type;
- gsize y[14];
+ guintptr y[14];
} s;
- gsize x[16];
+ guintptr x[16];
} u;
};
@@ -453,9 +453,9 @@ struct _GVariantDict {
struct {
GVariant *asv;
gsize partial_magic;
- gsize y[14];
+ guintptr y[14];
} s;
- gsize x[16];
+ guintptr x[16];
} u;
};
diff --git a/glib/gwakeup.c b/glib/gwakeup.c
index 24d85b669..a3283a3ff 100644
--- a/glib/gwakeup.c
+++ b/glib/gwakeup.c
@@ -160,7 +160,7 @@ g_wakeup_new (void)
/* for any failure, try a pipe instead */
#endif
- if (!g_unix_open_pipe (wakeup->fds, FD_CLOEXEC, &error))
+ if (!g_unix_open_pipe (wakeup->fds, FD_CLOEXEC | O_NONBLOCK, &error))
g_error ("Creating pipes for GWakeup: %s", error->message);
if (!g_unix_set_fd_nonblocking (wakeup->fds[0], TRUE, &error) ||
diff --git a/glib/gwin32.c b/glib/gwin32.c
index d1391b1d2..85053c079 100644
--- a/glib/gwin32.c
+++ b/glib/gwin32.c
@@ -578,7 +578,9 @@ g_win32_check_windows_version (const gint major,
/* Check for Service Pack Version >= 0 */
g_return_val_if_fail (spver >= 0, FALSE);
- g_return_val_if_fail (_g_win32_call_rtl_version (&osverinfo), FALSE);
+
+ if (!_g_win32_call_rtl_version (&osverinfo))
+ return FALSE;
/* check the OS and Service Pack Versions */
if (osverinfo.dwMajorVersion > (DWORD) major)
diff --git a/glib/meson.build b/glib/meson.build
index c62f94565..898446e00 100644
--- a/glib/meson.build
+++ b/glib/meson.build
@@ -150,6 +150,10 @@ glib_headers = files(
)
install_headers(glib_headers, install_dir : glib_includedir)
+if host_system == 'windows'
+ install_headers([ 'msvc_recommended_pragmas.h' ], install_dir : glib_includedir)
+endif
+
# Expose as variable to be used by gobject-introspection
# when it includes GLib as a subproject
glib_unix_h = files('glib-unix.h')
diff --git a/msvc_recommended_pragmas.h b/glib/msvc_recommended_pragmas.h
index 051a02ae4..051a02ae4 100644
--- a/msvc_recommended_pragmas.h
+++ b/glib/msvc_recommended_pragmas.h
diff --git a/glib/tests/.gitignore b/glib/tests/.gitignore
deleted file mode 100644
index 9e4c147d3..000000000
--- a/glib/tests/.gitignore
+++ /dev/null
@@ -1,89 +0,0 @@
-1bit-emufutex
-1bit-mutex
-642026
-642026-ec
-array-test
-asyncqueue
-atomic
-autoptr
-base64
-bitlock
-bookmarkfile
-bytes
-cache
-checksum
-collate
-cond
-convert
-dataset
-date
-dir
-environment
-error
-fileutils
-gdatetime
-guuid
-gvariant
-gwakeup
-gwakeup-fallback
-hash
-hmac
-hook
-hostutils
-include
-keyfile
-list
-logging
-mainloop
-malloc
-mappedfile
-markup
-markup-collect
-markup-escape
-markup-parse
-markup-subparser
-mem-overflow
-mutex
-node
-once
-option-argv0
-option-context
-overflow
-overflow-fallback
-pattern
-private
-protocol
-queue
-rand
-rec-mutex
-regex
-rwlock
-scannerapi
-search-utils
-sequence
-shell
-slice
-slist
-sort
-spawn-multithreaded
-spawn-singlethread
-strfuncs
-string
-testing
-test-printf
-test-spawn-echo
-thread
-timeout
-timer
-tmpsample.xml
-tree
-unicode
-unix
-unix-multithreaded
-unix-nothreads
-uri
-utf8-misc
-utf8-performance
-utf8-pointer
-utf8-validate
-utils
diff --git a/glib/tests/NormalizationTest.txt b/glib/tests/NormalizationTest.txt
index 302c35f37..e75b4801c 100644
--- a/glib/tests/NormalizationTest.txt
+++ b/glib/tests/NormalizationTest.txt
@@ -1,11 +1,11 @@
-# NormalizationTest-14.0.0.txt
-# Date: 2021-05-28, 21:49:12 GMT
-# © 2021 Unicode®, Inc.
+# NormalizationTest-15.0.0.txt
+# Date: 2022-04-02, 01:29:09 GMT
+# © 2022 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For terms of use, see https://www.unicode.org/terms_of_use.html
#
# Unicode Character Database
-# For documentation, see http://www.unicode.org/reports/tr44/
+# For documentation, see https://www.unicode.org/reports/tr44/
#
# Normalization Test Suite
# Format:
@@ -16208,6 +16208,68 @@ FFEE;FFEE;FFEE;25CB;25CB; # (○; ○; ○; ○; ○; ) HALFWIDTH WHITE CIRCLE
1D7FD;1D7FD;1D7FD;0037;0037; # (𝟽; 𝟽; 𝟽; 7; 7; ) MATHEMATICAL MONOSPACE DIGIT SEVEN
1D7FE;1D7FE;1D7FE;0038;0038; # (𝟾; 𝟾; 𝟾; 8; 8; ) MATHEMATICAL MONOSPACE DIGIT EIGHT
1D7FF;1D7FF;1D7FF;0039;0039; # (𝟿; 𝟿; 𝟿; 9; 9; ) MATHEMATICAL MONOSPACE DIGIT NINE
+1E030;1E030;1E030;0430;0430; # (𞀰; 𞀰; 𞀰; а; а; ) MODIFIER LETTER CYRILLIC SMALL A
+1E031;1E031;1E031;0431;0431; # (𞀱; 𞀱; 𞀱; б; б; ) MODIFIER LETTER CYRILLIC SMALL BE
+1E032;1E032;1E032;0432;0432; # (𞀲; 𞀲; 𞀲; в; в; ) MODIFIER LETTER CYRILLIC SMALL VE
+1E033;1E033;1E033;0433;0433; # (𞀳; 𞀳; 𞀳; г; г; ) MODIFIER LETTER CYRILLIC SMALL GHE
+1E034;1E034;1E034;0434;0434; # (𞀴; 𞀴; 𞀴; д; д; ) MODIFIER LETTER CYRILLIC SMALL DE
+1E035;1E035;1E035;0435;0435; # (𞀵; 𞀵; 𞀵; е; е; ) MODIFIER LETTER CYRILLIC SMALL IE
+1E036;1E036;1E036;0436;0436; # (𞀶; 𞀶; 𞀶; ж; ж; ) MODIFIER LETTER CYRILLIC SMALL ZHE
+1E037;1E037;1E037;0437;0437; # (𞀷; 𞀷; 𞀷; з; з; ) MODIFIER LETTER CYRILLIC SMALL ZE
+1E038;1E038;1E038;0438;0438; # (𞀸; 𞀸; 𞀸; и; и; ) MODIFIER LETTER CYRILLIC SMALL I
+1E039;1E039;1E039;043A;043A; # (𞀹; 𞀹; 𞀹; к; к; ) MODIFIER LETTER CYRILLIC SMALL KA
+1E03A;1E03A;1E03A;043B;043B; # (𞀺; 𞀺; 𞀺; л; л; ) MODIFIER LETTER CYRILLIC SMALL EL
+1E03B;1E03B;1E03B;043C;043C; # (𞀻; 𞀻; 𞀻; м; м; ) MODIFIER LETTER CYRILLIC SMALL EM
+1E03C;1E03C;1E03C;043E;043E; # (𞀼; 𞀼; 𞀼; о; о; ) MODIFIER LETTER CYRILLIC SMALL O
+1E03D;1E03D;1E03D;043F;043F; # (𞀽; 𞀽; 𞀽; п; п; ) MODIFIER LETTER CYRILLIC SMALL PE
+1E03E;1E03E;1E03E;0440;0440; # (𞀾; 𞀾; 𞀾; р; р; ) MODIFIER LETTER CYRILLIC SMALL ER
+1E03F;1E03F;1E03F;0441;0441; # (𞀿; 𞀿; 𞀿; с; с; ) MODIFIER LETTER CYRILLIC SMALL ES
+1E040;1E040;1E040;0442;0442; # (𞁀; 𞁀; 𞁀; т; т; ) MODIFIER LETTER CYRILLIC SMALL TE
+1E041;1E041;1E041;0443;0443; # (𞁁; 𞁁; 𞁁; у; у; ) MODIFIER LETTER CYRILLIC SMALL U
+1E042;1E042;1E042;0444;0444; # (𞁂; 𞁂; 𞁂; ф; ф; ) MODIFIER LETTER CYRILLIC SMALL EF
+1E043;1E043;1E043;0445;0445; # (𞁃; 𞁃; 𞁃; х; х; ) MODIFIER LETTER CYRILLIC SMALL HA
+1E044;1E044;1E044;0446;0446; # (𞁄; 𞁄; 𞁄; ц; ц; ) MODIFIER LETTER CYRILLIC SMALL TSE
+1E045;1E045;1E045;0447;0447; # (𞁅; 𞁅; 𞁅; ч; ч; ) MODIFIER LETTER CYRILLIC SMALL CHE
+1E046;1E046;1E046;0448;0448; # (𞁆; 𞁆; 𞁆; ш; ш; ) MODIFIER LETTER CYRILLIC SMALL SHA
+1E047;1E047;1E047;044B;044B; # (𞁇; 𞁇; 𞁇; ы; ы; ) MODIFIER LETTER CYRILLIC SMALL YERU
+1E048;1E048;1E048;044D;044D; # (𞁈; 𞁈; 𞁈; э; э; ) MODIFIER LETTER CYRILLIC SMALL E
+1E049;1E049;1E049;044E;044E; # (𞁉; 𞁉; 𞁉; ю; ю; ) MODIFIER LETTER CYRILLIC SMALL YU
+1E04A;1E04A;1E04A;A689;A689; # (𞁊; 𞁊; 𞁊; ꚉ; ꚉ; ) MODIFIER LETTER CYRILLIC SMALL DZZE
+1E04B;1E04B;1E04B;04D9;04D9; # (𞁋; 𞁋; 𞁋; ә; ә; ) MODIFIER LETTER CYRILLIC SMALL SCHWA
+1E04C;1E04C;1E04C;0456;0456; # (𞁌; 𞁌; 𞁌; і; і; ) MODIFIER LETTER CYRILLIC SMALL BYELORUSSIAN-UKRAINIAN I
+1E04D;1E04D;1E04D;0458;0458; # (𞁍; 𞁍; 𞁍; ј; ј; ) MODIFIER LETTER CYRILLIC SMALL JE
+1E04E;1E04E;1E04E;04E9;04E9; # (𞁎; 𞁎; 𞁎; ө; ө; ) MODIFIER LETTER CYRILLIC SMALL BARRED O
+1E04F;1E04F;1E04F;04AF;04AF; # (𞁏; 𞁏; 𞁏; ү; ү; ) MODIFIER LETTER CYRILLIC SMALL STRAIGHT U
+1E050;1E050;1E050;04CF;04CF; # (𞁐; 𞁐; 𞁐; ӏ; ӏ; ) MODIFIER LETTER CYRILLIC SMALL PALOCHKA
+1E051;1E051;1E051;0430;0430; # (𞁑; 𞁑; 𞁑; а; а; ) CYRILLIC SUBSCRIPT SMALL LETTER A
+1E052;1E052;1E052;0431;0431; # (𞁒; 𞁒; 𞁒; б; б; ) CYRILLIC SUBSCRIPT SMALL LETTER BE
+1E053;1E053;1E053;0432;0432; # (𞁓; 𞁓; 𞁓; в; в; ) CYRILLIC SUBSCRIPT SMALL LETTER VE
+1E054;1E054;1E054;0433;0433; # (𞁔; 𞁔; 𞁔; г; г; ) CYRILLIC SUBSCRIPT SMALL LETTER GHE
+1E055;1E055;1E055;0434;0434; # (𞁕; 𞁕; 𞁕; д; д; ) CYRILLIC SUBSCRIPT SMALL LETTER DE
+1E056;1E056;1E056;0435;0435; # (𞁖; 𞁖; 𞁖; е; е; ) CYRILLIC SUBSCRIPT SMALL LETTER IE
+1E057;1E057;1E057;0436;0436; # (𞁗; 𞁗; 𞁗; ж; ж; ) CYRILLIC SUBSCRIPT SMALL LETTER ZHE
+1E058;1E058;1E058;0437;0437; # (𞁘; 𞁘; 𞁘; з; з; ) CYRILLIC SUBSCRIPT SMALL LETTER ZE
+1E059;1E059;1E059;0438;0438; # (𞁙; 𞁙; 𞁙; и; и; ) CYRILLIC SUBSCRIPT SMALL LETTER I
+1E05A;1E05A;1E05A;043A;043A; # (𞁚; 𞁚; 𞁚; к; к; ) CYRILLIC SUBSCRIPT SMALL LETTER KA
+1E05B;1E05B;1E05B;043B;043B; # (𞁛; 𞁛; 𞁛; л; л; ) CYRILLIC SUBSCRIPT SMALL LETTER EL
+1E05C;1E05C;1E05C;043E;043E; # (𞁜; 𞁜; 𞁜; о; о; ) CYRILLIC SUBSCRIPT SMALL LETTER O
+1E05D;1E05D;1E05D;043F;043F; # (𞁝; 𞁝; 𞁝; п; п; ) CYRILLIC SUBSCRIPT SMALL LETTER PE
+1E05E;1E05E;1E05E;0441;0441; # (𞁞; 𞁞; 𞁞; с; с; ) CYRILLIC SUBSCRIPT SMALL LETTER ES
+1E05F;1E05F;1E05F;0443;0443; # (𞁟; 𞁟; 𞁟; у; у; ) CYRILLIC SUBSCRIPT SMALL LETTER U
+1E060;1E060;1E060;0444;0444; # (𞁠; 𞁠; 𞁠; ф; ф; ) CYRILLIC SUBSCRIPT SMALL LETTER EF
+1E061;1E061;1E061;0445;0445; # (𞁡; 𞁡; 𞁡; х; х; ) CYRILLIC SUBSCRIPT SMALL LETTER HA
+1E062;1E062;1E062;0446;0446; # (𞁢; 𞁢; 𞁢; ц; ц; ) CYRILLIC SUBSCRIPT SMALL LETTER TSE
+1E063;1E063;1E063;0447;0447; # (𞁣; 𞁣; 𞁣; ч; ч; ) CYRILLIC SUBSCRIPT SMALL LETTER CHE
+1E064;1E064;1E064;0448;0448; # (𞁤; 𞁤; 𞁤; ш; ш; ) CYRILLIC SUBSCRIPT SMALL LETTER SHA
+1E065;1E065;1E065;044A;044A; # (𞁥; 𞁥; 𞁥; ъ; ъ; ) CYRILLIC SUBSCRIPT SMALL LETTER HARD SIGN
+1E066;1E066;1E066;044B;044B; # (𞁦; 𞁦; 𞁦; ы; ы; ) CYRILLIC SUBSCRIPT SMALL LETTER YERU
+1E067;1E067;1E067;0491;0491; # (𞁧; 𞁧; 𞁧; ґ; ґ; ) CYRILLIC SUBSCRIPT SMALL LETTER GHE WITH UPTURN
+1E068;1E068;1E068;0456;0456; # (𞁨; 𞁨; 𞁨; і; і; ) CYRILLIC SUBSCRIPT SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+1E069;1E069;1E069;0455;0455; # (𞁩; 𞁩; 𞁩; ѕ; ѕ; ) CYRILLIC SUBSCRIPT SMALL LETTER DZE
+1E06A;1E06A;1E06A;045F;045F; # (𞁪; 𞁪; 𞁪; џ; џ; ) CYRILLIC SUBSCRIPT SMALL LETTER DZHE
+1E06B;1E06B;1E06B;04AB;04AB; # (𞁫; 𞁫; 𞁫; ҫ; ҫ; ) MODIFIER LETTER CYRILLIC SMALL ES WITH DESCENDER
+1E06C;1E06C;1E06C;A651;A651; # (𞁬; 𞁬; 𞁬; ꙑ; ꙑ; ) MODIFIER LETTER CYRILLIC SMALL YERU WITH BACK YER
+1E06D;1E06D;1E06D;04B1;04B1; # (𞁭; 𞁭; 𞁭; ұ; ұ; ) MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
1EE00;1EE00;1EE00;0627;0627; # (𞸀; 𞸀; 𞸀; ا; ا; ) ARABIC MATHEMATICAL ALEF
1EE01;1EE01;1EE01;0628;0628; # (𞸁; 𞸁; 𞸁; ب; ب; ) ARABIC MATHEMATICAL BEH
1EE02;1EE02;1EE02;062C;062C; # (𞸂; 𞸂; 𞸂; ج; ج; ) ARABIC MATHEMATICAL JEEM
@@ -18496,6 +18558,12 @@ FFEE;FFEE;FFEE;25CB;25CB; # (○; ○; ○; ○; ○; ) HALFWIDTH WHITE CIRCLE
0061 10EAB 0315 0300 05AE 0062;0061 05AE 10EAB 0300 0315 0062;0061 05AE 10EAB 0300 0315 0062;0061 05AE 10EAB 0300 0315 0062;0061 05AE 10EAB 0300 0315 0062; # (a◌𐺫◌̕◌̀◌֮b; a◌֮◌𐺫◌̀◌̕b; a◌֮◌𐺫◌̀◌̕b; a◌֮◌𐺫◌̀◌̕b; a◌֮◌𐺫◌̀◌̕b; ) LATIN SMALL LETTER A, YEZIDI COMBINING HAMZA MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 10EAC 0062;00E0 05AE 10EAC 0315 0062;0061 05AE 0300 10EAC 0315 0062;00E0 05AE 10EAC 0315 0062;0061 05AE 0300 10EAC 0315 0062; # (a◌̕◌̀◌֮◌𐺬b; à◌֮◌𐺬◌̕b; a◌֮◌̀◌𐺬◌̕b; à◌֮◌𐺬◌̕b; a◌֮◌̀◌𐺬◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, YEZIDI COMBINING MADDA MARK, LATIN SMALL LETTER B
0061 10EAC 0315 0300 05AE 0062;0061 05AE 10EAC 0300 0315 0062;0061 05AE 10EAC 0300 0315 0062;0061 05AE 10EAC 0300 0315 0062;0061 05AE 10EAC 0300 0315 0062; # (a◌𐺬◌̕◌̀◌֮b; a◌֮◌𐺬◌̀◌̕b; a◌֮◌𐺬◌̀◌̕b; a◌֮◌𐺬◌̀◌̕b; a◌֮◌𐺬◌̀◌̕b; ) LATIN SMALL LETTER A, YEZIDI COMBINING MADDA MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 10EFD 0062;0061 1DFA 0316 10EFD 059A 0062;0061 1DFA 0316 10EFD 059A 0062;0061 1DFA 0316 10EFD 059A 0062;0061 1DFA 0316 10EFD 059A 0062; # (a◌֚◌̖◌᷺◌𐻽b; a◌᷺◌̖◌𐻽◌֚b; a◌᷺◌̖◌𐻽◌֚b; a◌᷺◌̖◌𐻽◌֚b; a◌᷺◌̖◌𐻽◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC SMALL LOW WORD SAKTA, LATIN SMALL LETTER B
+0061 10EFD 059A 0316 1DFA 0062;0061 1DFA 10EFD 0316 059A 0062;0061 1DFA 10EFD 0316 059A 0062;0061 1DFA 10EFD 0316 059A 0062;0061 1DFA 10EFD 0316 059A 0062; # (a◌𐻽◌֚◌̖◌᷺b; a◌᷺◌𐻽◌̖◌֚b; a◌᷺◌𐻽◌̖◌֚b; a◌᷺◌𐻽◌̖◌֚b; a◌᷺◌𐻽◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SMALL LOW WORD SAKTA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 10EFE 0062;0061 1DFA 0316 10EFE 059A 0062;0061 1DFA 0316 10EFE 059A 0062;0061 1DFA 0316 10EFE 059A 0062;0061 1DFA 0316 10EFE 059A 0062; # (a◌֚◌̖◌᷺◌𐻾b; a◌᷺◌̖◌𐻾◌֚b; a◌᷺◌̖◌𐻾◌֚b; a◌᷺◌̖◌𐻾◌֚b; a◌᷺◌̖◌𐻾◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC SMALL LOW WORD QASR, LATIN SMALL LETTER B
+0061 10EFE 059A 0316 1DFA 0062;0061 1DFA 10EFE 0316 059A 0062;0061 1DFA 10EFE 0316 059A 0062;0061 1DFA 10EFE 0316 059A 0062;0061 1DFA 10EFE 0316 059A 0062; # (a◌𐻾◌֚◌̖◌᷺b; a◌᷺◌𐻾◌̖◌֚b; a◌᷺◌𐻾◌̖◌֚b; a◌᷺◌𐻾◌̖◌֚b; a◌᷺◌𐻾◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SMALL LOW WORD QASR, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 10EFF 0062;0061 1DFA 0316 10EFF 059A 0062;0061 1DFA 0316 10EFF 059A 0062;0061 1DFA 0316 10EFF 059A 0062;0061 1DFA 0316 10EFF 059A 0062; # (a◌֚◌̖◌᷺◌𐻿b; a◌᷺◌̖◌𐻿◌֚b; a◌᷺◌̖◌𐻿◌֚b; a◌᷺◌̖◌𐻿◌֚b; a◌᷺◌̖◌𐻿◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC SMALL LOW WORD MADDA, LATIN SMALL LETTER B
+0061 10EFF 059A 0316 1DFA 0062;0061 1DFA 10EFF 0316 059A 0062;0061 1DFA 10EFF 0316 059A 0062;0061 1DFA 10EFF 0316 059A 0062;0061 1DFA 10EFF 0316 059A 0062; # (a◌𐻿◌֚◌̖◌᷺b; a◌᷺◌𐻿◌̖◌֚b; a◌᷺◌𐻿◌̖◌֚b; a◌᷺◌𐻿◌̖◌֚b; a◌᷺◌𐻿◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SMALL LOW WORD MADDA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 059A 0316 1DFA 10F46 0062;0061 1DFA 0316 10F46 059A 0062;0061 1DFA 0316 10F46 059A 0062;0061 1DFA 0316 10F46 059A 0062;0061 1DFA 0316 10F46 059A 0062; # (a◌֚◌̖◌᷺◌𐽆b; a◌᷺◌̖◌𐽆◌֚b; a◌᷺◌̖◌𐽆◌֚b; a◌᷺◌̖◌𐽆◌֚b; a◌᷺◌̖◌𐽆◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SOGDIAN COMBINING DOT BELOW, LATIN SMALL LETTER B
0061 10F46 059A 0316 1DFA 0062;0061 1DFA 10F46 0316 059A 0062;0061 1DFA 10F46 0316 059A 0062;0061 1DFA 10F46 0316 059A 0062;0061 1DFA 10F46 0316 059A 0062; # (a◌𐽆◌֚◌̖◌᷺b; a◌᷺◌𐽆◌̖◌֚b; a◌᷺◌𐽆◌̖◌֚b; a◌᷺◌𐽆◌̖◌֚b; a◌᷺◌𐽆◌̖◌֚b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 059A 0316 1DFA 10F47 0062;0061 1DFA 0316 10F47 059A 0062;0061 1DFA 0316 10F47 059A 0062;0061 1DFA 0316 10F47 059A 0062;0061 1DFA 0316 10F47 059A 0062; # (a◌֚◌̖◌᷺◌𐽇b; a◌᷺◌̖◌𐽇◌֚b; a◌᷺◌̖◌𐽇◌֚b; a◌᷺◌̖◌𐽇◌֚b; a◌᷺◌̖◌𐽇◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SOGDIAN COMBINING TWO DOTS BELOW, LATIN SMALL LETTER B
@@ -18640,6 +18708,10 @@ FFEE;FFEE;FFEE;25CB;25CB; # (○; ○; ○; ○; ○; ) HALFWIDTH WHITE CIRCLE
0061 11D45 05B0 094D 3099 0062;0061 3099 11D45 094D 05B0 0062;0061 3099 11D45 094D 05B0 0062;0061 3099 11D45 094D 05B0 0062;0061 3099 11D45 094D 05B0 0062; # (a◌𑵅◌ְ◌्◌゙b; a◌゙◌𑵅◌्◌ְb; a◌゙◌𑵅◌्◌ְb; a◌゙◌𑵅◌्◌ְb; a◌゙◌𑵅◌्◌ְb; ) LATIN SMALL LETTER A, MASARAM GONDI VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
0061 05B0 094D 3099 11D97 0062;0061 3099 094D 11D97 05B0 0062;0061 3099 094D 11D97 05B0 0062;0061 3099 094D 11D97 05B0 0062;0061 3099 094D 11D97 05B0 0062; # (a◌ְ◌्◌゙◌𑶗b; a◌゙◌्◌𑶗◌ְb; a◌゙◌्◌𑶗◌ְb; a◌゙◌्◌𑶗◌ְb; a◌゙◌्◌𑶗◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, GUNJALA GONDI VIRAMA, LATIN SMALL LETTER B
0061 11D97 05B0 094D 3099 0062;0061 3099 11D97 094D 05B0 0062;0061 3099 11D97 094D 05B0 0062;0061 3099 11D97 094D 05B0 0062;0061 3099 11D97 094D 05B0 0062; # (a◌𑶗◌ְ◌्◌゙b; a◌゙◌𑶗◌्◌ְb; a◌゙◌𑶗◌्◌ְb; a◌゙◌𑶗◌्◌ְb; a◌゙◌𑶗◌्◌ְb; ) LATIN SMALL LETTER A, GUNJALA GONDI VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
+0061 05B0 094D 3099 11F41 0062;0061 3099 094D 11F41 05B0 0062;0061 3099 094D 11F41 05B0 0062;0061 3099 094D 11F41 05B0 0062;0061 3099 094D 11F41 05B0 0062; # (a◌ְ◌्◌゙𑽁b; a◌゙◌्𑽁◌ְb; a◌゙◌्𑽁◌ְb; a◌゙◌्𑽁◌ְb; a◌゙◌्𑽁◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, KAWI SIGN KILLER, LATIN SMALL LETTER B
+0061 11F41 05B0 094D 3099 0062;0061 3099 11F41 094D 05B0 0062;0061 3099 11F41 094D 05B0 0062;0061 3099 11F41 094D 05B0 0062;0061 3099 11F41 094D 05B0 0062; # (a𑽁◌ְ◌्◌゙b; a◌゙𑽁◌्◌ְb; a◌゙𑽁◌्◌ְb; a◌゙𑽁◌्◌ְb; a◌゙𑽁◌्◌ְb; ) LATIN SMALL LETTER A, KAWI SIGN KILLER, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
+0061 05B0 094D 3099 11F42 0062;0061 3099 094D 11F42 05B0 0062;0061 3099 094D 11F42 05B0 0062;0061 3099 094D 11F42 05B0 0062;0061 3099 094D 11F42 05B0 0062; # (a◌ְ◌्◌゙◌𑽂b; a◌゙◌्◌𑽂◌ְb; a◌゙◌्◌𑽂◌ְb; a◌゙◌्◌𑽂◌ְb; a◌゙◌्◌𑽂◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, KAWI CONJOINER, LATIN SMALL LETTER B
+0061 11F42 05B0 094D 3099 0062;0061 3099 11F42 094D 05B0 0062;0061 3099 11F42 094D 05B0 0062;0061 3099 11F42 094D 05B0 0062;0061 3099 11F42 094D 05B0 0062; # (a◌𑽂◌ְ◌्◌゙b; a◌゙◌𑽂◌्◌ְb; a◌゙◌𑽂◌्◌ְb; a◌゙◌𑽂◌्◌ְb; a◌゙◌𑽂◌्◌ְb; ) LATIN SMALL LETTER A, KAWI CONJOINER, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
0061 16FF0 0334 16AF0 0062;0061 0334 16AF0 16FF0 0062;0061 0334 16AF0 16FF0 0062;0061 0334 16AF0 16FF0 0062;0061 0334 16AF0 16FF0 0062; # (a𖿰◌̴◌𖫰b; a◌̴◌𖫰𖿰b; a◌̴◌𖫰𖿰b; a◌̴◌𖫰𖿰b; a◌̴◌𖫰𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, BASSA VAH COMBINING HIGH TONE, LATIN SMALL LETTER B
0061 16AF0 16FF0 0334 0062;0061 16AF0 0334 16FF0 0062;0061 16AF0 0334 16FF0 0062;0061 16AF0 0334 16FF0 0062;0061 16AF0 0334 16FF0 0062; # (a◌𖫰𖿰◌̴b; a◌𖫰◌̴𖿰b; a◌𖫰◌̴𖿰b; a◌𖫰◌̴𖿰b; a◌𖫰◌̴𖿰b; ) LATIN SMALL LETTER A, BASSA VAH COMBINING HIGH TONE, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B
0061 16FF0 0334 16AF1 0062;0061 0334 16AF1 16FF0 0062;0061 0334 16AF1 16FF0 0062;0061 0334 16AF1 16FF0 0062;0061 0334 16AF1 16FF0 0062; # (a𖿰◌̴◌𖫱b; a◌̴◌𖫱𖿰b; a◌̴◌𖫱𖿰b; a◌̴◌𖫱𖿰b; a◌̴◌𖫱𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, BASSA VAH COMBINING LOW TONE, LATIN SMALL LETTER B
@@ -18812,6 +18884,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (○; ○; ○; ○; ○; ) HALFWIDTH WHITE CIRCLE
0061 1E029 0315 0300 05AE 0062;0061 05AE 1E029 0300 0315 0062;0061 05AE 1E029 0300 0315 0062;0061 05AE 1E029 0300 0315 0062;0061 05AE 1E029 0300 0315 0062; # (a◌𞀩◌̕◌̀◌֮b; a◌֮◌𞀩◌̀◌̕b; a◌֮◌𞀩◌̀◌̕b; a◌֮◌𞀩◌̀◌̕b; a◌֮◌𞀩◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER IOTATED BIG YUS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 1E02A 0062;00E0 05AE 1E02A 0315 0062;0061 05AE 0300 1E02A 0315 0062;00E0 05AE 1E02A 0315 0062;0061 05AE 0300 1E02A 0315 0062; # (a◌̕◌̀◌֮◌𞀪b; à◌֮◌𞀪◌̕b; a◌֮◌̀◌𞀪◌̕b; à◌֮◌𞀪◌̕b; a◌֮◌̀◌𞀪◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER FITA, LATIN SMALL LETTER B
0061 1E02A 0315 0300 05AE 0062;0061 05AE 1E02A 0300 0315 0062;0061 05AE 1E02A 0300 0315 0062;0061 05AE 1E02A 0300 0315 0062;0061 05AE 1E02A 0300 0315 0062; # (a◌𞀪◌̕◌̀◌֮b; a◌֮◌𞀪◌̀◌̕b; a◌֮◌𞀪◌̀◌̕b; a◌֮◌𞀪◌̀◌̕b; a◌֮◌𞀪◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER FITA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 0315 0300 05AE 1E08F 0062;00E0 05AE 1E08F 0315 0062;0061 05AE 0300 1E08F 0315 0062;00E0 05AE 1E08F 0315 0062;0061 05AE 0300 1E08F 0315 0062; # (a◌̕◌̀◌֮◌𞂏b; à◌֮◌𞂏◌̕b; a◌֮◌̀◌𞂏◌̕b; à◌֮◌𞂏◌̕b; a◌֮◌̀◌𞂏◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I, LATIN SMALL LETTER B
+0061 1E08F 0315 0300 05AE 0062;0061 05AE 1E08F 0300 0315 0062;0061 05AE 1E08F 0300 0315 0062;0061 05AE 1E08F 0300 0315 0062;0061 05AE 1E08F 0300 0315 0062; # (a◌𞂏◌̕◌̀◌֮b; a◌֮◌𞂏◌̀◌̕b; a◌֮◌𞂏◌̀◌̕b; a◌֮◌𞂏◌̀◌̕b; a◌֮◌𞂏◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 1E130 0062;00E0 05AE 1E130 0315 0062;0061 05AE 0300 1E130 0315 0062;00E0 05AE 1E130 0315 0062;0061 05AE 0300 1E130 0315 0062; # (a◌̕◌̀◌֮◌𞄰b; à◌֮◌𞄰◌̕b; a◌֮◌̀◌𞄰◌̕b; à◌֮◌𞄰◌̕b; a◌֮◌̀◌𞄰◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, NYIAKENG PUACHUE HMONG TONE-B, LATIN SMALL LETTER B
0061 1E130 0315 0300 05AE 0062;0061 05AE 1E130 0300 0315 0062;0061 05AE 1E130 0300 0315 0062;0061 05AE 1E130 0300 0315 0062;0061 05AE 1E130 0300 0315 0062; # (a◌𞄰◌̕◌̀◌֮b; a◌֮◌𞄰◌̀◌̕b; a◌֮◌𞄰◌̀◌̕b; a◌֮◌𞄰◌̀◌̕b; a◌֮◌𞄰◌̀◌̕b; ) LATIN SMALL LETTER A, NYIAKENG PUACHUE HMONG TONE-B, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 1E131 0062;00E0 05AE 1E131 0315 0062;0061 05AE 0300 1E131 0315 0062;00E0 05AE 1E131 0315 0062;0061 05AE 0300 1E131 0315 0062; # (a◌̕◌̀◌֮◌𞄱b; à◌֮◌𞄱◌̕b; a◌֮◌̀◌𞄱◌̕b; à◌֮◌𞄱◌̕b; a◌֮◌̀◌𞄱◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, NYIAKENG PUACHUE HMONG TONE-M, LATIN SMALL LETTER B
@@ -18836,6 +18910,14 @@ FFEE;FFEE;FFEE;25CB;25CB; # (○; ○; ○; ○; ○; ) HALFWIDTH WHITE CIRCLE
0061 1E2EE 0315 0300 05AE 0062;0061 05AE 1E2EE 0300 0315 0062;0061 05AE 1E2EE 0300 0315 0062;0061 05AE 1E2EE 0300 0315 0062;0061 05AE 1E2EE 0300 0315 0062; # (a◌𞋮◌̕◌̀◌֮b; a◌֮◌𞋮◌̀◌̕b; a◌֮◌𞋮◌̀◌̕b; a◌֮◌𞋮◌̀◌̕b; a◌֮◌𞋮◌̀◌̕b; ) LATIN SMALL LETTER A, WANCHO TONE KOI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 1E2EF 0062;00E0 05AE 1E2EF 0315 0062;0061 05AE 0300 1E2EF 0315 0062;00E0 05AE 1E2EF 0315 0062;0061 05AE 0300 1E2EF 0315 0062; # (a◌̕◌̀◌֮◌𞋯b; à◌֮◌𞋯◌̕b; a◌֮◌̀◌𞋯◌̕b; à◌֮◌𞋯◌̕b; a◌֮◌̀◌𞋯◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, WANCHO TONE KOINI, LATIN SMALL LETTER B
0061 1E2EF 0315 0300 05AE 0062;0061 05AE 1E2EF 0300 0315 0062;0061 05AE 1E2EF 0300 0315 0062;0061 05AE 1E2EF 0300 0315 0062;0061 05AE 1E2EF 0300 0315 0062; # (a◌𞋯◌̕◌̀◌֮b; a◌֮◌𞋯◌̀◌̕b; a◌֮◌𞋯◌̀◌̕b; a◌֮◌𞋯◌̀◌̕b; a◌֮◌𞋯◌̀◌̕b; ) LATIN SMALL LETTER A, WANCHO TONE KOINI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 035C 0315 0300 1E4EC 0062;00E0 0315 1E4EC 035C 0062;0061 0300 0315 1E4EC 035C 0062;00E0 0315 1E4EC 035C 0062;0061 0300 0315 1E4EC 035C 0062; # (a◌͜◌̕◌̀◌𞓬b; à◌̕◌𞓬◌͜b; a◌̀◌̕◌𞓬◌͜b; à◌̕◌𞓬◌͜b; a◌̀◌̕◌𞓬◌͜b; ) LATIN SMALL LETTER A, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, NAG MUNDARI SIGN MUHOR, LATIN SMALL LETTER B
+0061 1E4EC 035C 0315 0300 0062;00E0 1E4EC 0315 035C 0062;0061 0300 1E4EC 0315 035C 0062;00E0 1E4EC 0315 035C 0062;0061 0300 1E4EC 0315 035C 0062; # (a◌𞓬◌͜◌̕◌̀b; à◌𞓬◌̕◌͜b; a◌̀◌𞓬◌̕◌͜b; à◌𞓬◌̕◌͜b; a◌̀◌𞓬◌̕◌͜b; ) LATIN SMALL LETTER A, NAG MUNDARI SIGN MUHOR, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, LATIN SMALL LETTER B
+0061 035C 0315 0300 1E4ED 0062;00E0 0315 1E4ED 035C 0062;0061 0300 0315 1E4ED 035C 0062;00E0 0315 1E4ED 035C 0062;0061 0300 0315 1E4ED 035C 0062; # (a◌͜◌̕◌̀◌𞓭b; à◌̕◌𞓭◌͜b; a◌̀◌̕◌𞓭◌͜b; à◌̕◌𞓭◌͜b; a◌̀◌̕◌𞓭◌͜b; ) LATIN SMALL LETTER A, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, NAG MUNDARI SIGN TOYOR, LATIN SMALL LETTER B
+0061 1E4ED 035C 0315 0300 0062;00E0 1E4ED 0315 035C 0062;0061 0300 1E4ED 0315 035C 0062;00E0 1E4ED 0315 035C 0062;0061 0300 1E4ED 0315 035C 0062; # (a◌𞓭◌͜◌̕◌̀b; à◌𞓭◌̕◌͜b; a◌̀◌𞓭◌̕◌͜b; à◌𞓭◌̕◌͜b; a◌̀◌𞓭◌̕◌͜b; ) LATIN SMALL LETTER A, NAG MUNDARI SIGN TOYOR, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1E4EE 0062;0061 1DFA 0316 1E4EE 059A 0062;0061 1DFA 0316 1E4EE 059A 0062;0061 1DFA 0316 1E4EE 059A 0062;0061 1DFA 0316 1E4EE 059A 0062; # (a◌֚◌̖◌᷺◌𞓮b; a◌᷺◌̖◌𞓮◌֚b; a◌᷺◌̖◌𞓮◌֚b; a◌᷺◌̖◌𞓮◌֚b; a◌᷺◌̖◌𞓮◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, NAG MUNDARI SIGN IKIR, LATIN SMALL LETTER B
+0061 1E4EE 059A 0316 1DFA 0062;0061 1DFA 1E4EE 0316 059A 0062;0061 1DFA 1E4EE 0316 059A 0062;0061 1DFA 1E4EE 0316 059A 0062;0061 1DFA 1E4EE 0316 059A 0062; # (a◌𞓮◌֚◌̖◌᷺b; a◌᷺◌𞓮◌̖◌֚b; a◌᷺◌𞓮◌̖◌֚b; a◌᷺◌𞓮◌̖◌֚b; a◌᷺◌𞓮◌̖◌֚b; ) LATIN SMALL LETTER A, NAG MUNDARI SIGN IKIR, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 0315 0300 05AE 1E4EF 0062;00E0 05AE 1E4EF 0315 0062;0061 05AE 0300 1E4EF 0315 0062;00E0 05AE 1E4EF 0315 0062;0061 05AE 0300 1E4EF 0315 0062; # (a◌̕◌̀◌֮◌𞓯b; à◌֮◌𞓯◌̕b; a◌֮◌̀◌𞓯◌̕b; à◌֮◌𞓯◌̕b; a◌֮◌̀◌𞓯◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, NAG MUNDARI SIGN SUTUH, LATIN SMALL LETTER B
+0061 1E4EF 0315 0300 05AE 0062;0061 05AE 1E4EF 0300 0315 0062;0061 05AE 1E4EF 0300 0315 0062;0061 05AE 1E4EF 0300 0315 0062;0061 05AE 1E4EF 0300 0315 0062; # (a◌𞓯◌̕◌̀◌֮b; a◌֮◌𞓯◌̀◌̕b; a◌֮◌𞓯◌̀◌̕b; a◌֮◌𞓯◌̀◌̕b; a◌֮◌𞓯◌̀◌̕b; ) LATIN SMALL LETTER A, NAG MUNDARI SIGN SUTUH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 059A 0316 1DFA 1E8D0 0062;0061 1DFA 0316 1E8D0 059A 0062;0061 1DFA 0316 1E8D0 059A 0062;0061 1DFA 0316 1E8D0 059A 0062;0061 1DFA 0316 1E8D0 059A 0062; # (a◌֚◌̖◌᷺◌𞣐b; a◌᷺◌̖◌𞣐◌֚b; a◌᷺◌̖◌𞣐◌֚b; a◌᷺◌̖◌𞣐◌֚b; a◌᷺◌̖◌𞣐◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MENDE KIKAKUI COMBINING NUMBER TEENS, LATIN SMALL LETTER B
0061 1E8D0 059A 0316 1DFA 0062;0061 1DFA 1E8D0 0316 059A 0062;0061 1DFA 1E8D0 0316 059A 0062;0061 1DFA 1E8D0 0316 059A 0062;0061 1DFA 1E8D0 0316 059A 0062; # (a◌𞣐◌֚◌̖◌᷺b; a◌᷺◌𞣐◌̖◌֚b; a◌᷺◌𞣐◌̖◌֚b; a◌᷺◌𞣐◌̖◌֚b; a◌᷺◌𞣐◌̖◌֚b; ) LATIN SMALL LETTER A, MENDE KIKAKUI COMBINING NUMBER TEENS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 059A 0316 1DFA 1E8D1 0062;0061 1DFA 0316 1E8D1 059A 0062;0061 1DFA 0316 1E8D1 059A 0062;0061 1DFA 0316 1E8D1 059A 0062;0061 1DFA 0316 1E8D1 059A 0062; # (a◌֚◌̖◌᷺◌𞣑b; a◌᷺◌̖◌𞣑◌֚b; a◌᷺◌̖◌𞣑◌֚b; a◌᷺◌̖◌𞣑◌֚b; a◌᷺◌̖◌𞣑◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MENDE KIKAKUI COMBINING NUMBER TENS, LATIN SMALL LETTER B
diff --git a/glib/tests/cxx.cpp b/glib/tests/cxx.cpp
index 243134009..bc7967cce 100644
--- a/glib/tests/cxx.cpp
+++ b/glib/tests/cxx.cpp
@@ -350,6 +350,36 @@ test_strdup_macro (void)
}
static void
+test_strdup_macro_qualified (void)
+{
+ gchar *str;
+
+ g_assert_null (::g_strdup (NULL));
+
+ str = ::g_strdup ("C++ is cool too!");
+ g_assert_nonnull (str);
+ g_assert_cmpstr (str, ==, "C++ is cool too!");
+ g_free (str);
+}
+
+static void
+test_strdup_macro_nested_initializer (void)
+{
+ struct
+ {
+ char *p, *q;
+ } strings = {
+ g_strdup (NULL),
+ g_strdup ("C++ is cool too!"),
+ };
+
+ g_assert_null (strings.p);
+ g_assert_nonnull (strings.q);
+ g_assert_cmpstr (strings.q, ==, "C++ is cool too!");
+ g_free (strings.q);
+}
+
+static void
test_str_has_prefix (void)
{
g_assert_true ((g_str_has_prefix) ("C++ is cool!", "C++"));
@@ -527,6 +557,8 @@ main (int argc, char *argv[])
g_test_add_func ("/C++/str-equal", test_str_equal);
g_test_add_func ("/C++/strdup", test_strdup);
g_test_add_func ("/C++/strdup/macro", test_strdup_macro);
+ g_test_add_func ("/C++/strdup/macro/qualified", test_strdup_macro_qualified);
+ g_test_add_func ("/C++/strdup/macro/nested-initializer", test_strdup_macro_nested_initializer);
g_test_add_func ("/C++/str-has-prefix", test_str_has_prefix);
g_test_add_func ("/C++/str-has-prefix/macro", test_str_has_prefix_macro);
g_test_add_func ("/C++/str-has-suffix", test_str_has_suffix);
diff --git a/glib/tests/mainloop.c b/glib/tests/mainloop.c
index 9904da833..4c63df168 100644
--- a/glib/tests/mainloop.c
+++ b/glib/tests/mainloop.c
@@ -1702,10 +1702,6 @@ threadf (gpointer data)
static void
test_mainloop_wait (void)
{
-#ifdef _GLIB_ADDRESS_SANITIZER
- (void) threadf;
- g_test_incomplete ("FIXME: Leaks a GMainLoop, see glib#2307");
-#else
GMainContext *context;
GThread *t1, *t2;
@@ -1718,7 +1714,6 @@ test_mainloop_wait (void)
g_thread_join (t2);
g_main_context_unref (context);
-#endif
}
#endif
diff --git a/glib/tests/markup-example.c b/glib/tests/markup-example.c
new file mode 100644
index 000000000..63e1a481c
--- /dev/null
+++ b/glib/tests/markup-example.c
@@ -0,0 +1,168 @@
+/* Copyright (C) 2008 Luc Pionchon
+ * Copyright (C) 2012 David King
+ *
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ *
+ * 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.1 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 library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <glib.h>
+
+static void foo_parser_start_element (GMarkupParseContext *context,
+ const gchar *element_name,
+ const gchar **attribute_names,
+ const gchar **attribute_values,
+ gpointer user_data,
+ GError **error);
+static void foo_parser_end_element (GMarkupParseContext *context,
+ const gchar *element_name,
+ gpointer user_data,
+ GError **error);
+static void foo_parser_characters (GMarkupParseContext *context,
+ const gchar *text,
+ gsize text_len,
+ gpointer user_data,
+ GError **error);
+static void foo_parser_passthrough (GMarkupParseContext *context,
+ const gchar *passthrough_text,
+ gsize text_len,
+ gpointer user_data,
+ GError **error);
+static void foo_parser_error (GMarkupParseContext *context,
+ GError *error,
+ gpointer user_data);
+
+/*
+ * Parser
+ */
+static const GMarkupParser foo_xml_parser = {
+ foo_parser_start_element,
+ foo_parser_end_element,
+ foo_parser_characters,
+ foo_parser_passthrough,
+ foo_parser_error
+};
+
+/*
+ * Called for opening tags like <foo bar="baz">
+ */
+static void
+foo_parser_start_element (GMarkupParseContext *context,
+ const gchar *element_name,
+ const gchar **attribute_names,
+ const gchar **attribute_values,
+ gpointer user_data,
+ GError **error)
+{
+ g_print ("element: <%s>\n", element_name);
+
+ for (gsize i = 0; attribute_names[i]; i++)
+ {
+ g_print ("attribute: %s = \"%s\"\n", attribute_names[i],
+ attribute_values[i]);
+ }
+}
+
+/*
+ * Called for closing tags like </foo>
+ */
+static void
+foo_parser_end_element (GMarkupParseContext *context,
+ const gchar *element_name,
+ gpointer user_data,
+ GError **error)
+{
+ g_print ("element: </%s>\n", element_name);
+}
+
+/*
+ * Called for character data. Text is not nul-terminated
+ */
+static void
+foo_parser_characters (GMarkupParseContext *context,
+ const gchar *text,
+ gsize text_len,
+ gpointer user_data,
+ GError **error)
+{
+ g_print ("text: [%s]\n", text);
+}
+
+/*
+ * Called for strings that should be re-saved verbatim in this same
+ * position, but are not otherwise interpretable. At the moment this
+ * includes comments and processing instructions. Text is not
+ * nul-terminated.
+ */
+static void
+foo_parser_passthrough (GMarkupParseContext *context,
+ const gchar *passthrough_text,
+ gsize text_len,
+ gpointer user_data,
+ GError **error)
+{
+ g_print ("passthrough: %s\n", passthrough_text);
+}
+
+/*
+ * Called when any parsing method encounters an error. The GError should not be
+ * freed.
+ */
+static void
+foo_parser_error (GMarkupParseContext *context,
+ GError *error,
+ gpointer user_data)
+{
+ g_printerr ("ERROR: %s\n", error->message);
+}
+
+int
+main (void)
+{
+ GMarkupParseContext *context;
+ gboolean success = FALSE;
+ glong len;
+
+ /*
+ * Example XML for the parser.
+ */
+ const gchar foo_xml_example[] =
+ "<foo bar='baz' bir='boz'>"
+ " <bar>bar text 1</bar> "
+ " <bar>bar text 2</bar> "
+ " foo text "
+ "<!-- nothing --> "
+ "</foo> ";
+
+ len = g_utf8_strlen (foo_xml_example, -1);
+ g_print ("Parsing: %s\n", foo_xml_example);
+ g_print ("(%ld UTF-8 characters)\n", len);
+
+ context = g_markup_parse_context_new (&foo_xml_parser, G_MARKUP_DEFAULT_FLAGS, NULL, NULL);
+
+ success = g_markup_parse_context_parse (context, foo_xml_example, len, NULL);
+
+ g_markup_parse_context_free (context);
+
+ if (success)
+ {
+ g_print ("DONE\n");
+ return 0;
+ }
+ else
+ {
+ g_printerr ("ERROR\n");
+ return 1;
+ }
+}
diff --git a/glib/tests/meson.build b/glib/tests/meson.build
index 2443bd4b0..09ecd5ab3 100644
--- a/glib/tests/meson.build
+++ b/glib/tests/meson.build
@@ -281,6 +281,7 @@ endif
test_extra_programs = {
'assert-msg-test' : {},
+ 'markup-example' : {'install' : false},
'spawn-path-search-helper' : {},
'spawn-test-helper' : {},
'testing-helper' : {},
diff --git a/glib/tests/queue.c b/glib/tests/queue.c
index f092f6bfc..b35e8ffaa 100644
--- a/glib/tests/queue.c
+++ b/glib/tests/queue.c
@@ -1,3 +1,24 @@
+/*
+ * Copyright 1999 Jeff Garzik
+ * Copyright 1999 Tim Janik
+ * Copyright 2004 Soeren Sandmann
+ * Copyright 2006 Martyn James Russell
+ * Copyright 2004, 2005, 2010, 2019 Red Hat, Inc.
+ * Copyright 2011 Samsung
+ * Copyright 2018 Tapasweni Pathak
+ * Copyright 2019 Endless Mobile, Inc.
+ * Copyright 2020 Emmanuel Fleury
+ *
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ *
+ * This program 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.1 of the License, or (at your option) any later version.
+ *
+ * See the included COPYING file for more information.
+ */
+
#undef G_DISABLE_ASSERT
#undef G_LOG_DOMAIN
@@ -16,14 +37,14 @@ check_integrity (GQueue *queue)
GList *link;
guint n;
- g_assert (queue->length < 4000000000u);
+ g_assert_cmpuint (queue->length, <, 4000000000u);
- g_assert (g_queue_get_length (queue) == queue->length);
+ g_assert_cmpuint (g_queue_get_length (queue), ==, queue->length);
if (!queue->head)
- g_assert (!queue->tail);
+ g_assert_null (queue->tail);
if (!queue->tail)
- g_assert (!queue->head);
+ g_assert_null (queue->head);
n = 0;
last = NULL;
@@ -33,8 +54,8 @@ check_integrity (GQueue *queue)
last = list;
++n;
}
- g_assert (n == queue->length);
- g_assert (last == queue->tail);
+ g_assert_cmpuint (n, ==, queue->length);
+ g_assert_true (last == queue->tail);
n = 0;
last = NULL;
@@ -44,8 +65,8 @@ check_integrity (GQueue *queue)
last = list;
++n;
}
- g_assert (n == queue->length);
- g_assert (last == queue->head);
+ g_assert_cmpuint (n, ==, queue->length);
+ g_assert_true (last == queue->head);
links = NULL;
for (list = queue->head; list != NULL; list = list->next)
@@ -54,7 +75,7 @@ check_integrity (GQueue *queue)
link = links;
for (list = queue->tail; list != NULL; list = list->prev)
{
- g_assert (list == link->data);
+ g_assert_true (list == link->data);
link = link->next;
}
g_list_free (links);
@@ -66,7 +87,7 @@ check_integrity (GQueue *queue)
link = links;
for (list = queue->head; list != NULL; list = list->next)
{
- g_assert (list == link->data);
+ g_assert_true (list == link->data);
link = link->next;
}
g_list_free (links);
@@ -145,10 +166,9 @@ compare_int (gconstpointer a, gconstpointer b, gpointer data)
return -1;
}
-static gint
+static guint
get_random_position (GQueue *queue, gboolean allow_offlist)
{
- int n;
enum { OFF_QUEUE, HEAD, TAIL, MIDDLE, LAST } where;
if (allow_offlist)
@@ -159,35 +179,28 @@ get_random_position (GQueue *queue, gboolean allow_offlist)
switch (where)
{
case OFF_QUEUE:
- n = g_random_int ();
- break;
+ return g_random_int ();
case HEAD:
- n = 0;
- break;
+ return 0;
case TAIL:
if (allow_offlist)
- n = queue->length;
+ return queue->length;
+ else if (queue->length > 0)
+ return queue->length - 1;
else
- n = queue->length - 1;
- break;
+ return 0;
case MIDDLE:
if (queue->length == 0)
- n = 0;
+ return 0;
else
- n = g_random_int_range (0, queue->length);
- break;
+ return g_random_int_range (0, queue->length);
default:
- g_assert_not_reached();
- n = 100;
- break;
-
+ g_assert_not_reached ();
}
-
- return n;
}
static void
@@ -207,10 +220,9 @@ random_test (gconstpointer d)
LINK_INDEX, UNLINK, DELETE_LINK, LAST_OP
} QueueOp;
-#define N_ITERATIONS 500000
-#define N_QUEUES 3
+ const guint n_iterations = g_test_thorough () ? 500000 : 100000;
-#define RANDOM_QUEUE() &(queues[g_random_int_range(0, N_QUEUES)])
+#define RANDOM_QUEUE() &(queues[g_random_int_range(0, G_N_ELEMENTS (queues))])
typedef struct QueueInfo QueueInfo;
struct QueueInfo
@@ -221,13 +233,13 @@ random_test (gconstpointer d)
guint length;
};
- gint i;
+ guint i;
QueueOp op;
- QueueInfo queues[N_QUEUES];
+ QueueInfo queues[3];
g_random_set_seed (seed);
- for (i = 0; i < N_QUEUES; ++i)
+ for (i = 0; i < G_N_ELEMENTS (queues); ++i)
{
queues[i].queue = g_queue_new ();
queues[i].head = NULL;
@@ -235,16 +247,16 @@ random_test (gconstpointer d)
queues[i].length = 0;
}
- for (i = 0; i < N_ITERATIONS; ++i)
+ for (i = 0; i < n_iterations; ++i)
{
- int j;
+ guint j;
QueueInfo *qinf = RANDOM_QUEUE();
GQueue *q = qinf->queue;
op = g_random_int_range (IS_EMPTY, LAST_OP);
- g_assert (qinf->head == q->head);
- g_assert (qinf->tail == q->tail);
- g_assert (qinf->length == q->length);
+ g_assert_true (qinf->head == q->head);
+ g_assert_true (qinf->tail == q->tail);
+ g_assert_cmpuint (qinf->length, ==, q->length);
switch (op)
{
@@ -252,15 +264,15 @@ random_test (gconstpointer d)
{
if (g_queue_is_empty (qinf->queue))
{
- g_assert (q->head == NULL);
- g_assert (q->tail == NULL);
- g_assert (q->length == 0);
+ g_assert_null (q->head);
+ g_assert_null (q->tail);
+ g_assert_cmpuint (q->length, ==, 0);
}
else
{
- g_assert (q->head);
- g_assert (q->tail);
- g_assert (q->length > 0);
+ g_assert_nonnull (q->head);
+ g_assert_nonnull (q->tail);
+ g_assert_cmpuint (q->length, >, 0);
}
}
break;
@@ -270,15 +282,15 @@ random_test (gconstpointer d)
l = g_queue_get_length (q);
- g_assert (qinf->length == q->length);
- g_assert (qinf->length == l);
+ g_assert_cmpuint (qinf->length, ==, q->length);
+ g_assert_cmpuint (qinf->length, ==, l);
}
break;
case REVERSE:
g_queue_reverse (q);
- g_assert (qinf->tail == q->head);
- g_assert (qinf->head == q->tail);
- g_assert (qinf->length == q->length);
+ g_assert_true (qinf->tail == q->head);
+ g_assert_true (qinf->head == q->tail);
+ g_assert_cmpuint (qinf->length, ==, q->length);
qinf->tail = q->tail;
qinf->head = q->head;
break;
@@ -316,13 +328,13 @@ random_test (gconstpointer d)
if (find_existing)
{
- g_assert (g_queue_find (q, GINT_TO_POINTER (first)));
- g_assert (g_queue_find (q, GINT_TO_POINTER (second)));
+ g_assert_nonnull (g_queue_find (q, GINT_TO_POINTER (first)));
+ g_assert_nonnull (g_queue_find (q, GINT_TO_POINTER (second)));
}
else
{
- g_assert (!g_queue_find (q, GINT_TO_POINTER (first)));
- g_assert (!g_queue_find (q, GINT_TO_POINTER (second)));
+ g_assert_null (g_queue_find (q, GINT_TO_POINTER (first)));
+ g_assert_null (g_queue_find (q, GINT_TO_POINTER (second)));
}
}
break;
@@ -353,7 +365,7 @@ random_test (gconstpointer d)
qinf->head = g_queue_find (q, GINT_TO_POINTER (find_min(q)));
qinf->tail = g_queue_find (q, GINT_TO_POINTER (find_max(q)));
- g_assert (qinf->tail == q->tail);
+ g_assert_true (qinf->tail == q->tail);
}
break;
case PUSH_HEAD:
@@ -380,7 +392,7 @@ random_test (gconstpointer d)
break;
case PUSH_NTH:
{
- int pos = get_random_position (q, TRUE);
+ guint pos = get_random_position (q, TRUE);
int x = g_random_int_range (0, 236546);
g_queue_push_nth (q, GINT_TO_POINTER (x), pos);
if (qinf->head && qinf->head->prev)
@@ -413,46 +425,47 @@ random_test (gconstpointer d)
case POP_NTH:
if (!g_queue_is_empty (q))
{
- int n = get_random_position (q, TRUE);
+ guint n = get_random_position (q, TRUE);
gpointer elm = g_queue_peek_nth (q, n);
- if (n == (int) (q->length - 1))
+ if (n == q->length - 1)
qinf->tail = qinf->tail->prev;
if (n == 0)
qinf->head = qinf->head->next;
- if (n >= 0 && (guint) n < q->length)
+ if (n < q->length)
qinf->length--;
- g_assert (elm == g_queue_pop_nth (q, n));
+ g_assert_true (elm == g_queue_pop_nth (q, n));
}
break;
case PEEK_HEAD:
if (qinf->head)
- g_assert (qinf->head->data == g_queue_peek_head (q));
+ g_assert_true (qinf->head->data == g_queue_peek_head (q));
else
- g_assert (g_queue_peek_head (q) == NULL);
+ g_assert_null (g_queue_peek_head (q));
break;
case PEEK_TAIL:
if (qinf->tail)
- g_assert (qinf->tail->data == g_queue_peek_tail (q));
+ g_assert_true (qinf->tail->data == g_queue_peek_tail (q));
else
- g_assert (g_queue_peek_tail (q) == NULL);
+ g_assert_null (g_queue_peek_tail (q));
break;
case PEEK_NTH:
if (g_queue_is_empty (q))
{
- for (j = -10; j < 10; ++j)
- g_assert (g_queue_peek_nth (q, j) == NULL);
+ int k;
+ for (k = -10; k < 10; ++k)
+ g_assert_null (g_queue_peek_nth (q, (guint) k));
}
else
{
GList *list;
- int n = get_random_position (q, TRUE);
- if (n < 0 || (guint) n >= q->length)
+ guint n = get_random_position (q, TRUE);
+ if (n >= q->length)
{
- g_assert (g_queue_peek_nth (q, n) == NULL);
+ g_assert_null (g_queue_peek_nth (q, n));
}
else
{
@@ -460,7 +473,7 @@ random_test (gconstpointer d)
for (j = 0; j < n; ++j)
list = list->next;
- g_assert (list->data == g_queue_peek_nth (q, n));
+ g_assert_true (list->data == g_queue_peek_nth (q, n));
}
}
break;
@@ -485,10 +498,10 @@ random_test (gconstpointer d)
break;
n++;
}
- g_assert (list);
- g_assert (g_queue_index (q, GINT_TO_POINTER (x)) ==
- g_queue_link_index (q, list));
- g_assert (g_queue_link_index (q, list) == n);
+ g_assert_nonnull (list);
+ g_assert_cmpint (g_queue_index (q, GINT_TO_POINTER (x)), ==,
+ g_queue_link_index (q, list));
+ g_assert_cmpint (g_queue_link_index (q, list), ==, n);
qinf->head = q->head;
qinf->tail = q->tail;
@@ -564,10 +577,10 @@ random_test (gconstpointer d)
check_integrity (q);
g_queue_insert_sorted (q, GINT_TO_POINTER (max + 1), compare_int, NULL);
check_integrity (q);
- g_assert (GPOINTER_TO_INT (q->tail->data) == max + 1);
+ g_assert_cmpint (GPOINTER_TO_INT (q->tail->data), ==, max + 1);
g_queue_insert_sorted (q, GINT_TO_POINTER (min - 1), compare_int, NULL);
check_integrity (q);
- g_assert (GPOINTER_TO_INT (q->head->data) == min - 1);
+ g_assert_cmpint (GPOINTER_TO_INT (q->head->data), ==, min - 1);
qinf->head = q->head;
qinf->tail = q->tail;
qinf->length = q->length;
@@ -596,7 +609,7 @@ random_test (gconstpointer d)
case PUSH_NTH_LINK:
{
GList *link = g_list_prepend (NULL, GINT_TO_POINTER (i));
- gint n = get_random_position (q, TRUE);
+ guint n = get_random_position (q, TRUE);
g_queue_push_nth_link (q, n, link);
if (qinf->head && qinf->head->prev)
@@ -632,12 +645,12 @@ random_test (gconstpointer d)
break;
case POP_NTH_LINK:
if (g_queue_is_empty (q))
- g_assert (g_queue_pop_nth_link (q, 200) == NULL);
+ g_assert_null (g_queue_pop_nth_link (q, 200));
else
{
- int n = get_random_position (q, FALSE);
+ guint n = get_random_position (q, FALSE);
- if (n == (int) (g_queue_get_length (q) - 1))
+ if (n == g_queue_get_length (q) - 1)
qinf->tail = qinf->tail->prev;
if (n == 0)
@@ -650,35 +663,35 @@ random_test (gconstpointer d)
break;
case PEEK_HEAD_LINK:
if (g_queue_is_empty (q))
- g_assert (g_queue_peek_head_link (q) == NULL);
+ g_assert_null (g_queue_peek_head_link (q));
else
- g_assert (g_queue_peek_head_link (q) == qinf->head);
+ g_assert_true (g_queue_peek_head_link (q) == qinf->head);
break;
case PEEK_TAIL_LINK:
if (g_queue_is_empty (q))
- g_assert (g_queue_peek_tail_link (q) == NULL);
+ g_assert_null (g_queue_peek_tail_link (q));
else
- g_assert (g_queue_peek_tail_link (q) == qinf->tail);
+ g_assert_true (g_queue_peek_tail_link (q) == qinf->tail);
break;
case PEEK_NTH_LINK:
if (g_queue_is_empty(q))
- g_assert (g_queue_peek_nth_link (q, 1000) == NULL);
+ g_assert_null (g_queue_peek_nth_link (q, 1000));
else
{
- gint n = get_random_position (q, FALSE);
+ guint n = get_random_position (q, FALSE);
GList *link;
link = q->head;
for (j = 0; j < n; ++j)
link = link->next;
- g_assert (g_queue_peek_nth_link (q, n) == link);
+ g_assert_true (g_queue_peek_nth_link (q, n) == link);
}
break;
case UNLINK:
if (!g_queue_is_empty (q))
{
- gint n = g_random_int_range (0, g_queue_get_length (q));
+ guint n = g_random_int_range (0, g_queue_get_length (q));
GList *link;
link = q->head;
@@ -698,7 +711,7 @@ random_test (gconstpointer d)
case DELETE_LINK:
if (!g_queue_is_empty (q))
{
- gint n = g_random_int_range (0, g_queue_get_length (q));
+ guint n = g_random_int_range (0, g_queue_get_length (q));
GList *link;
link = q->head;
@@ -724,15 +737,15 @@ random_test (gconstpointer d)
qinf->length != q->length)
g_printerr ("op: %d\n", op);
- g_assert (qinf->head == q->head);
- g_assert (qinf->tail == q->tail);
- g_assert (qinf->length == q->length);
+ g_assert_true (qinf->head == q->head);
+ g_assert_true (qinf->tail == q->tail);
+ g_assert_cmpuint (qinf->length, ==, q->length);
- for (j = 0; j < N_QUEUES; ++j)
+ for (j = 0; j < G_N_ELEMENTS (queues); ++j)
check_integrity (queues[j].queue);
}
- for (i = 0; i < N_QUEUES; ++i)
+ for (i = 0; i < G_N_ELEMENTS (queues); ++i)
g_queue_free (queues[i].queue);
}
@@ -753,88 +766,88 @@ test_basic (void)
q = g_queue_new ();
- g_assert (g_queue_is_empty (q));
+ g_assert_true (g_queue_is_empty (q));
g_queue_push_head (q, GINT_TO_POINTER (2));
check_integrity (q);
- g_assert (g_queue_peek_head (q) == GINT_TO_POINTER (2));
+ g_assert_cmpint (GPOINTER_TO_INT (g_queue_peek_head (q)), ==, 2);
check_integrity (q);
- g_assert (!g_queue_is_empty (q));
+ g_assert_false (g_queue_is_empty (q));
check_integrity (q);
g_assert_cmpint (g_list_length (q->head), ==, 1);
- g_assert (q->head == q->tail);
+ g_assert_true (q->head == q->tail);
g_queue_push_head (q, GINT_TO_POINTER (1));
check_integrity (q);
- g_assert (q->head->next == q->tail);
- g_assert (q->tail->prev == q->head);
+ g_assert_true (q->head->next == q->tail);
+ g_assert_true (q->tail->prev == q->head);
g_assert_cmpint (g_list_length (q->head), ==, 2);
check_integrity (q);
- g_assert (q->tail->data == GINT_TO_POINTER (2));
- g_assert (q->head->data == GINT_TO_POINTER (1));
+ g_assert_cmpint (GPOINTER_TO_INT (q->tail->data), ==, 2);
+ g_assert_cmpint (GPOINTER_TO_INT (q->head->data), ==, 1);
check_integrity (q);
g_queue_push_tail (q, GINT_TO_POINTER (3));
g_assert_cmpint (g_list_length (q->head), ==, 3);
- g_assert (q->head->data == GINT_TO_POINTER (1));
- g_assert (q->head->next->data == GINT_TO_POINTER (2));
- g_assert (q->head->next->next == q->tail);
- g_assert (q->head->next == q->tail->prev);
- g_assert (q->tail->data == GINT_TO_POINTER (3));
+ g_assert_cmpint (GPOINTER_TO_INT (q->head->data), ==, 1);
+ g_assert_cmpint (GPOINTER_TO_INT (q->head->next->data), ==, 2);
+ g_assert_true (q->head->next->next == q->tail);
+ g_assert_true (q->head->next == q->tail->prev);
+ g_assert_cmpint (GPOINTER_TO_INT (q->tail->data), ==, 3);
g_queue_push_tail (q, GINT_TO_POINTER (4));
check_integrity (q);
g_assert_cmpint (g_list_length (q->head), ==, 4);
- g_assert (q->head->data == GINT_TO_POINTER (1));
- g_assert (g_queue_peek_tail (q) == GINT_TO_POINTER (4));
+ g_assert_cmpint (GPOINTER_TO_INT (q->head->data), ==, 1);
+ g_assert_cmpint (GPOINTER_TO_INT (g_queue_peek_tail (q)), ==, 4);
g_queue_push_tail (q, GINT_TO_POINTER (5));
check_integrity (q);
g_assert_cmpint (g_list_length (q->head), ==, 5);
- g_assert (g_queue_is_empty (q) == FALSE);
+ g_assert_false (g_queue_is_empty (q));
check_integrity (q);
g_assert_cmpint (q->length, ==, 5);
- g_assert (q->head->prev == NULL);
- g_assert (q->head->data == GINT_TO_POINTER (1));
- g_assert (q->head->next->data == GINT_TO_POINTER (2));
- g_assert (q->head->next->next->data == GINT_TO_POINTER (3));
- g_assert (q->head->next->next->next->data == GINT_TO_POINTER (4));
- g_assert (q->head->next->next->next->next->data == GINT_TO_POINTER (5));
- g_assert (q->head->next->next->next->next->next == NULL);
- g_assert (q->head->next->next->next->next == q->tail);
- g_assert (q->tail->data == GINT_TO_POINTER (5));
- g_assert (q->tail->prev->data == GINT_TO_POINTER (4));
- g_assert (q->tail->prev->prev->data == GINT_TO_POINTER (3));
- g_assert (q->tail->prev->prev->prev->data == GINT_TO_POINTER (2));
- g_assert (q->tail->prev->prev->prev->prev->data == GINT_TO_POINTER (1));
- g_assert (q->tail->prev->prev->prev->prev->prev == NULL);
- g_assert (q->tail->prev->prev->prev->prev == q->head);
- g_assert (g_queue_peek_tail (q) == GINT_TO_POINTER (5));
- g_assert (g_queue_peek_head (q) == GINT_TO_POINTER (1));
- g_assert (g_queue_pop_head (q) == GINT_TO_POINTER (1));
+ g_assert_null (q->head->prev);
+ g_assert_cmpint (GPOINTER_TO_INT (q->head->data), ==, 1);
+ g_assert_cmpint (GPOINTER_TO_INT (q->head->next->data), ==, 2);
+ g_assert_cmpint (GPOINTER_TO_INT (q->head->next->next->data), ==, 3);
+ g_assert_cmpint (GPOINTER_TO_INT (q->head->next->next->next->data), ==, 4);
+ g_assert_cmpint (GPOINTER_TO_INT (q->head->next->next->next->next->data), ==, 5);
+ g_assert_null (q->head->next->next->next->next->next);
+ g_assert_true (q->head->next->next->next->next == q->tail);
+ g_assert_cmpint (GPOINTER_TO_INT (q->tail->data), ==, 5);
+ g_assert_cmpint (GPOINTER_TO_INT (q->tail->prev->data), ==, 4);
+ g_assert_cmpint (GPOINTER_TO_INT (q->tail->prev->prev->data), ==, 3);
+ g_assert_cmpint (GPOINTER_TO_INT (q->tail->prev->prev->prev->data), ==, 2);
+ g_assert_cmpint (GPOINTER_TO_INT (q->tail->prev->prev->prev->prev->data), ==, 1);
+ g_assert_null (q->tail->prev->prev->prev->prev->prev);
+ g_assert_true (q->tail->prev->prev->prev->prev == q->head);
+ g_assert_cmpint (GPOINTER_TO_INT (g_queue_peek_tail (q)), ==, 5);
+ g_assert_cmpint (GPOINTER_TO_INT (g_queue_peek_head (q)), ==, 1);
+ g_assert_cmpint (GPOINTER_TO_INT (g_queue_pop_head (q)), ==, 1);
check_integrity (q);
g_assert_cmpint (g_list_length (q->head), ==, 4);
g_assert_cmpint (q->length, ==, 4);
- g_assert (g_queue_pop_tail (q) == GINT_TO_POINTER (5));
+ g_assert_cmpint (GPOINTER_TO_INT (g_queue_pop_tail (q)), ==, 5);
check_integrity (q);
g_assert_cmpint (g_list_length (q->head), ==, 3);
node = g_queue_pop_head_link (q);
- g_assert (node->data == GINT_TO_POINTER (2));
+ g_assert_cmpint (GPOINTER_TO_INT (node->data), ==, 2);
g_list_free_1 (node);
check_integrity (q);
g_assert_cmpint (g_list_length (q->head), ==, 2);
- g_assert (g_queue_pop_tail (q) == GINT_TO_POINTER (4));
+ g_assert_cmpint (GPOINTER_TO_INT (g_queue_pop_tail (q)), ==, 4);
check_integrity (q);
g_assert_cmpint (g_list_length (q->head), ==, 1);
node = g_queue_pop_head_link (q);
- g_assert (node->data == GINT_TO_POINTER (3));
+ g_assert_cmpint (GPOINTER_TO_INT (node->data), ==, 3);
g_list_free_1 (node);
check_integrity (q);
g_assert_cmpint (g_list_length (q->head), ==, 0);
- g_assert (g_queue_pop_tail (q) == NULL);
+ g_assert_null (g_queue_pop_tail (q));
check_integrity (q);
g_assert_cmpint (g_list_length (q->head), ==, 0);
- g_assert (g_queue_pop_head (q) == NULL);
+ g_assert_null (g_queue_pop_head (q));
check_integrity (q);
g_assert_cmpint (g_list_length (q->head), ==, 0);
- g_assert (g_queue_is_empty (q));
+ g_assert_true (g_queue_is_empty (q));
check_integrity (q);
g_queue_push_head (q, GINT_TO_POINTER (1));
@@ -857,31 +870,31 @@ test_basic (void)
check_integrity (q);
g_assert_cmpint (g_list_length (q->head), ==, 5);
g_assert_cmpint (q->length, ==, 5);
- g_assert (g_queue_pop_head (q) == GINT_TO_POINTER (5));
+ g_assert_cmpint (GPOINTER_TO_INT (g_queue_pop_head (q)), ==, 5);
check_integrity (q);
g_assert_cmpint (g_list_length (q->head), ==, 4);
node = q->tail;
- g_assert (node == g_queue_pop_tail_link (q));
+ g_assert_true (node == g_queue_pop_tail_link (q));
check_integrity (q);
g_list_free_1 (node);
g_assert_cmpint (g_list_length (q->head), ==, 3);
data = q->head->data;
- g_assert (data == g_queue_pop_head (q));
+ g_assert_true (data == g_queue_pop_head (q));
check_integrity (q);
g_assert_cmpint (g_list_length (q->head), ==, 2);
- g_assert (g_queue_pop_tail (q) == GINT_TO_POINTER (2));
+ g_assert_cmpint (GPOINTER_TO_INT (g_queue_pop_tail (q)), ==, 2);
check_integrity (q);
g_assert_cmpint (g_list_length (q->head), ==, 1);
- g_assert (q->head == q->tail);
- g_assert (g_queue_pop_tail (q) == GINT_TO_POINTER (3));
+ g_assert_true (q->head == q->tail);
+ g_assert_cmpint (GPOINTER_TO_INT (g_queue_pop_tail (q)), ==, 3);
check_integrity (q);
g_assert_cmpint (g_list_length (q->head), ==, 0);
- g_assert (g_queue_pop_head (q) == NULL);
+ g_assert_null (g_queue_pop_head (q));
check_integrity (q);
- g_assert (g_queue_pop_head_link (q) == NULL);
+ g_assert_null (g_queue_pop_head_link (q));
check_integrity (q);
g_assert_cmpint (g_list_length (q->head), ==, 0);
- g_assert (g_queue_pop_tail_link (q) == NULL);
+ g_assert_null (g_queue_pop_tail_link (q));
check_integrity (q);
g_assert_cmpint (g_list_length (q->head), ==, 0);
@@ -913,7 +926,7 @@ test_copy (void)
for (i = 0; i < 200; ++i)
{
g_queue_push_nth (q, GINT_TO_POINTER (i), i);
- g_assert (g_queue_find (q, GINT_TO_POINTER (i)));
+ g_assert_nonnull (g_queue_find (q, GINT_TO_POINTER (i)));
check_integrity (q);
check_integrity (q2);
}
@@ -959,15 +972,22 @@ test_off_by_one (void)
g_queue_push_tail (q, GINT_TO_POINTER (1234));
check_integrity (q);
node = g_queue_peek_tail_link (q);
- g_assert (node != NULL && node->data == GINT_TO_POINTER (1234));
+ g_assert_nonnull (node);
+ g_assert_cmpint (GPOINTER_TO_INT (node->data), ==, 1234);
+
node = g_queue_peek_nth_link (q, g_queue_get_length (q));
- g_assert (node == NULL);
+ g_assert_null (node);
+
node = g_queue_peek_nth_link (q, g_queue_get_length (q) - 1);
- g_assert (node->data == GINT_TO_POINTER (1234));
+ g_assert_cmpint (GPOINTER_TO_INT (node->data), ==, 1234);
+
node = g_queue_pop_nth_link (q, g_queue_get_length (q));
- g_assert (node == NULL);
+ g_assert_null (node);
+
node = g_queue_pop_nth_link (q, g_queue_get_length (q) - 1);
- g_assert (node != NULL && node->data == GINT_TO_POINTER (1234));
+ g_assert_nonnull (node);
+ g_assert_cmpint (GPOINTER_TO_INT (node->data), ==, 1234);
+
g_list_free_1 (node);
g_queue_free (q);
@@ -990,11 +1010,11 @@ test_find_custom (void)
g_queue_push_tail (q, GINT_TO_POINTER (1));
g_queue_push_tail (q, GINT_TO_POINTER (2));
node = g_queue_find_custom (q, GINT_TO_POINTER (1), find_custom);
- g_assert (node != NULL);
+ g_assert_nonnull (node);
node = g_queue_find_custom (q, GINT_TO_POINTER (2), find_custom);
- g_assert (node != NULL);
+ g_assert_nonnull (node);
node = g_queue_find_custom (q, GINT_TO_POINTER (3), find_custom);
- g_assert (node == NULL);
+ g_assert_null (node);
g_queue_free (q);
}
@@ -1008,10 +1028,10 @@ test_static (void)
g_queue_init (&q);
check_integrity (&q);
- g_assert (g_queue_is_empty (&q));
+ g_assert_true (g_queue_is_empty (&q));
check_integrity (&q2);
- g_assert (g_queue_is_empty (&q2));
+ g_assert_true (g_queue_is_empty (&q2));
}
static void
@@ -1027,7 +1047,7 @@ test_clear (void)
g_queue_clear (q);
check_integrity (q);
- g_assert (g_queue_is_empty (q));
+ g_assert_true (g_queue_is_empty (q));
g_queue_free (q);
}
@@ -1223,13 +1243,13 @@ test_free_full (void)
g_queue_push_tail (queue, one = new_item (1));
g_queue_push_tail (queue, two = new_item (2));
g_queue_push_tail (queue, three = new_item (3));
- g_assert (!one->freed);
- g_assert (!two->freed);
- g_assert (!three->freed);
+ g_assert_false (one->freed);
+ g_assert_false (two->freed);
+ g_assert_false (three->freed);
g_queue_free_full (queue, free_func);
- g_assert (one->freed);
- g_assert (two->freed);
- g_assert (three->freed);
+ g_assert_true (one->freed);
+ g_assert_true (two->freed);
+ g_assert_true (three->freed);
g_slice_free (QueueItem, one);
g_slice_free (QueueItem, two);
g_slice_free (QueueItem, three);
diff --git a/glib/tests/spawn-test.c b/glib/tests/spawn-test.c
index b1b2eac0f..fdc35e86f 100644
--- a/glib/tests/spawn-test.c
+++ b/glib/tests/spawn-test.c
@@ -59,7 +59,136 @@ get_system_directory (void)
return path;
}
-#endif
+
+static wchar_t *
+g_wcsdup (const wchar_t *wcs_string)
+{
+ size_t length = wcslen (wcs_string);
+
+ return g_memdup2 (wcs_string, (length + 1) * sizeof (wchar_t));
+}
+
+static wchar_t *
+g_wcsndup (const wchar_t *wcs_string,
+ size_t length)
+{
+ wchar_t *result = NULL;
+
+ g_assert_true (length < SIZE_MAX);
+
+ result = g_new (wchar_t, length + 1);
+ memcpy (result, wcs_string, length * sizeof (wchar_t));
+ result[length] = L'\0';
+
+ return result;
+}
+
+/**
+ * parse_environment_string:
+ *
+ * @string: source environment string in the form <VARIABLE>=<VALUE>
+ * (e.g as returned by GetEnvironmentStrings)
+ * @name: (out) (optional) (utf-16) name of the variable
+ * @value: (out) (optional) (utf-16) value of the variable
+ *
+ * Parse environment string in the form <VARIABLE>=<VALUE>, for example
+ * the strings in the environment block returned by GetEnvironmentStrings.
+ *
+ * Returns: %TRUE on success
+ */
+static gboolean
+parse_environment_string (const wchar_t *string,
+ wchar_t **name,
+ wchar_t **value)
+{
+ const wchar_t *equal_sign;
+
+ g_assert_nonnull (string);
+ g_assert_true (name || value);
+
+ /* On Windows environment variables may have an equal-sign
+ * character as part of their name, but only as the first
+ * character */
+ equal_sign = wcschr (string[0] == L'=' ? (string + 1) : string, L'=');
+
+ if (name)
+ *name = equal_sign ? g_wcsndup (string, equal_sign - string) : NULL;
+
+ if (value)
+ *value = equal_sign ? g_wcsdup (equal_sign + 1) : NULL;
+
+ return (equal_sign != NULL);
+}
+
+/**
+ * find_cmd_shell_environment_variables:
+ *
+ * Finds all the environment variables related to cmd.exe, which are
+ * usually (but not always) present in a process environment block.
+ * Those environment variables are named "=X:", where X is a drive /
+ * volume letter and are used by cmd.exe to track per-drive current
+ * directories.
+ *
+ * See "What are these strange =C: environment variables?"
+ * https://devblogs.microsoft.com/oldnewthing/20100506-00/?p=14133
+ *
+ * This is used to test a work around for an UCRT issue
+ * https://developercommunity.visualstudio.com/t/UCRT-Crash-in-_wspawne-functions/10262748
+ */
+static GList *
+find_cmd_shell_environment_variables (void)
+{
+ wchar_t *block = NULL;
+ wchar_t *iter = NULL;
+ GList *variables = NULL;
+ size_t len = 0;
+
+ block = GetEnvironmentStringsW ();
+ if (!block)
+ {
+ DWORD code = GetLastError ();
+ g_error ("%s failed with error code %u",
+ "GetEnvironmentStrings", (unsigned int) code);
+ }
+
+ iter = block;
+
+ while ((len = wcslen (iter)))
+ {
+ if (iter[0] == L'=')
+ {
+ wchar_t *variable = NULL;
+
+ g_assert_true (parse_environment_string (iter, &variable, NULL));
+ g_assert_nonnull (variable);
+
+ variables = g_list_prepend (variables, variable);
+ }
+
+ iter += len + 1;
+ }
+
+ FreeEnvironmentStringsW (block);
+
+ return variables;
+}
+
+static void
+remove_environment_variables (GList *list)
+{
+ for (GList *l = list; l; l = l->next)
+ {
+ const wchar_t *variable = (const wchar_t*) l->data;
+
+ if (!SetEnvironmentVariableW (variable, NULL))
+ {
+ DWORD code = GetLastError ();
+ g_error ("%s failed with error code %u",
+ "SetEnvironmentVariable", (unsigned int) code);
+ }
+ }
+}
+#endif /* G_OS_WIN32 */
static void
test_spawn_basics (void)
@@ -73,9 +202,11 @@ test_spawn_basics (void)
char buf[100];
int pipedown[2], pipeup[2];
gchar **argv = NULL;
+ gchar **envp = g_get_environ ();
gchar *system_directory;
gchar spawn_binary[1000] = {0};
gchar full_cmdline[1000] = {0};
+ GList *cmd_shell_env_vars = NULL;
const LCID old_lcid = GetThreadUILanguage ();
const unsigned int initial_cp = GetConsoleOutputCP ();
@@ -253,11 +384,29 @@ test_spawn_basics (void)
buf[n] = '\0';
g_assert_cmpstr (buf, ==, "See ya");
+
+ /* Test workaround for:
+ *
+ * https://developercommunity.visualstudio.com/t/UCRT-Crash-in-_wspawne-functions/10262748
+ */
+ cmd_shell_env_vars = find_cmd_shell_environment_variables ();
+ remove_environment_variables (cmd_shell_env_vars);
+
+ g_snprintf (full_cmdline, sizeof (full_cmdline),
+ "'%s\\sort.exe' non-existing-file.txt", system_directory);
+ g_assert_true (g_shell_parse_argv (full_cmdline, NULL, &argv, NULL));
+ g_assert_nonnull (argv);
+ g_spawn_sync (NULL, argv, envp, G_SPAWN_DEFAULT,
+ NULL, NULL, NULL, NULL, NULL, NULL);
+ g_free (argv);
+ argv = NULL;
#endif
#ifdef G_OS_WIN32
SetThreadUILanguage (old_lcid);
SetConsoleOutputCP (initial_cp); /* 437 means en-US codepage */
+ g_list_free_full (cmd_shell_env_vars, g_free);
+ g_strfreev (envp);
g_free (system_directory);
#endif
}
diff --git a/glib/tests/strfuncs.c b/glib/tests/strfuncs.c
index 96f378815..544cee936 100644
--- a/glib/tests/strfuncs.c
+++ b/glib/tests/strfuncs.c
@@ -2459,6 +2459,7 @@ test_ascii_string_to_number_usual (void)
&value64,
&error);
g_test_assert_expected_messages ();
+ g_assert_false (result);
g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
"*assertion \'base >= 2 && base <= 36\'*");
@@ -2469,6 +2470,7 @@ test_ascii_string_to_number_usual (void)
&value64,
&error);
g_test_assert_expected_messages ();
+ g_assert_false (result);
g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
"*assertion \'base >= 2 && base <= 36\'*");
@@ -2479,6 +2481,7 @@ test_ascii_string_to_number_usual (void)
&value64,
&error);
g_test_assert_expected_messages ();
+ g_assert_false (result);
g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
"*assertion \'min <= max\'*");
@@ -2489,6 +2492,7 @@ test_ascii_string_to_number_usual (void)
&value64,
&error);
g_test_assert_expected_messages ();
+ g_assert_false (result);
}
/* Catching first part of (error == NULL || *error == NULL) */
@@ -2498,6 +2502,7 @@ test_ascii_string_to_number_usual (void)
data->max,
&value64,
NULL);
+ g_assert_true (result);
/*** g_ascii_string_to_unsigned() ***/
data = &test_data[12]; /* Setting data to unsigned data */
@@ -2513,6 +2518,7 @@ test_ascii_string_to_number_usual (void)
&valueu64,
&error);
g_test_assert_expected_messages ();
+ g_assert_false (result);
g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
"*assertion \'base >= 2 && base <= 36\'*");
@@ -2523,6 +2529,7 @@ test_ascii_string_to_number_usual (void)
&valueu64,
&error);
g_test_assert_expected_messages ();
+ g_assert_false (result);
g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
"*assertion \'base >= 2 && base <= 36\'*");
@@ -2533,6 +2540,7 @@ test_ascii_string_to_number_usual (void)
&valueu64,
&error);
g_test_assert_expected_messages ();
+ g_assert_false (result);
g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
"*assertion \'min <= max\'*");
@@ -2543,6 +2551,7 @@ test_ascii_string_to_number_usual (void)
&valueu64,
&error);
g_test_assert_expected_messages ();
+ g_assert_false (result);
}
/* Catching first part of (error == NULL || *error == NULL) */
@@ -2552,6 +2561,7 @@ test_ascii_string_to_number_usual (void)
data->max,
&valueu64,
NULL);
+ g_assert_false (result);
/* Testing usual cases */
for (idx = 0; idx < G_N_ELEMENTS (test_data); ++idx)
diff --git a/glib/tests/timer.c b/glib/tests/timer.c
index 3a2d1019c..be4cb957b 100644
--- a/glib/tests/timer.c
+++ b/glib/tests/timer.c
@@ -346,6 +346,29 @@ test_timeval_to_iso8601_overflow (void)
g_assert_null (out);
}
+static void
+test_usleep_with_zero_wait (void)
+{
+ GTimer *timer;
+ gdouble elapsed0, elapsed1;
+
+ timer = g_timer_new ();
+
+ g_timer_start (timer);
+ g_usleep (0);
+ elapsed0 = g_timer_elapsed (timer, NULL);
+ g_timer_stop (timer);
+
+ g_timer_start (timer);
+ g_usleep (1);
+ elapsed1 = g_timer_elapsed (timer, NULL);
+ g_timer_stop (timer);
+
+ g_assert_cmpfloat (elapsed0, <=, elapsed1);
+
+ g_clear_pointer (&timer, g_timer_destroy);
+}
+
int
main (int argc, char *argv[])
{
@@ -360,6 +383,7 @@ main (int argc, char *argv[])
g_test_add_func ("/timeval/from-iso8601", test_timeval_from_iso8601);
g_test_add_func ("/timeval/to-iso8601", test_timeval_to_iso8601);
g_test_add_func ("/timeval/to-iso8601/overflow", test_timeval_to_iso8601_overflow);
+ g_test_add_func ("/usleep/with-zero-wait", test_usleep_with_zero_wait);
return g_test_run ();
}
diff --git a/glib/tests/unicode-normalize.c b/glib/tests/unicode-normalize.c
index 451c03f34..191e5bb98 100644
--- a/glib/tests/unicode-normalize.c
+++ b/glib/tests/unicode-normalize.c
@@ -146,12 +146,50 @@ test_unicode_normalize (void)
g_string_free (buffer, TRUE);
}
+static void
+test_unicode_normalize_invalid (void)
+{
+ /* g_utf8_normalize() should return NULL for all of these invalid inputs */
+ const struct
+ {
+ gssize max_len;
+ const gchar *str;
+ } test_vectors[] = {
+ /* input ending with truncated multibyte encoding */
+ { -1, "\xC0" },
+ { 1, "\xC0\x80" },
+ { -1, "\xE0\x80" },
+ { 2, "\xE0\x80\x80" },
+ { -1, "\xF0\x80\x80" },
+ { 3, "\xF0\x80\x80\x80" },
+ { -1, "\xF8\x80\x80\x80" },
+ { 4, "\xF8\x80\x80\x80\x80" },
+ { 3, "\x20\xE2\x84\xAA" },
+ { -1, "\x20\xE2\x00\xAA" },
+ { -1, "\xC0\x80\xE0\x80" },
+ { 4, "\xC0\x80\xE0\x80\x80" },
+ /* input containing invalid multibyte encoding */
+ { -1, "\xED\x85\x9C\xED\x15\x9C\xED\x85\x9C" },
+ };
+ gsize i;
+
+ for (i = 0; i < G_N_ELEMENTS (test_vectors); i++)
+ {
+ g_test_message ("Invalid UTF-8 vector %" G_GSIZE_FORMAT, i);
+ g_assert_null (g_utf8_normalize (test_vectors[i].str,
+ test_vectors[i].max_len,
+ G_NORMALIZE_ALL));
+ }
+}
+
int
main (int argc, char **argv)
{
g_test_init (&argc, &argv, NULL);
g_test_add_func ("/unicode/normalize", test_unicode_normalize);
+ g_test_add_func ("/unicode/normalize-invalid",
+ test_unicode_normalize_invalid);
return g_test_run ();
}
diff --git a/glib/tests/unicode.c b/glib/tests/unicode.c
index d4955c6d1..5d66977c2 100644
--- a/glib/tests/unicode.c
+++ b/glib/tests/unicode.c
@@ -459,6 +459,10 @@ test_strup (void)
/* Tricky, comparing two unicode strings with an ASCII function */
g_assert_cmpstr (str_up, ==, "AAZZ09X;\003E\357\274\241\357\274\241");
g_free (str_up);
+
+ str_up = g_utf8_strup ("", 0);
+ g_assert_cmpstr (str_up, ==, "");
+ g_free (str_up);
}
/* Test that g_utf8_strdown() returns the correct value for various
@@ -484,6 +488,10 @@ test_strdown (void)
/* Tricky, comparing two unicode strings with an ASCII function */
g_assert_cmpstr (str_down, ==, "aazz09x;\003\007\357\275\201\357\275\201");
g_free (str_down);
+
+ str_down = g_utf8_strdown ("", 0);
+ g_assert_cmpstr (str_down, ==, "");
+ g_free (str_down);
}
/* Test that g_utf8_strup() and g_utf8_strdown() return the correct
@@ -576,6 +584,10 @@ test_casefold (void)
/* Tricky, comparing two unicode strings with an ASCII function */
g_assert_cmpstr (str_casefold, ==, "aazz09x;\357\275\201\357\275\201");
g_free (str_casefold);
+
+ str_casefold = g_utf8_casefold ("", 0);
+ g_assert_cmpstr (str_casefold, ==, "");
+ g_free (str_casefold);
}
static void
@@ -1889,6 +1901,45 @@ test_iso15924 (void)
#undef PACK
}
+static void
+test_normalize (void)
+{
+ guint i;
+ typedef struct
+ {
+ const gchar *str;
+ const gchar *nfd;
+ const gchar *nfc;
+ const gchar *nfkd;
+ const gchar *nfkc;
+ } Test;
+ Test tests[] = {
+ { "Äffin", "A\u0308ffin", "Äffin", "A\u0308ffin", "Äffin" },
+ { "Ä\uFB03n", "A\u0308\uFB03n", "Ä\uFB03n", "A\u0308ffin", "Äffin" },
+ { "Henry IV", "Henry IV", "Henry IV", "Henry IV", "Henry IV" },
+ { "Henry \u2163", "Henry \u2163", "Henry \u2163", "Henry IV", "Henry IV" },
+ { "non-utf\x88", NULL, NULL, NULL, NULL },
+ { "", "", "", "", "" },
+ };
+
+#define TEST(str, mode, expected) \
+ { \
+ gchar *normalized = g_utf8_normalize (str, -1, mode); \
+ g_assert_cmpstr (normalized, ==, expected); \
+ g_free (normalized); \
+ }
+
+ for (i = 0; i < G_N_ELEMENTS (tests); i++)
+ {
+ TEST (tests[i].str, G_NORMALIZE_NFD, tests[i].nfd);
+ TEST (tests[i].str, G_NORMALIZE_NFC, tests[i].nfc);
+ TEST (tests[i].str, G_NORMALIZE_NFKD, tests[i].nfkd);
+ TEST (tests[i].str, G_NORMALIZE_NFKC, tests[i].nfkc);
+ }
+
+#undef TEST
+}
+
int
main (int argc,
char *argv[])
@@ -1933,6 +1984,7 @@ main (int argc,
g_test_add_func ("/unicode/xdigit", test_xdigit);
g_test_add_func ("/unicode/xdigit-value", test_xdigit_value);
g_test_add_func ("/unicode/zero-width", test_zerowidth);
+ g_test_add_func ("/unicode/normalize", test_normalize);
return g_test_run();
}
diff --git a/gmodule/meson.build b/gmodule/meson.build
index 4b0778e70..237992fcc 100644
--- a/gmodule/meson.build
+++ b/gmodule/meson.build
@@ -115,22 +115,24 @@ pkg.generate(libgmodule,
description : 'Dynamic module loader for GLib',
)
-pkg.generate(libraries : [libgmodule, export_dynamic_ldflags],
+pkg.generate(libraries : [libgmodule],
requires : ['glib-2.0'],
version : glib_version,
variables : [supported_var],
install_dir : glib_pkgconfigreldir,
filebase : 'gmodule-export-2.0',
+ extra_cflags : export_dynamic_cflags,
name : 'GModule',
description : 'Dynamic module loader for GLib',
)
-pkg.generate(libraries : [libgmodule, export_dynamic_ldflags],
+pkg.generate(libraries : [libgmodule],
requires : ['glib-2.0'],
version : glib_version,
variables : [supported_var],
install_dir : glib_pkgconfigreldir,
filebase : 'gmodule-2.0',
+ extra_cflags : export_dynamic_cflags,
name : 'GModule',
description : 'Dynamic module loader for GLib',
)
diff --git a/gobject/gsignal.c b/gobject/gsignal.c
index dd1c6b50d..4bd918406 100644
--- a/gobject/gsignal.c
+++ b/gobject/gsignal.c
@@ -2946,13 +2946,19 @@ signal_handlers_foreach_matched_unlocked_R (gpointer instance,
* @data: (nullable) (closure closure): The closure data of the handlers' closures.
*
* Blocks all handlers on an instance that match a certain selection criteria.
- * The criteria mask is passed as an OR-ed combination of #GSignalMatchType
- * flags, and the criteria values are passed as arguments.
- * Passing at least one of the %G_SIGNAL_MATCH_CLOSURE, %G_SIGNAL_MATCH_FUNC
+ *
+ * The criteria mask is passed as a combination of #GSignalMatchType flags, and
+ * the criteria values are passed as arguments. A handler must match on all
+ * flags set in @mask to be blocked (i.e. the match is conjunctive).
+ *
+ * Passing at least one of the %G_SIGNAL_MATCH_ID, %G_SIGNAL_MATCH_CLOSURE,
+ * %G_SIGNAL_MATCH_FUNC
* or %G_SIGNAL_MATCH_DATA match flags is required for successful matches.
* If no handlers were found, 0 is returned, the number of blocked handlers
* otherwise.
*
+ * Support for %G_SIGNAL_MATCH_ID was added in GLib 2.78.
+ *
* Returns: The number of handlers that matched.
*/
guint
@@ -2969,7 +2975,7 @@ g_signal_handlers_block_matched (gpointer instance,
g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), 0);
g_return_val_if_fail ((mask & ~G_SIGNAL_MATCH_MASK) == 0, 0);
- if (mask & (G_SIGNAL_MATCH_CLOSURE | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA))
+ if (mask & (G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_CLOSURE | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA))
{
SIGNAL_LOCK ();
n_handlers =
@@ -2994,14 +3000,21 @@ g_signal_handlers_block_matched (gpointer instance,
* @data: (nullable) (closure closure): The closure data of the handlers' closures.
*
* Unblocks all handlers on an instance that match a certain selection
- * criteria. The criteria mask is passed as an OR-ed combination of
- * #GSignalMatchType flags, and the criteria values are passed as arguments.
- * Passing at least one of the %G_SIGNAL_MATCH_CLOSURE, %G_SIGNAL_MATCH_FUNC
+ * criteria.
+ *
+ * The criteria mask is passed as a combination of #GSignalMatchType flags, and
+ * the criteria values are passed as arguments. A handler must match on all
+ * flags set in @mask to be unblocked (i.e. the match is conjunctive).
+ *
+ * Passing at least one of the %G_SIGNAL_MATCH_ID, %G_SIGNAL_MATCH_CLOSURE,
+ * %G_SIGNAL_MATCH_FUNC
* or %G_SIGNAL_MATCH_DATA match flags is required for successful matches.
* If no handlers were found, 0 is returned, the number of unblocked handlers
* otherwise. The match criteria should not apply to any handlers that are
* not currently blocked.
*
+ * Support for %G_SIGNAL_MATCH_ID was added in GLib 2.78.
+ *
* Returns: The number of handlers that matched.
*/
guint
@@ -3018,7 +3031,7 @@ g_signal_handlers_unblock_matched (gpointer instance,
g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), 0);
g_return_val_if_fail ((mask & ~G_SIGNAL_MATCH_MASK) == 0, 0);
- if (mask & (G_SIGNAL_MATCH_CLOSURE | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA))
+ if (mask & (G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_CLOSURE | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA))
{
SIGNAL_LOCK ();
n_handlers =
@@ -3043,14 +3056,20 @@ g_signal_handlers_unblock_matched (gpointer instance,
* @data: (nullable) (closure closure): The closure data of the handlers' closures.
*
* Disconnects all handlers on an instance that match a certain
- * selection criteria. The criteria mask is passed as an OR-ed
- * combination of #GSignalMatchType flags, and the criteria values are
- * passed as arguments. Passing at least one of the
- * %G_SIGNAL_MATCH_CLOSURE, %G_SIGNAL_MATCH_FUNC or
+ * selection criteria.
+ *
+ * The criteria mask is passed as a combination of #GSignalMatchType flags, and
+ * the criteria values are passed as arguments. A handler must match on all
+ * flags set in @mask to be disconnected (i.e. the match is conjunctive).
+ *
+ * Passing at least one of the %G_SIGNAL_MATCH_ID, %G_SIGNAL_MATCH_CLOSURE,
+ * %G_SIGNAL_MATCH_FUNC or
* %G_SIGNAL_MATCH_DATA match flags is required for successful
* matches. If no handlers were found, 0 is returned, the number of
* disconnected handlers otherwise.
*
+ * Support for %G_SIGNAL_MATCH_ID was added in GLib 2.78.
+ *
* Returns: The number of handlers that matched.
*/
guint
@@ -3067,7 +3086,7 @@ g_signal_handlers_disconnect_matched (gpointer instance,
g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), 0);
g_return_val_if_fail ((mask & ~G_SIGNAL_MATCH_MASK) == 0, 0);
- if (mask & (G_SIGNAL_MATCH_CLOSURE | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA))
+ if (mask & (G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_CLOSURE | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA))
{
SIGNAL_LOCK ();
n_handlers =
diff --git a/gobject/gtype.h b/gobject/gtype.h
index cba70185e..b68af22ca 100644
--- a/gobject/gtype.h
+++ b/gobject/gtype.h
@@ -268,7 +268,7 @@ G_BEGIN_DECLS
*
* Checks if @type is a fundamental type.
*
- * Returns: %TRUE on success
+ * Returns: %TRUE is @type is fundamental
*/
#define G_TYPE_IS_FUNDAMENTAL(type) ((type) <= G_TYPE_FUNDAMENTAL_MAX)
/**
@@ -279,7 +279,7 @@ G_BEGIN_DECLS
* inherited) from another type (this holds true for all non-fundamental
* types).
*
- * Returns: %TRUE on success
+ * Returns: %TRUE if @type is derived
*/
#define G_TYPE_IS_DERIVED(type) ((type) > G_TYPE_FUNDAMENTAL_MAX)
/**
@@ -295,7 +295,7 @@ G_BEGIN_DECLS
* with the difference that GType interfaces are not derivable (but see
* g_type_interface_add_prerequisite() for an alternative).
*
- * Returns: %TRUE on success
+ * Returns: %TRUE if @type is an interface
*/
#define G_TYPE_IS_INTERFACE(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_INTERFACE)
/**
@@ -304,7 +304,16 @@ G_BEGIN_DECLS
*
* Checks if @type is a classed type.
*
- * Returns: %TRUE on success
+ * A classed type has an associated #GTypeClass which can be derived to store
+ * class-wide virtual function pointers and data for all instances of the type.
+ * This allows for subclassing. All #GObjects are classed; none of the scalar
+ * fundamental types built into GLib are classed.
+ *
+ * Interfaces are not classed: while their #GTypeInterface struct could be
+ * considered similar to #GTypeClass, and classes can derive interfaces,
+ * #GTypeInterface doesn’t allow for subclassing.
+ *
+ * Returns: %TRUE if @type is classed
*/
#define G_TYPE_IS_CLASSED(type) (g_type_test_flags ((type), G_TYPE_FLAG_CLASSED))
/**
@@ -314,7 +323,7 @@ G_BEGIN_DECLS
* Checks if @type can be instantiated. Instantiation is the
* process of creating an instance (object) of this type.
*
- * Returns: %TRUE on success
+ * Returns: %TRUE if @type is instantiatable
*/
#define G_TYPE_IS_INSTANTIATABLE(type) (g_type_test_flags ((type), G_TYPE_FLAG_INSTANTIATABLE))
/**
@@ -324,7 +333,7 @@ G_BEGIN_DECLS
* Checks if @type is a derivable type. A derivable type can
* be used as the base class of a flat (single-level) class hierarchy.
*
- * Returns: %TRUE on success
+ * Returns: %TRUE if @type is derivable
*/
#define G_TYPE_IS_DERIVABLE(type) (g_type_test_flags ((type), G_TYPE_FLAG_DERIVABLE))
/**
@@ -334,7 +343,7 @@ G_BEGIN_DECLS
* Checks if @type is a deep derivable type. A deep derivable type
* can be used as the base class of a deep (multi-level) class hierarchy.
*
- * Returns: %TRUE on success
+ * Returns: %TRUE if @type is deep derivable
*/
#define G_TYPE_IS_DEEP_DERIVABLE(type) (g_type_test_flags ((type), G_TYPE_FLAG_DEEP_DERIVABLE))
/**
@@ -345,7 +354,7 @@ G_BEGIN_DECLS
* instantiated and is normally used as an abstract base class for
* derived classes.
*
- * Returns: %TRUE on success
+ * Returns: %TRUE if @type is abstract
*/
#define G_TYPE_IS_ABSTRACT(type) (g_type_test_flags ((type), G_TYPE_FLAG_ABSTRACT))
/**
@@ -356,7 +365,7 @@ G_BEGIN_DECLS
* a value table, but can't be used for g_value_init() and is normally used as
* an abstract base type for derived value types.
*
- * Returns: %TRUE on success
+ * Returns: %TRUE if @type is an abstract value type
*/
#define G_TYPE_IS_VALUE_ABSTRACT(type) (g_type_test_flags ((type), G_TYPE_FLAG_VALUE_ABSTRACT))
/**
@@ -365,7 +374,7 @@ G_BEGIN_DECLS
*
* Checks if @type is a value type and can be used with g_value_init().
*
- * Returns: %TRUE on success
+ * Returns: %TRUE if @type is a value type
*/
#define G_TYPE_IS_VALUE_TYPE(type) (g_type_check_is_value_type (type))
/**
@@ -374,7 +383,7 @@ G_BEGIN_DECLS
*
* Checks if @type has a #GTypeValueTable.
*
- * Returns: %TRUE on success
+ * Returns: %TRUE if @type has a value table
*/
#define G_TYPE_HAS_VALUE_TABLE(type) (g_type_value_table_peek (type) != NULL)
/**
@@ -384,7 +393,7 @@ G_BEGIN_DECLS
* Checks if @type is a final type. A final type cannot be derived any
* further.
*
- * Returns: %TRUE on success
+ * Returns: %TRUE if @type is final
*
* Since: 2.70
*/
@@ -497,7 +506,7 @@ struct _GTypeQuery
*
* This macro should only be used in type implementations.
*
- * Returns: %TRUE on success
+ * Returns: %TRUE if @instance is valid
*/
#define G_TYPE_CHECK_INSTANCE(instance) (_G_TYPE_CHI ((GTypeInstance*) (instance)))
/**
@@ -525,7 +534,7 @@ struct _GTypeQuery
*
* This macro should only be used in type implementations.
*
- * Returns: %TRUE on success
+ * Returns: %TRUE if @instance is an instance of @g_type
*/
#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type) (_G_TYPE_CIT ((instance), (g_type)))
/**
@@ -538,7 +547,7 @@ struct _GTypeQuery
*
* This macro should only be used in type implementations.
*
- * Returns: %TRUE on success
+ * Returns: %TRUE if @instance is an instance of @g_type
*/
#define G_TYPE_CHECK_INSTANCE_FUNDAMENTAL_TYPE(instance, g_type) (_G_TYPE_CIFT ((instance), (g_type)))
/**
@@ -594,7 +603,7 @@ struct _GTypeQuery
*
* This macro should only be used in type implementations.
*
- * Returns: %TRUE on success
+ * Returns: %TRUE if @g_class is a class structure of @g_type
*/
#define G_TYPE_CHECK_CLASS_TYPE(g_class, g_type) (_G_TYPE_CCT ((g_class), (g_type)))
/**
@@ -606,7 +615,7 @@ struct _GTypeQuery
*
* This macro should only be used in type implementations.
*
- * Returns: %TRUE on success
+ * Returns: %TRUE if @value is initialized
*/
#define G_TYPE_CHECK_VALUE(value) (_G_TYPE_CHV ((value)))
/**
@@ -619,7 +628,7 @@ struct _GTypeQuery
*
* This macro should only be used in type implementations.
*
- * Returns: %TRUE on success
+ * Returns: %TRUE if @value has been initialized to hold values of type @g_type
*/
#define G_TYPE_CHECK_VALUE_TYPE(value, g_type) (_G_TYPE_CVH ((value), (g_type)))
/**
diff --git a/gobject/gvalue.c b/gobject/gvalue.c
index 699fc79e3..10885dad8 100644
--- a/gobject/gvalue.c
+++ b/gobject/gvalue.c
@@ -141,7 +141,7 @@
* g_value_set_boxed (value, mystruct);
* // [... your code ....]
* g_value_unset (value);
- * g_value_free (value);
+ * g_free (value);
* }
* ]|
*/
diff --git a/gobject/tests/.gitignore b/gobject/tests/.gitignore
deleted file mode 100644
index 06f3991ee..000000000
--- a/gobject/tests/.gitignore
+++ /dev/null
@@ -1,18 +0,0 @@
-binding
-boxed
-closure
-dynamictests
-enums
-ifaceproperties
-object
-param
-properties
-qdata
-reference
-signal-handler
-signals
-threadtests
-type
-value
-private
-marshalers.[ch]
diff --git a/gobject/tests/signals.c b/gobject/tests/signals.c
index 1c7085244..b8bd8247e 100644
--- a/gobject/tests/signals.c
+++ b/gobject/tests/signals.c
@@ -1487,6 +1487,22 @@ test_block_handler (void)
g_signal_handlers_unblock_matched (test2, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, test_handler, NULL);
+ /* Test match by signal ID. */
+ g_assert_cmpuint (g_signal_handlers_block_matched (test1, G_SIGNAL_MATCH_ID, simple_id, 0, NULL, NULL, NULL), ==, 1);
+
+ g_signal_emit_by_name (test1, "simple");
+ g_signal_emit_by_name (test2, "simple");
+
+ g_assert_cmpint (count1, ==, 3);
+ g_assert_cmpint (count2, ==, 4);
+
+ g_assert_cmpuint (g_signal_handlers_unblock_matched (test1, G_SIGNAL_MATCH_ID, simple_id, 0, NULL, NULL, NULL), ==, 1);
+
+ /* Match types are conjunctive */
+ g_assert_cmpuint (g_signal_handlers_block_matched (test1, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, test_handler, "will not match"), ==, 0);
+ g_assert_cmpuint (g_signal_handlers_block_matched (test1, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, test_handler, &count1), ==, 1);
+ g_assert_cmpuint (g_signal_handlers_unblock_matched (test1, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, test_handler, &count1), ==, 1);
+
g_object_unref (test1);
g_object_unref (test2);
}
diff --git a/gobject/tests/type-flags.c b/gobject/tests/type-flags.c
index 653cb9b01..bb67f8c03 100644
--- a/gobject/tests/type-flags.c
+++ b/gobject/tests/type-flags.c
@@ -3,6 +3,42 @@
#include <glib-object.h>
+typedef struct
+{
+ GTypeInterface g_iface;
+} TestInterfaceInterface;
+
+GType test_interface_get_type (void);
+#define TEST_TYPE_INTERFACE test_interface_get_type ()
+G_DEFINE_INTERFACE (TestInterface, test_interface, G_TYPE_INVALID)
+
+static void
+test_interface_default_init (TestInterfaceInterface *iface)
+{
+}
+
+static void
+test_type_flags_interface (void)
+{
+ g_assert_false (G_TYPE_IS_ABSTRACT (TEST_TYPE_INTERFACE));
+ g_assert_false (g_type_test_flags (TEST_TYPE_INTERFACE, G_TYPE_FLAG_ABSTRACT));
+
+ g_assert_false (G_TYPE_IS_CLASSED (TEST_TYPE_INTERFACE));
+ g_assert_false (g_type_test_flags (TEST_TYPE_INTERFACE, G_TYPE_FLAG_CLASSED));
+
+ g_assert_false (G_TYPE_IS_DEEP_DERIVABLE (TEST_TYPE_INTERFACE));
+ g_assert_false (g_type_test_flags (TEST_TYPE_INTERFACE, G_TYPE_FLAG_DEEP_DERIVABLE));
+
+ g_assert_true (G_TYPE_IS_DERIVABLE (TEST_TYPE_INTERFACE));
+ g_assert_true (g_type_test_flags (TEST_TYPE_INTERFACE, G_TYPE_FLAG_DERIVABLE));
+
+ g_assert_false (G_TYPE_IS_FINAL (TEST_TYPE_INTERFACE));
+ g_assert_false (g_type_test_flags (TEST_TYPE_INTERFACE, G_TYPE_FLAG_FINAL));
+
+ g_assert_false (G_TYPE_IS_INSTANTIATABLE (TEST_TYPE_INTERFACE));
+ g_assert_false (g_type_test_flags (TEST_TYPE_INTERFACE, G_TYPE_FLAG_INSTANTIATABLE));
+}
+
#define TEST_TYPE_FINAL (test_final_get_type())
G_DECLARE_FINAL_TYPE (TestFinal, test_final, TEST, FINAL, GObject)
@@ -201,6 +237,7 @@ main (int argc, char *argv[])
g_setenv ("G_ENABLE_DIAGNOSTIC", "1", TRUE);
+ g_test_add_func ("/type/flags/interface", test_type_flags_interface);
g_test_add_func ("/type/flags/final", test_type_flags_final);
g_test_add_func ("/type/flags/final/instance-check", test_type_flags_final_instance_check);
g_test_add_func ("/type/flags/deprecated", test_type_flags_deprecated);
diff --git a/meson.build b/meson.build
index e404a7faa..3cb72aae4 100644
--- a/meson.build
+++ b/meson.build
@@ -1,5 +1,5 @@
project('glib', 'c',
- version : '2.76.0',
+ version : '2.77.0',
# NOTE: See the policy in docs/meson-version.md before changing the Meson dependency
meson_version : '>= 0.60.0',
default_options : [
@@ -39,7 +39,7 @@ cc_can_run = meson.can_run_host_binaries()
if cc.get_argument_syntax() == 'msvc'
# Ignore several spurious warnings for things glib does very commonly
# (also for clang-cl)
- add_project_arguments('/FImsvc_recommended_pragmas.h',language : 'c')
+ add_project_arguments('/FIglib/msvc_recommended_pragmas.h', language : 'c')
endif
if cc.get_id() == 'msvc'
@@ -2092,6 +2092,7 @@ libz_dep = dependency('zlib')
# FIXME: glib-gettext.m4 has much more checks to detect broken/uncompatible
# implementations. This could be extended if issues are found in some platforms.
libintl_deps = []
+libintl_prefix = '#include <libintl.h>'
libintl = dependency('intl', required: false, allow_fallback: false)
if libintl.found()
# libintl supports different threading APIs, which may not
@@ -2103,11 +2104,11 @@ if libintl.found()
#
# Meson's builtin dependency lookup as of 0.60.0 doesn't check for
# pthread, so we do this manually here.
- if cc.has_function('ngettext', dependencies : libintl)
+ if cc.has_function('ngettext', dependencies : libintl, prefix: libintl_prefix)
libintl_deps += [libintl]
else
libintl_pthread = cc.find_library('pthread', required : false)
- if libintl_pthread.found() and cc.has_function('ngettext', dependencies : [libintl, libintl_pthread])
+ if libintl_pthread.found() and cc.has_function('ngettext', dependencies : [libintl, libintl_pthread], prefix: libintl_prefix)
libintl_deps += [libintl, libintl_pthread]
else
libintl = disabler()
@@ -2116,7 +2117,7 @@ if libintl.found()
endif
if libintl.found()
- have_bind_textdomain_codeset = cc.has_function('bind_textdomain_codeset', dependencies: libintl_deps)
+ have_bind_textdomain_codeset = cc.has_function('bind_textdomain_codeset', dependencies: libintl_deps, prefix: libintl_prefix)
else
libintl = dependency('intl', allow_fallback: true)
assert(libintl.type_name() == 'internal')
@@ -2309,15 +2310,15 @@ if host_system == 'windows'
# Autotools explicitly removed --Wl,--export-all-symbols from windows builds,
# with no explanation. Do the same here for now but this could be revisited if
# if causes issues.
- export_dynamic_ldflags = []
+ export_dynamic_cflags = []
elif host_system == 'cygwin'
- export_dynamic_ldflags = ['-Wl,--export-all-symbols']
+ export_dynamic_cflags = ['-Wl,--export-all-symbols']
elif host_system in ['darwin', 'ios']
- export_dynamic_ldflags = []
+ export_dynamic_cflags = []
elif host_system == 'sunos'
- export_dynamic_ldflags = []
+ export_dynamic_cflags = []
else
- export_dynamic_ldflags = ['-Wl,--export-dynamic']
+ export_dynamic_cflags = ['-Wl,--export-dynamic']
endif
win32_cflags = []
@@ -2425,10 +2426,6 @@ endif
configure_file(output : 'config.h', configuration : glib_conf)
-if host_system == 'windows'
- install_headers([ 'msvc_recommended_pragmas.h' ], install_dir : glib_includedir)
-endif
-
if get_option('man')
xsltproc = find_program('xsltproc', required : true)
xsltproc_command = [
diff --git a/po/bg.po b/po/bg.po
index f89c9ef39..7f5288021 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -313,7 +313,7 @@ msgstr "Основният поток не може да се съкращава
#: gio/gsimpleasyncresult.c:873 gio/gsimpleasyncresult.c:899
#, c-format
msgid "Operation was cancelled"
-msgstr "Действието е прекратено"
+msgstr "Действието е отменено"
#: gio/gcharsetconverter.c:262
msgid "Invalid object, not initialized"
diff --git a/po/fa.po b/po/fa.po
index cee417a51..59edfb444 100644
--- a/po/fa.po
+++ b/po/fa.po
@@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: glib HEAD\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n"
-"POT-Creation-Date: 2022-09-12 05:47+0000\n"
-"PO-Revision-Date: 2022-09-12 13:55+0430\n"
+"POT-Creation-Date: 2023-02-15 16:30+0000\n"
+"PO-Revision-Date: 2023-03-22 14:04+0330\n"
"Last-Translator: Danial Behzadi <dani.behzi@ubuntu.com>\n"
"Language-Team: Persian <>\n"
"Language: fa\n"
@@ -19,22 +19,22 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
-"X-Generator: Poedit 3.1.1\n"
+"X-Generator: Poedit 3.2.2\n"
-#: gio/gappinfo.c:335
+#: gio/gappinfo.c:339
msgid "Setting default applications not supported yet"
msgstr "تنظیم برنامهٔ پیش‌گزیده هنوز پشتیبانی نمی‌شود"
-#: gio/gappinfo.c:368
+#: gio/gappinfo.c:372
msgid "Setting application as last used for type not supported yet"
msgstr "تنظیم برنامه به عنوان آخرین استفاده برای گونه هنوز پشتیبانی نمی‌شود"
-#: gio/gappinfo.c:810
+#: gio/gappinfo.c:814
#, c-format
msgid "Failed to find default application for content type ‘%s’"
msgstr "شکست در یافتن برنامهٔ پیش‌گزیده برای گونهٔ محتوای «%s»"
-#: gio/gappinfo.c:870
+#: gio/gappinfo.c:874
#, c-format
msgid "Failed to find default application for URI Scheme ‘%s’"
msgstr "شکست در یافتن برنامهٔ پیش‌گزیده برای شمای نشانی %s"
@@ -229,11 +229,11 @@ msgstr "ناتوان در وصل شدن به D-Bus: %s\n"
msgid "error sending %s message to application: %s\n"
msgstr "خطای فرستادن %s پیام به برنامه: %s\n"
-#: gio/gapplication-tool.c:321
+#: gio/gapplication-tool.c:324
msgid "action name must be given after application id\n"
msgstr "نام کنش باید پس از شناسهٔ برنامه داده شود\n"
-#: gio/gapplication-tool.c:329
+#: gio/gapplication-tool.c:332
#, c-format
msgid ""
"invalid action name: “%s”\n"
@@ -242,27 +242,27 @@ msgstr ""
"نام کنش نامعتبر: «%s»\n"
"نام‌های کنش‌ها باید فقط شامل حرف‌رقم، «-» و «.»‌ باشند\n"
-#: gio/gapplication-tool.c:348
+#: gio/gapplication-tool.c:351
#, c-format
msgid "error parsing action parameter: %s\n"
msgstr ""
"خطا در تجزیه پارامتر کنش: %s\n"
"\n"
-#: gio/gapplication-tool.c:360
+#: gio/gapplication-tool.c:363
msgid "actions accept a maximum of one parameter\n"
msgstr "کنش بیشینه یک پارامتر می‌پذیرد\n"
-#: gio/gapplication-tool.c:415
+#: gio/gapplication-tool.c:418
msgid "list-actions command takes only the application id"
msgstr "دستور کنش‌های سیاهه فقط شناسهٔ برنامه را می‌گیرند"
-#: gio/gapplication-tool.c:425
+#: gio/gapplication-tool.c:428
#, c-format
msgid "unable to find desktop file for application %s\n"
msgstr "ناتوان در یافتن پروندهٔ میزکار برای برنامهٔ %s\n"
-#: gio/gapplication-tool.c:470
+#: gio/gapplication-tool.c:473
#, c-format
msgid ""
"unrecognised command: %s\n"
@@ -297,7 +297,7 @@ msgstr "جریان از قبل بسته شده است"
msgid "Truncate not supported on base stream"
msgstr "هرس روی جریان پایه پشتیبانی نمی‌شود"
-#: gio/gcancellable.c:319 gio/gdbusconnection.c:1859 gio/gdbusprivate.c:1420
+#: gio/gcancellable.c:326 gio/gdbusconnection.c:1859 gio/gdbusprivate.c:1420
#: gio/gsimpleasyncresult.c:873 gio/gsimpleasyncresult.c:899
#, c-format
msgid "Operation was cancelled"
@@ -317,13 +317,13 @@ msgstr "فضا کافی در مقصد وجود ندارد"
#: gio/gcharsetconverter.c:344 gio/gdatainputstream.c:850
#: gio/gdatainputstream.c:1268 glib/gconvert.c:451 glib/gconvert.c:883
-#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2473
+#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2478
#: glib/gutf8.c:892 glib/gutf8.c:1346
msgid "Invalid byte sequence in conversion input"
msgstr "دنبالهٔ بایتی نامعتبر در ورودی تبدیل"
#: gio/gcharsetconverter.c:349 glib/gconvert.c:459 glib/gconvert.c:797
-#: glib/giochannel.c:1583 glib/giochannel.c:2485
+#: glib/giochannel.c:1583 glib/giochannel.c:2493
#, c-format
msgid "Error during conversion: %s"
msgstr "خطا در حین تبدیل: %s"
@@ -380,17 +380,17 @@ msgstr "جعل گواهی روی این سیستم‌عامل ممکن نیست"
msgid "Unexpected early end-of-stream"
msgstr "پایان جریان زودهنگام نامنتظره"
-#: gio/gdbusaddress.c:164 gio/gdbusaddress.c:238 gio/gdbusaddress.c:327
+#: gio/gdbusaddress.c:162 gio/gdbusaddress.c:234 gio/gdbusaddress.c:321
#, c-format
msgid "Unsupported key “%s” in address entry “%s”"
msgstr "کلید پشتیبانی نشدهٔ «%s» در ورودی نشانی «%s»"
-#: gio/gdbusaddress.c:177
+#: gio/gdbusaddress.c:175
#, c-format
msgid "Meaningless key/value pair combination in address entry “%s”"
msgstr "ترکیب جفت کلید و مقدار بی‌معنی در ورودی نشانی «%s»"
-#: gio/gdbusaddress.c:186
+#: gio/gdbusaddress.c:184
#, c-format
msgid ""
"Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract keys)"
@@ -398,45 +398,45 @@ msgstr ""
"نشانی «%s» نامعتبر است (فقط یکی از کلیدهای path، dir، tmpdir یا abstract را نیاز "
"دارد)"
-#: gio/gdbusaddress.c:253 gio/gdbusaddress.c:264 gio/gdbusaddress.c:279
-#: gio/gdbusaddress.c:342 gio/gdbusaddress.c:353
+#: gio/gdbusaddress.c:249 gio/gdbusaddress.c:260 gio/gdbusaddress.c:275
+#: gio/gdbusaddress.c:336 gio/gdbusaddress.c:347
#, c-format
msgid "Error in address “%s” — the “%s” attribute is malformed"
msgstr "خطا در نشانی «%s» — مولّفهٔ «%s» بدریخت است"
-#: gio/gdbusaddress.c:423 gio/gdbusaddress.c:682
+#: gio/gdbusaddress.c:417 gio/gdbusaddress.c:676
#, c-format
msgid "Unknown or unsupported transport “%s” for address “%s”"
msgstr "جابه‌جایی پشتیبانی نشده یا ناشناختهٔ «%s» برای نشانی «%s»"
-#: gio/gdbusaddress.c:467
+#: gio/gdbusaddress.c:461
#, c-format
msgid "Address element “%s” does not contain a colon (:)"
msgstr "عنصر نشانی «%s» دارای دونقطه (:) نیست."
-#: gio/gdbusaddress.c:476
+#: gio/gdbusaddress.c:470
#, c-format
msgid "Transport name in address element “%s” must not be empty"
msgstr "نام جابه‌جایی در عنصر نشانی «%s» نباید خالی باشد"
-#: gio/gdbusaddress.c:497
+#: gio/gdbusaddress.c:491
#, c-format
msgid ""
"Key/Value pair %d, “%s”, in address element “%s” does not contain an equal sign"
msgstr "جفت گلید و مقدار %Id، «%s» در عنصر نشانی «%s» دارای علامت مساوی نیست"
-#: gio/gdbusaddress.c:508
+#: gio/gdbusaddress.c:502
#, c-format
msgid "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key"
msgstr "جفت گلید و مقدار %Id، «%s» در عنصر نشانی «%s» نباید کلیدی خالی داشته باشد"
-#: gio/gdbusaddress.c:522
+#: gio/gdbusaddress.c:516
#, c-format
msgid ""
"Error unescaping key or value in Key/Value pair %d, “%s”, in address element “%s”"
msgstr "خطا در حذف کلید یا مقدار در جفت کلیدمقدار %Id، «%s» در نشانی عنصر «%s»"
-#: gio/gdbusaddress.c:590
+#: gio/gdbusaddress.c:584
#, c-format
msgid ""
"Error in address “%s” — the unix transport requires exactly one of the keys "
@@ -445,74 +445,74 @@ msgstr ""
"خطا در نشانی «%s» — جابه‌جایی یونیکس نیازمند تنظیم بودن دقیقاً یکی از کلیدهای path "
"یا abstract است"
-#: gio/gdbusaddress.c:625
+#: gio/gdbusaddress.c:619
#, c-format
msgid "Error in address “%s” — the host attribute is missing or malformed"
msgstr "خطا در نشانی «%s» — مولّفهٔ host غایب یا بدریخت است"
-#: gio/gdbusaddress.c:639
+#: gio/gdbusaddress.c:633
#, c-format
msgid "Error in address “%s” — the port attribute is missing or malformed"
msgstr "خطا در نشانی «%s» — مولّفهٔ port غایب یا بدریخت است"
-#: gio/gdbusaddress.c:653
+#: gio/gdbusaddress.c:647
#, c-format
msgid "Error in address “%s” — the noncefile attribute is missing or malformed"
msgstr "خطا در نشانی «%s» — مولّفهٔ noncefile غایب یا بدریخت است"
-#: gio/gdbusaddress.c:674
+#: gio/gdbusaddress.c:668
msgid "Error auto-launching: "
msgstr "خطا در راه‌اندازی خودکار: "
-#: gio/gdbusaddress.c:727
+#: gio/gdbusaddress.c:721
#, c-format
msgid "Error opening nonce file “%s”: %s"
msgstr "خطا در گشودن پروندهٔ فعلی «‎%s»‏: %s"
-#: gio/gdbusaddress.c:746
+#: gio/gdbusaddress.c:740
#, c-format
msgid "Error reading from nonce file “%s”: %s"
msgstr "خطا در خواندن از پروندهٔ فعلی «‎%s»‏: %s"
-#: gio/gdbusaddress.c:755
+#: gio/gdbusaddress.c:749
#, c-format
msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d"
msgstr "خطا در خواندن از پروندهٔ فعلی «‎%s»‏، انتظار ۱۶ بایت می‌رفت ولی %Id دریافت شد"
-#: gio/gdbusaddress.c:773
+#: gio/gdbusaddress.c:767
#, c-format
msgid "Error writing contents of nonce file “%s” to stream:"
msgstr "خطا در نوشتن محتوای پروندهٔ فعلی «‎%s»‏ روی جریان:"
-#: gio/gdbusaddress.c:988
+#: gio/gdbusaddress.c:982
msgid "The given address is empty"
msgstr "آدرس داده شده خالی است"
-#: gio/gdbusaddress.c:1101
+#: gio/gdbusaddress.c:1095
#, c-format
msgid "Cannot spawn a message bus when AT_SECURE is set"
msgstr "هنگام تنظیم بودن AT_SECURE نمی‌توان گذرگاه پیامی ایجاد کرد"
-#: gio/gdbusaddress.c:1108
+#: gio/gdbusaddress.c:1102
msgid "Cannot spawn a message bus without a machine-id: "
msgstr "نمی‌توان بدون یک شناسهٔ دستگاه، گذرگاه پیامی ایجاد کرد: "
-#: gio/gdbusaddress.c:1115
+#: gio/gdbusaddress.c:1109
#, c-format
msgid "Cannot autolaunch D-Bus without X11 $DISPLAY"
msgstr "نمی‌توان بدون ‪$DISPLAY‬ X11 به طور خودکار D-Bus را اجرا کرد"
-#: gio/gdbusaddress.c:1157
+#: gio/gdbusaddress.c:1151
#, c-format
msgid "Error spawning command line “%s”: "
msgstr "خطا در ایجاد خط فرمان «%s»: "
-#: gio/gdbusaddress.c:1226
+#: gio/gdbusaddress.c:1220
#, c-format
msgid "Cannot determine session bus address (not implemented for this OS)"
msgstr "نمی‌توان نشانی گذرگاه نشست را تشخیص داد (برای این سیستم‌عامل پیاده نشده)"
-#: gio/gdbusaddress.c:1375 gio/gdbusconnection.c:7321
+#: gio/gdbusaddress.c:1374 gio/gdbusconnection.c:7316
#, c-format
msgid ""
"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable — "
@@ -521,7 +521,7 @@ msgstr ""
"نمی‌توان نشانی گذرگاه را از متغیّر محیطی DBUS_STARTER_BUS_TYPE تشخیص داد — مقدار "
"ناشناختهٔ «%s»"
-#: gio/gdbusaddress.c:1384 gio/gdbusconnection.c:7330
+#: gio/gdbusaddress.c:1383 gio/gdbusconnection.c:7325
msgid ""
"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment "
"variable is not set"
@@ -529,7 +529,7 @@ msgstr ""
"نمی‌توان نشانی گذرگاه را تشخیص داد؛ چون متغیّر محیطی DBUS_STARTER_BUS_TYPE تنظیم "
"نشده"
-#: gio/gdbusaddress.c:1394
+#: gio/gdbusaddress.c:1393
#, c-format
msgid "Unknown bus type %d"
msgstr "گونهٔ گذرگاه ناشناخته %d"
@@ -548,11 +548,15 @@ msgid ""
"Exhausted all available authentication mechanisms (tried: %s) (available: %s)"
msgstr "تمامی سازوکارهای تأیید هویت موجود آزموده شد (آزموده: %s) (موجود: %s)"
-#: gio/gdbusauth.c:1178
+#: gio/gdbusauth.c:1045
+msgid "Unexpected lack of content trying to read a byte"
+msgstr "کمبود محتوای نامنتظره هنگام خواندن یک بایت"
+
+#: gio/gdbusauth.c:1195
msgid "User IDs must be the same for peer and server"
msgstr "شناسه‌های کاربری باید برای نمونه و کارساز یکی باشد"
-#: gio/gdbusauth.c:1190
+#: gio/gdbusauth.c:1207
msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer"
msgstr "لغو شده به دست GDBusAuthObserver::authorize-authenticated-peer"
@@ -638,7 +642,7 @@ msgstr "خطا در گشودن دسته‌کلید «%s» برای نوشتن: "
msgid "(Additionally, releasing the lock for “%s” also failed: %s) "
msgstr "(به علاوه، آزاد سازی قفل برا ی «%s» هم شکست خورد: %s) "
-#: gio/gdbusconnection.c:590 gio/gdbusconnection.c:2404
+#: gio/gdbusconnection.c:590 gio/gdbusconnection.c:2405
msgid "The connection is closed"
msgstr "اتصال بسته شده است"
@@ -646,111 +650,111 @@ msgstr "اتصال بسته شده است"
msgid "Timeout was reached"
msgstr "زمان به پایان رسید"
-#: gio/gdbusconnection.c:2527
+#: gio/gdbusconnection.c:2528
msgid "Unsupported flags encountered when constructing a client-side connection"
msgstr "مواجهه با پرچم‌های پشتیبانی نشده هنگام ساخت یک اتّصال سمت کارخواه"
-#: gio/gdbusconnection.c:4256 gio/gdbusconnection.c:4610
+#: gio/gdbusconnection.c:4257 gio/gdbusconnection.c:4611
#, c-format
msgid "No such interface “org.freedesktop.DBus.Properties” on object at path %s"
msgstr "واسطی چون org.freedesktop.DBus.Properties روی شی در مسیر %s وجود ندارد"
-#: gio/gdbusconnection.c:4401
+#: gio/gdbusconnection.c:4402
#, c-format
msgid "No such property “%s”"
msgstr "ویژگی «%s» وجود ندارد"
-#: gio/gdbusconnection.c:4413
+#: gio/gdbusconnection.c:4414
#, c-format
msgid "Property “%s” is not readable"
msgstr "ویژگی «%s» خواندنی نیست"
-#: gio/gdbusconnection.c:4424
+#: gio/gdbusconnection.c:4425
#, c-format
msgid "Property “%s” is not writable"
msgstr "ویژگی «%s» نوشتنی نیست"
-#: gio/gdbusconnection.c:4444
+#: gio/gdbusconnection.c:4445
#, c-format
msgid "Error setting property “%s”: Expected type “%s” but got “%s”"
msgstr "خطای تنظیم مولّفهٔ «%s»: انتظار گونهٔ «%s» می‌رفت؛ ولی «%s» گرفته شد"
-#: gio/gdbusconnection.c:4549 gio/gdbusconnection.c:4764 gio/gdbusconnection.c:6747
+#: gio/gdbusconnection.c:4550 gio/gdbusconnection.c:4765 gio/gdbusconnection.c:6742
#, c-format
msgid "No such interface “%s”"
msgstr "واسطی چون «%s» وجود ندارد"
-#: gio/gdbusconnection.c:4986 gio/gdbusconnection.c:7261
+#: gio/gdbusconnection.c:4981 gio/gdbusconnection.c:7256
#, c-format
msgid "No such interface “%s” on object at path %s"
msgstr "واسطی چون «%s» روی شی در مسیر %s وجود ندارد"
-#: gio/gdbusconnection.c:5087
+#: gio/gdbusconnection.c:5082
#, c-format
msgid "No such method “%s”"
msgstr "روش «%s» وجود ندارد"
-#: gio/gdbusconnection.c:5118
+#: gio/gdbusconnection.c:5113
#, c-format
msgid "Type of message, “%s”, does not match expected type “%s”"
msgstr "گونهٔ پیام، «%s»، با گونهٔ مورد انتظار «%s» مطابق نیست"
-#: gio/gdbusconnection.c:5321
+#: gio/gdbusconnection.c:5316
#, c-format
msgid "An object is already exported for the interface %s at %s"
msgstr "یک شیء از قبل برای واسط %s در %s صادر شده است"
-#: gio/gdbusconnection.c:5548
+#: gio/gdbusconnection.c:5543
#, c-format
msgid "Unable to retrieve property %s.%s"
msgstr "ناتوان در دریافت ویژگی %s.%s"
-#: gio/gdbusconnection.c:5604
+#: gio/gdbusconnection.c:5599
#, c-format
msgid "Unable to set property %s.%s"
msgstr "ناتوان در تنظیم ویژگی %s.%s"
-#: gio/gdbusconnection.c:5783
+#: gio/gdbusconnection.c:5778
#, c-format
msgid "Method “%s” returned type “%s”, but expected “%s”"
msgstr "روش «%s» گونهٔ «%s» را برگرداند؛ ولی انتظار «%s» می‌رفت"
-#: gio/gdbusconnection.c:6859
+#: gio/gdbusconnection.c:6854
#, c-format
msgid "Method “%s” on interface “%s” with signature “%s” does not exist"
msgstr "روش «%s» روی واسط «%s» با امضای «%s» وجود ندارد"
-#: gio/gdbusconnection.c:6980
+#: gio/gdbusconnection.c:6975
#, c-format
msgid "A subtree is already exported for %s"
msgstr "زیردرختی از پیش برای %s برون‌ریزی شده"
-#: gio/gdbusconnection.c:7269
+#: gio/gdbusconnection.c:7264
#, c-format
msgid "Object does not exist at path “%s”"
msgstr "شی در مسیر «%s» وجود ندارد"
-#: gio/gdbusmessage.c:1303
+#: gio/gdbusmessage.c:1306
msgid "type is INVALID"
msgstr "نوع INVALID است"
-#: gio/gdbusmessage.c:1314
+#: gio/gdbusmessage.c:1317
msgid "METHOD_CALL message: PATH or MEMBER header field is missing"
msgstr "پیام METHOD_CALL: زمینهٔ سرایند PATH یا MEMBER وجود ندارد"
-#: gio/gdbusmessage.c:1325
+#: gio/gdbusmessage.c:1328
msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing"
msgstr "پیام METHOD_RETURN: زمینهٔ سرایند REPLY_SERIAL وجود ندارد"
-#: gio/gdbusmessage.c:1337
+#: gio/gdbusmessage.c:1340
msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing"
msgstr "پیام خطا: زمینهٔ سرایند REPLY_SERIAL یا ERROR_NAME ناموجود"
-#: gio/gdbusmessage.c:1350
+#: gio/gdbusmessage.c:1353
msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing"
msgstr "پیام سیگنال: زمینهٔ سرایند PATH، INTERFACE یا MEMBER ناموجود"
-#: gio/gdbusmessage.c:1358
+#: gio/gdbusmessage.c:1361
msgid ""
"SIGNAL message: The PATH header field is using the reserved value /org/"
"freedesktop/DBus/Local"
@@ -758,7 +762,7 @@ msgstr ""
"پیام سیگنال: زمینهٔ سرایند PATH دارد از مقدار رزرو شدهٔ ‪/org/freedesktop/DBus/"
"Local‬ استفاده می‌کند"
-#: gio/gdbusmessage.c:1366
+#: gio/gdbusmessage.c:1369
msgid ""
"SIGNAL message: The INTERFACE header field is using the reserved value org."
"freedesktop.DBus.Local"
@@ -766,19 +770,19 @@ msgstr ""
"پیام سیگنال: زمینهٔ سرایند INTERFACE دارد از مقدار رزرو شدهٔ ‪org.freedesktop.DBus."
"Local‬ استفاده می‌کند"
-#: gio/gdbusmessage.c:1414 gio/gdbusmessage.c:1474
+#: gio/gdbusmessage.c:1417 gio/gdbusmessage.c:1477
#, c-format
msgid "Wanted to read %lu byte but only got %lu"
msgid_plural "Wanted to read %lu bytes but only got %lu"
msgstr[0] "می‌خواست %lu بایت بخواند؛ ولی فقط %lu بایت گرفت"
msgstr[1] "می‌خواست %lu بایت بخواند؛ ولی فقط %lu بایت گرفت"
-#: gio/gdbusmessage.c:1428
+#: gio/gdbusmessage.c:1431
#, c-format
msgid "Expected NUL byte after the string “%s” but found byte %d"
msgstr "پس از رشتهٔ «%s» انتظار بایت NUL می‌رفت؛ ولی بایت %Id پیدا شد"
-#: gio/gdbusmessage.c:1447
+#: gio/gdbusmessage.c:1450
#, c-format
msgid ""
"Expected valid UTF-8 string but found invalid bytes at byte offset %d (length of "
@@ -787,21 +791,21 @@ msgstr ""
"انتظار رشتهٔ UTF-8 معتبر می‌رفت؛ ولی بایت‌های نامعتبر در عرض از مبدأ بایت %Id پیدا "
"شد (طول رشته %Id است). رشتهٔ معتبر UTF-8 تا آن نقطه «%s» بود"
-#: gio/gdbusmessage.c:1511 gio/gdbusmessage.c:1787 gio/gdbusmessage.c:1998
+#: gio/gdbusmessage.c:1514 gio/gdbusmessage.c:1790 gio/gdbusmessage.c:2001
msgid "Value nested too deeply"
msgstr "مقدار بیش از حد تودرتو شده"
-#: gio/gdbusmessage.c:1679
+#: gio/gdbusmessage.c:1682
#, c-format
msgid "Parsed value “%s” is not a valid D-Bus object path"
msgstr "مقدار تجزیه شدهٔ «%s» مسیر شی D-Bus معتبری نیست"
-#: gio/gdbusmessage.c:1703
+#: gio/gdbusmessage.c:1706
#, c-format
msgid "Parsed value “%s” is not a valid D-Bus signature"
msgstr "مقدار تجزیه شدهٔ «%s» امضای D-Bus معتبری نیست"
-#: gio/gdbusmessage.c:1754
+#: gio/gdbusmessage.c:1757
#, c-format
msgid ""
"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)."
@@ -810,101 +814,101 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: gio/gdbusmessage.c:1774
+#: gio/gdbusmessage.c:1777
#, c-format
msgid ""
"Encountered array of type “a%c”, expected to have a length a multiple of %u "
"bytes, but found to be %u bytes in length"
msgstr ""
-#: gio/gdbusmessage.c:1928 gio/gdbusmessage.c:2647
+#: gio/gdbusmessage.c:1931 gio/gdbusmessage.c:2650
msgid "Empty structures (tuples) are not allowed in D-Bus"
msgstr ""
-#: gio/gdbusmessage.c:1982
+#: gio/gdbusmessage.c:1985
#, c-format
msgid "Parsed value “%s” for variant is not a valid D-Bus signature"
msgstr ""
-#: gio/gdbusmessage.c:2023
+#: gio/gdbusmessage.c:2026
#, c-format
msgid ""
"Error deserializing GVariant with type string “%s” from the D-Bus wire format"
msgstr ""
-#: gio/gdbusmessage.c:2208
+#: gio/gdbusmessage.c:2211
#, c-format
msgid ""
"Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value "
"0x%02x"
msgstr ""
-#: gio/gdbusmessage.c:2227
+#: gio/gdbusmessage.c:2230
#, c-format
msgid "Invalid major protocol version. Expected 1 but found %d"
msgstr ""
-#: gio/gdbusmessage.c:2285 gio/gdbusmessage.c:2883
+#: gio/gdbusmessage.c:2288 gio/gdbusmessage.c:2886
msgid "Signature header found but is not of type signature"
msgstr ""
-#: gio/gdbusmessage.c:2297
+#: gio/gdbusmessage.c:2300
#, c-format
msgid "Signature header with signature “%s” found but message body is empty"
msgstr ""
-#: gio/gdbusmessage.c:2312
+#: gio/gdbusmessage.c:2315
#, c-format
msgid "Parsed value “%s” is not a valid D-Bus signature (for body)"
msgstr ""
-#: gio/gdbusmessage.c:2344
+#: gio/gdbusmessage.c:2347
#, c-format
msgid "No signature header in message but the message body is %u byte"
msgid_plural "No signature header in message but the message body is %u bytes"
msgstr[0] ""
msgstr[1] ""
-#: gio/gdbusmessage.c:2354
+#: gio/gdbusmessage.c:2357
msgid "Cannot deserialize message: "
msgstr ""
-#: gio/gdbusmessage.c:2700
+#: gio/gdbusmessage.c:2703
#, c-format
msgid "Error serializing GVariant with type string “%s” to the D-Bus wire format"
msgstr ""
-#: gio/gdbusmessage.c:2837
+#: gio/gdbusmessage.c:2840
#, c-format
msgid "Number of file descriptors in message (%d) differs from header field (%d)"
msgstr ""
-#: gio/gdbusmessage.c:2845
+#: gio/gdbusmessage.c:2848
msgid "Cannot serialize message: "
msgstr ""
-#: gio/gdbusmessage.c:2898
+#: gio/gdbusmessage.c:2901
#, c-format
msgid "Message body has signature “%s” but there is no signature header"
msgstr ""
-#: gio/gdbusmessage.c:2908
+#: gio/gdbusmessage.c:2911
#, c-format
msgid ""
"Message body has type signature “%s” but signature in the header field is “%s”"
msgstr ""
-#: gio/gdbusmessage.c:2924
+#: gio/gdbusmessage.c:2927
#, c-format
msgid "Message body is empty but signature in the header field is “(%s)”"
msgstr ""
-#: gio/gdbusmessage.c:3479
+#: gio/gdbusmessage.c:3482
#, c-format
msgid "Error return with body of type “%s”"
msgstr "خطای بازگشت با بدنهٔ گونهٔ «%s»"
-#: gio/gdbusmessage.c:3487
+#: gio/gdbusmessage.c:3490
msgid "Error return with empty body"
msgstr ""
@@ -929,42 +933,42 @@ msgstr "ناتوان در گرفتن نمایهٔ سخت‌افزار: %s"
msgid "Unable to load %s or %s: "
msgstr "ناتوان در بار کردن %s یا %s: "
-#: gio/gdbusproxy.c:1575
+#: gio/gdbusproxy.c:1568
#, c-format
msgid "Error calling StartServiceByName for %s: "
msgstr ""
-#: gio/gdbusproxy.c:1598
+#: gio/gdbusproxy.c:1591
#, c-format
msgid "Unexpected reply %d from StartServiceByName(\"%s\") method"
msgstr ""
-#: gio/gdbusproxy.c:2709 gio/gdbusproxy.c:2844
+#: gio/gdbusproxy.c:2702 gio/gdbusproxy.c:2837
#, c-format
msgid ""
"Cannot invoke method; proxy is for the well-known name %s without an owner, and "
"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag"
msgstr ""
-#: gio/gdbusserver.c:765
+#: gio/gdbusserver.c:758
msgid "Abstract namespace not supported"
msgstr "فضانام انتزاعی پشتیبانی نمی‌شود"
-#: gio/gdbusserver.c:857
+#: gio/gdbusserver.c:850
msgid "Cannot specify nonce file when creating a server"
msgstr ""
-#: gio/gdbusserver.c:939
+#: gio/gdbusserver.c:932
#, c-format
msgid "Error writing nonce file at “%s”: %s"
msgstr "خطا در خواندن پروندهٔ فعلی «‎%s»‏: %s"
-#: gio/gdbusserver.c:1114
+#: gio/gdbusserver.c:1107
#, c-format
msgid "The string “%s” is not a valid D-Bus GUID"
msgstr ""
-#: gio/gdbusserver.c:1152
+#: gio/gdbusserver.c:1145
#, c-format
msgid "Cannot listen on unsupported transport “%s”"
msgstr ""
@@ -983,14 +987,14 @@ msgid ""
"Use “%s COMMAND --help” to get help on each command.\n"
msgstr ""
-#: gio/gdbus-tool.c:204 gio/gdbus-tool.c:276 gio/gdbus-tool.c:348
-#: gio/gdbus-tool.c:372 gio/gdbus-tool.c:862 gio/gdbus-tool.c:1247
-#: gio/gdbus-tool.c:1734
+#: gio/gdbus-tool.c:204 gio/gdbus-tool.c:276 gio/gdbus-tool.c:347
+#: gio/gdbus-tool.c:371 gio/gdbus-tool.c:861 gio/gdbus-tool.c:1246
+#: gio/gdbus-tool.c:1733
#, c-format
msgid "Error: %s\n"
msgstr "خطا: %s\n"
-#: gio/gdbus-tool.c:215 gio/gdbus-tool.c:289 gio/gdbus-tool.c:1750
+#: gio/gdbus-tool.c:215 gio/gdbus-tool.c:289 gio/gdbus-tool.c:1749
#, c-format
msgid "Error parsing introspection XML: %s\n"
msgstr "خطا در تجزیهٔ XML درون‌نگری %s\n"
@@ -1000,238 +1004,238 @@ msgstr "خطا در تجزیهٔ XML درون‌نگری %s\n"
msgid "Error: %s is not a valid name\n"
msgstr "خطا: %s نام معتبری نیست\n"
-#: gio/gdbus-tool.c:258 gio/gdbus-tool.c:748 gio/gdbus-tool.c:1066
-#: gio/gdbus-tool.c:1900 gio/gdbus-tool.c:2140
+#: gio/gdbus-tool.c:258 gio/gdbus-tool.c:747 gio/gdbus-tool.c:1065
+#: gio/gdbus-tool.c:1899 gio/gdbus-tool.c:2139
#, c-format
msgid "Error: %s is not a valid object path\n"
msgstr "خطا: %s یک مسیر شیء معتبر نیست\n"
-#: gio/gdbus-tool.c:406
+#: gio/gdbus-tool.c:405
msgid "Connect to the system bus"
msgstr "وصل شدن به گذرگاه سامانه"
-#: gio/gdbus-tool.c:407
+#: gio/gdbus-tool.c:406
msgid "Connect to the session bus"
msgstr "وصل شدن به گذرگاه نشست"
-#: gio/gdbus-tool.c:408
+#: gio/gdbus-tool.c:407
msgid "Connect to given D-Bus address"
msgstr "وصل‌شدن به نشانی دی‌باس داده شده"
-#: gio/gdbus-tool.c:418
+#: gio/gdbus-tool.c:417
msgid "Connection Endpoint Options:"
msgstr "گزینه‌های نقطهٔ پایانی اتّصال:"
-#: gio/gdbus-tool.c:419
+#: gio/gdbus-tool.c:418
msgid "Options specifying the connection endpoint"
msgstr "گزینه‌های مشخّص‌کنندهٔ نقطهٔ پایانی اتّصال"
-#: gio/gdbus-tool.c:442
+#: gio/gdbus-tool.c:441
#, c-format
msgid "No connection endpoint specified"
msgstr "هیچ نقطهٔ پایانی اتّصالی مشخّص نشده"
-#: gio/gdbus-tool.c:452
+#: gio/gdbus-tool.c:451
#, c-format
msgid "Multiple connection endpoints specified"
msgstr "چندین نقطهٔ پایانی اتّصال مشخّص شده"
-#: gio/gdbus-tool.c:525
+#: gio/gdbus-tool.c:524
#, c-format
msgid "Warning: According to introspection data, interface “%s” does not exist\n"
msgstr "هشدار: با توجه به داده‌های درون‌نگری، واسط «%s» وجود ندارد\n"
-#: gio/gdbus-tool.c:534
+#: gio/gdbus-tool.c:533
#, c-format
msgid ""
"Warning: According to introspection data, method “%s” does not exist on "
"interface “%s”\n"
msgstr "هشدار: با توجه به داده‌های درون‌نگری، روش «%s» روی واسط «%s» وجود ندارد\n"
-#: gio/gdbus-tool.c:596
+#: gio/gdbus-tool.c:595
msgid "Optional destination for signal (unique name)"
msgstr "مقصد اختیاری برای سیگنال (نام یکتا)"
-#: gio/gdbus-tool.c:597
+#: gio/gdbus-tool.c:596
msgid "Object path to emit signal on"
msgstr ""
-#: gio/gdbus-tool.c:598
+#: gio/gdbus-tool.c:597
msgid "Signal and interface name"
msgstr ""
-#: gio/gdbus-tool.c:631
+#: gio/gdbus-tool.c:630
msgid "Emit a signal."
msgstr ""
-#: gio/gdbus-tool.c:686 gio/gdbus-tool.c:1003 gio/gdbus-tool.c:1837
-#: gio/gdbus-tool.c:2069 gio/gdbus-tool.c:2289
+#: gio/gdbus-tool.c:685 gio/gdbus-tool.c:1002 gio/gdbus-tool.c:1836
+#: gio/gdbus-tool.c:2068 gio/gdbus-tool.c:2288
#, c-format
msgid "Error connecting: %s\n"
msgstr "خطا در هنگام اتصال: %s\n"
-#: gio/gdbus-tool.c:706
+#: gio/gdbus-tool.c:705
#, c-format
msgid "Error: %s is not a valid unique bus name.\n"
msgstr "خطا: %s نام گذرگاه یکتای معتبری نیست\n"
-#: gio/gdbus-tool.c:725 gio/gdbus-tool.c:1046 gio/gdbus-tool.c:1880
+#: gio/gdbus-tool.c:724 gio/gdbus-tool.c:1045 gio/gdbus-tool.c:1879
msgid "Error: Object path is not specified\n"
msgstr "خطا: مسیر شیء مشخص نشده است\n"
-#: gio/gdbus-tool.c:768
+#: gio/gdbus-tool.c:767
msgid "Error: Signal name is not specified\n"
msgstr "خطا: نام سیگنال مشخص نشده است\n"
-#: gio/gdbus-tool.c:782
+#: gio/gdbus-tool.c:781
#, c-format
msgid "Error: Signal name “%s” is invalid\n"
msgstr "خطا: نام سیگنال «%s» نامعتبر است\n"
-#: gio/gdbus-tool.c:794
+#: gio/gdbus-tool.c:793
#, c-format
msgid "Error: %s is not a valid interface name\n"
msgstr "خطا: %s نام واسط معتبری نیست\n"
-#: gio/gdbus-tool.c:800
+#: gio/gdbus-tool.c:799
#, c-format
msgid "Error: %s is not a valid member name\n"
msgstr "خطا: %s یک نام عضو معتبر نیست\n"
#. Use the original non-"parse-me-harder" error
-#: gio/gdbus-tool.c:837 gio/gdbus-tool.c:1178
+#: gio/gdbus-tool.c:836 gio/gdbus-tool.c:1177
#, c-format
msgid "Error parsing parameter %d: %s\n"
msgstr "خطا در تجزیه پارامتر %Id: %s\n"
-#: gio/gdbus-tool.c:869
+#: gio/gdbus-tool.c:868
#, c-format
msgid "Error flushing connection: %s\n"
msgstr "خطا در بستن اتّصال: %s\n"
-#: gio/gdbus-tool.c:897
+#: gio/gdbus-tool.c:896
msgid "Destination name to invoke method on"
msgstr ""
-#: gio/gdbus-tool.c:898
+#: gio/gdbus-tool.c:897
msgid "Object path to invoke method on"
msgstr ""
-#: gio/gdbus-tool.c:899
+#: gio/gdbus-tool.c:898
msgid "Method and interface name"
msgstr "نام متد و واسط"
-#: gio/gdbus-tool.c:900
+#: gio/gdbus-tool.c:899
msgid "Timeout in seconds"
msgstr ""
-#: gio/gdbus-tool.c:901
+#: gio/gdbus-tool.c:900
msgid "Allow interactive authorization"
msgstr ""
-#: gio/gdbus-tool.c:948
+#: gio/gdbus-tool.c:947
msgid "Invoke a method on a remote object."
msgstr ""
-#: gio/gdbus-tool.c:1020 gio/gdbus-tool.c:1854 gio/gdbus-tool.c:2094
+#: gio/gdbus-tool.c:1019 gio/gdbus-tool.c:1853 gio/gdbus-tool.c:2093
msgid "Error: Destination is not specified\n"
msgstr "خطا: مقصد مشخص نشده است\n"
-#: gio/gdbus-tool.c:1031 gio/gdbus-tool.c:1871 gio/gdbus-tool.c:2105
+#: gio/gdbus-tool.c:1030 gio/gdbus-tool.c:1870 gio/gdbus-tool.c:2104
#, c-format
msgid "Error: %s is not a valid bus name\n"
msgstr "خطا: %s نام گذرگاه معتبری نیست\n"
-#: gio/gdbus-tool.c:1081
+#: gio/gdbus-tool.c:1080
msgid "Error: Method name is not specified\n"
msgstr "خطا: نام متد مشخص نشده است\n"
-#: gio/gdbus-tool.c:1092
+#: gio/gdbus-tool.c:1091
#, c-format
msgid "Error: Method name “%s” is invalid\n"
msgstr "خطا: نام روش «%s» نامعتبر است\n"
-#: gio/gdbus-tool.c:1170
+#: gio/gdbus-tool.c:1169
#, c-format
msgid "Error parsing parameter %d of type “%s”: %s\n"
msgstr "خطا در تجزیهٔ پارامتر %Id از گونهٔ «%s»: %s\n"
-#: gio/gdbus-tool.c:1196
+#: gio/gdbus-tool.c:1195
#, c-format
msgid "Error adding handle %d: %s\n"
msgstr "خطا در افزودن دستهٔ %Id‏: %s\n"
-#: gio/gdbus-tool.c:1696
+#: gio/gdbus-tool.c:1695
msgid "Destination name to introspect"
msgstr ""
-#: gio/gdbus-tool.c:1697
+#: gio/gdbus-tool.c:1696
msgid "Object path to introspect"
msgstr ""
-#: gio/gdbus-tool.c:1698
+#: gio/gdbus-tool.c:1697
msgid "Print XML"
msgstr "چاپ XML"
-#: gio/gdbus-tool.c:1699
+#: gio/gdbus-tool.c:1698
msgid "Introspect children"
msgstr ""
-#: gio/gdbus-tool.c:1700
+#: gio/gdbus-tool.c:1699
msgid "Only print properties"
msgstr "تنها ترجیحات را چاپ کن"
-#: gio/gdbus-tool.c:1789
+#: gio/gdbus-tool.c:1788
msgid "Introspect a remote object."
msgstr ""
-#: gio/gdbus-tool.c:1995
+#: gio/gdbus-tool.c:1994
msgid "Destination name to monitor"
msgstr "نام مقصد جهت پایش"
-#: gio/gdbus-tool.c:1996
+#: gio/gdbus-tool.c:1995
msgid "Object path to monitor"
msgstr "مسیر شیء جهت پایش"
-#: gio/gdbus-tool.c:2021
+#: gio/gdbus-tool.c:2020
msgid "Monitor a remote object."
msgstr "پایش یک شیء دوردست."
-#: gio/gdbus-tool.c:2079
+#: gio/gdbus-tool.c:2078
msgid "Error: can’t monitor a non-message-bus connection\n"
msgstr ""
-#: gio/gdbus-tool.c:2203
+#: gio/gdbus-tool.c:2202
msgid "Service to activate before waiting for the other one (well-known name)"
msgstr ""
-#: gio/gdbus-tool.c:2206
+#: gio/gdbus-tool.c:2205
msgid ""
"Timeout to wait for before exiting with an error (seconds); 0 for no timeout "
"(default)"
msgstr ""
-#: gio/gdbus-tool.c:2254
+#: gio/gdbus-tool.c:2253
msgid "[OPTION…] BUS-NAME"
msgstr "[OPTION…] BUS-NAME"
-#: gio/gdbus-tool.c:2255
+#: gio/gdbus-tool.c:2254
msgid "Wait for a bus name to appear."
msgstr "انتظار برای ظهور یک نام گذرگاه."
-#: gio/gdbus-tool.c:2331
+#: gio/gdbus-tool.c:2330
msgid "Error: A service to activate for must be specified.\n"
msgstr "خطا: باید خدمتی برای فعّال کردنش مشخّص شده باشد.\n"
-#: gio/gdbus-tool.c:2336
+#: gio/gdbus-tool.c:2335
msgid "Error: A service to wait for must be specified.\n"
msgstr "خطا: باید خدمتی برای منتظرش شدن مشخّص شده باشد.\n"
-#: gio/gdbus-tool.c:2341
+#: gio/gdbus-tool.c:2340
msgid "Error: Too many arguments.\n"
msgstr "خطا: آرگومان‌های بیش از حد.\n"
-#: gio/gdbus-tool.c:2349 gio/gdbus-tool.c:2356
+#: gio/gdbus-tool.c:2348 gio/gdbus-tool.c:2355
#, c-format
msgid "Error: %s is not a valid well-known bus name.\n"
msgstr "خطا: %s نام گذرگاه شناخته شدهٔ معتبری نیست\n"
@@ -1241,38 +1245,43 @@ msgstr "خطا: %s نام گذرگاه شناخته شدهٔ معتبری نیس
msgid "Not authorized to change debug settings"
msgstr "برای تغییر تنظیمات اشکال‌زدایی مجاز نیست"
-#: gio/gdesktopappinfo.c:2182 gio/gdesktopappinfo.c:5119
+#: gio/gdesktopappinfo.c:2242 gio/gdesktopappinfo.c:5223
msgid "Unnamed"
msgstr "بدون‌نام"
-#: gio/gdesktopappinfo.c:2592
+#: gio/gdesktopappinfo.c:2652
msgid "Desktop file didn’t specify Exec field"
msgstr "پروندهٔ میزکار زمینهٔ Exec را مشخّص نکرده"
-#: gio/gdesktopappinfo.c:2891
+#: gio/gdesktopappinfo.c:2942
msgid "Unable to find terminal required for application"
msgstr "نمی‌توان پایانهٔ لازم برای این برنامه را پیدا کرد"
-#: gio/gdesktopappinfo.c:3637
+#: gio/gdesktopappinfo.c:3002
+#, c-format
+msgid "Program ‘%s’ not found in $PATH"
+msgstr ""
+
+#: gio/gdesktopappinfo.c:3735
#, c-format
msgid "Can’t create user application configuration folder %s: %s"
msgstr "نمی‌توان شاخهٔ پیکربندی برنامهٔ کاربر %s را ایجاد کرد: %s"
-#: gio/gdesktopappinfo.c:3641
+#: gio/gdesktopappinfo.c:3739
#, c-format
msgid "Can’t create user MIME configuration folder %s: %s"
msgstr "نمی‌توان شاخهٔ پیکربندی MIME کاربر %s را ایجاد کرد: %s"
-#: gio/gdesktopappinfo.c:3883 gio/gdesktopappinfo.c:3907
+#: gio/gdesktopappinfo.c:3981 gio/gdesktopappinfo.c:4005
msgid "Application information lacks an identifier"
msgstr "اطّلاعات برنامه یک شناسه کم دارد"
-#: gio/gdesktopappinfo.c:4143
+#: gio/gdesktopappinfo.c:4241
#, c-format
msgid "Can’t create user desktop file %s"
msgstr "نمی‌توان پروندهٔ میزکار کاربر %s را ایجاد کرد"
-#: gio/gdesktopappinfo.c:4279
+#: gio/gdesktopappinfo.c:4377
#, c-format
msgid "Custom definition for %s"
msgstr "تعریف شخصی برای %s"
@@ -1344,7 +1353,7 @@ msgstr "برای GEmblemedIcon انتظار GEmblem می‌رفت"
msgid "Containing mount does not exist"
msgstr ""
-#: gio/gfile.c:2641 gio/glocalfile.c:2500
+#: gio/gfile.c:2641 gio/glocalfile.c:2511
msgid "Can’t copy over directory"
msgstr "نمی‌توان روی شاخه رونوشت کرد"
@@ -1389,7 +1398,7 @@ msgstr "نمی‌توان پروندهٔ خاص را رونوشت کرد"
msgid "Invalid symlink value given"
msgstr "مقدار نامعتبر پیوند نمادین داده شده"
-#: gio/gfile.c:4163 glib/gfileutils.c:2335
+#: gio/gfile.c:4163 glib/gfileutils.c:2392
msgid "Symbolic links not supported"
msgstr "پیوندهای نمادی پشتیبانی نمی‌شوند"
@@ -1487,37 +1496,37 @@ msgstr "پاسخ بیش از حد بزرگ پیشکار HTTP"
msgid "HTTP proxy server closed connection unexpectedly."
msgstr "کارساز پیشکار HTTP اتّصال را به طور غیرمنتظره‌ای بست."
-#: gio/gicon.c:300
+#: gio/gicon.c:299
#, c-format
msgid "Wrong number of tokens (%d)"
msgstr "تعداد ژتون‌های اشتباه (%Id)"
-#: gio/gicon.c:320
+#: gio/gicon.c:319
#, c-format
msgid "No type for class name %s"
msgstr "گونه‌ای برای نام کلاس %s وجود ندارد"
-#: gio/gicon.c:330
+#: gio/gicon.c:329
#, c-format
msgid "Type %s does not implement the GIcon interface"
msgstr "گونهٔ %s واسط GIcon را پیاده نساخته"
-#: gio/gicon.c:341
+#: gio/gicon.c:340
#, c-format
msgid "Type %s is not classed"
msgstr ""
-#: gio/gicon.c:355
+#: gio/gicon.c:354
#, c-format
msgid "Malformed version number: %s"
msgstr "شمارهٔ نگارش بدریخت: %s"
-#: gio/gicon.c:369
+#: gio/gicon.c:368
#, c-format
msgid "Type %s does not implement from_tokens() on the GIcon interface"
msgstr "گونهٔ %s from_tokens() را روی واسط GIcon پیاده نساخته"
-#: gio/gicon.c:471
+#: gio/gicon.c:470
msgid "Can’t handle the supplied version of the icon encoding"
msgstr "نمی‌توان نگارش فراهم شدهٔ رمزنگاری نقشک را مدیریت کرد"
@@ -2282,7 +2291,7 @@ msgstr ""
msgid "List contents of directories in a tree-like format."
msgstr ""
-#: gio/glib-compile-resources.c:142 gio/glib-compile-schemas.c:1516
+#: gio/glib-compile-resources.c:142 gio/glib-compile-schemas.c:1513
#, c-format
msgid "Element <%s> not allowed inside <%s>"
msgstr ""
@@ -2337,7 +2346,7 @@ msgstr "خطا در هنگام فشرده‌سازی پرونده %s"
msgid "text may not appear inside <%s>"
msgstr ""
-#: gio/glib-compile-resources.c:821 gio/glib-compile-schemas.c:2174
+#: gio/glib-compile-resources.c:821 gio/glib-compile-schemas.c:2171
msgid "Show program version and exit"
msgstr ""
@@ -2351,8 +2360,8 @@ msgid ""
"directory)"
msgstr ""
-#: gio/glib-compile-resources.c:823 gio/glib-compile-schemas.c:2175
-#: gio/glib-compile-schemas.c:2204
+#: gio/glib-compile-resources.c:823 gio/glib-compile-schemas.c:2172
+#: gio/glib-compile-schemas.c:2201
msgid "DIRECTORY"
msgstr "DIRECTORY"
@@ -2558,287 +2567,287 @@ msgstr ""
msgid "<aliases> must contain at least one <alias>"
msgstr ""
-#: gio/glib-compile-schemas.c:799
+#: gio/glib-compile-schemas.c:796
msgid "Empty names are not permitted"
msgstr "نام‌های خالی مجاز نیستند"
-#: gio/glib-compile-schemas.c:809
+#: gio/glib-compile-schemas.c:806
#, c-format
msgid "Invalid name “%s”: names must begin with a lowercase letter"
msgstr ""
-#: gio/glib-compile-schemas.c:821
+#: gio/glib-compile-schemas.c:818
#, c-format
msgid ""
"Invalid name “%s”: invalid character “%c”; only lowercase letters, numbers and "
"hyphen (“-”) are permitted"
msgstr ""
-#: gio/glib-compile-schemas.c:830
+#: gio/glib-compile-schemas.c:827
#, c-format
msgid "Invalid name “%s”: two successive hyphens (“--”) are not permitted"
msgstr ""
-#: gio/glib-compile-schemas.c:839
+#: gio/glib-compile-schemas.c:836
#, c-format
msgid "Invalid name “%s”: the last character may not be a hyphen (“-”)"
msgstr ""
-#: gio/glib-compile-schemas.c:847
+#: gio/glib-compile-schemas.c:844
#, c-format
msgid "Invalid name “%s”: maximum length is 1024"
msgstr ""
-#: gio/glib-compile-schemas.c:919
+#: gio/glib-compile-schemas.c:916
#, c-format
msgid "<child name='%s'> already specified"
msgstr ""
-#: gio/glib-compile-schemas.c:945
+#: gio/glib-compile-schemas.c:942
msgid "Cannot add keys to a “list-of” schema"
msgstr ""
-#: gio/glib-compile-schemas.c:956
+#: gio/glib-compile-schemas.c:953
#, c-format
msgid "<key name='%s'> already specified"
msgstr ""
-#: gio/glib-compile-schemas.c:974
+#: gio/glib-compile-schemas.c:971
#, c-format
msgid ""
"<key name='%s'> shadows <key name='%s'> in <schema id='%s'>; use <override> to "
"modify value"
msgstr ""
-#: gio/glib-compile-schemas.c:985
+#: gio/glib-compile-schemas.c:982
#, c-format
msgid ""
"Exactly one of “type”, “enum” or “flags” must be specified as an attribute to "
"<key>"
msgstr ""
-#: gio/glib-compile-schemas.c:1004
+#: gio/glib-compile-schemas.c:1001
#, c-format
msgid "<%s id='%s'> not (yet) defined."
msgstr ""
-#: gio/glib-compile-schemas.c:1019
+#: gio/glib-compile-schemas.c:1016
#, c-format
msgid "Invalid GVariant type string “%s”"
msgstr "رشتهٔ گونهٔ GVariant نامعتبر «%s»"
-#: gio/glib-compile-schemas.c:1049
+#: gio/glib-compile-schemas.c:1046
msgid "<override> given but schema isn’t extending anything"
msgstr ""
-#: gio/glib-compile-schemas.c:1062
+#: gio/glib-compile-schemas.c:1059
#, c-format
msgid "No <key name='%s'> to override"
msgstr ""
-#: gio/glib-compile-schemas.c:1070
+#: gio/glib-compile-schemas.c:1067
#, c-format
msgid "<override name='%s'> already specified"
msgstr ""
-#: gio/glib-compile-schemas.c:1143
+#: gio/glib-compile-schemas.c:1140
#, c-format
msgid "<schema id='%s'> already specified"
msgstr ""
-#: gio/glib-compile-schemas.c:1155
+#: gio/glib-compile-schemas.c:1152
#, c-format
msgid "<schema id='%s'> extends not yet existing schema “%s”"
msgstr ""
-#: gio/glib-compile-schemas.c:1171
+#: gio/glib-compile-schemas.c:1168
#, c-format
msgid "<schema id='%s'> is list of not yet existing schema “%s”"
msgstr ""
-#: gio/glib-compile-schemas.c:1179
+#: gio/glib-compile-schemas.c:1176
#, c-format
msgid "Cannot be a list of a schema with a path"
msgstr "نمی‌تواند سیاهه‌ای از یک شما با یک مسیر باشد"
-#: gio/glib-compile-schemas.c:1189
+#: gio/glib-compile-schemas.c:1186
#, c-format
msgid "Cannot extend a schema with a path"
msgstr "نمی‌تواند شمایی را با یک مسیر گستراند"
-#: gio/glib-compile-schemas.c:1199
+#: gio/glib-compile-schemas.c:1196
#, c-format
msgid "<schema id='%s'> is a list, extending <schema id='%s'> which is not a list"
msgstr ""
-#: gio/glib-compile-schemas.c:1209
+#: gio/glib-compile-schemas.c:1206
#, c-format
msgid ""
"<schema id='%s' list-of='%s'> extends <schema id='%s' list-of='%s'> but “%s” "
"does not extend “%s”"
msgstr ""
-#: gio/glib-compile-schemas.c:1226
+#: gio/glib-compile-schemas.c:1223
#, c-format
msgid "A path, if given, must begin and end with a slash"
msgstr "یک مسیر، اگر داده شود، باید با یک اسلش آغاز و پایان یابد"
-#: gio/glib-compile-schemas.c:1233
+#: gio/glib-compile-schemas.c:1230
#, c-format
msgid "The path of a list must end with “:/”"
msgstr "مسیر یک سیاهه باید با «‪:/‬» خاتمه پیدا کند"
-#: gio/glib-compile-schemas.c:1242
+#: gio/glib-compile-schemas.c:1239
#, c-format
msgid ""
"Warning: Schema “%s” has path “%s”. Paths starting with “/apps/”, “/desktop/” "
"or “/system/” are deprecated."
msgstr ""
-#: gio/glib-compile-schemas.c:1272
+#: gio/glib-compile-schemas.c:1269
#, c-format
msgid "<%s id='%s'> already specified"
msgstr "<%s id='%s'> از قبل مشخص شده است"
-#: gio/glib-compile-schemas.c:1422 gio/glib-compile-schemas.c:1438
+#: gio/glib-compile-schemas.c:1419 gio/glib-compile-schemas.c:1435
#, c-format
msgid "Only one <%s> element allowed inside <%s>"
msgstr ""
-#: gio/glib-compile-schemas.c:1520
+#: gio/glib-compile-schemas.c:1517
#, c-format
msgid "Element <%s> not allowed at the top level"
msgstr ""
-#: gio/glib-compile-schemas.c:1538
+#: gio/glib-compile-schemas.c:1535
msgid "Element <default> is required in <key>"
msgstr ""
-#: gio/glib-compile-schemas.c:1628
+#: gio/glib-compile-schemas.c:1625
#, c-format
msgid "Text may not appear inside <%s>"
msgstr ""
-#: gio/glib-compile-schemas.c:1696
+#: gio/glib-compile-schemas.c:1693
#, c-format
msgid "Warning: undefined reference to <schema id='%s'/>"
msgstr ""
#. Translators: Do not translate "--strict".
-#: gio/glib-compile-schemas.c:1835 gio/glib-compile-schemas.c:1914
+#: gio/glib-compile-schemas.c:1832 gio/glib-compile-schemas.c:1911
msgid "--strict was specified; exiting."
msgstr ""
-#: gio/glib-compile-schemas.c:1847
+#: gio/glib-compile-schemas.c:1844
msgid "This entire file has been ignored."
msgstr "تمامی این پرونده چشم پوشی شده."
-#: gio/glib-compile-schemas.c:1910
+#: gio/glib-compile-schemas.c:1907
msgid "Ignoring this file."
msgstr "چشم پوشی از این پرونده."
-#: gio/glib-compile-schemas.c:1965
+#: gio/glib-compile-schemas.c:1962
#, c-format
msgid ""
"No such key “%s” in schema “%s” as specified in override file “%s”; ignoring "
"override for this key."
msgstr ""
-#: gio/glib-compile-schemas.c:1973
+#: gio/glib-compile-schemas.c:1970
#, c-format
msgid ""
"No such key “%s” in schema “%s” as specified in override file “%s” and --strict "
"was specified; exiting."
msgstr ""
-#: gio/glib-compile-schemas.c:1995
+#: gio/glib-compile-schemas.c:1992
#, c-format
msgid ""
"Cannot provide per-desktop overrides for localized key “%s” in schema "
"“%s” (override file “%s”); ignoring override for this key."
msgstr ""
-#: gio/glib-compile-schemas.c:2004
+#: gio/glib-compile-schemas.c:2001
#, c-format
msgid ""
"Cannot provide per-desktop overrides for localized key “%s” in schema "
"“%s” (override file “%s”) and --strict was specified; exiting."
msgstr ""
-#: gio/glib-compile-schemas.c:2028
+#: gio/glib-compile-schemas.c:2025
#, c-format
msgid ""
"Error parsing key “%s” in schema “%s” as specified in override file “%s”: %s. "
"Ignoring override for this key."
msgstr ""
-#: gio/glib-compile-schemas.c:2040
+#: gio/glib-compile-schemas.c:2037
#, c-format
msgid ""
"Error parsing key “%s” in schema “%s” as specified in override file “%s”: %s. --"
"strict was specified; exiting."
msgstr ""
-#: gio/glib-compile-schemas.c:2067
+#: gio/glib-compile-schemas.c:2064
#, c-format
msgid ""
"Override for key “%s” in schema “%s” in override file “%s” is outside the range "
"given in the schema; ignoring override for this key."
msgstr ""
-#: gio/glib-compile-schemas.c:2077
+#: gio/glib-compile-schemas.c:2074
#, c-format
msgid ""
"Override for key “%s” in schema “%s” in override file “%s” is outside the range "
"given in the schema and --strict was specified; exiting."
msgstr ""
-#: gio/glib-compile-schemas.c:2103
+#: gio/glib-compile-schemas.c:2100
#, c-format
msgid ""
"Override for key “%s” in schema “%s” in override file “%s” is not in the list of "
"valid choices; ignoring override for this key."
msgstr ""
-#: gio/glib-compile-schemas.c:2113
+#: gio/glib-compile-schemas.c:2110
#, c-format
msgid ""
"Override for key “%s” in schema “%s” in override file “%s” is not in the list of "
"valid choices and --strict was specified; exiting."
msgstr ""
-#: gio/glib-compile-schemas.c:2175
+#: gio/glib-compile-schemas.c:2172
msgid "Where to store the gschemas.compiled file"
msgstr "مکان ذخیرهٔ پروندهٔ gschemas.compiled"
-#: gio/glib-compile-schemas.c:2176
+#: gio/glib-compile-schemas.c:2173
msgid "Abort on any errors in schemas"
msgstr "قطع کردن با رخدادِ هر نوع خطا در شِماها"
-#: gio/glib-compile-schemas.c:2177
+#: gio/glib-compile-schemas.c:2174
msgid "Do not write the gschema.compiled file"
msgstr "بر روی پروندهٔ gschema.compiled ننویس"
-#: gio/glib-compile-schemas.c:2178
+#: gio/glib-compile-schemas.c:2175
msgid "Do not enforce key name restrictions"
msgstr ""
-#: gio/glib-compile-schemas.c:2207
+#: gio/glib-compile-schemas.c:2204
msgid ""
"Compile all GSettings schema files into a schema cache.\n"
"Schema files are required to have the extension .gschema.xml,\n"
"and the cache file is called gschemas.compiled."
msgstr ""
-#: gio/glib-compile-schemas.c:2228
+#: gio/glib-compile-schemas.c:2225
msgid "You should give exactly one directory name"
msgstr "باید دقیقأ یک نام شاخه بدهید"
-#: gio/glib-compile-schemas.c:2271
+#: gio/glib-compile-schemas.c:2268
msgid "No schema files found: doing nothing."
msgstr "هیچ پرونده شمایی پیدا نشد: کاری نمی‌شود."
-#: gio/glib-compile-schemas.c:2273
+#: gio/glib-compile-schemas.c:2270
msgid "No schema files found: removed existing output file."
msgstr "هیچ پرونده شمایی پیدا نشد: پروندهٔ خروجی موجود برداشته شد."
@@ -2847,7 +2856,7 @@ msgstr "هیچ پرونده شمایی پیدا نشد: پروندهٔ خروج
msgid "Invalid filename %s"
msgstr "نام پرونده نامعتبر: %s"
-#: gio/glocalfile.c:996
+#: gio/glocalfile.c:1005
#, c-format
msgid "Error getting filesystem info for %s: %s"
msgstr "خطا در گرفتن اطّلاعات سامانه‌پرونده‌ برای %s: %s"
@@ -2856,124 +2865,124 @@ msgstr "خطا در گرفتن اطّلاعات سامانه‌پرونده‌
#. * the enclosing (user visible) mount of a file, but none
#. * exists.
#.
-#: gio/glocalfile.c:1137
+#: gio/glocalfile.c:1141
#, c-format
msgid "Containing mount for file %s not found"
msgstr ""
-#: gio/glocalfile.c:1160
+#: gio/glocalfile.c:1164
msgid "Can’t rename root directory"
msgstr "نمی‌توان نام شاخهٔ ریشه را عوض کرد"
-#: gio/glocalfile.c:1178 gio/glocalfile.c:1201
+#: gio/glocalfile.c:1182 gio/glocalfile.c:1205
#, c-format
msgid "Error renaming file %s: %s"
msgstr "خطا در تغییر نام پرونده %s: %s"
-#: gio/glocalfile.c:1185
+#: gio/glocalfile.c:1189
msgid "Can’t rename file, filename already exists"
msgstr "نمی‌توان نام پرونده را عوض کرد. نام پرونده از پیش وجود دارد"
-#: gio/glocalfile.c:1198 gio/glocalfile.c:2394 gio/glocalfile.c:2422
-#: gio/glocalfile.c:2561 gio/glocalfileoutputstream.c:658
+#: gio/glocalfile.c:1202 gio/glocalfile.c:2405 gio/glocalfile.c:2433
+#: gio/glocalfile.c:2572 gio/glocalfileoutputstream.c:658
msgid "Invalid filename"
msgstr "نام پرونده نامعتبر"
-#: gio/glocalfile.c:1366 gio/glocalfile.c:1377
+#: gio/glocalfile.c:1370 gio/glocalfile.c:1381
#, c-format
msgid "Error opening file %s: %s"
msgstr "خطا در گشودن پروندهٔ %s: %s"
-#: gio/glocalfile.c:1502
+#: gio/glocalfile.c:1506
#, c-format
msgid "Error removing file %s: %s"
msgstr "خطا در برداشتن پروندهٔ %s: %s"
-#: gio/glocalfile.c:1996 gio/glocalfile.c:2007 gio/glocalfile.c:2034
+#: gio/glocalfile.c:2000 gio/glocalfile.c:2011 gio/glocalfile.c:2038
#, c-format
msgid "Error trashing file %s: %s"
msgstr "خطا در دور ریختن پروندهٔ %s: %s"
-#: gio/glocalfile.c:2054
+#: gio/glocalfile.c:2058
#, c-format
msgid "Unable to create trash directory %s: %s"
msgstr "ناتوان در ایجاد شاخهٔ زباله‌دان %s: %s"
-#: gio/glocalfile.c:2075
+#: gio/glocalfile.c:2079
#, c-format
msgid "Unable to find toplevel directory to trash %s"
msgstr "ناتوان در یافتن شاخهٔ سطح بالا برای دور ریختن %s"
-#: gio/glocalfile.c:2083
+#: gio/glocalfile.c:2087
#, c-format
msgid "Trashing on system internal mounts is not supported"
msgstr ""
-#: gio/glocalfile.c:2169 gio/glocalfile.c:2197
+#: gio/glocalfile.c:2173 gio/glocalfile.c:2201
#, c-format
msgid "Unable to find or create trash directory %s to trash %s"
msgstr "ناتوان در یافتن یا ایجاد شاخهٔ زباله‌دان %s برای دور ریختن %s"
-#: gio/glocalfile.c:2243
+#: gio/glocalfile.c:2245
#, c-format
msgid "Unable to create trashing info file for %s: %s"
msgstr "ناتوان در ایجاد پروندهٔ اطّلاعات دور ریختن برای %s: %s"
-#: gio/glocalfile.c:2305
+#: gio/glocalfile.c:2316
#, c-format
msgid "Unable to trash file %s across filesystem boundaries"
msgstr "ناتوان در دور ریختن پروندهٔ %s از فرار محدوده‌های سامانه‌پرونده"
-#: gio/glocalfile.c:2309 gio/glocalfile.c:2365
+#: gio/glocalfile.c:2320 gio/glocalfile.c:2376
#, c-format
msgid "Unable to trash file %s: %s"
msgstr "ناتوان در دور ریختن پروندهٔ %s: %s"
-#: gio/glocalfile.c:2371
+#: gio/glocalfile.c:2382
#, c-format
msgid "Unable to trash file %s"
msgstr "ناتوان در دور ریختن پروندهٔ %s"
-#: gio/glocalfile.c:2397
+#: gio/glocalfile.c:2408
#, c-format
msgid "Error creating directory %s: %s"
msgstr "خطا در ایجاد شاخهٔ %s: %s"
-#: gio/glocalfile.c:2426
+#: gio/glocalfile.c:2437
#, c-format
msgid "Filesystem does not support symbolic links"
msgstr "سیستم‌پرونده از پیوندهای نمادین پشتیبانی نمی‌کند"
-#: gio/glocalfile.c:2429
+#: gio/glocalfile.c:2440
#, c-format
msgid "Error making symbolic link %s: %s"
msgstr "خطا در ساختن پیوند نمادین %s: %s"
-#: gio/glocalfile.c:2472 gio/glocalfile.c:2507 gio/glocalfile.c:2564
+#: gio/glocalfile.c:2483 gio/glocalfile.c:2518 gio/glocalfile.c:2575
#, c-format
msgid "Error moving file %s: %s"
msgstr "خطا در جابجایی پروندهٔ %s: %s"
-#: gio/glocalfile.c:2495
+#: gio/glocalfile.c:2506
msgid "Can’t move directory over directory"
msgstr "نمی‌توان شاخه را روی شاخه جابه‌جا کرد"
-#: gio/glocalfile.c:2521 gio/glocalfileoutputstream.c:1110
+#: gio/glocalfile.c:2532 gio/glocalfileoutputstream.c:1110
#: gio/glocalfileoutputstream.c:1124 gio/glocalfileoutputstream.c:1139
#: gio/glocalfileoutputstream.c:1156 gio/glocalfileoutputstream.c:1170
msgid "Backup file creation failed"
msgstr "ساخت پرونده پشتیبان شکست خورد"
-#: gio/glocalfile.c:2540
+#: gio/glocalfile.c:2551
#, c-format
msgid "Error removing target file: %s"
msgstr "خطا در هنگام حذف پرونده هدف: %s"
-#: gio/glocalfile.c:2554
+#: gio/glocalfile.c:2565
msgid "Move between mounts not supported"
msgstr ""
-#: gio/glocalfile.c:2728
+#: gio/glocalfile.c:2741
#, c-format
msgid "Could not determine the disk usage of %s: %s"
msgstr "نتوانست استفادهٔ دیسک %s را تشخیص دهد: %s"
@@ -2995,114 +3004,114 @@ msgstr "نام صفت گستردهٔ نامعتبر"
msgid "Error setting extended attribute “%s”: %s"
msgstr "خطا در تنظیم کردن صفت گستردهٔ «‎%s»‏: %s"
-#: gio/glocalfileinfo.c:1738 gio/win32/gwinhttpfile.c:191
+#: gio/glocalfileinfo.c:1819 gio/win32/gwinhttpfile.c:191
msgid " (invalid encoding)"
msgstr " (کدگذاری نامعتبر)"
-#: gio/glocalfileinfo.c:1897 gio/glocalfileoutputstream.c:945
+#: gio/glocalfileinfo.c:1978 gio/glocalfileoutputstream.c:945
#: gio/glocalfileoutputstream.c:997
#, c-format
msgid "Error when getting information for file “%s”: %s"
msgstr "خطا هنگام گرفتن اطّلاعات برای پروندهٔ «%s»: %s"
-#: gio/glocalfileinfo.c:2163
+#: gio/glocalfileinfo.c:2281
#, c-format
msgid "Error when getting information for file descriptor: %s"
msgstr "خطا هنگام گرفتن اطّلاعات برای توصیفگر پرونده: %s"
-#: gio/glocalfileinfo.c:2208
+#: gio/glocalfileinfo.c:2326
msgid "Invalid attribute type (uint32 expected)"
msgstr "نوع مشخصه نامعتبر (uint32 مورد انتظار بود)"
-#: gio/glocalfileinfo.c:2226
+#: gio/glocalfileinfo.c:2344
msgid "Invalid attribute type (uint64 expected)"
msgstr "نوع مشخصه نامعتبر بود (uint64 مورد انتظار بود)"
-#: gio/glocalfileinfo.c:2245 gio/glocalfileinfo.c:2264
+#: gio/glocalfileinfo.c:2363 gio/glocalfileinfo.c:2382
msgid "Invalid attribute type (byte string expected)"
msgstr "نوع مشخصه نامعتبر (رشته بایتی مورد انتظار بود)"
-#: gio/glocalfileinfo.c:2311
+#: gio/glocalfileinfo.c:2429
msgid "Cannot set permissions on symlinks"
msgstr "نمی‌توان اجازه‌های روی پیوند نمادین را تنظیم کرد"
-#: gio/glocalfileinfo.c:2327
+#: gio/glocalfileinfo.c:2445
#, c-format
msgid "Error setting permissions: %s"
msgstr "خطا در هنگام تنظیم اجازه‌ها: %s"
-#: gio/glocalfileinfo.c:2378
+#: gio/glocalfileinfo.c:2496
#, c-format
msgid "Error setting owner: %s"
msgstr "خطا در هنگام تنظیم مالک: %s"
-#: gio/glocalfileinfo.c:2401
+#: gio/glocalfileinfo.c:2519
msgid "symlink must be non-NULL"
msgstr ""
-#: gio/glocalfileinfo.c:2411 gio/glocalfileinfo.c:2430 gio/glocalfileinfo.c:2441
+#: gio/glocalfileinfo.c:2529 gio/glocalfileinfo.c:2548 gio/glocalfileinfo.c:2559
#, c-format
msgid "Error setting symlink: %s"
msgstr "خطا در تنظیم پیوند نمادین: %s"
-#: gio/glocalfileinfo.c:2420
+#: gio/glocalfileinfo.c:2538
msgid "Error setting symlink: file is not a symlink"
msgstr ""
-#: gio/glocalfileinfo.c:2492
+#: gio/glocalfileinfo.c:2630
#, c-format
msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative"
msgstr ""
-#: gio/glocalfileinfo.c:2501
+#: gio/glocalfileinfo.c:2639
#, c-format
msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second"
msgstr ""
-#: gio/glocalfileinfo.c:2511
+#: gio/glocalfileinfo.c:2649
#, c-format
msgid "UNIX timestamp %lld does not fit into 64 bits"
msgstr ""
-#: gio/glocalfileinfo.c:2522
+#: gio/glocalfileinfo.c:2660
#, c-format
msgid "UNIX timestamp %lld is outside of the range supported by Windows"
msgstr ""
-#: gio/glocalfileinfo.c:2625
+#: gio/glocalfileinfo.c:2792
#, c-format
msgid "File name “%s” cannot be converted to UTF-16"
msgstr ""
-#: gio/glocalfileinfo.c:2644
+#: gio/glocalfileinfo.c:2811
#, c-format
msgid "File “%s” cannot be opened: Windows Error %lu"
msgstr ""
-#: gio/glocalfileinfo.c:2657
+#: gio/glocalfileinfo.c:2824
#, c-format
msgid "Error setting modification or access time for file “%s”: %lu"
msgstr "خطا در تنظیم کردن زمان دسترسی یا تغییر برای پروندهٔ «%s»: %lu"
-#: gio/glocalfileinfo.c:2798 gio/glocalfileinfo.c:2810
+#: gio/glocalfileinfo.c:2981
#, c-format
msgid "Error setting modification or access time: %s"
msgstr "خطا در هنگام تنظیم کردن زمان دسترسی یا تغییر: %s"
-#: gio/glocalfileinfo.c:2833
+#: gio/glocalfileinfo.c:3004
msgid "SELinux context must be non-NULL"
msgstr ""
-#: gio/glocalfileinfo.c:2840
+#: gio/glocalfileinfo.c:3011
msgid "SELinux is not enabled on this system"
msgstr "سیستم SELinux بر روی این سیستم فعال نشده است"
-#: gio/glocalfileinfo.c:2850
+#: gio/glocalfileinfo.c:3021
#, c-format
msgid "Error setting SELinux context: %s"
msgstr "خطا در تنظیم مفاد SELinux: %s"
-#: gio/glocalfileinfo.c:2947
+#: gio/glocalfileinfo.c:3118
#, c-format
msgid "Setting attribute %s not supported"
msgstr "تنظیم کردن مشخصه %s پشتیبانی نمی‌شود"
@@ -3149,13 +3158,13 @@ msgstr "خطا در هنگام رونشت از پشتیبان: %s"
msgid "Error renaming temporary file: %s"
msgstr "خطا خطا در تغییر نام پرونده موقت: %s"
-#: gio/glocalfileoutputstream.c:611 gio/glocalfileoutputstream.c:1241
+#: gio/glocalfileoutputstream.c:611 gio/glocalfileoutputstream.c:1242
#, c-format
msgid "Error truncating file: %s"
msgstr "خطا در هنگام کوتاه کردن پرونده: %s"
#: gio/glocalfileoutputstream.c:664 gio/glocalfileoutputstream.c:909
-#: gio/glocalfileoutputstream.c:1222 gio/gsubprocess.c:231
+#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:231
#, c-format
msgid "Error opening file “%s”: %s"
msgstr "خطا در گشودن پروندهٔ «%s»: %s"
@@ -3172,7 +3181,7 @@ msgstr "پرونده هدف یک پرونده معمولی نیست"
msgid "The file was externally modified"
msgstr "پرونده از خارج تغییر کرده است"
-#: gio/glocalfileoutputstream.c:1204
+#: gio/glocalfileoutputstream.c:1205
#, c-format
msgid "Error removing old file: %s"
msgstr "خطا در هنگام حذف پرونده قدیمی: %s"
@@ -3317,8 +3326,8 @@ msgstr ""
#. Translators: the first placeholder is a domain name, the
#. * second is an error message
#: gio/gresolver.c:403 gio/gthreadedresolver.c:152 gio/gthreadedresolver.c:170
-#: gio/gthreadedresolver.c:782 gio/gthreadedresolver.c:806
-#: gio/gthreadedresolver.c:831 gio/gthreadedresolver.c:846
+#: gio/gthreadedresolver.c:798 gio/gthreadedresolver.c:822
+#: gio/gthreadedresolver.c:847 gio/gthreadedresolver.c:862
#, c-format
msgid "Error resolving “%s”: %s"
msgstr "خطا در حل «%s»: %s"
@@ -3973,35 +3982,35 @@ msgstr "خطا در حل معکوس «%s»: %s"
#. Translators: the placeholder is a DNS record type, such as ‘MX’ or ‘SRV’
#: gio/gthreadedresolver.c:552 gio/gthreadedresolver.c:574
-#: gio/gthreadedresolver.c:612 gio/gthreadedresolver.c:659
-#: gio/gthreadedresolver.c:688 gio/gthreadedresolver.c:700
+#: gio/gthreadedresolver.c:628 gio/gthreadedresolver.c:675
+#: gio/gthreadedresolver.c:704 gio/gthreadedresolver.c:716
#, c-format
msgid "Error parsing DNS %s record: malformed DNS packet"
msgstr ""
-#: gio/gthreadedresolver.c:758 gio/gthreadedresolver.c:895
-#: gio/gthreadedresolver.c:993 gio/gthreadedresolver.c:1043
+#: gio/gthreadedresolver.c:774 gio/gthreadedresolver.c:911
+#: gio/gthreadedresolver.c:1009 gio/gthreadedresolver.c:1059
#, c-format
msgid "No DNS record of the requested type for “%s”"
msgstr ""
-#: gio/gthreadedresolver.c:763 gio/gthreadedresolver.c:998
+#: gio/gthreadedresolver.c:779 gio/gthreadedresolver.c:1014
#, c-format
msgid "Temporarily unable to resolve “%s”"
msgstr ""
-#: gio/gthreadedresolver.c:768 gio/gthreadedresolver.c:1003
-#: gio/gthreadedresolver.c:1113
+#: gio/gthreadedresolver.c:784 gio/gthreadedresolver.c:1019
+#: gio/gthreadedresolver.c:1129
#, c-format
msgid "Error resolving “%s”"
msgstr "خطا در حل «%s»"
-#: gio/gthreadedresolver.c:782 gio/gthreadedresolver.c:806
-#: gio/gthreadedresolver.c:831 gio/gthreadedresolver.c:846
+#: gio/gthreadedresolver.c:798 gio/gthreadedresolver.c:822
+#: gio/gthreadedresolver.c:847 gio/gthreadedresolver.c:862
msgid "Malformed DNS packet"
msgstr ""
-#: gio/gthreadedresolver.c:888
+#: gio/gthreadedresolver.c:904
#, c-format
msgid "Failed to parse DNS response for “%s”: "
msgstr "شکست در تجزیهٔ پاسخ ساناد برای «%s»: "
@@ -4125,7 +4134,7 @@ msgstr "خطا در خواندن از توصیف‌گر پرونده: %s"
msgid "Error closing file descriptor: %s"
msgstr "خطا در بستن توصیف‌گر پرونده: %s"
-#: gio/gunixmounts.c:2815 gio/gunixmounts.c:2868
+#: gio/gunixmounts.c:2817 gio/gunixmounts.c:2870
msgid "Filesystem root"
msgstr "ریشه سیستم‌پرونده‌ها"
@@ -4207,74 +4216,74 @@ msgstr ""
msgid "Wrong args\n"
msgstr ""
-#: glib/gbookmarkfile.c:779
+#: glib/gbookmarkfile.c:861
#, c-format
msgid "Unexpected attribute “%s” for element “%s”"
msgstr "صفت نامنتظرهٔ «%s» برای عنصر «%s»"
-#: glib/gbookmarkfile.c:790 glib/gbookmarkfile.c:870 glib/gbookmarkfile.c:880
-#: glib/gbookmarkfile.c:993
+#: glib/gbookmarkfile.c:872 glib/gbookmarkfile.c:952 glib/gbookmarkfile.c:962
+#: glib/gbookmarkfile.c:1075
#, c-format
msgid "Attribute “%s” of element “%s” not found"
msgstr "صفت «%s» برای عنصر «%s» پیدا نشد"
-#: glib/gbookmarkfile.c:1202 glib/gbookmarkfile.c:1267 glib/gbookmarkfile.c:1331
-#: glib/gbookmarkfile.c:1341
+#: glib/gbookmarkfile.c:1284 glib/gbookmarkfile.c:1349 glib/gbookmarkfile.c:1413
+#: glib/gbookmarkfile.c:1423
#, c-format
msgid "Unexpected tag “%s”, tag “%s” expected"
msgstr "برچسب نامنتظرهٔ «%s»، انتظار برچسب «%s» می‌رفت"
-#: glib/gbookmarkfile.c:1227 glib/gbookmarkfile.c:1241 glib/gbookmarkfile.c:1309
-#: glib/gbookmarkfile.c:1355
+#: glib/gbookmarkfile.c:1309 glib/gbookmarkfile.c:1323 glib/gbookmarkfile.c:1391
+#: glib/gbookmarkfile.c:1437
#, c-format
msgid "Unexpected tag “%s” inside “%s”"
msgstr "برچسب نامنتظرهٔ «%s» داخل «%s»"
-#: glib/gbookmarkfile.c:1635
+#: glib/gbookmarkfile.c:1717
#, c-format
msgid "Invalid date/time ‘%s’ in bookmark file"
msgstr ""
-#: glib/gbookmarkfile.c:1838
+#: glib/gbookmarkfile.c:1956
msgid "No valid bookmark file found in data dirs"
msgstr "پروندهٔ چوب‌الف معتبری در شاخه‌های داده پیدا نمی‌شود"
-#: glib/gbookmarkfile.c:2039
+#: glib/gbookmarkfile.c:2157
#, c-format
msgid "A bookmark for URI “%s” already exists"
msgstr "نشانکی برای نشانی «‎%s» از پیش موجود است"
-#: glib/gbookmarkfile.c:2088 glib/gbookmarkfile.c:2246 glib/gbookmarkfile.c:2331
-#: glib/gbookmarkfile.c:2411 glib/gbookmarkfile.c:2496 glib/gbookmarkfile.c:2630
-#: glib/gbookmarkfile.c:2763 glib/gbookmarkfile.c:2898 glib/gbookmarkfile.c:2940
-#: glib/gbookmarkfile.c:3037 glib/gbookmarkfile.c:3158 glib/gbookmarkfile.c:3352
-#: glib/gbookmarkfile.c:3493 glib/gbookmarkfile.c:3712 glib/gbookmarkfile.c:3801
-#: glib/gbookmarkfile.c:3890 glib/gbookmarkfile.c:4009
+#: glib/gbookmarkfile.c:2206 glib/gbookmarkfile.c:2364 glib/gbookmarkfile.c:2449
+#: glib/gbookmarkfile.c:2529 glib/gbookmarkfile.c:2614 glib/gbookmarkfile.c:2748
+#: glib/gbookmarkfile.c:2881 glib/gbookmarkfile.c:3016 glib/gbookmarkfile.c:3058
+#: glib/gbookmarkfile.c:3155 glib/gbookmarkfile.c:3276 glib/gbookmarkfile.c:3470
+#: glib/gbookmarkfile.c:3611 glib/gbookmarkfile.c:3830 glib/gbookmarkfile.c:3919
+#: glib/gbookmarkfile.c:4008 glib/gbookmarkfile.c:4127
#, c-format
msgid "No bookmark found for URI “%s”"
msgstr "نشانکی برای نشانی «‎%s» پیدا نشد"
-#: glib/gbookmarkfile.c:2420
+#: glib/gbookmarkfile.c:2538
#, c-format
msgid "No MIME type defined in the bookmark for URI “%s”"
msgstr "هیچ گونهٔ MIMEای در نشانک برای نشانی «‎%s» تعریف نشده"
-#: glib/gbookmarkfile.c:2505
+#: glib/gbookmarkfile.c:2623
#, c-format
msgid "No private flag has been defined in bookmark for URI “%s”"
msgstr "هیچ پرچم خصوصی‌ای در نشانک برای نشانی «%s» تعریف نشده"
-#: glib/gbookmarkfile.c:3046
+#: glib/gbookmarkfile.c:3164
#, c-format
msgid "No groups set in bookmark for URI “%s”"
msgstr "هیچ گروهی در نشانک برای نشانی «‎%s» تعیین نشده"
-#: glib/gbookmarkfile.c:3514 glib/gbookmarkfile.c:3722
+#: glib/gbookmarkfile.c:3632 glib/gbookmarkfile.c:3840
#, c-format
msgid "No application with name “%s” registered a bookmark for “%s”"
msgstr "هیچ برنامه‌ای با نام «%s» نشانکی برای «‎%s» ثبت نکرده"
-#: glib/gbookmarkfile.c:3745
+#: glib/gbookmarkfile.c:3863
#, c-format
msgid "Failed to expand exec line “%s” with URI “%s”"
msgstr "شکست در گستراندن خط «‎%s» با نشانی «%s»"
@@ -4753,79 +4762,79 @@ msgstr "ب‌ظ"
msgid "Error opening directory “%s”: %s"
msgstr "خطا در گشودن شاخهٔ «‎%s»‏: %s"
-#: glib/gfileutils.c:735 glib/gfileutils.c:827
+#: glib/gfileutils.c:753 glib/gfileutils.c:845
#, c-format
msgid "Could not allocate %lu byte to read file “%s”"
msgid_plural "Could not allocate %lu bytes to read file “%s”"
msgstr[0] "نتوانست %Ilu بایت برای خواندن پروندهٔ «‎%s» تخصیص دهد"
msgstr[1] "نتوانست %Ilu بایت برای خواندن پروندهٔ «‎%s» تخصیص دهد"
-#: glib/gfileutils.c:752
+#: glib/gfileutils.c:770
#, c-format
msgid "Error reading file “%s”: %s"
msgstr "خطا در خواندن پروندهٔ «%s»: %s"
-#: glib/gfileutils.c:788
+#: glib/gfileutils.c:806
#, c-format
msgid "File “%s” is too large"
msgstr "پروندهٔ «%s» بسیار بزرگ است"
-#: glib/gfileutils.c:852
+#: glib/gfileutils.c:870
#, c-format
msgid "Failed to read from file “%s”: %s"
msgstr "شکست در خواندن از پروندهٔ «‎%s»: %s"
-#: glib/gfileutils.c:902 glib/gfileutils.c:977 glib/gfileutils.c:1449
+#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1472
#, c-format
msgid "Failed to open file “%s”: %s"
msgstr "شکست در گشودن پروندهٔ «‎%s»: %s"
-#: glib/gfileutils.c:915
+#: glib/gfileutils.c:933
#, c-format
msgid "Failed to get attributes of file “%s”: fstat() failed: %s"
msgstr "شکست در گرفتن مشخصه‌های پروندهٔ «‎%s»: fstat()‎ شکست خورد: %s"
-#: glib/gfileutils.c:946
+#: glib/gfileutils.c:964
#, c-format
msgid "Failed to open file “%s”: fdopen() failed: %s"
msgstr "شکست در گشودن پروندهٔ «‎%s»: fdopen()‎ شکست خورد: %s"
-#: glib/gfileutils.c:1047
+#: glib/gfileutils.c:1065
#, c-format
msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s"
msgstr "شکست در تغییر نام پروندهٔ «‎%s» به «‎%s»: g_rename()‎ شکست خورد: %s"
-#: glib/gfileutils.c:1156
+#: glib/gfileutils.c:1179
#, c-format
msgid "Failed to write file “%s”: write() failed: %s"
msgstr "شکست در نوشتن پروندهٔ «‎%s»: fdwrite()‎ شکست خورد: %s"
-#: glib/gfileutils.c:1177
+#: glib/gfileutils.c:1200
#, c-format
msgid "Failed to write file “%s”: fsync() failed: %s"
msgstr "شکست در نوشتن پروندهٔ «‎%s»: fsync()‎ شکست خورد: %s"
-#: glib/gfileutils.c:1338 glib/gfileutils.c:1753
+#: glib/gfileutils.c:1361 glib/gfileutils.c:1776
#, c-format
msgid "Failed to create file “%s”: %s"
msgstr "شکست در ایجاد پروندهٔ «‎%s»: %s"
-#: glib/gfileutils.c:1383
+#: glib/gfileutils.c:1406
#, c-format
msgid "Existing file “%s” could not be removed: g_unlink() failed: %s"
msgstr "پروندهٔ موجود «‎%s» نتوانست برداشته شود: g_unlink() شکست خورد: %s"
-#: glib/gfileutils.c:1718
+#: glib/gfileutils.c:1741
#, c-format
msgid "Template “%s” invalid, should not contain a “%s”"
msgstr "قالب «%s» نامعتبر است، نباید «%s» داشته باشد"
-#: glib/gfileutils.c:1731
+#: glib/gfileutils.c:1754
#, c-format
msgid "Template “%s” doesn’t contain XXXXXX"
msgstr "قالب «%s» شامل XXXXXX نیست"
-#: glib/gfileutils.c:2291 glib/gfileutils.c:2320
+#: glib/gfileutils.c:2348 glib/gfileutils.c:2377
#, c-format
msgid "Failed to read the symbolic link “%s”: %s"
msgstr "شکست در خواندن پیوند نمادین «‎%s»: %s"
@@ -4885,8 +4894,8 @@ msgid "Key file contains unsupported encoding “%s”"
msgstr "پروندهٔ کلید حاوی کدگذاری پشتیبانی نشدهٔ «%s» است"
#: glib/gkeyfile.c:1679 glib/gkeyfile.c:1852 glib/gkeyfile.c:3299
-#: glib/gkeyfile.c:3363 glib/gkeyfile.c:3493 glib/gkeyfile.c:3625
-#: glib/gkeyfile.c:3771 glib/gkeyfile.c:4006 glib/gkeyfile.c:4073
+#: glib/gkeyfile.c:3363 glib/gkeyfile.c:3493 glib/gkeyfile.c:3622
+#: glib/gkeyfile.c:3768 glib/gkeyfile.c:4003 glib/gkeyfile.c:4070
#, c-format
msgid "Key file does not have group “%s”"
msgstr "پروندهٔ کلید گروه «%s» را ندارد"
@@ -4918,31 +4927,31 @@ msgstr "پروندهٔ کلید دارای کلید «%s» در گروه «%s»
msgid "Key “%s” in group “%s” has value “%s” where %s was expected"
msgstr "کلید «%s» در گروه «%s» دارای مقدار «%s» است؛ در حالی مه انتظار %s می رفت"
-#: glib/gkeyfile.c:4326
+#: glib/gkeyfile.c:4323
msgid "Key file contains escape character at end of line"
msgstr "پرونده کلید شامل نویسهٔ گریز در انتهای خط است"
-#: glib/gkeyfile.c:4348
+#: glib/gkeyfile.c:4345
#, c-format
msgid "Key file contains invalid escape sequence “%s”"
msgstr "پروندهٔ کلید حاوی دنبالهٔ گریز نامعتبر «%s» است"
-#: glib/gkeyfile.c:4493
+#: glib/gkeyfile.c:4490
#, c-format
msgid "Value “%s” cannot be interpreted as a number."
msgstr "مقدار «%s» را نمی‌توان به عدد تفسیر کرد."
-#: glib/gkeyfile.c:4507
+#: glib/gkeyfile.c:4504
#, c-format
msgid "Integer value “%s” out of range"
msgstr "مقدار صحیح «%s» خارج از محدوده است"
-#: glib/gkeyfile.c:4540
+#: glib/gkeyfile.c:4537
#, c-format
msgid "Value “%s” cannot be interpreted as a float number."
msgstr "مقدار «%s» را نمی‌توان به عدد اعشاری تفسیر کرد."
-#: glib/gkeyfile.c:4579
+#: glib/gkeyfile.c:4576
#, c-format
msgid "Value “%s” cannot be interpreted as a boolean."
msgstr "مقدار «%s» را نمی‌توان به مقدار بولی تفسیر کرد."
@@ -4962,32 +4971,32 @@ msgstr "شکست در نگاشت %s%s%s%s: mmap()‎ شکست خورد: %s"
msgid "Failed to open file “%s”: open() failed: %s"
msgstr "شکست در گشودن «%s»: ‪open()‬ شکست خورد: %s"
-#: glib/gmarkup.c:400 glib/gmarkup.c:442
+#: glib/gmarkup.c:393 glib/gmarkup.c:435
#, c-format
msgid "Error on line %d char %d: "
msgstr "خطا در سطر %Id نویسهٔ %Id:‏ "
-#: glib/gmarkup.c:464 glib/gmarkup.c:547
+#: glib/gmarkup.c:457 glib/gmarkup.c:540
#, c-format
msgid "Invalid UTF-8 encoded text in name — not valid “%s”"
msgstr "متن کدگذاری‌شدهٔ UTF-8 نامعتبر در نام - «%s» معتبر نیست"
-#: glib/gmarkup.c:475
+#: glib/gmarkup.c:468
#, c-format
msgid "“%s” is not a valid name"
msgstr "نام «%s» معتبر نیست"
-#: glib/gmarkup.c:491
+#: glib/gmarkup.c:484
#, c-format
msgid "“%s” is not a valid name: “%c”"
msgstr "نام «%s» معتبر نیست: «%c»"
-#: glib/gmarkup.c:615
+#: glib/gmarkup.c:608
#, c-format
msgid "Error on line %d: %s"
msgstr "خطا در سطر %Id:‏ %s"
-#: glib/gmarkup.c:692
+#: glib/gmarkup.c:685
#, c-format
msgid ""
"Failed to parse “%-.*s”, which should have been a digit inside a character "
@@ -4996,7 +5005,7 @@ msgstr ""
"شکست در تجزیهٔ «‎%-.*s»، که باید رقمی داخل یک ارجاع نویسه‌ای (مثل ‎&#234;‎) باشد - "
"شاید رقم خیلی بزرگ است"
-#: glib/gmarkup.c:704
+#: glib/gmarkup.c:697
msgid ""
"Character reference did not end with a semicolon; most likely you used an "
"ampersand character without intending to start an entity — escape ampersand as "
@@ -5006,23 +5015,23 @@ msgstr ""
"موجودیتی را بیاغازید از نویسهٔ & استفاده کرده‌اید - برای نوشتن علامت & از ‎&amp;‎ "
"استفاده کنید;"
-#: glib/gmarkup.c:730
+#: glib/gmarkup.c:723
#, c-format
msgid "Character reference “%-.*s” does not encode a permitted character"
msgstr "ارجاع نویسه‌ای «‎%-.*s» به نویسهٔ مجاز اشاره نمی‌کند"
-#: glib/gmarkup.c:768
+#: glib/gmarkup.c:761
msgid "Empty entity “&;” seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
msgstr ""
"موجودیت خالی «‎&;‎» مشاهده شد؛ موجودیت‌های معتبر عبارتند از: ‎&amp; &quot; &lt; &gt; "
"&apos;"
-#: glib/gmarkup.c:776
+#: glib/gmarkup.c:769
#, c-format
msgid "Entity name “%-.*s” is not known"
msgstr "نام موجودیت «%-.*s» شناخته شده نیست"
-#: glib/gmarkup.c:781
+#: glib/gmarkup.c:774
msgid ""
"Entity did not end with a semicolon; most likely you used an ampersand character "
"without intending to start an entity — escape ampersand as &amp;"
@@ -5031,18 +5040,18 @@ msgstr ""
"موجودیتی را بیاغازید از نویسهٔ & استفاده کرده‌اید - برای نوشتن علامت & از ‎&amp;‎ "
"استفاده کنید;"
-#: glib/gmarkup.c:1195
+#: glib/gmarkup.c:1188
msgid "Document must begin with an element (e.g. <book>)"
msgstr "نوشتار باید با یک عنصر (مثلاً <book>) شروع شود"
-#: glib/gmarkup.c:1235
+#: glib/gmarkup.c:1228
#, c-format
msgid ""
"“%s” is not a valid character following a “<” character; it may not begin an "
"element name"
msgstr "«%s» پس از یک نویسهٔ '‎<‎' نویسهٔ مجازی نیست؛ نمی‌شود ابتدای نام یک عنصر باشد"
-#: glib/gmarkup.c:1278
+#: glib/gmarkup.c:1271
#, c-format
msgid ""
"Odd character “%s”, expected a “>” character to end the empty-element tag “%s”"
@@ -5050,19 +5059,19 @@ msgstr ""
"نویسهٔ غیرعادی «%s»، برای پایان دادن به برچسب عنصر خالی «%s» انتظار یک نویسهٔ «‎>‎» "
"می‌رفت"
-#: glib/gmarkup.c:1348
+#: glib/gmarkup.c:1341
#, c-format
msgid "Too many attributes in element “%s”"
msgstr ""
-#: glib/gmarkup.c:1368
+#: glib/gmarkup.c:1361
#, c-format
msgid ""
"Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”"
msgstr ""
"نویسهٔ غیرعادی «%s»، بعد از نام مشخصهٔ «%s» عنصر «%s» انتظار یک نویسهٔ «=» می‌رفت"
-#: glib/gmarkup.c:1410
+#: glib/gmarkup.c:1403
#, c-format
msgid ""
"Odd character “%s”, expected a “>” or “/” character to end the start tag of "
@@ -5073,7 +5082,7 @@ msgstr ""
"انتظار یک نویسهٔ «‎>‎» یا «/» می‌رفت؛ شاید از یک نویسهٔ نامعتبر در نام مشخصه‌ای "
"استفاده کرده باشید"
-#: glib/gmarkup.c:1455
+#: glib/gmarkup.c:1448
#, c-format
msgid ""
"Odd character “%s”, expected an open quote mark after the equals sign when "
@@ -5082,7 +5091,7 @@ msgstr ""
"نویسهٔ غیرعادی «%s»، هنگام مقدار دادن به مشخصهٔ «%s» از عنصر «%s» پس از علامت "
"تساوی انتظار یک علامت نقل قول باز می‌رفت"
-#: glib/gmarkup.c:1589
+#: glib/gmarkup.c:1582
#, c-format
msgid ""
"“%s” is not a valid character following the characters “</”; “%s” may not begin "
@@ -5091,32 +5100,32 @@ msgstr ""
"«%s» بعد از نویسه‌های «‎</‎» نویسهٔ معتبری نیست؛ «%s» نمی‌تواند ابتدای نام عناصر قرار "
"بگیرد"
-#: glib/gmarkup.c:1627
+#: glib/gmarkup.c:1620
#, c-format
msgid ""
"“%s” is not a valid character following the close element name “%s”; the allowed "
"character is “>”"
msgstr "«%s» نویسهٔ معتبری برای بستن نام عنصر «%s» نیست؛ نویسهٔ مجاز «‎<» است"
-#: glib/gmarkup.c:1639
+#: glib/gmarkup.c:1632
#, c-format
msgid "Element “%s” was closed, no element is currently open"
msgstr "عنصر «%s» بسته بود، در حال حاضر هیچ عنصری باز نیست"
-#: glib/gmarkup.c:1648
+#: glib/gmarkup.c:1641
#, c-format
msgid "Element “%s” was closed, but the currently open element is “%s”"
msgstr "عنصر «%s» بسته بود، ولی عنصری که در حال حاضر باز است «%s» است"
-#: glib/gmarkup.c:1801
+#: glib/gmarkup.c:1794
msgid "Document was empty or contained only whitespace"
msgstr "نوشتار خالی است یا فقط فاصلهٔ خالی دارد"
-#: glib/gmarkup.c:1815
+#: glib/gmarkup.c:1808
msgid "Document ended unexpectedly just after an open angle bracket “<”"
msgstr "نوشتار به‌طور غیرمنتظره‌ای درست بعد از یک علامت کوچکتر '‎<‎' پایان یافت"
-#: glib/gmarkup.c:1823 glib/gmarkup.c:1868
+#: glib/gmarkup.c:1816 glib/gmarkup.c:1861
#, c-format
msgid ""
"Document ended unexpectedly with elements still open — “%s” was the last element "
@@ -5125,7 +5134,7 @@ msgstr ""
"نوشتار وقتی که هنوز عناصری باز بودند به‌طور غیرمنتظره‌ای پایان یافت — آخرین عنصر "
"باز شده «%s» بود"
-#: glib/gmarkup.c:1831
+#: glib/gmarkup.c:1824
#, c-format
msgid ""
"Document ended unexpectedly, expected to see a close angle bracket ending the "
@@ -5134,19 +5143,19 @@ msgstr ""
"نوشتار به‌طور غیرمنتظره‌ای پایان یافت، یک علامت بزرگتر برای بستن برچسب ‎<%s/>‎ "
"انتظار می‌رفت"
-#: glib/gmarkup.c:1837
+#: glib/gmarkup.c:1830
msgid "Document ended unexpectedly inside an element name"
msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل نام یک عنصر به‌پایان رسید"
-#: glib/gmarkup.c:1843
+#: glib/gmarkup.c:1836
msgid "Document ended unexpectedly inside an attribute name"
msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل نام یک مشخصه به‌پایان رسید"
-#: glib/gmarkup.c:1848
+#: glib/gmarkup.c:1841
msgid "Document ended unexpectedly inside an element-opening tag."
msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل یک برچسب عنصربازکن پایان یافت."
-#: glib/gmarkup.c:1854
+#: glib/gmarkup.c:1847
msgid ""
"Document ended unexpectedly after the equals sign following an attribute name; "
"no attribute value"
@@ -5154,20 +5163,20 @@ msgstr ""
"نوشتار به‌طور غیرمنتظره‌ای بعد از علامت تساوی‌ای که پس از نام مشخصه‌ای آمده بود تمام "
"شد؛ بدون مقدار برای مشخصه"
-#: glib/gmarkup.c:1861
+#: glib/gmarkup.c:1854
msgid "Document ended unexpectedly while inside an attribute value"
msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل مقدار یک مشخصه به‌پایان رسید"
-#: glib/gmarkup.c:1878
+#: glib/gmarkup.c:1871
#, c-format
msgid "Document ended unexpectedly inside the close tag for element “%s”"
msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل برچسب بستن عنصر «%s» پایان یافت"
-#: glib/gmarkup.c:1882
+#: glib/gmarkup.c:1875
msgid "Document ended unexpectedly inside the close tag for an unopened element"
msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل برچسب بستن عنصر «%s» پایان یافت"
-#: glib/gmarkup.c:1888
+#: glib/gmarkup.c:1881
msgid "Document ended unexpectedly inside a comment or processing instruction"
msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل یک توضیح یا دستورالعمل پردازشی پایان یافت"
@@ -5230,300 +5239,300 @@ msgstr "‏%s یک آرگومان کم دارد"
msgid "Unknown option %s"
msgstr "گزینهٔ نامعلوم %s"
-#: glib/gregex.c:436
+#: glib/gregex.c:479
msgid "corrupted object"
msgstr "شیء ناقص"
-#: glib/gregex.c:438
+#: glib/gregex.c:481
msgid "out of memory"
msgstr "حافظه کم است"
-#: glib/gregex.c:443
+#: glib/gregex.c:487
msgid "backtracking limit reached"
msgstr "محدودیت backtracking فرارسید"
-#: glib/gregex.c:454 glib/gregex.c:707 glib/gregex.c:736
+#: glib/gregex.c:498
msgid "internal error"
msgstr "خطا داخلی"
-#: glib/gregex.c:456
+#: glib/gregex.c:500
msgid "the pattern contains items not supported for partial matching"
msgstr "الگو حاوی مواردی است که برای مطابقت جزئی مناسب نیست"
-#: glib/gregex.c:458
+#: glib/gregex.c:502
msgid "back references as conditions are not supported for partial matching"
msgstr ""
-#: glib/gregex.c:464
+#: glib/gregex.c:508
msgid "recursion limit reached"
msgstr "محدودیت تکرار فرارسید"
-#: glib/gregex.c:466
+#: glib/gregex.c:510
msgid "bad offset"
msgstr "جابه‌جایی نادرست"
-#: glib/gregex.c:468
+#: glib/gregex.c:512
msgid "recursion loop"
msgstr ""
#. should not happen in GRegex since we check modes before each match
-#: glib/gregex.c:471
+#: glib/gregex.c:515
msgid "matching mode is requested that was not compiled for JIT"
msgstr ""
-#: glib/gregex.c:475
+#: glib/gregex.c:536 glib/gregex.c:1838
msgid "unknown error"
msgstr "خطا نادرست"
-#: glib/gregex.c:496
+#: glib/gregex.c:557
msgid "\\ at end of pattern"
msgstr "\\ در پایان الگو"
-#: glib/gregex.c:500
+#: glib/gregex.c:561
msgid "\\c at end of pattern"
msgstr "\\c در پایان الگو"
-#: glib/gregex.c:505
+#: glib/gregex.c:566
msgid "unrecognized character following \\"
msgstr "نویسهٔ ناشناخته پس از \\"
-#: glib/gregex.c:509
+#: glib/gregex.c:570
msgid "numbers out of order in {} quantifier"
msgstr "اعداد بدون ترتیل در کمیت‌سنج {}"
-#: glib/gregex.c:513
+#: glib/gregex.c:574
msgid "number too big in {} quantifier"
msgstr "اعداد در کمیت‌سنج {} بسیار بزرگ هستند"
-#: glib/gregex.c:517
+#: glib/gregex.c:578
msgid "missing terminating ] for character class"
msgstr "بدون [ پایان‌دهنده برای کلاس نویسه"
-#: glib/gregex.c:521
+#: glib/gregex.c:582
msgid "invalid escape sequence in character class"
msgstr "دنبالهٔ گریز نامعتبر در کلاس نویسه"
-#: glib/gregex.c:525
+#: glib/gregex.c:586
msgid "range out of order in character class"
msgstr "محدوده در کلاس نویسه بدون ترتیب است"
-#: glib/gregex.c:530
+#: glib/gregex.c:591
msgid "nothing to repeat"
msgstr "چیزی برای تکرار نیست"
-#: glib/gregex.c:534
+#: glib/gregex.c:595
msgid "unrecognized character after (? or (?-"
msgstr "نویسهٔ ناشناس پس از ‪(?‬ یا ‪(?-"
-#: glib/gregex.c:538
+#: glib/gregex.c:599
msgid "POSIX named classes are supported only within a class"
msgstr ""
-#: glib/gregex.c:542
+#: glib/gregex.c:603
msgid "POSIX collating elements are not supported"
msgstr "عنصرهای تطبیق با POSIX پشتیبانی نمی‌شوند"
-#: glib/gregex.c:548
+#: glib/gregex.c:609
msgid "missing terminating )"
msgstr ""
-#: glib/gregex.c:552
+#: glib/gregex.c:613
msgid "reference to non-existent subpattern"
msgstr ""
-#: glib/gregex.c:556
+#: glib/gregex.c:617
msgid "missing ) after comment"
msgstr ""
-#: glib/gregex.c:560
+#: glib/gregex.c:621
msgid "regular expression is too large"
msgstr "عبارت باقاعده بیش از حد بلند است"
-#: glib/gregex.c:564
+#: glib/gregex.c:625
msgid "malformed number or name after (?("
msgstr ""
-#: glib/gregex.c:568
+#: glib/gregex.c:629
msgid "lookbehind assertion is not fixed length"
msgstr ""
-#: glib/gregex.c:572
+#: glib/gregex.c:633
msgid "conditional group contains more than two branches"
msgstr ""
-#: glib/gregex.c:576
+#: glib/gregex.c:637
msgid "assertion expected after (?("
msgstr ""
-#: glib/gregex.c:580
+#: glib/gregex.c:641
msgid "a numbered reference must not be zero"
msgstr ""
-#: glib/gregex.c:584
+#: glib/gregex.c:645
msgid "unknown POSIX class name"
msgstr "نام کلاس POSIX ناشناخته"
-#: glib/gregex.c:589
+#: glib/gregex.c:650
msgid "character value in \\x{...} sequence is too large"
msgstr ""
-#: glib/gregex.c:593
+#: glib/gregex.c:654
msgid "\\C not allowed in lookbehind assertion"
msgstr ""
-#: glib/gregex.c:597
+#: glib/gregex.c:658
msgid "missing terminator in subpattern name"
msgstr ""
-#: glib/gregex.c:601
+#: glib/gregex.c:662
msgid "two named subpatterns have the same name"
msgstr ""
-#: glib/gregex.c:605
+#: glib/gregex.c:666
msgid "malformed \\P or \\p sequence"
msgstr ""
-#: glib/gregex.c:609
+#: glib/gregex.c:670
msgid "unknown property name after \\P or \\p"
msgstr "خصیصهٔ ناشناس پس از \\P یا \\p"
-#: glib/gregex.c:613
+#: glib/gregex.c:674
msgid "subpattern name is too long (maximum 32 characters)"
msgstr ""
-#: glib/gregex.c:617
+#: glib/gregex.c:678
msgid "too many named subpatterns (maximum 10,000)"
msgstr ""
-#: glib/gregex.c:621
+#: glib/gregex.c:682
msgid "octal value is greater than \\377"
msgstr ""
-#: glib/gregex.c:625
+#: glib/gregex.c:686
msgid "DEFINE group contains more than one branch"
msgstr ""
-#: glib/gregex.c:629
+#: glib/gregex.c:690
msgid "inconsistent NEWLINE options"
msgstr ""
-#: glib/gregex.c:633
+#: glib/gregex.c:694
msgid ""
"\\g is not followed by a braced, angle-bracketed, or quoted name or number, or "
"by a plain number"
msgstr ""
-#: glib/gregex.c:638
+#: glib/gregex.c:699
msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)"
msgstr ""
-#: glib/gregex.c:642
+#: glib/gregex.c:703
msgid "(*VERB) not recognized"
msgstr ""
-#: glib/gregex.c:646
+#: glib/gregex.c:707
msgid "number is too big"
-msgstr ""
+msgstr "عدد بیش از حد بزرگ است"
-#: glib/gregex.c:650
+#: glib/gregex.c:711
msgid "missing subpattern name after (?&"
msgstr ""
-#: glib/gregex.c:654
+#: glib/gregex.c:715
msgid "different names for subpatterns of the same number are not allowed"
msgstr ""
-#: glib/gregex.c:658
+#: glib/gregex.c:719
msgid "(*MARK) must have an argument"
msgstr ""
-#: glib/gregex.c:662
+#: glib/gregex.c:723
msgid "\\c must be followed by an ASCII character"
msgstr ""
-#: glib/gregex.c:666
+#: glib/gregex.c:727
msgid "\\k is not followed by a braced, angle-bracketed, or quoted name"
msgstr ""
-#: glib/gregex.c:670
+#: glib/gregex.c:731
msgid "\\N is not supported in a class"
msgstr "از ‪/N‬ در یک کلاس پشتیبانی نمی‌شود"
-#: glib/gregex.c:674
+#: glib/gregex.c:735
msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)"
msgstr "نام در (*MARK)، (*PRUNE)، (*SKIP) یا (*THEN) بیش از حد طولانی است."
-#: glib/gregex.c:678 glib/gregex.c:809
+#: glib/gregex.c:739 glib/gregex.c:875
msgid "code overflow"
msgstr "سرریز کد"
-#: glib/gregex.c:682
+#: glib/gregex.c:743
msgid "unrecognized character after (?P"
msgstr "نویسه ناشناس بعد از (?P"
-#: glib/gregex.c:686
+#: glib/gregex.c:747
msgid "overran compiling workspace"
msgstr "فضای کاری ترجمهٔ پایمال شده"
-#: glib/gregex.c:690
+#: glib/gregex.c:751
msgid "previously-checked referenced subpattern not found"
msgstr "زیرالگوی ارجاع شدهٔ پیش‌تر بررسی شده پیدا نشد"
-#: glib/gregex.c:808 glib/gregex.c:1041 glib/gregex.c:2342
+#: glib/gregex.c:874 glib/gregex.c:1121 glib/gregex.c:2444
#, c-format
msgid "Error while matching regular expression %s: %s"
msgstr "خطا در هنگام منطبق کردن عبارت باقاعده %s: %s"
-#: glib/gregex.c:1618
+#: glib/gregex.c:1721
msgid "PCRE library is compiled without UTF8 support"
msgstr "کتابخانه PCRE بدون پشتیبانی از UTF8 کامپایل شده است"
-#: glib/gregex.c:1626
+#: glib/gregex.c:1729
msgid "PCRE library is compiled with incompatible options"
msgstr "کتابخانهٔ PCRE با گزینه‌هایی ناسازگار ترجمه شده"
-#: glib/gregex.c:1751
+#: glib/gregex.c:1847
#, c-format
msgid "Error while compiling regular expression ‘%s’ at char %s: %s"
msgstr "خطا هنگام ترجمهٔ عبارت با قاعدهٔ «%s» در نویسهٔ %s: %s"
-#: glib/gregex.c:2786
+#: glib/gregex.c:2887
msgid "hexadecimal digit or “}” expected"
msgstr "انتظار رقم شانزده‌شانزدهی یا «}» می‌رفت"
-#: glib/gregex.c:2802
+#: glib/gregex.c:2903
msgid "hexadecimal digit expected"
msgstr "رقم هگزادسیمال مورد انتظار بود"
-#: glib/gregex.c:2842
+#: glib/gregex.c:2943
msgid "missing “<” in symbolic reference"
msgstr "بدون «>» در ارجاع نمادین"
-#: glib/gregex.c:2851
+#: glib/gregex.c:2952
msgid "unfinished symbolic reference"
msgstr "ارجاع نمادین ناتمام"
-#: glib/gregex.c:2858
+#: glib/gregex.c:2959
msgid "zero-length symbolic reference"
msgstr "مرجع نمادین با طول صفر"
-#: glib/gregex.c:2869
+#: glib/gregex.c:2970
msgid "digit expected"
msgstr "انتظار رقم می‌رفت"
-#: glib/gregex.c:2887
+#: glib/gregex.c:2988
msgid "illegal symbolic reference"
msgstr "ارجاع نمادین غیرقانونی"
-#: glib/gregex.c:2950
+#: glib/gregex.c:3051
msgid "stray final “\\”"
msgstr "«\\» پایانی سرگردان"
-#: glib/gregex.c:2954
+#: glib/gregex.c:3055
msgid "unknown escape sequence"
msgstr "دنبالهٔ گریز ناشناخته"
-#: glib/gregex.c:2964
+#: glib/gregex.c:3065
#, c-format
msgid "Error while parsing replacement text “%s” at char %lu: %s"
msgstr "خطا هنگام تجزیه کردن متن جایگزین «%s» در نویسهٔ %lu: %s"
@@ -5552,96 +5561,101 @@ msgstr ""
msgid "Text was empty (or contained only whitespace)"
msgstr "متن خالی بود (یا فقط فاصلهٔ خالی داشت)"
-#: glib/gspawn.c:314
+#: glib/gspawn.c:319
#, c-format
msgid "Failed to read data from child process (%s)"
msgstr "خواندن داده‌ها از فرایند فرزند شکست خورد (%s)"
-#: glib/gspawn.c:466
+#: glib/gspawn.c:471
#, c-format
msgid "Unexpected error in reading data from a child process (%s)"
msgstr "خطای غیرمنتظره در خواندن داده‌ها از یک فرایند فرزند (%s)"
-#: glib/gspawn.c:551
+#: glib/gspawn.c:556
#, c-format
msgid "Unexpected error in waitpid() (%s)"
msgstr "خطای غیرمنتظره در waitpid()‎ ‏(%s)"
-#: glib/gspawn.c:1170 glib/gspawn-win32.c:1488
+#: glib/gspawn.c:1175 glib/gspawn-win32.c:1503
#, c-format
msgid "Child process exited with code %ld"
msgstr "فرایند فرزند با رمز %ld خارج شد"
-#: glib/gspawn.c:1178
+#: glib/gspawn.c:1183
#, c-format
msgid "Child process killed by signal %ld"
msgstr "فرایند فرزند به دست سیگنال %ld کشته شد"
-#: glib/gspawn.c:1185
+#: glib/gspawn.c:1190
#, c-format
msgid "Child process stopped by signal %ld"
msgstr "فرایند فرزند به دست سیگنال %ld متوقّف شد"
-#: glib/gspawn.c:1192
+#: glib/gspawn.c:1197
#, c-format
msgid "Child process exited abnormally"
msgstr "فرایند فرزند به طور غیر معمول خارج شد"
-#: glib/gspawn.c:1885 glib/gspawn-win32.c:393 glib/gspawn-win32.c:401
+#: glib/gspawn.c:2027 glib/gspawn-win32.c:393 glib/gspawn-win32.c:401
#, c-format
msgid "Failed to read from child pipe (%s)"
msgstr "خواندن از لولهٔ فرزند شکست خورد (%s)"
-#: glib/gspawn.c:2248
+#: glib/gspawn.c:2399
#, c-format
msgid "Failed to spawn child process “%s” (%s)"
msgstr "انشعاب فرایند فرزند «%s» شکست خورد (%s)"
-#: glib/gspawn.c:2365
+#: glib/gspawn.c:2525
#, c-format
msgid "Failed to fork (%s)"
msgstr "انشعاب شکست خورد (%s)"
-#: glib/gspawn.c:2525 glib/gspawn-win32.c:424
+#: glib/gspawn.c:2685 glib/gspawn-win32.c:424
#, c-format
msgid "Failed to change to directory “%s” (%s)"
msgstr "تغییر به شاخهٔ «%s» شکست خورد: (%s)"
-#: glib/gspawn.c:2535
+#: glib/gspawn.c:2695
#, c-format
msgid "Failed to execute child process “%s” (%s)"
msgstr "اجرای فرایند فرزند «%s» شکست خورد (%s)"
-#: glib/gspawn.c:2545
+#: glib/gspawn.c:2705
#, c-format
msgid "Failed to open file to remap file descriptor (%s)"
msgstr "شکست در گشودن شرح‌دهندهٔ پروندهٔ بازنگاشت (%s)"
-#: glib/gspawn.c:2553
+#: glib/gspawn.c:2713
#, c-format
msgid "Failed to duplicate file descriptor for child process (%s)"
msgstr "شکست در تکرار شرح‌دهندهٔ پرونده برای فرایند فرزند (%s)"
-#: glib/gspawn.c:2562
+#: glib/gspawn.c:2722
#, c-format
msgid "Failed to fork child process (%s)"
msgstr "انشعاب فرایند فرزند شکست خورد (%s)"
-#: glib/gspawn.c:2570
+#: glib/gspawn.c:2730
#, c-format
msgid "Failed to close file descriptor for child process (%s)"
msgstr "شکست در بستن شرح‌دهندهٔ پرونده برای فرایند فرزند (%s)"
-#: glib/gspawn.c:2578
+#: glib/gspawn.c:2738
#, c-format
msgid "Unknown error executing child process “%s”"
msgstr "خطای ناشناخته در اجرای فرایند فرزند «%s»"
-#: glib/gspawn.c:2602
+#: glib/gspawn.c:2762
#, c-format
msgid "Failed to read enough data from child pid pipe (%s)"
msgstr "خواندن دادهٔ کافی از لولهٔ pid فرزند شکست خورد (%s)"
+#: glib/gspawn-private.h:134
+#, c-format
+msgid "Invalid source FDs argument"
+msgstr "آرگومان FDs منبع نامعتبر"
+
#: glib/gspawn-win32.c:337
msgid "Failed to read data from child process"
msgstr "خواندن داده‌ها از فرایند فرزند شکست خورد"
@@ -5661,48 +5675,48 @@ msgstr "شکست در ‪dup()‬ در فرایند فرزند (%s)"
msgid "Invalid program name: %s"
msgstr "نام برنامهٔ نامعتبر: %s"
-#: glib/gspawn-win32.c:521 glib/gspawn-win32.c:853
+#: glib/gspawn-win32.c:521 glib/gspawn-win32.c:868
#, c-format
msgid "Invalid string in argument vector at %d: %s"
msgstr "رشتهٔ نامعتبر در بردار آرگومان درآیهٔ %Id: %s"
-#: glib/gspawn-win32.c:532 glib/gspawn-win32.c:869
+#: glib/gspawn-win32.c:532 glib/gspawn-win32.c:884
#, c-format
msgid "Invalid string in environment: %s"
msgstr "رشتهٔ نامعتبر در محیط: %s"
-#: glib/gspawn-win32.c:849
+#: glib/gspawn-win32.c:864
#, c-format
msgid "Invalid working directory: %s"
msgstr "شاخهٔ کاری نامعتبر‏: %s"
-#: glib/gspawn-win32.c:914
+#: glib/gspawn-win32.c:929
#, c-format
msgid "Failed to execute helper program (%s)"
msgstr "اجرای برنامهٔ راهنما (‎%s) شکست خورد"
-#: glib/gspawn-win32.c:1143
+#: glib/gspawn-win32.c:1158
msgid ""
"Unexpected error in g_io_channel_win32_poll() reading data from a child process"
msgstr ""
"خطای غیرمنتظره در g_io_channel_win32_poll()‎ هنگام خواندن داده‌ها از یک فرایند "
"فرزند"
-#: glib/gstrfuncs.c:3372 glib/gstrfuncs.c:3474
+#: glib/gstrfuncs.c:3370 glib/gstrfuncs.c:3472
msgid "Empty string is not a number"
msgstr "رشتهٔ خالی یک شماره نیست"
-#: glib/gstrfuncs.c:3396
+#: glib/gstrfuncs.c:3394
#, c-format
msgid "“%s” is not a signed number"
msgstr "«%s» عددی علامت‌دار نیست"
-#: glib/gstrfuncs.c:3406 glib/gstrfuncs.c:3510
+#: glib/gstrfuncs.c:3404 glib/gstrfuncs.c:3508
#, c-format
msgid "Number “%s” is out of bounds [%s, %s]"
msgstr "شمارهٔ «%s» خارج از محدودهٔ [%s, %s] است"
-#: glib/gstrfuncs.c:3500
+#: glib/gstrfuncs.c:3498
#, c-format
msgid "“%s” is not an unsigned number"
msgstr "«%s» عددی بدون علامت نیست"
@@ -5781,132 +5795,132 @@ msgid "Character out of range for UTF-16"
msgstr "نویسهٔ خارج از محدوده برای UTF-16"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 kB"
-#: glib/gutils.c:2857
+#: glib/gutils.c:2966
msgid "kB"
msgstr "ک‌ب"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 MB"
-#: glib/gutils.c:2859
+#: glib/gutils.c:2968
msgid "MB"
msgstr "م‌ب"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 GB"
-#: glib/gutils.c:2861
+#: glib/gutils.c:2970
msgid "GB"
msgstr "گ‌ب"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 TB"
-#: glib/gutils.c:2863
+#: glib/gutils.c:2972
msgid "TB"
msgstr "ت‌ب"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 PB"
-#: glib/gutils.c:2865
+#: glib/gutils.c:2974
msgid "PB"
msgstr "پ‌ب"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 EB"
-#: glib/gutils.c:2867
+#: glib/gutils.c:2976
msgid "EB"
msgstr "اِب"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 KiB"
-#: glib/gutils.c:2871
+#: glib/gutils.c:2980
msgid "KiB"
msgstr "کی‌ب"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 MiB"
-#: glib/gutils.c:2873
+#: glib/gutils.c:2982
msgid "MiB"
msgstr "می‌ب"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 GiB"
-#: glib/gutils.c:2875
+#: glib/gutils.c:2984
msgid "GiB"
msgstr "گی‌ب"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 TiB"
-#: glib/gutils.c:2877
+#: glib/gutils.c:2986
msgid "TiB"
msgstr "تی‌ب"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 PiB"
-#: glib/gutils.c:2879
+#: glib/gutils.c:2988
msgid "PiB"
msgstr "پی‌ب"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 EiB"
-#: glib/gutils.c:2881
+#: glib/gutils.c:2990
msgid "EiB"
msgstr "ای‌ب"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 kb"
-#: glib/gutils.c:2885
+#: glib/gutils.c:2994
msgid "kb"
msgstr "ک‌بی"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mb"
-#: glib/gutils.c:2887
+#: glib/gutils.c:2996
msgid "Mb"
msgstr "م‌بی"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gb"
-#: glib/gutils.c:2889
+#: glib/gutils.c:2998
msgid "Gb"
msgstr "گ‌بی"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tb"
-#: glib/gutils.c:2891
+#: glib/gutils.c:3000
msgid "Tb"
msgstr "ت‌بی"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pb"
-#: glib/gutils.c:2893
+#: glib/gutils.c:3002
msgid "Pb"
msgstr "پ‌بی"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eb"
-#: glib/gutils.c:2895
+#: glib/gutils.c:3004
msgid "Eb"
msgstr "اِبی"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kib"
-#: glib/gutils.c:2899
+#: glib/gutils.c:3008
msgid "Kib"
msgstr "کی‌بی"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mib"
-#: glib/gutils.c:2901
+#: glib/gutils.c:3010
msgid "Mib"
msgstr "می‌بی"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gib"
-#: glib/gutils.c:2903
+#: glib/gutils.c:3012
msgid "Gib"
msgstr "گی‌بی"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tib"
-#: glib/gutils.c:2905
+#: glib/gutils.c:3014
msgid "Tib"
msgstr "تی‌بی"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pib"
-#: glib/gutils.c:2907
+#: glib/gutils.c:3016
msgid "Pib"
msgstr "پی‌بی"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eib"
-#: glib/gutils.c:2909
+#: glib/gutils.c:3018
msgid "Eib"
msgstr "ای‌بی"
-#: glib/gutils.c:2947
+#: glib/gutils.c:3056
msgid "byte"
msgid_plural "bytes"
msgstr[0] "بایت"
msgstr[1] "بایت"
-#: glib/gutils.c:2951
+#: glib/gutils.c:3060
msgid "bit"
msgid_plural "bits"
msgstr[0] "بیت"
@@ -5914,7 +5928,7 @@ msgstr[1] "بیت"
#. Translators: The "%u" is replaced with the size value, like "13"; it could
#. * be part of "13 bytes", but only the number is requested this time.
-#: glib/gutils.c:2959
+#: glib/gutils.c:3068
#, c-format
msgctxt "format-size"
msgid "%u"
@@ -5922,7 +5936,7 @@ msgstr "%Iu"
#. Translators: The first "%u" is replaced with the value, the "%s" with a unit of the value.
#. * The order can be changed with "%$2s %$1u". An example: "13 bytes"
-#: glib/gutils.c:2964
+#: glib/gutils.c:3073
#, c-format
msgctxt "format-size"
msgid "%u %s"
@@ -5930,7 +5944,7 @@ msgstr "%Iu %s"
#. Translators: The "%.1f" is replaced with the size value, like "13.0"; it could
#. * be part of "13.0 MB", but only the number is requested this time.
-#: glib/gutils.c:3000
+#: glib/gutils.c:3109
#, c-format
msgctxt "format-size"
msgid "%.1f"
@@ -5939,14 +5953,14 @@ msgstr "%I.1f"
#. Translators: The first "%.1f" is replaced with the value, the "%s" with a unit of the value.
#. * The order can be changed with "%$2s %$1.1f". Keep the no-break space between the value and
#. * the unit symbol. An example: "13.0 MB"
-#: glib/gutils.c:3006
+#: glib/gutils.c:3115
#, c-format
msgctxt "format-size"
msgid "%.1f %s"
msgstr "%I.1f %s"
#. Translators: the %s in "%s bytes" will always be replaced by a number.
-#: glib/gutils.c:3046
+#: glib/gutils.c:3155
#, c-format
msgid "%s byte"
msgid_plural "%s bytes"
@@ -5954,14 +5968,14 @@ msgstr[0] "%s بایت"
msgstr[1] "%s بایت"
#. Translators: the %s in "%s bits" will always be replaced by a number.
-#: glib/gutils.c:3051
+#: glib/gutils.c:3160
#, c-format
msgid "%s bit"
msgid_plural "%s bits"
msgstr[0] "%s بیت"
msgstr[1] "%s بیت"
-#: glib/gutils.c:3092
+#: glib/gutils.c:3201
#, c-format
msgid "%u byte"
msgid_plural "%u bytes"
@@ -5973,32 +5987,32 @@ msgstr[1] "%Iu بایت"
#. * compatibility. Users will not see this string unless a program is using this deprecated function.
#. * Please translate as literally as possible.
#.
-#: glib/gutils.c:3105
+#: glib/gutils.c:3214
#, c-format
msgid "%.1f KB"
msgstr "%I.1f کیلوبایت"
-#: glib/gutils.c:3110
+#: glib/gutils.c:3219
#, c-format
msgid "%.1f MB"
msgstr "%I.1f مگابایت"
-#: glib/gutils.c:3115
+#: glib/gutils.c:3224
#, c-format
msgid "%.1f GB"
msgstr "%I.1f گیگابایت"
-#: glib/gutils.c:3120
+#: glib/gutils.c:3229
#, c-format
msgid "%.1f TB"
msgstr "%I.1f ترابایت"
-#: glib/gutils.c:3125
+#: glib/gutils.c:3234
#, c-format
msgid "%.1f PB"
msgstr "%I.1f پتابایت"
-#: glib/gutils.c:3130
+#: glib/gutils.c:3239
#, c-format
msgid "%.1f EB"
msgstr "%I.1f اگزابایت"
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 593a356de..b5ba32d51 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -18,14 +18,15 @@
# Mingcong Bai <jeffbai@aosc.xyz>, 2015, 2016, 2018.
# Dingzhong Chen <wsxy162@gmail.com>, 2018-2021.
# lumingzh <lumingzh@qq.com>, 2022.
+# Nanling <neithern@outlook.com>, 2023.
#
msgid ""
msgstr ""
"Project-Id-Version: glib master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n"
-"POT-Creation-Date: 2022-08-31 23:44+0000\n"
-"PO-Revision-Date: 2022-09-11 07:57+0800\n"
-"Last-Translator: lumingzh <lumingzh@qq.com>\n"
+"POT-Creation-Date: 2023-02-15 16:30+0000\n"
+"PO-Revision-Date: 2023-03-26 11:52+0800\n"
+"Last-Translator: Nanling <neithern@outlook.com>\n"
"Language-Team: Chinese - China <i18n-zh@googlegroups.com>\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
@@ -34,20 +35,20 @@ msgstr ""
"Plural-Forms: nplurals=1; plural=0\n"
"X-Generator: Gtranslator 42.0\n"
-#: gio/gappinfo.c:335
+#: gio/gappinfo.c:339
msgid "Setting default applications not supported yet"
msgstr "暂不支持设置默认应用程序"
-#: gio/gappinfo.c:368
+#: gio/gappinfo.c:372
msgid "Setting application as last used for type not supported yet"
msgstr "暂不支持设置上次用来打开文件类型的应用程序"
-#: gio/gappinfo.c:810
+#: gio/gappinfo.c:814
#, c-format
msgid "Failed to find default application for content type ‘%s’"
msgstr "无法找到处理内容类型“%s”的默认应用程序"
-#: gio/gappinfo.c:870
+#: gio/gappinfo.c:874
#, c-format
msgid "Failed to find default application for URI Scheme ‘%s’"
msgstr "无法找到处理 URI Scheme“%s”的默认应用程序"
@@ -244,11 +245,11 @@ msgstr "无法连接到 D-Bus:%s\n"
msgid "error sending %s message to application: %s\n"
msgstr "给应用程序发送 %s 消息时出错:%s\n"
-#: gio/gapplication-tool.c:321
+#: gio/gapplication-tool.c:324
msgid "action name must be given after application id\n"
msgstr "操作名必须在应用程序 ID 后给出\n"
-#: gio/gapplication-tool.c:329
+#: gio/gapplication-tool.c:332
#, c-format
msgid ""
"invalid action name: “%s”\n"
@@ -257,25 +258,25 @@ msgstr ""
"无效的操作名:“%s”\n"
"操作名只能由字母数字、“-”和“.”组成\n"
-#: gio/gapplication-tool.c:348
+#: gio/gapplication-tool.c:351
#, c-format
msgid "error parsing action parameter: %s\n"
msgstr "解析操作参数时出错:%s\n"
-#: gio/gapplication-tool.c:360
+#: gio/gapplication-tool.c:363
msgid "actions accept a maximum of one parameter\n"
msgstr "操作最多接受一个参数\n"
-#: gio/gapplication-tool.c:415
+#: gio/gapplication-tool.c:418
msgid "list-actions command takes only the application id"
msgstr "list-actions 命令只能接受应用程序的 ID"
-#: gio/gapplication-tool.c:425
+#: gio/gapplication-tool.c:428
#, c-format
msgid "unable to find desktop file for application %s\n"
msgstr "找不到与应用程序 %s 对应的桌面文件\n"
-#: gio/gapplication-tool.c:470
+#: gio/gapplication-tool.c:473
#, c-format
msgid ""
"unrecognised command: %s\n"
@@ -310,7 +311,7 @@ msgstr "流已经关闭"
msgid "Truncate not supported on base stream"
msgstr "基流不支持截断"
-#: gio/gcancellable.c:319 gio/gdbusconnection.c:1859 gio/gdbusprivate.c:1420
+#: gio/gcancellable.c:326 gio/gdbusconnection.c:1859 gio/gdbusprivate.c:1420
#: gio/gsimpleasyncresult.c:873 gio/gsimpleasyncresult.c:899
#, c-format
msgid "Operation was cancelled"
@@ -330,13 +331,13 @@ msgstr "目标位置没有足够的空间"
#: gio/gcharsetconverter.c:344 gio/gdatainputstream.c:850
#: gio/gdatainputstream.c:1268 glib/gconvert.c:451 glib/gconvert.c:883
-#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2473
+#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2478
#: glib/gutf8.c:892 glib/gutf8.c:1346
msgid "Invalid byte sequence in conversion input"
msgstr "转换输入中有无效的字符序列"
#: gio/gcharsetconverter.c:349 glib/gconvert.c:459 glib/gconvert.c:797
-#: glib/giochannel.c:1583 glib/giochannel.c:2485
+#: glib/giochannel.c:1583 glib/giochannel.c:2493
#, c-format
msgid "Error during conversion: %s"
msgstr "转换过程中出错:%s"
@@ -393,153 +394,153 @@ msgstr "此操作系统上无法进行证书欺骗"
msgid "Unexpected early end-of-stream"
msgstr "非预期的过早的流结束符"
-#: gio/gdbusaddress.c:164 gio/gdbusaddress.c:238 gio/gdbusaddress.c:327
+#: gio/gdbusaddress.c:162 gio/gdbusaddress.c:234 gio/gdbusaddress.c:321
#, c-format
msgid "Unsupported key “%s” in address entry “%s”"
msgstr "地址条目“%2$s”中有未支持的键“%1$s”"
-#: gio/gdbusaddress.c:177
+#: gio/gdbusaddress.c:175
#, c-format
msgid "Meaningless key/value pair combination in address entry “%s”"
msgstr "地址条目“%s”中有无意义的键/值对组合"
-#: gio/gdbusaddress.c:186
+#: gio/gdbusaddress.c:184
#, c-format
msgid ""
"Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract "
"keys)"
msgstr "地址“%s”无效(需要指定一个且仅一个的路径、目录、临时目录或抽象键)"
-#: gio/gdbusaddress.c:253 gio/gdbusaddress.c:264 gio/gdbusaddress.c:279
-#: gio/gdbusaddress.c:342 gio/gdbusaddress.c:353
+#: gio/gdbusaddress.c:249 gio/gdbusaddress.c:260 gio/gdbusaddress.c:275
+#: gio/gdbusaddress.c:336 gio/gdbusaddress.c:347
#, c-format
msgid "Error in address “%s” — the “%s” attribute is malformed"
msgstr "地址“%s”中有错误——\"%s\"属性格式错误"
-#: gio/gdbusaddress.c:423 gio/gdbusaddress.c:682
+#: gio/gdbusaddress.c:417 gio/gdbusaddress.c:676
#, c-format
msgid "Unknown or unsupported transport “%s” for address “%s”"
msgstr "传输“%s”对于地址“%s”未知或不支持"
-#: gio/gdbusaddress.c:467
+#: gio/gdbusaddress.c:461
#, c-format
msgid "Address element “%s” does not contain a colon (:)"
msgstr "地址元素“%s”未包含冒号(:)"
-#: gio/gdbusaddress.c:476
+#: gio/gdbusaddress.c:470
#, c-format
msgid "Transport name in address element “%s” must not be empty"
msgstr "地址元素“%s”中的传输名称不能为空"
-#: gio/gdbusaddress.c:497
+#: gio/gdbusaddress.c:491
#, c-format
msgid ""
"Key/Value pair %d, “%s”, in address element “%s” does not contain an equal "
"sign"
msgstr "地址元素“%3$s”中的第 %1$d 个键/值对 “%2$s”未包含等号"
-#: gio/gdbusaddress.c:508
+#: gio/gdbusaddress.c:502
#, c-format
msgid ""
"Key/Value pair %d, “%s”, in address element “%s” must not have an empty key"
msgstr "地址元素“%3$s”中的第 %1$d 个键/值对 “%2$s”不能有空的键"
# 改掉顿号,因其不是并列关系
-#: gio/gdbusaddress.c:522
+#: gio/gdbusaddress.c:516
#, c-format
msgid ""
"Error unescaping key or value in Key/Value pair %d, “%s”, in address element "
"“%s”"
msgstr "在地址元素“%3$s”中,对键/值对 %1$d,“%2$s”取消转义键或值时出错"
-#: gio/gdbusaddress.c:590
+#: gio/gdbusaddress.c:584
#, c-format
msgid ""
"Error in address “%s” — the unix transport requires exactly one of the keys "
"“path” or “abstract” to be set"
msgstr "地址“%s”中有错误——UNIX 传输需要“path”或“abstract”之一的键被设置"
-#: gio/gdbusaddress.c:625
+#: gio/gdbusaddress.c:619
#, c-format
msgid "Error in address “%s” — the host attribute is missing or malformed"
msgstr "地址“%s”中有错误——主机属性丢失或格式错误"
-#: gio/gdbusaddress.c:639
+#: gio/gdbusaddress.c:633
#, c-format
msgid "Error in address “%s” — the port attribute is missing or malformed"
msgstr "地址“%s”中有错误——端口属性丢失或格式错误"
-#: gio/gdbusaddress.c:653
+#: gio/gdbusaddress.c:647
#, c-format
msgid "Error in address “%s” — the noncefile attribute is missing or malformed"
msgstr "地址“%s”中有错误——临时文件属性丢失或格式错误"
-#: gio/gdbusaddress.c:674
+#: gio/gdbusaddress.c:668
msgid "Error auto-launching: "
msgstr "自动启动出错:"
-#: gio/gdbusaddress.c:727
+#: gio/gdbusaddress.c:721
#, c-format
msgid "Error opening nonce file “%s”: %s"
msgstr "打开临时文件“%s”时出错:%s"
-#: gio/gdbusaddress.c:746
+#: gio/gdbusaddress.c:740
#, c-format
msgid "Error reading from nonce file “%s”: %s"
msgstr "读取临时文件“%s”时出错:%s"
-#: gio/gdbusaddress.c:755
+#: gio/gdbusaddress.c:749
#, c-format
msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d"
msgstr "读取临时文件“%s”时出错,预计 16 个字节,得到 %d 个"
-#: gio/gdbusaddress.c:773
+#: gio/gdbusaddress.c:767
#, c-format
msgid "Error writing contents of nonce file “%s” to stream:"
msgstr "写入临时文件“%s”的内容到流时出错:"
-#: gio/gdbusaddress.c:988
+#: gio/gdbusaddress.c:982
msgid "The given address is empty"
msgstr "给定的地址为空"
-#: gio/gdbusaddress.c:1101
+#: gio/gdbusaddress.c:1095
#, c-format
msgid "Cannot spawn a message bus when AT_SECURE is set"
msgstr "无法在已设置 AT_SECURE 时启动一条消息总线"
-#: gio/gdbusaddress.c:1108
+#: gio/gdbusaddress.c:1102
msgid "Cannot spawn a message bus without a machine-id: "
msgstr "无法在无机器 ID 时生成一条消息总线:"
-#: gio/gdbusaddress.c:1115
+#: gio/gdbusaddress.c:1109
#, c-format
msgid "Cannot autolaunch D-Bus without X11 $DISPLAY"
msgstr "无法在没有 X11 $DISPLAY 的情况下自动启动 D-Bus"
-#: gio/gdbusaddress.c:1157
+#: gio/gdbusaddress.c:1151
#, c-format
msgid "Error spawning command line “%s”: "
msgstr "生成并运行命令行“%s”时出错:"
-#: gio/gdbusaddress.c:1226
+#: gio/gdbusaddress.c:1220
#, c-format
msgid "Cannot determine session bus address (not implemented for this OS)"
msgstr "无法确定会话总线地址(尚未在此操作系统上实现)"
-#: gio/gdbusaddress.c:1375 gio/gdbusconnection.c:7321
+#: gio/gdbusaddress.c:1374 gio/gdbusconnection.c:7316
#, c-format
msgid ""
"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable "
"— unknown value “%s”"
msgstr "无法从 DBUS_STARTER_BUS_TYPE 环境变量确定总线地址——未知的值“%s”"
-#: gio/gdbusaddress.c:1384 gio/gdbusconnection.c:7330
+#: gio/gdbusaddress.c:1383 gio/gdbusconnection.c:7325
msgid ""
"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment "
"variable is not set"
msgstr "无法确定总线地址,因为环境变量 DBUS_STARTER_BUS_TYPE 未设置"
-#: gio/gdbusaddress.c:1394
+#: gio/gdbusaddress.c:1393
#, c-format
msgid "Unknown bus type %d"
msgstr "未知的总线类型 %d"
@@ -558,11 +559,15 @@ msgid ""
"Exhausted all available authentication mechanisms (tried: %s) (available: %s)"
msgstr "用尽了所有可用的认证机制(已尝试:%s)(可用的:%s)"
-#: gio/gdbusauth.c:1178
+#: gio/gdbusauth.c:1045
+msgid "Unexpected lack of content trying to read a byte"
+msgstr "试图读取一个字节时异常地缺少内容"
+
+#: gio/gdbusauth.c:1195
msgid "User IDs must be the same for peer and server"
msgstr "对等端和服务器端的用户 ID 必须相同"
-#: gio/gdbusauth.c:1190
+#: gio/gdbusauth.c:1207
msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer"
msgstr "通过 GDBusAuthObserver::authorize-authenticated-peer 取消"
@@ -649,7 +654,7 @@ msgstr "打开钥匙环“%s”以写入时出错:"
msgid "(Additionally, releasing the lock for “%s” also failed: %s) "
msgstr "(此外,解除“%s”的锁定也失败了:%s) "
-#: gio/gdbusconnection.c:590 gio/gdbusconnection.c:2404
+#: gio/gdbusconnection.c:590 gio/gdbusconnection.c:2405
msgid "The connection is closed"
msgstr "连接已关闭"
@@ -657,137 +662,137 @@ msgstr "连接已关闭"
msgid "Timeout was reached"
msgstr "已到超时限制"
-#: gio/gdbusconnection.c:2527
+#: gio/gdbusconnection.c:2528
msgid ""
"Unsupported flags encountered when constructing a client-side connection"
msgstr "构建客户端连接时遇到不支持的标志"
-#: gio/gdbusconnection.c:4256 gio/gdbusconnection.c:4610
+#: gio/gdbusconnection.c:4257 gio/gdbusconnection.c:4611
#, c-format
msgid ""
"No such interface “org.freedesktop.DBus.Properties” on object at path %s"
msgstr "路径 %s 的对象上没有“org.freedesktop.DBus.Properties”接口"
-#: gio/gdbusconnection.c:4401
+#: gio/gdbusconnection.c:4402
#, c-format
msgid "No such property “%s”"
msgstr "无此属性“%s”"
-#: gio/gdbusconnection.c:4413
+#: gio/gdbusconnection.c:4414
#, c-format
msgid "Property “%s” is not readable"
msgstr "属性“%s”不可读"
-#: gio/gdbusconnection.c:4424
+#: gio/gdbusconnection.c:4425
#, c-format
msgid "Property “%s” is not writable"
msgstr "属性“%s”不可写"
-#: gio/gdbusconnection.c:4444
+#: gio/gdbusconnection.c:4445
#, c-format
msgid "Error setting property “%s”: Expected type “%s” but got “%s”"
msgstr "设置属性“%s”时出错:期望“%s”类型但得到了“%s”类型"
-#: gio/gdbusconnection.c:4549 gio/gdbusconnection.c:4764
-#: gio/gdbusconnection.c:6747
+#: gio/gdbusconnection.c:4550 gio/gdbusconnection.c:4765
+#: gio/gdbusconnection.c:6742
#, c-format
msgid "No such interface “%s”"
msgstr "无此接口“%s”"
-#: gio/gdbusconnection.c:4986 gio/gdbusconnection.c:7261
+#: gio/gdbusconnection.c:4981 gio/gdbusconnection.c:7256
#, c-format
msgid "No such interface “%s” on object at path %s"
msgstr "在路径 %s 的对象上没有“%s”接口"
-#: gio/gdbusconnection.c:5087
+#: gio/gdbusconnection.c:5082
#, c-format
msgid "No such method “%s”"
msgstr "没有“%s”这个方法"
-#: gio/gdbusconnection.c:5118
+#: gio/gdbusconnection.c:5113
#, c-format
msgid "Type of message, “%s”, does not match expected type “%s”"
msgstr "消息的类型“%s”,与预期的类型“%s”不匹配"
-#: gio/gdbusconnection.c:5321
+#: gio/gdbusconnection.c:5316
#, c-format
msgid "An object is already exported for the interface %s at %s"
msgstr "已为 %2$s 处的接口 %1$s 导出了一个对象"
-#: gio/gdbusconnection.c:5548
+#: gio/gdbusconnection.c:5543
#, c-format
msgid "Unable to retrieve property %s.%s"
msgstr "无法检索属性 %s.%s"
-#: gio/gdbusconnection.c:5604
+#: gio/gdbusconnection.c:5599
#, c-format
msgid "Unable to set property %s.%s"
msgstr "无法设置属性 %s.%s"
-#: gio/gdbusconnection.c:5783
+#: gio/gdbusconnection.c:5778
#, c-format
msgid "Method “%s” returned type “%s”, but expected “%s”"
msgstr "方法“%s”返回类型“%s”,但预期的是“%s”"
-#: gio/gdbusconnection.c:6859
+#: gio/gdbusconnection.c:6854
#, c-format
msgid "Method “%s” on interface “%s” with signature “%s” does not exist"
msgstr "带有“%3$s”签名的接口“%2$s”上不存在“%1$s”方法"
-#: gio/gdbusconnection.c:6980
+#: gio/gdbusconnection.c:6975
#, c-format
msgid "A subtree is already exported for %s"
msgstr "已经为 %s 导出一个子树"
-#: gio/gdbusconnection.c:7269
+#: gio/gdbusconnection.c:7264
#, c-format
msgid "Object does not exist at path “%s”"
msgstr "对象在路径“%s”处不存在"
-#: gio/gdbusmessage.c:1303
+#: gio/gdbusmessage.c:1306
msgid "type is INVALID"
msgstr "类型无效"
-#: gio/gdbusmessage.c:1314
+#: gio/gdbusmessage.c:1317
msgid "METHOD_CALL message: PATH or MEMBER header field is missing"
msgstr "METHOD_CALL 消息:PATH 或 MEMBER 首部字段缺失"
-#: gio/gdbusmessage.c:1325
+#: gio/gdbusmessage.c:1328
msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing"
msgstr "METHOD_RETURN 消息:REPLY_SERIAL 首部字段缺失"
-#: gio/gdbusmessage.c:1337
+#: gio/gdbusmessage.c:1340
msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing"
msgstr "错误消息:REPLY_SERIAL 或 ERROR_NAME 首部字段缺失"
-#: gio/gdbusmessage.c:1350
+#: gio/gdbusmessage.c:1353
msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing"
msgstr "信号消息:PATH、INTERFACE 或 MEMBER METHOD_RETURN缺失"
-#: gio/gdbusmessage.c:1358
+#: gio/gdbusmessage.c:1361
msgid ""
"SIGNAL message: The PATH header field is using the reserved value /org/"
"freedesktop/DBus/Local"
msgstr "信号消息:PATH 首部字段正在使用保留值 /org/freedesktop/DBus/Local"
-#: gio/gdbusmessage.c:1366
+#: gio/gdbusmessage.c:1369
msgid ""
"SIGNAL message: The INTERFACE header field is using the reserved value org."
"freedesktop.DBus.Local"
msgstr "信号消息:INTERFACE 首部字段正在使用保留值 org.freedesktop.DBus.Local"
-#: gio/gdbusmessage.c:1414 gio/gdbusmessage.c:1474
+#: gio/gdbusmessage.c:1417 gio/gdbusmessage.c:1477
#, c-format
msgid "Wanted to read %lu byte but only got %lu"
msgid_plural "Wanted to read %lu bytes but only got %lu"
msgstr[0] "期望读取 %lu 个字节但只得到 %lu 个"
-#: gio/gdbusmessage.c:1428
+#: gio/gdbusmessage.c:1431
#, c-format
msgid "Expected NUL byte after the string “%s” but found byte %d"
msgstr "期望“%s”后为 NUL 字节但找到了字节 %d"
-#: gio/gdbusmessage.c:1447
+#: gio/gdbusmessage.c:1450
#, c-format
msgid ""
"Expected valid UTF-8 string but found invalid bytes at byte offset %d "
@@ -796,21 +801,21 @@ msgstr ""
"期望得到有效的 UTF-8 字符串,但在字节偏移 %d 处(字符串长度为 %d)找到了无效"
"的字节。该点的有效 UTF-8 字符串曾是“%s”"
-#: gio/gdbusmessage.c:1511 gio/gdbusmessage.c:1787 gio/gdbusmessage.c:1998
+#: gio/gdbusmessage.c:1514 gio/gdbusmessage.c:1790 gio/gdbusmessage.c:2001
msgid "Value nested too deeply"
msgstr "值嵌套过深"
-#: gio/gdbusmessage.c:1679
+#: gio/gdbusmessage.c:1682
#, c-format
msgid "Parsed value “%s” is not a valid D-Bus object path"
msgstr "已解析的值“%s”不是有效的 D-Bus 对象路径"
-#: gio/gdbusmessage.c:1703
+#: gio/gdbusmessage.c:1706
#, c-format
msgid "Parsed value “%s” is not a valid D-Bus signature"
msgstr "已解析的值“%s”不是有效的 D-Bus 签名"
-#: gio/gdbusmessage.c:1754
+#: gio/gdbusmessage.c:1757
#, c-format
msgid ""
"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)."
@@ -818,7 +823,7 @@ msgid_plural ""
"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)."
msgstr[0] "遇到长度为 %u 字节的数组。最大长度应为 2<<26 字节(64 MiB)。"
-#: gio/gdbusmessage.c:1774
+#: gio/gdbusmessage.c:1777
#, c-format
msgid ""
"Encountered array of type “a%c”, expected to have a length a multiple of %u "
@@ -826,96 +831,96 @@ msgid ""
msgstr ""
"遇到类型为“a%c”的数组,需要长度为 %u 字节的倍数,但是找到的长度为 %u 字节"
-#: gio/gdbusmessage.c:1928 gio/gdbusmessage.c:2647
+#: gio/gdbusmessage.c:1931 gio/gdbusmessage.c:2650
msgid "Empty structures (tuples) are not allowed in D-Bus"
msgstr "D-Bus 中不允许空结构(tuples)"
-#: gio/gdbusmessage.c:1982
+#: gio/gdbusmessage.c:1985
#, c-format
msgid "Parsed value “%s” for variant is not a valid D-Bus signature"
msgstr "变量的已解析值“%s”不是有效的 D-Bus 签名"
-#: gio/gdbusmessage.c:2023
+#: gio/gdbusmessage.c:2026
#, c-format
msgid ""
"Error deserializing GVariant with type string “%s” from the D-Bus wire format"
msgstr "从 D-Bus 线格式以类型字符串“%s”反序列化 GVariant 时发生错误"
-#: gio/gdbusmessage.c:2208
+#: gio/gdbusmessage.c:2211
#, c-format
msgid ""
"Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value "
"0x%02x"
msgstr "无效的字节序值。期望为 0x6c(“l”)或 0x42(“B”)但找到值 0x%02x"
-#: gio/gdbusmessage.c:2227
+#: gio/gdbusmessage.c:2230
#, c-format
msgid "Invalid major protocol version. Expected 1 but found %d"
msgstr "无效的主协议版本。期望 1,但是找到了 %d"
-#: gio/gdbusmessage.c:2285 gio/gdbusmessage.c:2883
+#: gio/gdbusmessage.c:2288 gio/gdbusmessage.c:2886
msgid "Signature header found but is not of type signature"
msgstr "找到了签名首部但不属于类型签名"
-#: gio/gdbusmessage.c:2297
+#: gio/gdbusmessage.c:2300
#, c-format
msgid "Signature header with signature “%s” found but message body is empty"
msgstr "发现签名“%s”的签名首部,但消息主体为空"
-#: gio/gdbusmessage.c:2312
+#: gio/gdbusmessage.c:2315
#, c-format
msgid "Parsed value “%s” is not a valid D-Bus signature (for body)"
msgstr "已解析的值“%s”不是有效的 D-Bus 签名(针对消息主体)"
-#: gio/gdbusmessage.c:2344
+#: gio/gdbusmessage.c:2347
#, c-format
msgid "No signature header in message but the message body is %u byte"
msgid_plural "No signature header in message but the message body is %u bytes"
msgstr[0] "消息中没有签名首部,但消息主体为 %u 字节"
-#: gio/gdbusmessage.c:2354
+#: gio/gdbusmessage.c:2357
msgid "Cannot deserialize message: "
msgstr "无法反序列化消息:"
-#: gio/gdbusmessage.c:2700
+#: gio/gdbusmessage.c:2703
#, c-format
msgid ""
"Error serializing GVariant with type string “%s” to the D-Bus wire format"
msgstr "以类型字符串“%s”序列化 GVariant 到 D-Bus 线格式时发生错误"
-#: gio/gdbusmessage.c:2837
+#: gio/gdbusmessage.c:2840
#, c-format
msgid ""
"Number of file descriptors in message (%d) differs from header field (%d)"
msgstr "消息中的文件描述符数量(%d)与首部字段中的(%d)不同"
-#: gio/gdbusmessage.c:2845
+#: gio/gdbusmessage.c:2848
msgid "Cannot serialize message: "
msgstr "无法序列化消息:"
-#: gio/gdbusmessage.c:2898
+#: gio/gdbusmessage.c:2901
#, c-format
msgid "Message body has signature “%s” but there is no signature header"
msgstr "消息主体有签名“%s”但是没有签名首部"
-#: gio/gdbusmessage.c:2908
+#: gio/gdbusmessage.c:2911
#, c-format
msgid ""
"Message body has type signature “%s” but signature in the header field is "
"“%s”"
msgstr "消息主体有类型签名“%s”但首部字段的签名为“%s”"
-#: gio/gdbusmessage.c:2924
+#: gio/gdbusmessage.c:2927
#, c-format
msgid "Message body is empty but signature in the header field is “(%s)”"
msgstr "消息主体为空,但首部字段的签名为“(%s)”"
-#: gio/gdbusmessage.c:3479
+#: gio/gdbusmessage.c:3482
#, c-format
msgid "Error return with body of type “%s”"
msgstr "出错,返回了“%s”类型的主体"
-#: gio/gdbusmessage.c:3487
+#: gio/gdbusmessage.c:3490
msgid "Error return with empty body"
msgstr "出错,返回了空的主体"
@@ -940,17 +945,17 @@ msgstr "无法获取硬件配置文件:%s"
msgid "Unable to load %s or %s: "
msgstr "无法载入 %s 或 %s:"
-#: gio/gdbusproxy.c:1575
+#: gio/gdbusproxy.c:1568
#, c-format
msgid "Error calling StartServiceByName for %s: "
msgstr "为 %s 调用 StartServiceByName 时出错:"
-#: gio/gdbusproxy.c:1598
+#: gio/gdbusproxy.c:1591
#, c-format
msgid "Unexpected reply %d from StartServiceByName(\"%s\") method"
msgstr "从 StartServiceByName(\"%2$s\") 方法获得意外回复 %1$d"
-#: gio/gdbusproxy.c:2709 gio/gdbusproxy.c:2844
+#: gio/gdbusproxy.c:2702 gio/gdbusproxy.c:2837
#, c-format
msgid ""
"Cannot invoke method; proxy is for the well-known name %s without an owner, "
@@ -959,25 +964,25 @@ msgstr ""
"无法调用方法;代理名称为常见的无所有者的名称 %s,且代理使用 "
"G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START 标记构建"
-#: gio/gdbusserver.c:765
+#: gio/gdbusserver.c:758
msgid "Abstract namespace not supported"
msgstr "不支持抽象命名空间"
-#: gio/gdbusserver.c:857
+#: gio/gdbusserver.c:850
msgid "Cannot specify nonce file when creating a server"
msgstr "创建服务器时无法指定临时文件"
-#: gio/gdbusserver.c:939
+#: gio/gdbusserver.c:932
#, c-format
msgid "Error writing nonce file at “%s”: %s"
msgstr "写入“%s”处的临时文件时出错:%s"
-#: gio/gdbusserver.c:1114
+#: gio/gdbusserver.c:1107
#, c-format
msgid "The string “%s” is not a valid D-Bus GUID"
msgstr "字符串“%s”不是有效 D-Bus GUID"
-#: gio/gdbusserver.c:1152
+#: gio/gdbusserver.c:1145
#, c-format
msgid "Cannot listen on unsupported transport “%s”"
msgstr "无法监听不支持的传输“%s”"
@@ -1006,14 +1011,14 @@ msgstr ""
"\n"
"使用“%s 命令 --help”以获得每一个命令的帮助。\n"
-#: gio/gdbus-tool.c:204 gio/gdbus-tool.c:276 gio/gdbus-tool.c:348
-#: gio/gdbus-tool.c:372 gio/gdbus-tool.c:862 gio/gdbus-tool.c:1247
-#: gio/gdbus-tool.c:1734
+#: gio/gdbus-tool.c:204 gio/gdbus-tool.c:276 gio/gdbus-tool.c:347
+#: gio/gdbus-tool.c:371 gio/gdbus-tool.c:861 gio/gdbus-tool.c:1246
+#: gio/gdbus-tool.c:1733
#, c-format
msgid "Error: %s\n"
msgstr "错误:%s\n"
-#: gio/gdbus-tool.c:215 gio/gdbus-tool.c:289 gio/gdbus-tool.c:1750
+#: gio/gdbus-tool.c:215 gio/gdbus-tool.c:289 gio/gdbus-tool.c:1749
#, c-format
msgid "Error parsing introspection XML: %s\n"
msgstr "解析 Introspection XML 时出错:%s\n"
@@ -1023,241 +1028,241 @@ msgstr "解析 Introspection XML 时出错:%s\n"
msgid "Error: %s is not a valid name\n"
msgstr "错误:%s 不是有效的名称\n"
-#: gio/gdbus-tool.c:258 gio/gdbus-tool.c:748 gio/gdbus-tool.c:1066
-#: gio/gdbus-tool.c:1900 gio/gdbus-tool.c:2140
+#: gio/gdbus-tool.c:258 gio/gdbus-tool.c:747 gio/gdbus-tool.c:1065
+#: gio/gdbus-tool.c:1899 gio/gdbus-tool.c:2139
#, c-format
msgid "Error: %s is not a valid object path\n"
msgstr "错误:%s 不是有效的对象路径\n"
-#: gio/gdbus-tool.c:406
+#: gio/gdbus-tool.c:405
msgid "Connect to the system bus"
msgstr "连接到系统总线"
-#: gio/gdbus-tool.c:407
+#: gio/gdbus-tool.c:406
msgid "Connect to the session bus"
msgstr "连接到会话总线"
-#: gio/gdbus-tool.c:408
+#: gio/gdbus-tool.c:407
msgid "Connect to given D-Bus address"
msgstr "连接到给定的 D-Bus 地址"
-#: gio/gdbus-tool.c:418
+#: gio/gdbus-tool.c:417
msgid "Connection Endpoint Options:"
msgstr "连接端点选项:"
-#: gio/gdbus-tool.c:419
+#: gio/gdbus-tool.c:418
msgid "Options specifying the connection endpoint"
msgstr "指定连接端点的选项"
# 没有>未,消歧义
-#: gio/gdbus-tool.c:442
+#: gio/gdbus-tool.c:441
#, c-format
msgid "No connection endpoint specified"
msgstr "未指定连接的端点"
-#: gio/gdbus-tool.c:452
+#: gio/gdbus-tool.c:451
#, c-format
msgid "Multiple connection endpoints specified"
msgstr "指定了多个连接端点"
-#: gio/gdbus-tool.c:525
+#: gio/gdbus-tool.c:524
#, c-format
msgid ""
"Warning: According to introspection data, interface “%s” does not exist\n"
msgstr "警告:根据 Introspection 数据,接口“%s”不存在\n"
-#: gio/gdbus-tool.c:534
+#: gio/gdbus-tool.c:533
#, c-format
msgid ""
"Warning: According to introspection data, method “%s” does not exist on "
"interface “%s”\n"
msgstr "警告:根据 Introspection 数据,接口“%2$s”中不存在方法“%1$s”\n"
-#: gio/gdbus-tool.c:596
+#: gio/gdbus-tool.c:595
msgid "Optional destination for signal (unique name)"
msgstr "信号的可选目标位置(唯一名称)"
-#: gio/gdbus-tool.c:597
+#: gio/gdbus-tool.c:596
msgid "Object path to emit signal on"
msgstr "要触发信号的对象路径"
-#: gio/gdbus-tool.c:598
+#: gio/gdbus-tool.c:597
msgid "Signal and interface name"
msgstr "信号和接口名称"
-#: gio/gdbus-tool.c:631
+#: gio/gdbus-tool.c:630
msgid "Emit a signal."
msgstr "发射信号。"
-#: gio/gdbus-tool.c:686 gio/gdbus-tool.c:1003 gio/gdbus-tool.c:1837
-#: gio/gdbus-tool.c:2069 gio/gdbus-tool.c:2289
+#: gio/gdbus-tool.c:685 gio/gdbus-tool.c:1002 gio/gdbus-tool.c:1836
+#: gio/gdbus-tool.c:2068 gio/gdbus-tool.c:2288
#, c-format
msgid "Error connecting: %s\n"
msgstr "连接时出错:%s\n"
-#: gio/gdbus-tool.c:706
+#: gio/gdbus-tool.c:705
#, c-format
msgid "Error: %s is not a valid unique bus name.\n"
msgstr "错误:%s 不是有效的唯一总线名。\n"
-#: gio/gdbus-tool.c:725 gio/gdbus-tool.c:1046 gio/gdbus-tool.c:1880
+#: gio/gdbus-tool.c:724 gio/gdbus-tool.c:1045 gio/gdbus-tool.c:1879
msgid "Error: Object path is not specified\n"
msgstr "错误:未指定对象路径\n"
-#: gio/gdbus-tool.c:768
+#: gio/gdbus-tool.c:767
msgid "Error: Signal name is not specified\n"
msgstr "错误:未指定信号名\n"
-#: gio/gdbus-tool.c:782
+#: gio/gdbus-tool.c:781
#, c-format
msgid "Error: Signal name “%s” is invalid\n"
msgstr "错误:信号名“%s”无效\n"
-#: gio/gdbus-tool.c:794
+#: gio/gdbus-tool.c:793
#, c-format
msgid "Error: %s is not a valid interface name\n"
msgstr "错误:%s 不是有效的接口名称。\n"
-#: gio/gdbus-tool.c:800
+#: gio/gdbus-tool.c:799
#, c-format
msgid "Error: %s is not a valid member name\n"
msgstr "错误:%s 不是有效的成员名称。\n"
#. Use the original non-"parse-me-harder" error
-#: gio/gdbus-tool.c:837 gio/gdbus-tool.c:1178
+#: gio/gdbus-tool.c:836 gio/gdbus-tool.c:1177
#, c-format
msgid "Error parsing parameter %d: %s\n"
msgstr "解析第 %d 个选项时出错:%s\n"
-#: gio/gdbus-tool.c:869
+#: gio/gdbus-tool.c:868
#, c-format
msgid "Error flushing connection: %s\n"
msgstr "刷新连接时出错:%s\n"
-#: gio/gdbus-tool.c:897
+#: gio/gdbus-tool.c:896
msgid "Destination name to invoke method on"
msgstr "调用方法的目标位置名称"
-#: gio/gdbus-tool.c:898
+#: gio/gdbus-tool.c:897
msgid "Object path to invoke method on"
msgstr "调用方法的对象路径"
-#: gio/gdbus-tool.c:899
+#: gio/gdbus-tool.c:898
msgid "Method and interface name"
msgstr "方法和接口名称"
-#: gio/gdbus-tool.c:900
+#: gio/gdbus-tool.c:899
msgid "Timeout in seconds"
msgstr "超时(以秒计)"
-#: gio/gdbus-tool.c:901
+#: gio/gdbus-tool.c:900
msgid "Allow interactive authorization"
msgstr "允许交互式授权"
-#: gio/gdbus-tool.c:948
+#: gio/gdbus-tool.c:947
msgid "Invoke a method on a remote object."
msgstr "在远程对象上调用一个方法。"
-#: gio/gdbus-tool.c:1020 gio/gdbus-tool.c:1854 gio/gdbus-tool.c:2094
+#: gio/gdbus-tool.c:1019 gio/gdbus-tool.c:1853 gio/gdbus-tool.c:2093
msgid "Error: Destination is not specified\n"
msgstr "错误:未指定目标位置名称\n"
-#: gio/gdbus-tool.c:1031 gio/gdbus-tool.c:1871 gio/gdbus-tool.c:2105
+#: gio/gdbus-tool.c:1030 gio/gdbus-tool.c:1870 gio/gdbus-tool.c:2104
#, c-format
msgid "Error: %s is not a valid bus name\n"
msgstr "错误:%s 不是有效的总线名称\n"
-#: gio/gdbus-tool.c:1081
+#: gio/gdbus-tool.c:1080
msgid "Error: Method name is not specified\n"
msgstr "错误:方法名没有指定\n"
-#: gio/gdbus-tool.c:1092
+#: gio/gdbus-tool.c:1091
#, c-format
msgid "Error: Method name “%s” is invalid\n"
msgstr "错误:方法名“%s”无效\n"
-#: gio/gdbus-tool.c:1170
+#: gio/gdbus-tool.c:1169
#, c-format
msgid "Error parsing parameter %d of type “%s”: %s\n"
msgstr "解析\"%2$s\"类型的第 %1$d 个参数时发生错误:%3$s\n"
-#: gio/gdbus-tool.c:1196
+#: gio/gdbus-tool.c:1195
#, c-format
msgid "Error adding handle %d: %s\n"
msgstr "添加句柄 %d 时出错:%s\n"
-#: gio/gdbus-tool.c:1696
+#: gio/gdbus-tool.c:1695
msgid "Destination name to introspect"
msgstr "要 Introspect 的目标位置名称"
-#: gio/gdbus-tool.c:1697
+#: gio/gdbus-tool.c:1696
msgid "Object path to introspect"
msgstr "要 Introspect 的对象路径"
-#: gio/gdbus-tool.c:1698
+#: gio/gdbus-tool.c:1697
msgid "Print XML"
msgstr "输出 XML"
-#: gio/gdbus-tool.c:1699
+#: gio/gdbus-tool.c:1698
msgid "Introspect children"
msgstr "Introspect 子对象"
-#: gio/gdbus-tool.c:1700
+#: gio/gdbus-tool.c:1699
msgid "Only print properties"
msgstr "只打印属性"
# 跟命令行里的统一翻译
-#: gio/gdbus-tool.c:1789
+#: gio/gdbus-tool.c:1788
msgid "Introspect a remote object."
msgstr "Introspect 一个远程对象。"
-#: gio/gdbus-tool.c:1995
+#: gio/gdbus-tool.c:1994
msgid "Destination name to monitor"
msgstr "要监视的目标位置名称"
-#: gio/gdbus-tool.c:1996
+#: gio/gdbus-tool.c:1995
msgid "Object path to monitor"
msgstr "要监视的对象路径"
-#: gio/gdbus-tool.c:2021
+#: gio/gdbus-tool.c:2020
msgid "Monitor a remote object."
msgstr "监视一个远程对象。"
-#: gio/gdbus-tool.c:2079
+#: gio/gdbus-tool.c:2078
msgid "Error: can’t monitor a non-message-bus connection\n"
msgstr "错误:无法监视 non-message-bus 连接\n"
-#: gio/gdbus-tool.c:2203
+#: gio/gdbus-tool.c:2202
msgid "Service to activate before waiting for the other one (well-known name)"
msgstr "在等待另一服务前要激活的服务(常见名称)"
-#: gio/gdbus-tool.c:2206
+#: gio/gdbus-tool.c:2205
msgid ""
"Timeout to wait for before exiting with an error (seconds); 0 for no timeout "
"(default)"
msgstr "出现错误退出前的超时(秒); 0 为无超时(默认)"
-#: gio/gdbus-tool.c:2254
+#: gio/gdbus-tool.c:2253
msgid "[OPTION…] BUS-NAME"
msgstr "[选项…] 总线名称"
-#: gio/gdbus-tool.c:2255
+#: gio/gdbus-tool.c:2254
msgid "Wait for a bus name to appear."
msgstr "等待总线名称出现。"
-#: gio/gdbus-tool.c:2331
+#: gio/gdbus-tool.c:2330
msgid "Error: A service to activate for must be specified.\n"
msgstr "错误:未指定需要激活的服务名称。\n"
-#: gio/gdbus-tool.c:2336
+#: gio/gdbus-tool.c:2335
msgid "Error: A service to wait for must be specified.\n"
msgstr "错误:未指定需要等待的服务名称。\n"
-#: gio/gdbus-tool.c:2341
+#: gio/gdbus-tool.c:2340
msgid "Error: Too many arguments.\n"
msgstr "错误:参数过多。\n"
-#: gio/gdbus-tool.c:2349 gio/gdbus-tool.c:2356
+#: gio/gdbus-tool.c:2348 gio/gdbus-tool.c:2355
#, c-format
msgid "Error: %s is not a valid well-known bus name.\n"
msgstr "错误:%s 不是有效的总线名称。\n"
@@ -1267,38 +1272,43 @@ msgstr "错误:%s 不是有效的总线名称。\n"
msgid "Not authorized to change debug settings"
msgstr "未获认证以更改调试设置"
-#: gio/gdesktopappinfo.c:2182 gio/gdesktopappinfo.c:5112
+#: gio/gdesktopappinfo.c:2242 gio/gdesktopappinfo.c:5223
msgid "Unnamed"
msgstr "未命名"
-#: gio/gdesktopappinfo.c:2592
+#: gio/gdesktopappinfo.c:2652
msgid "Desktop file didn’t specify Exec field"
msgstr "桌面文件未指定 Exec 字段"
-#: gio/gdesktopappinfo.c:2891
+#: gio/gdesktopappinfo.c:2942
msgid "Unable to find terminal required for application"
msgstr "无法找到应用程序需要的终端"
-#: gio/gdesktopappinfo.c:3630
+#: gio/gdesktopappinfo.c:3002
+#, c-format
+msgid "Program ‘%s’ not found in $PATH"
+msgstr "程序 ‘%s’ 未在 $PATH 路径中找到"
+
+#: gio/gdesktopappinfo.c:3735
#, c-format
msgid "Can’t create user application configuration folder %s: %s"
msgstr "无法创建用户应用程序配置文件夹 %s:%s"
-#: gio/gdesktopappinfo.c:3634
+#: gio/gdesktopappinfo.c:3739
#, c-format
msgid "Can’t create user MIME configuration folder %s: %s"
msgstr "无法创建用户 MIME 配置文件夹 %s:%s"
-#: gio/gdesktopappinfo.c:3876 gio/gdesktopappinfo.c:3900
+#: gio/gdesktopappinfo.c:3981 gio/gdesktopappinfo.c:4005
msgid "Application information lacks an identifier"
msgstr "应用程序信息缺少标志符"
-#: gio/gdesktopappinfo.c:4136
+#: gio/gdesktopappinfo.c:4241
#, c-format
msgid "Can’t create user desktop file %s"
msgstr "无法创建用户桌面文件 %s"
-#: gio/gdesktopappinfo.c:4272
+#: gio/gdesktopappinfo.c:4377
#, c-format
msgid "Custom definition for %s"
msgstr "%s 的自定义"
@@ -1371,7 +1381,7 @@ msgstr "GEmblemedIcon 中应为 GEmblem"
msgid "Containing mount does not exist"
msgstr "包含的挂载不存在"
-#: gio/gfile.c:2641 gio/glocalfile.c:2500
+#: gio/gfile.c:2641 gio/glocalfile.c:2511
msgid "Can’t copy over directory"
msgstr "无法跨目录复制"
@@ -1416,7 +1426,7 @@ msgstr "无法复制特殊文件"
msgid "Invalid symlink value given"
msgstr "给定的符号链接值无效"
-#: gio/gfile.c:4163 glib/gfileutils.c:2335
+#: gio/gfile.c:4163 glib/gfileutils.c:2392
msgid "Symbolic links not supported"
msgstr "不支持符号链接"
@@ -1517,37 +1527,37 @@ msgstr "HTTP 代理响应过大"
msgid "HTTP proxy server closed connection unexpectedly."
msgstr "HTTP 代理服务器意外关闭连接。"
-#: gio/gicon.c:300
+#: gio/gicon.c:299
#, c-format
msgid "Wrong number of tokens (%d)"
msgstr "错误的符号数量(%d)"
-#: gio/gicon.c:320
+#: gio/gicon.c:319
#, c-format
msgid "No type for class name %s"
msgstr "类名 %s 没有类型"
-#: gio/gicon.c:330
+#: gio/gicon.c:329
#, c-format
msgid "Type %s does not implement the GIcon interface"
msgstr "类型 %s 没有实现 GIcon 接口"
-#: gio/gicon.c:341
+#: gio/gicon.c:340
#, c-format
msgid "Type %s is not classed"
msgstr "类型 %s 不是类"
-#: gio/gicon.c:355
+#: gio/gicon.c:354
#, c-format
msgid "Malformed version number: %s"
msgstr "不正确的版本号:%s"
-#: gio/gicon.c:369
+#: gio/gicon.c:368
#, c-format
msgid "Type %s does not implement from_tokens() on the GIcon interface"
msgstr "类型 %s 没有实现 GIcon 接口的 from_tokens() 方法"
-#: gio/gicon.c:471
+#: gio/gicon.c:470
msgid "Can’t handle the supplied version of the icon encoding"
msgstr "无法处理提供版本的图标编码"
@@ -1697,7 +1707,7 @@ msgstr "写入到标准输出时出错"
#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:379 gio/gio-tool-list.c:173
#: gio/gio-tool-mkdir.c:50 gio/gio-tool-monitor.c:39 gio/gio-tool-monitor.c:41
#: gio/gio-tool-monitor.c:43 gio/gio-tool-monitor.c:45
-#: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1202 gio/gio-tool-open.c:72
+#: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1210 gio/gio-tool-open.c:72
#: gio/gio-tool-remove.c:50 gio/gio-tool-rename.c:47 gio/gio-tool-set.c:95
#: gio/gio-tool-trash.c:222 gio/gio-tool-tree.c:241
msgid "LOCATION"
@@ -1717,7 +1727,7 @@ msgstr ""
"例如,你可以指定 smb://server/resource/file.txt 之类的位置。"
#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:410 gio/gio-tool-mkdir.c:78
-#: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1253 gio/gio-tool-open.c:98
+#: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1261 gio/gio-tool-open.c:98
#: gio/gio-tool-remove.c:74 gio/gio-tool-trash.c:303
msgid "No locations given"
msgstr "未给定位置"
@@ -2121,19 +2131,19 @@ msgstr "挂载 TCRYPT 隐藏卷"
msgid "Mount a TCRYPT system volume"
msgstr "挂载 TCRYPT 系统卷"
-#: gio/gio-tool-mount.c:268 gio/gio-tool-mount.c:300
+#: gio/gio-tool-mount.c:276 gio/gio-tool-mount.c:308
msgid "Anonymous access denied"
msgstr "匿名访问被拒绝"
-#: gio/gio-tool-mount.c:525
+#: gio/gio-tool-mount.c:533
msgid "No drive for device file"
msgstr "没有对应设备文件的驱动器"
-#: gio/gio-tool-mount.c:1017
+#: gio/gio-tool-mount.c:1025
msgid "No volume for given ID"
msgstr "没有对应ID的卷"
-#: gio/gio-tool-mount.c:1206
+#: gio/gio-tool-mount.c:1214
msgid "Mount or unmount the locations."
msgstr "挂载或卸载位置。"
@@ -2334,7 +2344,7 @@ msgstr "跟踪符号链接、挂载点及快捷方式"
msgid "List contents of directories in a tree-like format."
msgstr "使用树状格式列出目录内容。"
-#: gio/glib-compile-resources.c:142 gio/glib-compile-schemas.c:1516
+#: gio/glib-compile-resources.c:142 gio/glib-compile-schemas.c:1513
#, c-format
msgid "Element <%s> not allowed inside <%s>"
msgstr "在 <%2$s> 中不允许元素 <%1$s>"
@@ -2389,7 +2399,7 @@ msgstr "压缩文件时出错:%s"
msgid "text may not appear inside <%s>"
msgstr "<%s> 内不应出现文本"
-#: gio/glib-compile-resources.c:821 gio/glib-compile-schemas.c:2174
+#: gio/glib-compile-resources.c:821 gio/glib-compile-schemas.c:2171
msgid "Show program version and exit"
msgstr "显示程序版本并退出"
@@ -2403,8 +2413,8 @@ msgid ""
"directory)"
msgstr "FILE 中引用的要从其中载入文件的目录(默认为当前目录)"
-#: gio/glib-compile-resources.c:823 gio/glib-compile-schemas.c:2175
-#: gio/glib-compile-schemas.c:2204
+#: gio/glib-compile-resources.c:823 gio/glib-compile-schemas.c:2172
+#: gio/glib-compile-schemas.c:2201
msgid "DIRECTORY"
msgstr "目录"
@@ -2617,52 +2627,52 @@ msgstr "别名目标“%s”不在 <choices> 内"
msgid "<aliases> must contain at least one <alias>"
msgstr "<aliases> 必须包含至少一个 <alias>"
-#: gio/glib-compile-schemas.c:799
+#: gio/glib-compile-schemas.c:796
msgid "Empty names are not permitted"
msgstr "不允许空名称"
-#: gio/glib-compile-schemas.c:809
+#: gio/glib-compile-schemas.c:806
#, c-format
msgid "Invalid name “%s”: names must begin with a lowercase letter"
msgstr "无效名称“%s”:名称必须以小写字母开始"
-#: gio/glib-compile-schemas.c:821
+#: gio/glib-compile-schemas.c:818
#, c-format
msgid ""
"Invalid name “%s”: invalid character “%c”; only lowercase letters, numbers "
"and hyphen (“-”) are permitted"
msgstr "无效名称“%s”:无效的字符“%c”;仅允许使用小写字母、数字和连字符(“-”)"
-#: gio/glib-compile-schemas.c:830
+#: gio/glib-compile-schemas.c:827
#, c-format
msgid "Invalid name “%s”: two successive hyphens (“--”) are not permitted"
msgstr "无效名称“%s”:不允许使用连续的连字符(“--”)"
-#: gio/glib-compile-schemas.c:839
+#: gio/glib-compile-schemas.c:836
#, c-format
msgid "Invalid name “%s”: the last character may not be a hyphen (“-”)"
msgstr "无效名称“%s”:最后一个字符串不应为连字符(“-”)。"
-#: gio/glib-compile-schemas.c:847
+#: gio/glib-compile-schemas.c:844
#, c-format
msgid "Invalid name “%s”: maximum length is 1024"
msgstr "无效名称“%s”:最大长度为 1024"
-#: gio/glib-compile-schemas.c:919
+#: gio/glib-compile-schemas.c:916
#, c-format
msgid "<child name='%s'> already specified"
msgstr "<child name='%s'> 已指定"
-#: gio/glib-compile-schemas.c:945
+#: gio/glib-compile-schemas.c:942
msgid "Cannot add keys to a “list-of” schema"
msgstr "无法添加键到一个“list-of”架构"
-#: gio/glib-compile-schemas.c:956
+#: gio/glib-compile-schemas.c:953
#, c-format
msgid "<key name='%s'> already specified"
msgstr "<key name='%s'> 已指定"
-#: gio/glib-compile-schemas.c:974
+#: gio/glib-compile-schemas.c:971
#, c-format
msgid ""
"<key name='%s'> shadows <key name='%s'> in <schema id='%s'>; use <override> "
@@ -2671,69 +2681,69 @@ msgstr ""
"<key name='%s'> 与 <key name='%s'> 在 <schema id='%s'> 重合; 请使用 "
"<override> 修改其值"
-#: gio/glib-compile-schemas.c:985
+#: gio/glib-compile-schemas.c:982
#, c-format
msgid ""
"Exactly one of “type”, “enum” or “flags” must be specified as an attribute "
"to <key>"
msgstr "“type”、“enum”或“flags”中必须有一个被指定为 <key> 的属性"
-#: gio/glib-compile-schemas.c:1004
+#: gio/glib-compile-schemas.c:1001
#, c-format
msgid "<%s id='%s'> not (yet) defined."
msgstr "<%s id='%s'> 尚未定义。"
-#: gio/glib-compile-schemas.c:1019
+#: gio/glib-compile-schemas.c:1016
#, c-format
msgid "Invalid GVariant type string “%s”"
msgstr "无效的 GVariant 类型字符串“%s”"
-#: gio/glib-compile-schemas.c:1049
+#: gio/glib-compile-schemas.c:1046
msgid "<override> given but schema isn’t extending anything"
msgstr "已给定 <override> 但架构并未扩展"
-#: gio/glib-compile-schemas.c:1062
+#: gio/glib-compile-schemas.c:1059
#, c-format
msgid "No <key name='%s'> to override"
msgstr "无 <key name='%s'> 可覆盖"
-#: gio/glib-compile-schemas.c:1070
+#: gio/glib-compile-schemas.c:1067
#, c-format
msgid "<override name='%s'> already specified"
msgstr "<override name='%s'> 已指定"
-#: gio/glib-compile-schemas.c:1143
+#: gio/glib-compile-schemas.c:1140
#, c-format
msgid "<schema id='%s'> already specified"
msgstr "<schema id='%s'> 已指定"
-#: gio/glib-compile-schemas.c:1155
+#: gio/glib-compile-schemas.c:1152
#, c-format
msgid "<schema id='%s'> extends not yet existing schema “%s”"
msgstr "<schema id='%s'> 扩展了尚不存在的架构“%s”"
-#: gio/glib-compile-schemas.c:1171
+#: gio/glib-compile-schemas.c:1168
#, c-format
msgid "<schema id='%s'> is list of not yet existing schema “%s”"
msgstr "<schema id='%s'> 是尚不存在的架构“%s”的列表"
-#: gio/glib-compile-schemas.c:1179
+#: gio/glib-compile-schemas.c:1176
#, c-format
msgid "Cannot be a list of a schema with a path"
msgstr "不能是带有路径架构的列表"
-#: gio/glib-compile-schemas.c:1189
+#: gio/glib-compile-schemas.c:1186
#, c-format
msgid "Cannot extend a schema with a path"
msgstr "无法扩展带有路径的架构"
-#: gio/glib-compile-schemas.c:1199
+#: gio/glib-compile-schemas.c:1196
#, c-format
msgid ""
"<schema id='%s'> is a list, extending <schema id='%s'> which is not a list"
msgstr "<schema id='%s'> 是一个列表,扩展的 <schema id='%s'> 不是列表"
-#: gio/glib-compile-schemas.c:1209
+#: gio/glib-compile-schemas.c:1206
#, c-format
msgid ""
"<schema id='%s' list-of='%s'> extends <schema id='%s' list-of='%s'> but “%s” "
@@ -2742,17 +2752,17 @@ msgstr ""
"<schema id='%s' list-of='%s'> 扩展 <schema id='%s' list-of='%s'>,但“%s”不扩"
"展“%s”"
-#: gio/glib-compile-schemas.c:1226
+#: gio/glib-compile-schemas.c:1223
#, c-format
msgid "A path, if given, must begin and end with a slash"
msgstr "一个路径,如果给定则必须以斜线(/)开始和结束"
-#: gio/glib-compile-schemas.c:1233
+#: gio/glib-compile-schemas.c:1230
#, c-format
msgid "The path of a list must end with “:/”"
msgstr "一个列表的路径必须以“:/”结束"
-#: gio/glib-compile-schemas.c:1242
+#: gio/glib-compile-schemas.c:1239
#, c-format
msgid ""
"Warning: Schema “%s” has path “%s”. Paths starting with “/apps/”, “/"
@@ -2761,56 +2771,56 @@ msgstr ""
"警告:架构“%s”带有路径“%s”。以“/apps/”、“/desktop/”或“/system/”开头的路径已弃"
"用。"
-#: gio/glib-compile-schemas.c:1272
+#: gio/glib-compile-schemas.c:1269
#, c-format
msgid "<%s id='%s'> already specified"
msgstr "<%s id='%s'> 已指定"
-#: gio/glib-compile-schemas.c:1422 gio/glib-compile-schemas.c:1438
+#: gio/glib-compile-schemas.c:1419 gio/glib-compile-schemas.c:1435
#, c-format
msgid "Only one <%s> element allowed inside <%s>"
msgstr "在 <%2$s> 中仅允许一个成员 <%1$s>"
-#: gio/glib-compile-schemas.c:1520
+#: gio/glib-compile-schemas.c:1517
#, c-format
msgid "Element <%s> not allowed at the top level"
msgstr "顶层中不允许元素 <%s>"
-#: gio/glib-compile-schemas.c:1538
+#: gio/glib-compile-schemas.c:1535
msgid "Element <default> is required in <key>"
msgstr "<key> 里不需要元素 <default>"
-#: gio/glib-compile-schemas.c:1628
+#: gio/glib-compile-schemas.c:1625
#, c-format
msgid "Text may not appear inside <%s>"
msgstr "<%s> 内不应出现文本"
-#: gio/glib-compile-schemas.c:1696
+#: gio/glib-compile-schemas.c:1693
#, c-format
msgid "Warning: undefined reference to <schema id='%s'/>"
msgstr "警告:到 <schema id='%s'/> 的引用未定义"
#. Translators: Do not translate "--strict".
-#: gio/glib-compile-schemas.c:1835 gio/glib-compile-schemas.c:1914
+#: gio/glib-compile-schemas.c:1832 gio/glib-compile-schemas.c:1911
msgid "--strict was specified; exiting."
msgstr "指定了 --strict;正在退出。"
-#: gio/glib-compile-schemas.c:1847
+#: gio/glib-compile-schemas.c:1844
msgid "This entire file has been ignored."
msgstr "整个文件被忽略。"
-#: gio/glib-compile-schemas.c:1910
+#: gio/glib-compile-schemas.c:1907
msgid "Ignoring this file."
msgstr "正在忽略此文件。"
-#: gio/glib-compile-schemas.c:1965
+#: gio/glib-compile-schemas.c:1962
#, c-format
msgid ""
"No such key “%s” in schema “%s” as specified in override file “%s”; ignoring "
"override for this key."
msgstr "覆盖文件“%3$s”中指定的架构“%2$s”中没有键“%1$s”;正在忽略对此键的覆盖。"
-#: gio/glib-compile-schemas.c:1973
+#: gio/glib-compile-schemas.c:1970
#, c-format
msgid ""
"No such key “%s” in schema “%s” as specified in override file “%s” and --"
@@ -2818,7 +2828,7 @@ msgid ""
msgstr ""
"覆盖文件“%3$s”中指定的架构“%2$s”中没有键“%1$s”并且已指定 --strict;正在退出。"
-#: gio/glib-compile-schemas.c:1995
+#: gio/glib-compile-schemas.c:1992
#, c-format
msgid ""
"Cannot provide per-desktop overrides for localized key “%s” in schema "
@@ -2827,7 +2837,7 @@ msgstr ""
"无法为架构“%2$s”中的局部键“%1$s”提供每个桌面的覆盖(覆盖文件“%3$s”);正在忽"
"略对此键的覆盖。"
-#: gio/glib-compile-schemas.c:2004
+#: gio/glib-compile-schemas.c:2001
#, c-format
msgid ""
"Cannot provide per-desktop overrides for localized key “%s” in schema "
@@ -2836,7 +2846,7 @@ msgstr ""
"无法为架构“%2$s”中的局部键“%1$s”提供每个桌面的覆盖(覆盖文件“%3$s”)并且已指"
"定 --strict;正在退出。"
-#: gio/glib-compile-schemas.c:2028
+#: gio/glib-compile-schemas.c:2025
#, c-format
msgid ""
"Error parsing key “%s” in schema “%s” as specified in override file “%s”: "
@@ -2845,7 +2855,7 @@ msgstr ""
"解析覆盖文件“%3$s”所指定架构“%2$s”中的键“%1$s”时出错:%4$s。正在忽略对此键的"
"覆盖。"
-#: gio/glib-compile-schemas.c:2040
+#: gio/glib-compile-schemas.c:2037
#, c-format
msgid ""
"Error parsing key “%s” in schema “%s” as specified in override file “%s”: "
@@ -2854,7 +2864,7 @@ msgstr ""
"解析覆盖文件“%3$s”所指定架构“%2$s”中的键“%1$s”时出错:%4$s。已指定 --strict;"
"正在退出。"
-#: gio/glib-compile-schemas.c:2067
+#: gio/glib-compile-schemas.c:2064
#, c-format
msgid ""
"Override for key “%s” in schema “%s” in override file “%s” is outside the "
@@ -2863,7 +2873,7 @@ msgstr ""
"覆盖文件“%3$s”中架构“%2$s”的键“%1$s”的覆盖超出了架构给出的范围;正在忽略对此"
"键的覆盖。"
-#: gio/glib-compile-schemas.c:2077
+#: gio/glib-compile-schemas.c:2074
#, c-format
msgid ""
"Override for key “%s” in schema “%s” in override file “%s” is outside the "
@@ -2872,7 +2882,7 @@ msgstr ""
"覆盖文件“%3$s”中架构“%2$s”的键“%1$s”的覆盖超出了架构给出的范围并且已指定 --"
"strict;正在退出。"
-#: gio/glib-compile-schemas.c:2103
+#: gio/glib-compile-schemas.c:2100
#, c-format
msgid ""
"Override for key “%s” in schema “%s” in override file “%s” is not in the "
@@ -2881,7 +2891,7 @@ msgstr ""
"覆盖文件“%3$s”中架构“%2$s”的键“%1$s”的覆盖的值不在有效值列表内;正在忽略对此"
"键的覆盖。"
-#: gio/glib-compile-schemas.c:2113
+#: gio/glib-compile-schemas.c:2110
#, c-format
msgid ""
"Override for key “%s” in schema “%s” in override file “%s” is not in the "
@@ -2890,23 +2900,23 @@ msgstr ""
"覆盖文件“%3$s”中架构“%2$s”的键“%1$s”的覆盖的值不在有效值列表内并且已指定 --"
"strict;正在退出。"
-#: gio/glib-compile-schemas.c:2175
+#: gio/glib-compile-schemas.c:2172
msgid "Where to store the gschemas.compiled file"
msgstr "gschemas.compiled 文件存储于何处"
-#: gio/glib-compile-schemas.c:2176
+#: gio/glib-compile-schemas.c:2173
msgid "Abort on any errors in schemas"
msgstr "在架构里出现任何错误时中止"
-#: gio/glib-compile-schemas.c:2177
+#: gio/glib-compile-schemas.c:2174
msgid "Do not write the gschema.compiled file"
msgstr "不要对 gschema.compiled 进行写操作"
-#: gio/glib-compile-schemas.c:2178
+#: gio/glib-compile-schemas.c:2175
msgid "Do not enforce key name restrictions"
msgstr "不要强制键名的限制"
-#: gio/glib-compile-schemas.c:2207
+#: gio/glib-compile-schemas.c:2204
msgid ""
"Compile all GSettings schema files into a schema cache.\n"
"Schema files are required to have the extension .gschema.xml,\n"
@@ -2916,15 +2926,15 @@ msgstr ""
"要使用扩展 .gschema.xml,需要有架构文件,\n"
"缓存文件被称为 gschemas.compiled。"
-#: gio/glib-compile-schemas.c:2228
+#: gio/glib-compile-schemas.c:2225
msgid "You should give exactly one directory name"
msgstr "您应该给出一个且仅一个的目录名"
-#: gio/glib-compile-schemas.c:2271
+#: gio/glib-compile-schemas.c:2268
msgid "No schema files found: doing nothing."
msgstr "未找到架构文件:无事可做。"
-#: gio/glib-compile-schemas.c:2273
+#: gio/glib-compile-schemas.c:2270
msgid "No schema files found: removed existing output file."
msgstr "未找到架构文件:已删除存在的输出文件。"
@@ -2933,7 +2943,7 @@ msgstr "未找到架构文件:已删除存在的输出文件。"
msgid "Invalid filename %s"
msgstr "无效的文件名 %s"
-#: gio/glocalfile.c:996
+#: gio/glocalfile.c:1005
#, c-format
msgid "Error getting filesystem info for %s: %s"
msgstr "读取 %s 文件系统信息时出错:%s"
@@ -2942,124 +2952,124 @@ msgstr "读取 %s 文件系统信息时出错:%s"
#. * the enclosing (user visible) mount of a file, but none
#. * exists.
#.
-#: gio/glocalfile.c:1137
+#: gio/glocalfile.c:1141
#, c-format
msgid "Containing mount for file %s not found"
msgstr "找不到文件 %s 包含的挂载"
-#: gio/glocalfile.c:1160
+#: gio/glocalfile.c:1164
msgid "Can’t rename root directory"
msgstr "无法重命名根目录"
-#: gio/glocalfile.c:1178 gio/glocalfile.c:1201
+#: gio/glocalfile.c:1182 gio/glocalfile.c:1205
#, c-format
msgid "Error renaming file %s: %s"
msgstr "重命名文件 %s 时出错:%s"
-#: gio/glocalfile.c:1185
+#: gio/glocalfile.c:1189
msgid "Can’t rename file, filename already exists"
msgstr "无法重命名文件,该文件名已存在"
-#: gio/glocalfile.c:1198 gio/glocalfile.c:2394 gio/glocalfile.c:2422
-#: gio/glocalfile.c:2561 gio/glocalfileoutputstream.c:658
+#: gio/glocalfile.c:1202 gio/glocalfile.c:2405 gio/glocalfile.c:2433
+#: gio/glocalfile.c:2572 gio/glocalfileoutputstream.c:658
msgid "Invalid filename"
msgstr "无效的文件名"
-#: gio/glocalfile.c:1366 gio/glocalfile.c:1377
+#: gio/glocalfile.c:1370 gio/glocalfile.c:1381
#, c-format
msgid "Error opening file %s: %s"
msgstr "打开文件 %s 时出错:%s"
-#: gio/glocalfile.c:1502
+#: gio/glocalfile.c:1506
#, c-format
msgid "Error removing file %s: %s"
msgstr "删除文件 %s 时出错:%s"
-#: gio/glocalfile.c:1996 gio/glocalfile.c:2007 gio/glocalfile.c:2034
+#: gio/glocalfile.c:2000 gio/glocalfile.c:2011 gio/glocalfile.c:2038
#, c-format
msgid "Error trashing file %s: %s"
msgstr "将文件 %s 丢到回收站时出错:%s"
-#: gio/glocalfile.c:2054
+#: gio/glocalfile.c:2058
#, c-format
msgid "Unable to create trash directory %s: %s"
msgstr "无法创建回收站目录 %s:%s"
-#: gio/glocalfile.c:2075
+#: gio/glocalfile.c:2079
#, c-format
msgid "Unable to find toplevel directory to trash %s"
msgstr "找不到回收站 %s 的顶级目录"
-#: gio/glocalfile.c:2083
+#: gio/glocalfile.c:2087
#, c-format
msgid "Trashing on system internal mounts is not supported"
msgstr "不支持在系统内部挂载上的丢弃到回收站操作"
-#: gio/glocalfile.c:2169 gio/glocalfile.c:2197
+#: gio/glocalfile.c:2173 gio/glocalfile.c:2201
#, c-format
msgid "Unable to find or create trash directory %s to trash %s"
msgstr "无法找到或创建回收站目录 %s 来丢弃 %s"
-#: gio/glocalfile.c:2243
+#: gio/glocalfile.c:2245
#, c-format
msgid "Unable to create trashing info file for %s: %s"
msgstr "为 %s 创建回收站信息文件失败:%s"
-#: gio/glocalfile.c:2305
+#: gio/glocalfile.c:2316
#, c-format
msgid "Unable to trash file %s across filesystem boundaries"
msgstr "无法跨越文件系统边界将文件 %s 丢到回收站"
-#: gio/glocalfile.c:2309 gio/glocalfile.c:2365
+#: gio/glocalfile.c:2320 gio/glocalfile.c:2376
#, c-format
msgid "Unable to trash file %s: %s"
msgstr "无法将文件 %s 丢到回收站:%s"
-#: gio/glocalfile.c:2371
+#: gio/glocalfile.c:2382
#, c-format
msgid "Unable to trash file %s"
msgstr "无法将文件 %s 丢到回收站"
-#: gio/glocalfile.c:2397
+#: gio/glocalfile.c:2408
#, c-format
msgid "Error creating directory %s: %s"
msgstr "创建目录 %s 时出错:%s"
-#: gio/glocalfile.c:2426
+#: gio/glocalfile.c:2437
#, c-format
msgid "Filesystem does not support symbolic links"
msgstr "文件系统不支持符号链接"
-#: gio/glocalfile.c:2429
+#: gio/glocalfile.c:2440
#, c-format
msgid "Error making symbolic link %s: %s"
msgstr "创建符号链接 %s 时出错:%s"
-#: gio/glocalfile.c:2472 gio/glocalfile.c:2507 gio/glocalfile.c:2564
+#: gio/glocalfile.c:2483 gio/glocalfile.c:2518 gio/glocalfile.c:2575
#, c-format
msgid "Error moving file %s: %s"
msgstr "移动文件 %s 时出错:%s"
-#: gio/glocalfile.c:2495
+#: gio/glocalfile.c:2506
msgid "Can’t move directory over directory"
msgstr "无法将目录移动到目录"
-#: gio/glocalfile.c:2521 gio/glocalfileoutputstream.c:1110
+#: gio/glocalfile.c:2532 gio/glocalfileoutputstream.c:1110
#: gio/glocalfileoutputstream.c:1124 gio/glocalfileoutputstream.c:1139
#: gio/glocalfileoutputstream.c:1156 gio/glocalfileoutputstream.c:1170
msgid "Backup file creation failed"
msgstr "备份文件创建失败"
-#: gio/glocalfile.c:2540
+#: gio/glocalfile.c:2551
#, c-format
msgid "Error removing target file: %s"
msgstr "移除目标文件出错:%s"
-#: gio/glocalfile.c:2554
+#: gio/glocalfile.c:2565
msgid "Move between mounts not supported"
msgstr "不支持在挂载之间移动"
-#: gio/glocalfile.c:2728
+#: gio/glocalfile.c:2741
#, c-format
msgid "Could not determine the disk usage of %s: %s"
msgstr "无法确定 %s 的磁盘使用情况:%s"
@@ -3081,115 +3091,115 @@ msgstr "无效的扩展属性名"
msgid "Error setting extended attribute “%s”: %s"
msgstr "设置扩展属性“%s”时出错:%s"
-#: gio/glocalfileinfo.c:1738 gio/win32/gwinhttpfile.c:191
+#: gio/glocalfileinfo.c:1819 gio/win32/gwinhttpfile.c:191
msgid " (invalid encoding)"
msgstr " (无效的编码)"
-#: gio/glocalfileinfo.c:1897 gio/glocalfileoutputstream.c:945
+#: gio/glocalfileinfo.c:1978 gio/glocalfileoutputstream.c:945
#: gio/glocalfileoutputstream.c:997
#, c-format
msgid "Error when getting information for file “%s”: %s"
msgstr "获取文件“%s”的信息时出错:%s"
-#: gio/glocalfileinfo.c:2163
+#: gio/glocalfileinfo.c:2281
#, c-format
msgid "Error when getting information for file descriptor: %s"
msgstr "获取文件描述符的信息时出错:%s"
-#: gio/glocalfileinfo.c:2208
+#: gio/glocalfileinfo.c:2326
msgid "Invalid attribute type (uint32 expected)"
msgstr "无效的属性类型(应为 uint32)"
-#: gio/glocalfileinfo.c:2226
+#: gio/glocalfileinfo.c:2344
msgid "Invalid attribute type (uint64 expected)"
msgstr "无效的属性类型(应为 uint64)"
-#: gio/glocalfileinfo.c:2245 gio/glocalfileinfo.c:2264
+#: gio/glocalfileinfo.c:2363 gio/glocalfileinfo.c:2382
msgid "Invalid attribute type (byte string expected)"
msgstr "无效的属性类型(应为字节字符串)"
-#: gio/glocalfileinfo.c:2311
+#: gio/glocalfileinfo.c:2429
msgid "Cannot set permissions on symlinks"
msgstr "无法为符号链接设置权限"
-#: gio/glocalfileinfo.c:2327
+#: gio/glocalfileinfo.c:2445
#, c-format
msgid "Error setting permissions: %s"
msgstr "设置访问权限出错:%s"
-#: gio/glocalfileinfo.c:2378
+#: gio/glocalfileinfo.c:2496
#, c-format
msgid "Error setting owner: %s"
msgstr "设置所有者出错:%s"
-#: gio/glocalfileinfo.c:2401
+#: gio/glocalfileinfo.c:2519
msgid "symlink must be non-NULL"
msgstr "符号链接必须是非空"
-#: gio/glocalfileinfo.c:2411 gio/glocalfileinfo.c:2430
-#: gio/glocalfileinfo.c:2441
+#: gio/glocalfileinfo.c:2529 gio/glocalfileinfo.c:2548
+#: gio/glocalfileinfo.c:2559
#, c-format
msgid "Error setting symlink: %s"
msgstr "设置符号链接出错:%s"
-#: gio/glocalfileinfo.c:2420
+#: gio/glocalfileinfo.c:2538
msgid "Error setting symlink: file is not a symlink"
msgstr "设定符号链接出错:文件不是符号链接"
-#: gio/glocalfileinfo.c:2492
+#: gio/glocalfileinfo.c:2630
#, c-format
msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative"
msgstr "额外的纳秒数字 %d 在 UNIX 时间戳 %lld 中是负值"
-#: gio/glocalfileinfo.c:2501
+#: gio/glocalfileinfo.c:2639
#, c-format
msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second"
msgstr "额外的纳秒数字 %d 在 UNIX 时间戳 %lld 中长度已达到一秒钟"
-#: gio/glocalfileinfo.c:2511
+#: gio/glocalfileinfo.c:2649
#, c-format
msgid "UNIX timestamp %lld does not fit into 64 bits"
msgstr "UNIX 时间戳 %lld 无法作为 64 比特数据存储"
-#: gio/glocalfileinfo.c:2522
+#: gio/glocalfileinfo.c:2660
#, c-format
msgid "UNIX timestamp %lld is outside of the range supported by Windows"
msgstr "UNIX 时间戳 %lld 位于 Windows 所支持的范围之外"
-#: gio/glocalfileinfo.c:2625
+#: gio/glocalfileinfo.c:2792
#, c-format
msgid "File name “%s” cannot be converted to UTF-16"
msgstr "文件名“%s”不能转换为 UTF-16"
-#: gio/glocalfileinfo.c:2644
+#: gio/glocalfileinfo.c:2811
#, c-format
msgid "File “%s” cannot be opened: Windows Error %lu"
msgstr "无法打开文件“%s”:Windows 错误 %lu"
-#: gio/glocalfileinfo.c:2657
+#: gio/glocalfileinfo.c:2824
#, c-format
msgid "Error setting modification or access time for file “%s”: %lu"
msgstr "设置文件“%s”的修改或访问时间时出错:%lu"
-#: gio/glocalfileinfo.c:2798 gio/glocalfileinfo.c:2810
+#: gio/glocalfileinfo.c:2981
#, c-format
msgid "Error setting modification or access time: %s"
msgstr "设置修改或访问时间时出错:%s"
-#: gio/glocalfileinfo.c:2833
+#: gio/glocalfileinfo.c:3004
msgid "SELinux context must be non-NULL"
msgstr "SELinux 上下文必须是非空"
-#: gio/glocalfileinfo.c:2840
+#: gio/glocalfileinfo.c:3011
msgid "SELinux is not enabled on this system"
msgstr "此系统尚未启用 SELinux"
-#: gio/glocalfileinfo.c:2850
+#: gio/glocalfileinfo.c:3021
#, c-format
msgid "Error setting SELinux context: %s"
msgstr "设置 SELinux 上下文出错:%s"
-#: gio/glocalfileinfo.c:2947
+#: gio/glocalfileinfo.c:3118
#, c-format
msgid "Setting attribute %s not supported"
msgstr "不支持设置属性 %s"
@@ -3236,13 +3246,13 @@ msgstr "创建备份拷贝:%s"
msgid "Error renaming temporary file: %s"
msgstr "重命名临时文件出错:%s"
-#: gio/glocalfileoutputstream.c:611 gio/glocalfileoutputstream.c:1241
+#: gio/glocalfileoutputstream.c:611 gio/glocalfileoutputstream.c:1242
#, c-format
msgid "Error truncating file: %s"
msgstr "截断文件出错:%s"
#: gio/glocalfileoutputstream.c:664 gio/glocalfileoutputstream.c:909
-#: gio/glocalfileoutputstream.c:1222 gio/gsubprocess.c:231
+#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:231
#, c-format
msgid "Error opening file “%s”: %s"
msgstr "打开文件“%s”出错:%s"
@@ -3259,7 +3269,7 @@ msgstr "目标文件不是普通文件"
msgid "The file was externally modified"
msgstr "文件已经被其他程序修改"
-#: gio/glocalfileoutputstream.c:1204
+#: gio/glocalfileoutputstream.c:1205
#, c-format
msgid "Error removing old file: %s"
msgstr "移除旧文件出错:%s"
@@ -3404,8 +3414,8 @@ msgstr "未指定的代理查询失败"
#. Translators: the first placeholder is a domain name, the
#. * second is an error message
#: gio/gresolver.c:403 gio/gthreadedresolver.c:152 gio/gthreadedresolver.c:170
-#: gio/gthreadedresolver.c:782 gio/gthreadedresolver.c:806
-#: gio/gthreadedresolver.c:831 gio/gthreadedresolver.c:846
+#: gio/gthreadedresolver.c:798 gio/gthreadedresolver.c:822
+#: gio/gthreadedresolver.c:847 gio/gthreadedresolver.c:862
#, c-format
msgid "Error resolving “%s”: %s"
msgstr "解析“%s”时出错:%s"
@@ -4115,35 +4125,35 @@ msgstr "反向解析“%s”时出错:%s"
#. Translators: the placeholder is a DNS record type, such as ‘MX’ or ‘SRV’
#: gio/gthreadedresolver.c:552 gio/gthreadedresolver.c:574
-#: gio/gthreadedresolver.c:612 gio/gthreadedresolver.c:659
-#: gio/gthreadedresolver.c:688 gio/gthreadedresolver.c:700
+#: gio/gthreadedresolver.c:628 gio/gthreadedresolver.c:675
+#: gio/gthreadedresolver.c:704 gio/gthreadedresolver.c:716
#, c-format
msgid "Error parsing DNS %s record: malformed DNS packet"
msgstr "解析 DNS %s 记录时出错:畸形的 DNS 数据包"
-#: gio/gthreadedresolver.c:758 gio/gthreadedresolver.c:895
-#: gio/gthreadedresolver.c:993 gio/gthreadedresolver.c:1043
+#: gio/gthreadedresolver.c:774 gio/gthreadedresolver.c:911
+#: gio/gthreadedresolver.c:1009 gio/gthreadedresolver.c:1059
#, c-format
msgid "No DNS record of the requested type for “%s”"
msgstr "没有“%s”所请求类型的 DNS 记录"
-#: gio/gthreadedresolver.c:763 gio/gthreadedresolver.c:998
+#: gio/gthreadedresolver.c:779 gio/gthreadedresolver.c:1014
#, c-format
msgid "Temporarily unable to resolve “%s”"
msgstr "暂时无法解析“%s”"
-#: gio/gthreadedresolver.c:768 gio/gthreadedresolver.c:1003
-#: gio/gthreadedresolver.c:1113
+#: gio/gthreadedresolver.c:784 gio/gthreadedresolver.c:1019
+#: gio/gthreadedresolver.c:1129
#, c-format
msgid "Error resolving “%s”"
msgstr "解析“%s”时出错"
-#: gio/gthreadedresolver.c:782 gio/gthreadedresolver.c:806
-#: gio/gthreadedresolver.c:831 gio/gthreadedresolver.c:846
+#: gio/gthreadedresolver.c:798 gio/gthreadedresolver.c:822
+#: gio/gthreadedresolver.c:847 gio/gthreadedresolver.c:862
msgid "Malformed DNS packet"
msgstr "畸形的 DNS 数据包"
-#: gio/gthreadedresolver.c:888
+#: gio/gthreadedresolver.c:904
#, c-format
msgid "Failed to parse DNS response for “%s”: "
msgstr "解析响应“%s”的 DNS 失败:"
@@ -4262,7 +4272,7 @@ msgstr "从文件描述符读取时出错:%s"
msgid "Error closing file descriptor: %s"
msgstr "关闭文件描述符时出错:%s"
-#: gio/gunixmounts.c:2815 gio/gunixmounts.c:2868
+#: gio/gunixmounts.c:2817 gio/gunixmounts.c:2870
msgid "Filesystem root"
msgstr "文件系统根目录"
@@ -4344,77 +4354,77 @@ msgstr "运行一个 dbus 服务"
msgid "Wrong args\n"
msgstr "参数错误\n"
-#: glib/gbookmarkfile.c:779
+#: glib/gbookmarkfile.c:861
#, c-format
msgid "Unexpected attribute “%s” for element “%s”"
msgstr "元素“%2$s”的意外属性“%1$s”"
-#: glib/gbookmarkfile.c:790 glib/gbookmarkfile.c:870 glib/gbookmarkfile.c:880
-#: glib/gbookmarkfile.c:993
+#: glib/gbookmarkfile.c:872 glib/gbookmarkfile.c:952 glib/gbookmarkfile.c:962
+#: glib/gbookmarkfile.c:1075
#, c-format
msgid "Attribute “%s” of element “%s” not found"
msgstr "元素“%2$s”的属性“%1$s”未找到"
-#: glib/gbookmarkfile.c:1202 glib/gbookmarkfile.c:1267
-#: glib/gbookmarkfile.c:1331 glib/gbookmarkfile.c:1341
+#: glib/gbookmarkfile.c:1284 glib/gbookmarkfile.c:1349
+#: glib/gbookmarkfile.c:1413 glib/gbookmarkfile.c:1423
#, c-format
msgid "Unexpected tag “%s”, tag “%s” expected"
msgstr "意外标签“%s”,需要标签“%s”"
-#: glib/gbookmarkfile.c:1227 glib/gbookmarkfile.c:1241
-#: glib/gbookmarkfile.c:1309 glib/gbookmarkfile.c:1355
+#: glib/gbookmarkfile.c:1309 glib/gbookmarkfile.c:1323
+#: glib/gbookmarkfile.c:1391 glib/gbookmarkfile.c:1437
#, c-format
msgid "Unexpected tag “%s” inside “%s”"
msgstr "“%2$s”中有意外标签“%1$s”"
-#: glib/gbookmarkfile.c:1635
+#: glib/gbookmarkfile.c:1717
#, c-format
msgid "Invalid date/time ‘%s’ in bookmark file"
msgstr "书签文件中有无效的日期/时间“%s”"
-#: glib/gbookmarkfile.c:1838
+#: glib/gbookmarkfile.c:1956
msgid "No valid bookmark file found in data dirs"
msgstr "数据目录中没有找到有效的书签文件"
-#: glib/gbookmarkfile.c:2039
+#: glib/gbookmarkfile.c:2157
#, c-format
msgid "A bookmark for URI “%s” already exists"
msgstr "URI“%s”的书签已经存在"
-#: glib/gbookmarkfile.c:2088 glib/gbookmarkfile.c:2246
-#: glib/gbookmarkfile.c:2331 glib/gbookmarkfile.c:2411
-#: glib/gbookmarkfile.c:2496 glib/gbookmarkfile.c:2630
-#: glib/gbookmarkfile.c:2763 glib/gbookmarkfile.c:2898
-#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3037
-#: glib/gbookmarkfile.c:3158 glib/gbookmarkfile.c:3352
-#: glib/gbookmarkfile.c:3493 glib/gbookmarkfile.c:3712
-#: glib/gbookmarkfile.c:3801 glib/gbookmarkfile.c:3890
-#: glib/gbookmarkfile.c:4009
+#: glib/gbookmarkfile.c:2206 glib/gbookmarkfile.c:2364
+#: glib/gbookmarkfile.c:2449 glib/gbookmarkfile.c:2529
+#: glib/gbookmarkfile.c:2614 glib/gbookmarkfile.c:2748
+#: glib/gbookmarkfile.c:2881 glib/gbookmarkfile.c:3016
+#: glib/gbookmarkfile.c:3058 glib/gbookmarkfile.c:3155
+#: glib/gbookmarkfile.c:3276 glib/gbookmarkfile.c:3470
+#: glib/gbookmarkfile.c:3611 glib/gbookmarkfile.c:3830
+#: glib/gbookmarkfile.c:3919 glib/gbookmarkfile.c:4008
+#: glib/gbookmarkfile.c:4127
#, c-format
msgid "No bookmark found for URI “%s”"
msgstr "未找到 URI“%s”的书签"
-#: glib/gbookmarkfile.c:2420
+#: glib/gbookmarkfile.c:2538
#, c-format
msgid "No MIME type defined in the bookmark for URI “%s”"
msgstr "URI“%s”的书签未定义 MIME 类型"
-#: glib/gbookmarkfile.c:2505
+#: glib/gbookmarkfile.c:2623
#, c-format
msgid "No private flag has been defined in bookmark for URI “%s”"
msgstr "URI“%s”的书签未定义私有标志"
-#: glib/gbookmarkfile.c:3046
+#: glib/gbookmarkfile.c:3164
#, c-format
msgid "No groups set in bookmark for URI “%s”"
msgstr "URI“%s”的书签未设定组"
-#: glib/gbookmarkfile.c:3514 glib/gbookmarkfile.c:3722
+#: glib/gbookmarkfile.c:3632 glib/gbookmarkfile.c:3840
#, c-format
msgid "No application with name “%s” registered a bookmark for “%s”"
msgstr "没有名为“%s”的应用程序为“%s”注册了书签"
-#: glib/gbookmarkfile.c:3745
+#: glib/gbookmarkfile.c:3863
#, c-format
msgid "Failed to expand exec line “%s” with URI “%s”"
msgstr "用 URI“%2$s”展开 exec 行“%1$s”失败"
@@ -4893,78 +4903,78 @@ msgstr "下午"
msgid "Error opening directory “%s”: %s"
msgstr "打开目录“%s”时出错:%s"
-#: glib/gfileutils.c:735 glib/gfileutils.c:827
+#: glib/gfileutils.c:753 glib/gfileutils.c:845
#, c-format
msgid "Could not allocate %lu byte to read file “%s”"
msgid_plural "Could not allocate %lu bytes to read file “%s”"
msgstr[0] "无法分配 %lu 字节以读取文件“%s”"
-#: glib/gfileutils.c:752
+#: glib/gfileutils.c:770
#, c-format
msgid "Error reading file “%s”: %s"
msgstr "读取文件“%s”时出错:%s"
-#: glib/gfileutils.c:788
+#: glib/gfileutils.c:806
#, c-format
msgid "File “%s” is too large"
msgstr "文件“%s”过大"
-#: glib/gfileutils.c:852
+#: glib/gfileutils.c:870
#, c-format
msgid "Failed to read from file “%s”: %s"
msgstr "读取文件“%s”失败:%s"
-#: glib/gfileutils.c:902 glib/gfileutils.c:977 glib/gfileutils.c:1449
+#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1472
#, c-format
msgid "Failed to open file “%s”: %s"
msgstr "打开文件“%s”失败:%s"
-#: glib/gfileutils.c:915
+#: glib/gfileutils.c:933
#, c-format
msgid "Failed to get attributes of file “%s”: fstat() failed: %s"
msgstr "获得文件“%s”的属性失败:fstat() 失败:%s"
-#: glib/gfileutils.c:946
+#: glib/gfileutils.c:964
#, c-format
msgid "Failed to open file “%s”: fdopen() failed: %s"
msgstr "打开文件“%s”失败:fdopen() 失败:%s"
-#: glib/gfileutils.c:1047
+#: glib/gfileutils.c:1065
#, c-format
msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s"
msgstr "将文件“%s”重命名为“%s”失败:g_rename() 失败:%s"
-#: glib/gfileutils.c:1156
+#: glib/gfileutils.c:1179
#, c-format
msgid "Failed to write file “%s”: write() failed: %s"
msgstr "写入文件“%s”失败:write() 失败:%s"
-#: glib/gfileutils.c:1177
+#: glib/gfileutils.c:1200
#, c-format
msgid "Failed to write file “%s”: fsync() failed: %s"
msgstr "写入文件“%s”失败:fsync() 失败:%s"
-#: glib/gfileutils.c:1338 glib/gfileutils.c:1753
+#: glib/gfileutils.c:1361 glib/gfileutils.c:1776
#, c-format
msgid "Failed to create file “%s”: %s"
msgstr "创建文件“%s”失败:%s"
-#: glib/gfileutils.c:1383
+#: glib/gfileutils.c:1406
#, c-format
msgid "Existing file “%s” could not be removed: g_unlink() failed: %s"
msgstr "无法删除已有文件“%s”:g_unlink() 失败:%s"
-#: glib/gfileutils.c:1718
+#: glib/gfileutils.c:1741
#, c-format
msgid "Template “%s” invalid, should not contain a “%s”"
msgstr "模板“%s”无效,不应该包含“%s”"
-#: glib/gfileutils.c:1731
+#: glib/gfileutils.c:1754
#, c-format
msgid "Template “%s” doesn’t contain XXXXXX"
msgstr "模板“%s”不包含 XXXXXX"
-#: glib/gfileutils.c:2291 glib/gfileutils.c:2320
+#: glib/gfileutils.c:2348 glib/gfileutils.c:2377
#, c-format
msgid "Failed to read the symbolic link “%s”: %s"
msgstr "读取符号链接“%s”失败:%s"
@@ -5024,8 +5034,8 @@ msgid "Key file contains unsupported encoding “%s”"
msgstr "键文件包含不支持的编码“%s”"
#: glib/gkeyfile.c:1679 glib/gkeyfile.c:1852 glib/gkeyfile.c:3299
-#: glib/gkeyfile.c:3363 glib/gkeyfile.c:3493 glib/gkeyfile.c:3625
-#: glib/gkeyfile.c:3771 glib/gkeyfile.c:4006 glib/gkeyfile.c:4073
+#: glib/gkeyfile.c:3363 glib/gkeyfile.c:3493 glib/gkeyfile.c:3622
+#: glib/gkeyfile.c:3768 glib/gkeyfile.c:4003 glib/gkeyfile.c:4070
#, c-format
msgid "Key file does not have group “%s”"
msgstr "键文件没有组“%s”"
@@ -5058,31 +5068,31 @@ msgstr "键文件包含组“%2$s”中的键“%1$s”,其值无法解释。"
msgid "Key “%s” in group “%s” has value “%s” where %s was expected"
msgstr "组“%2$s”中的键“%1$s”的值为“%3$s”,应为 %4$s"
-#: glib/gkeyfile.c:4326
+#: glib/gkeyfile.c:4323
msgid "Key file contains escape character at end of line"
msgstr "键文件在行尾含有转义字符"
-#: glib/gkeyfile.c:4348
+#: glib/gkeyfile.c:4345
#, c-format
msgid "Key file contains invalid escape sequence “%s”"
msgstr "键文件中包含无效的转义序列“%s”"
-#: glib/gkeyfile.c:4493
+#: glib/gkeyfile.c:4490
#, c-format
msgid "Value “%s” cannot be interpreted as a number."
msgstr "无法将值“%s”解释为数值。"
-#: glib/gkeyfile.c:4507
+#: glib/gkeyfile.c:4504
#, c-format
msgid "Integer value “%s” out of range"
msgstr "整数值“%s”超出范围"
-#: glib/gkeyfile.c:4540
+#: glib/gkeyfile.c:4537
#, c-format
msgid "Value “%s” cannot be interpreted as a float number."
msgstr "无法将值“%s”解释为浮点数。"
-#: glib/gkeyfile.c:4579
+#: glib/gkeyfile.c:4576
#, c-format
msgid "Value “%s” cannot be interpreted as a boolean."
msgstr "无法将值“%s”解释为布尔值。"
@@ -5102,32 +5112,32 @@ msgstr "映射 %s%s%s%s 失败:mmap() 失败:%s"
msgid "Failed to open file “%s”: open() failed: %s"
msgstr "打开文件“%s”失败:open() 失败:%s"
-#: glib/gmarkup.c:400 glib/gmarkup.c:442
+#: glib/gmarkup.c:393 glib/gmarkup.c:435
#, c-format
msgid "Error on line %d char %d: "
msgstr "第 %d 行第 %d 个字符出错: "
-#: glib/gmarkup.c:464 glib/gmarkup.c:547
+#: glib/gmarkup.c:457 glib/gmarkup.c:540
#, c-format
msgid "Invalid UTF-8 encoded text in name — not valid “%s”"
msgstr "名称包含无效的 UTF-8 编码文本——无效的“%s”"
-#: glib/gmarkup.c:475
+#: glib/gmarkup.c:468
#, c-format
msgid "“%s” is not a valid name"
msgstr "“%s”不是有效的名称"
-#: glib/gmarkup.c:491
+#: glib/gmarkup.c:484
#, c-format
msgid "“%s” is not a valid name: “%c”"
msgstr "“%s”不是有效的名称:“%c”"
-#: glib/gmarkup.c:615
+#: glib/gmarkup.c:608
#, c-format
msgid "Error on line %d: %s"
msgstr "第 %d 行出错:%s"
-#: glib/gmarkup.c:692
+#: glib/gmarkup.c:685
#, c-format
msgid ""
"Failed to parse “%-.*s”, which should have been a digit inside a character "
@@ -5135,7 +5145,7 @@ msgid ""
msgstr ""
"解析“%-.*s”失败。它应该是字符引用中的数字(如 &#234;)——可能该数字太大了"
-#: glib/gmarkup.c:704
+#: glib/gmarkup.c:697
msgid ""
"Character reference did not end with a semicolon; most likely you used an "
"ampersand character without intending to start an entity — escape ampersand "
@@ -5144,22 +5154,22 @@ msgstr ""
"字符引用没有以分号结束。很可能您使用了与号(&)字符而又不是一个实体——将这个与"
"号变为 &amp;"
-#: glib/gmarkup.c:730
+#: glib/gmarkup.c:723
#, c-format
msgid "Character reference “%-.*s” does not encode a permitted character"
msgstr "字符引用“%-.*s”没有编码一个允许的字符"
-#: glib/gmarkup.c:768
+#: glib/gmarkup.c:761
msgid ""
"Empty entity “&;” seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
msgstr "发现空的实体“&;”。有效的实体为:&amp; &quot; &lt; &gt; &apos;"
-#: glib/gmarkup.c:776
+#: glib/gmarkup.c:769
#, c-format
msgid "Entity name “%-.*s” is not known"
msgstr "未知的实体名“%-.*s”"
-#: glib/gmarkup.c:781
+#: glib/gmarkup.c:774
msgid ""
"Entity did not end with a semicolon; most likely you used an ampersand "
"character without intending to start an entity — escape ampersand as &amp;"
@@ -5167,36 +5177,36 @@ msgstr ""
"实体没有以分号结束。很可能您使用了与号(&)字符而又不是一个实体——将这个与号变"
"为 &amp;"
-#: glib/gmarkup.c:1195
+#: glib/gmarkup.c:1188
msgid "Document must begin with an element (e.g. <book>)"
msgstr "文档必须以一个元素开始(例如 <book>)"
-#: glib/gmarkup.c:1235
+#: glib/gmarkup.c:1228
#, c-format
msgid ""
"“%s” is not a valid character following a “<” character; it may not begin an "
"element name"
msgstr "“%s”出现在字符“<”后是无效字符;它不能作为元素名的开头"
-#: glib/gmarkup.c:1278
+#: glib/gmarkup.c:1271
#, c-format
msgid ""
"Odd character “%s”, expected a “>” character to end the empty-element tag "
"“%s”"
msgstr "字符“%s”无效,应该以字符“>”来结束空元素标记“%s”"
-#: glib/gmarkup.c:1348
+#: glib/gmarkup.c:1341
#, c-format
msgid "Too many attributes in element “%s”"
msgstr "元素“%s”中有过多参数"
-#: glib/gmarkup.c:1368
+#: glib/gmarkup.c:1361
#, c-format
msgid ""
"Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”"
msgstr "字符“%s”无效,在属性名“%s”(元素“%s”)的后应该是字符“=”"
-#: glib/gmarkup.c:1410
+#: glib/gmarkup.c:1403
#, c-format
msgid ""
"Odd character “%s”, expected a “>” or “/” character to end the start tag of "
@@ -5206,92 +5216,92 @@ msgstr ""
"字符“%s”无效,应该以“>”或“/”结束元素“%s”的起始标记,或紧跟该元素的属性;可能"
"您在属性名中使用了无效字符"
-#: glib/gmarkup.c:1455
+#: glib/gmarkup.c:1448
#, c-format
msgid ""
"Odd character “%s”, expected an open quote mark after the equals sign when "
"giving value for attribute “%s” of element “%s”"
msgstr "字符“%1$s”无效,在给元素“%3$s”的属性“%2$s”赋值时,等号后应该是前引号"
-#: glib/gmarkup.c:1589
+#: glib/gmarkup.c:1582
#, c-format
msgid ""
"“%s” is not a valid character following the characters “</”; “%s” may not "
"begin an element name"
msgstr "“%s”出现在字符“</”后无效;“%s”不能作为元素名的开头"
-#: glib/gmarkup.c:1627
+#: glib/gmarkup.c:1620
#, c-format
msgid ""
"“%s” is not a valid character following the close element name “%s”; the "
"allowed character is “>”"
msgstr "“%s”字符出现在闭合元素名“%s”后无效;允许的字符是“>”"
-#: glib/gmarkup.c:1639
+#: glib/gmarkup.c:1632
#, c-format
msgid "Element “%s” was closed, no element is currently open"
msgstr "元素“%s”已经闭合,当前没有开放的元素"
-#: glib/gmarkup.c:1648
+#: glib/gmarkup.c:1641
#, c-format
msgid "Element “%s” was closed, but the currently open element is “%s”"
msgstr "元素“%s”已经闭合,当前仍开放的元素是“%s”"
-#: glib/gmarkup.c:1801
+#: glib/gmarkup.c:1794
msgid "Document was empty or contained only whitespace"
msgstr "文档为空或仅含空白字符"
-#: glib/gmarkup.c:1815
+#: glib/gmarkup.c:1808
msgid "Document ended unexpectedly just after an open angle bracket “<”"
msgstr "文档在一个左尖括号“<”后意外结束"
-#: glib/gmarkup.c:1823 glib/gmarkup.c:1868
+#: glib/gmarkup.c:1816 glib/gmarkup.c:1861
#, c-format
msgid ""
"Document ended unexpectedly with elements still open — “%s” was the last "
"element opened"
msgstr "文档在元素仍开放处意外结束——最后未结束的元素是“%s”"
-#: glib/gmarkup.c:1831
+#: glib/gmarkup.c:1824
#, c-format
msgid ""
"Document ended unexpectedly, expected to see a close angle bracket ending "
"the tag <%s/>"
msgstr "文档意外结束,应该以右尖括号“>”来结束标记 <%s/>"
-#: glib/gmarkup.c:1837
+#: glib/gmarkup.c:1830
msgid "Document ended unexpectedly inside an element name"
msgstr "文档在元素名中意外结束"
-#: glib/gmarkup.c:1843
+#: glib/gmarkup.c:1836
msgid "Document ended unexpectedly inside an attribute name"
msgstr "文档在属性名中意外结束"
-#: glib/gmarkup.c:1848
+#: glib/gmarkup.c:1841
msgid "Document ended unexpectedly inside an element-opening tag."
msgstr "文档在元素仍开放的标记中意外结束。"
-#: glib/gmarkup.c:1854
+#: glib/gmarkup.c:1847
msgid ""
"Document ended unexpectedly after the equals sign following an attribute "
"name; no attribute value"
msgstr "文档在跟在属性名后的等号后意外结束;没有属性值"
-#: glib/gmarkup.c:1861
+#: glib/gmarkup.c:1854
msgid "Document ended unexpectedly while inside an attribute value"
msgstr "文档在属性值中意外结束"
-#: glib/gmarkup.c:1878
+#: glib/gmarkup.c:1871
#, c-format
msgid "Document ended unexpectedly inside the close tag for element “%s”"
msgstr "文档在元素“%s”的闭合标记中意外结束"
-#: glib/gmarkup.c:1882
+#: glib/gmarkup.c:1875
msgid ""
"Document ended unexpectedly inside the close tag for an unopened element"
msgstr "文档在无起始元素的闭合标记中意外结束"
-#: glib/gmarkup.c:1888
+#: glib/gmarkup.c:1881
msgid "Document ended unexpectedly inside a comment or processing instruction"
msgstr "文档在注释或处理指令中意外结束"
@@ -5354,300 +5364,300 @@ msgstr "缺少 %s 的参数"
msgid "Unknown option %s"
msgstr "未知选项 %s"
-#: glib/gregex.c:436
+#: glib/gregex.c:479
msgid "corrupted object"
msgstr "无效对象"
-#: glib/gregex.c:438
+#: glib/gregex.c:481
msgid "out of memory"
msgstr "内存不足"
-#: glib/gregex.c:443
+#: glib/gregex.c:487
msgid "backtracking limit reached"
msgstr "达到回溯上限"
-#: glib/gregex.c:454 glib/gregex.c:707 glib/gregex.c:736
+#: glib/gregex.c:498
msgid "internal error"
msgstr "内部错误"
-#: glib/gregex.c:456
+#: glib/gregex.c:500
msgid "the pattern contains items not supported for partial matching"
msgstr "表达式包含不被部分匹配支持的项"
-#: glib/gregex.c:458
+#: glib/gregex.c:502
msgid "back references as conditions are not supported for partial matching"
msgstr "不完全匹配时作为条件的后向引用不被支持"
-#: glib/gregex.c:464
+#: glib/gregex.c:508
msgid "recursion limit reached"
msgstr "达到递归上限"
-#: glib/gregex.c:466
+#: glib/gregex.c:510
msgid "bad offset"
msgstr "错误的偏移值"
-#: glib/gregex.c:468
+#: glib/gregex.c:512
msgid "recursion loop"
msgstr "递归循环"
#. should not happen in GRegex since we check modes before each match
-#: glib/gregex.c:471
+#: glib/gregex.c:515
msgid "matching mode is requested that was not compiled for JIT"
msgstr "请求了匹配模式,但它未为 JIT 编译"
-#: glib/gregex.c:475
+#: glib/gregex.c:536 glib/gregex.c:1838
msgid "unknown error"
msgstr "未知错误"
-#: glib/gregex.c:496
+#: glib/gregex.c:557
msgid "\\ at end of pattern"
msgstr "\\ 在表达式末尾"
-#: glib/gregex.c:500
+#: glib/gregex.c:561
msgid "\\c at end of pattern"
msgstr "表达式末尾的 \\c"
-#: glib/gregex.c:505
+#: glib/gregex.c:566
msgid "unrecognized character following \\"
msgstr "\\ 后有无法识别的字符"
-#: glib/gregex.c:509
+#: glib/gregex.c:570
msgid "numbers out of order in {} quantifier"
msgstr "{} 量词里的数字次序颠倒了"
-#: glib/gregex.c:513
+#: glib/gregex.c:574
msgid "number too big in {} quantifier"
msgstr "{} 量词里的数字太大了"
-#: glib/gregex.c:517
+#: glib/gregex.c:578
msgid "missing terminating ] for character class"
msgstr "字符类缺少终结的 ]"
-#: glib/gregex.c:521
+#: glib/gregex.c:582
msgid "invalid escape sequence in character class"
msgstr "字符类包含无效的转义序列"
-#: glib/gregex.c:525
+#: glib/gregex.c:586
msgid "range out of order in character class"
msgstr "字符类的范围次序颠倒"
-#: glib/gregex.c:530
+#: glib/gregex.c:591
msgid "nothing to repeat"
msgstr "没有可以重复的内容"
-#: glib/gregex.c:534
+#: glib/gregex.c:595
msgid "unrecognized character after (? or (?-"
msgstr "(? 或 (?- 后有无法识别的字符"
-#: glib/gregex.c:538
+#: glib/gregex.c:599
msgid "POSIX named classes are supported only within a class"
msgstr "只有类里支持 POSIX 命名的类"
-#: glib/gregex.c:542
+#: glib/gregex.c:603
msgid "POSIX collating elements are not supported"
msgstr "不支持 POSIX 整理元素"
-#: glib/gregex.c:548
+#: glib/gregex.c:609
msgid "missing terminating )"
msgstr "缺少结束的 )"
-#: glib/gregex.c:552
+#: glib/gregex.c:613
msgid "reference to non-existent subpattern"
msgstr "引用了不存在的子表达式"
-#: glib/gregex.c:556
+#: glib/gregex.c:617
msgid "missing ) after comment"
msgstr "注释后缺少 )"
-#: glib/gregex.c:560
+#: glib/gregex.c:621
msgid "regular expression is too large"
msgstr "正则表达式过长"
-#: glib/gregex.c:564
+#: glib/gregex.c:625
msgid "malformed number or name after (?("
msgstr "(?( 后有形式不正确的数字或名称"
-#: glib/gregex.c:568
+#: glib/gregex.c:629
msgid "lookbehind assertion is not fixed length"
msgstr "lookbehind 断言不是定长的"
-#: glib/gregex.c:572
+#: glib/gregex.c:633
msgid "conditional group contains more than two branches"
msgstr "条件组包含了超过两个分支"
-#: glib/gregex.c:576
+#: glib/gregex.c:637
msgid "assertion expected after (?("
msgstr "(?( 后应该有断言"
-#: glib/gregex.c:580
+#: glib/gregex.c:641
msgid "a numbered reference must not be zero"
msgstr "编号引用不能为 0"
-#: glib/gregex.c:584
+#: glib/gregex.c:645
msgid "unknown POSIX class name"
msgstr "未知的 POSIX 类名"
-#: glib/gregex.c:589
+#: glib/gregex.c:650
msgid "character value in \\x{...} sequence is too large"
msgstr "\\x{...} 序列里的字符值太大了"
-#: glib/gregex.c:593
+#: glib/gregex.c:654
msgid "\\C not allowed in lookbehind assertion"
msgstr "lookbehind 断言里不允许使用 \\C"
-#: glib/gregex.c:597
+#: glib/gregex.c:658
msgid "missing terminator in subpattern name"
msgstr "子表达式名里缺少终结符"
-#: glib/gregex.c:601
+#: glib/gregex.c:662
msgid "two named subpatterns have the same name"
msgstr "两个有名子表达式有相同的名称"
-#: glib/gregex.c:605
+#: glib/gregex.c:666
msgid "malformed \\P or \\p sequence"
msgstr "形式不正确的 \\P 或 \\p 序列"
-#: glib/gregex.c:609
+#: glib/gregex.c:670
msgid "unknown property name after \\P or \\p"
msgstr "\\P 或 \\p 后有未知的属性名"
-#: glib/gregex.c:613
+#: glib/gregex.c:674
msgid "subpattern name is too long (maximum 32 characters)"
msgstr "子表达式名太长了(最多 32 个字符)"
-#: glib/gregex.c:617
+#: glib/gregex.c:678
msgid "too many named subpatterns (maximum 10,000)"
msgstr "有名子表达式太多了(最多 10,000 个)"
-#: glib/gregex.c:621
+#: glib/gregex.c:682
msgid "octal value is greater than \\377"
msgstr "八进制值大于 \\377"
-#: glib/gregex.c:625
+#: glib/gregex.c:686
msgid "DEFINE group contains more than one branch"
msgstr "定义组包含多于一个的分支"
-#: glib/gregex.c:629
+#: glib/gregex.c:690
msgid "inconsistent NEWLINE options"
msgstr "不一致的换行选项"
-#: glib/gregex.c:633
+#: glib/gregex.c:694
msgid ""
"\\g is not followed by a braced, angle-bracketed, or quoted name or number, "
"or by a plain number"
msgstr "\\g 后没有花括号、尖括号或引号括起来的名称或数字,或纯数字"
-#: glib/gregex.c:638
+#: glib/gregex.c:699
msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)"
msgstr "(*ACCEPT)、(*FAIL) 和 (*COMMIT) 不允许带参数"
-#: glib/gregex.c:642
+#: glib/gregex.c:703
msgid "(*VERB) not recognized"
msgstr "无法识别 (*VERB)"
-#: glib/gregex.c:646
+#: glib/gregex.c:707
msgid "number is too big"
msgstr "数字太大"
-#: glib/gregex.c:650
+#: glib/gregex.c:711
msgid "missing subpattern name after (?&"
msgstr "(?& 后缺少子表达式名"
-#: glib/gregex.c:654
+#: glib/gregex.c:715
msgid "different names for subpatterns of the same number are not allowed"
msgstr "不允许两个号码相同的子表达式有不同的名称"
-#: glib/gregex.c:658
+#: glib/gregex.c:719
msgid "(*MARK) must have an argument"
msgstr "(*MARK) 必须有一个参数"
-#: glib/gregex.c:662
+#: glib/gregex.c:723
msgid "\\c must be followed by an ASCII character"
msgstr "\\c 后面必须跟一个 ASCII 字符"
-#: glib/gregex.c:666
+#: glib/gregex.c:727
msgid "\\k is not followed by a braced, angle-bracketed, or quoted name"
msgstr "\\k 后没有用花括号、尖括号或引号括起来的名称"
-#: glib/gregex.c:670
+#: glib/gregex.c:731
msgid "\\N is not supported in a class"
msgstr "类中不支持 \\N"
-#: glib/gregex.c:674
+#: glib/gregex.c:735
msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)"
msgstr "在 (*MARK)、(*PRUNE)、(*SKIP) 或者 (*THEN) 中的名称太长"
-#: glib/gregex.c:678 glib/gregex.c:809
+#: glib/gregex.c:739 glib/gregex.c:875
msgid "code overflow"
msgstr "代码溢出"
-#: glib/gregex.c:682
+#: glib/gregex.c:743
msgid "unrecognized character after (?P"
msgstr "(?P 有无法识别的字符"
-#: glib/gregex.c:686
+#: glib/gregex.c:747
msgid "overran compiling workspace"
msgstr "编译工作区超出正常范围"
-#: glib/gregex.c:690
+#: glib/gregex.c:751
msgid "previously-checked referenced subpattern not found"
msgstr "未找到之前检查过的引用过的子表达式"
-#: glib/gregex.c:808 glib/gregex.c:1041 glib/gregex.c:2342
+#: glib/gregex.c:874 glib/gregex.c:1121 glib/gregex.c:2444
#, c-format
msgid "Error while matching regular expression %s: %s"
msgstr "匹配正则表达式 %s 时出错:%s"
-#: glib/gregex.c:1618
+#: glib/gregex.c:1721
msgid "PCRE library is compiled without UTF8 support"
msgstr "PCRE 库编译时未包含 UTF8 支持"
-#: glib/gregex.c:1626
+#: glib/gregex.c:1729
msgid "PCRE library is compiled with incompatible options"
msgstr "PCRE 库编译时使用了不兼容的选项"
-#: glib/gregex.c:1751
+#: glib/gregex.c:1847
#, c-format
msgid "Error while compiling regular expression ‘%s’ at char %s: %s"
msgstr "编译正则表达式“%s”到字符 %s 处时出错:%s"
-#: glib/gregex.c:2786
+#: glib/gregex.c:2887
msgid "hexadecimal digit or “}” expected"
msgstr "期望十六进制数或“}”"
-#: glib/gregex.c:2802
+#: glib/gregex.c:2903
msgid "hexadecimal digit expected"
msgstr "期望十六进制数"
-#: glib/gregex.c:2842
+#: glib/gregex.c:2943
msgid "missing “<” in symbolic reference"
msgstr "在符号引用中缺少“<”"
-#: glib/gregex.c:2851
+#: glib/gregex.c:2952
msgid "unfinished symbolic reference"
msgstr "未完成的符号引用"
-#: glib/gregex.c:2858
+#: glib/gregex.c:2959
msgid "zero-length symbolic reference"
msgstr "零长符号引用"
-#: glib/gregex.c:2869
+#: glib/gregex.c:2970
msgid "digit expected"
msgstr "期望数字"
-#: glib/gregex.c:2887
+#: glib/gregex.c:2988
msgid "illegal symbolic reference"
msgstr "非法的符号引用"
-#: glib/gregex.c:2950
+#: glib/gregex.c:3051
msgid "stray final “\\”"
msgstr "丢失了最后的“\\”"
-#: glib/gregex.c:2954
+#: glib/gregex.c:3055
msgid "unknown escape sequence"
msgstr "未知的转义序列"
-#: glib/gregex.c:2964
+#: glib/gregex.c:3065
#, c-format
msgid "Error while parsing replacement text “%s” at char %lu: %s"
msgstr "解析替换文本“%s”到字符 %lu 处时出错:%s"
@@ -5674,96 +5684,101 @@ msgstr "在找到为 %c 匹配的引用之前,文本已结束。(文本为
msgid "Text was empty (or contained only whitespace)"
msgstr "文本为空(或仅含空白字符)"
-#: glib/gspawn.c:314
+#: glib/gspawn.c:319
#, c-format
msgid "Failed to read data from child process (%s)"
msgstr "从子进程中读取数据失败(%s)"
-#: glib/gspawn.c:466
+#: glib/gspawn.c:471
#, c-format
msgid "Unexpected error in reading data from a child process (%s)"
msgstr "在从子进程中读取数据时出现异常错误(%s)"
-#: glib/gspawn.c:551
+#: glib/gspawn.c:556
#, c-format
msgid "Unexpected error in waitpid() (%s)"
msgstr "waitpid() 出现异常错误(%s)"
-#: glib/gspawn.c:1170 glib/gspawn-win32.c:1488
+#: glib/gspawn.c:1175 glib/gspawn-win32.c:1503
#, c-format
msgid "Child process exited with code %ld"
msgstr "子进程已退出,代码 %ld"
-#: glib/gspawn.c:1178
+#: glib/gspawn.c:1183
#, c-format
msgid "Child process killed by signal %ld"
msgstr "子进程已由信号 %ld 杀死"
-#: glib/gspawn.c:1185
+#: glib/gspawn.c:1190
#, c-format
msgid "Child process stopped by signal %ld"
msgstr "子进程已由信号 %ld 停止"
-#: glib/gspawn.c:1192
+#: glib/gspawn.c:1197
#, c-format
msgid "Child process exited abnormally"
msgstr "子进程异常中止"
-#: glib/gspawn.c:1885 glib/gspawn-win32.c:393 glib/gspawn-win32.c:401
+#: glib/gspawn.c:2027 glib/gspawn-win32.c:393 glib/gspawn-win32.c:401
#, c-format
msgid "Failed to read from child pipe (%s)"
msgstr "从子管道中读取失败(%s)"
-#: glib/gspawn.c:2248
+#: glib/gspawn.c:2399
#, c-format
msgid "Failed to spawn child process “%s” (%s)"
msgstr "生成子进程“%s”失败(%s)"
-#: glib/gspawn.c:2365
+#: glib/gspawn.c:2525
#, c-format
msgid "Failed to fork (%s)"
msgstr "fork 失败(%s)"
-#: glib/gspawn.c:2525 glib/gspawn-win32.c:424
+#: glib/gspawn.c:2685 glib/gspawn-win32.c:424
#, c-format
msgid "Failed to change to directory “%s” (%s)"
msgstr "切换到目录“%s”失败(%s)"
-#: glib/gspawn.c:2535
+#: glib/gspawn.c:2695
#, c-format
msgid "Failed to execute child process “%s” (%s)"
msgstr "执行子进程“%s”失败(%s)"
-#: glib/gspawn.c:2545
+#: glib/gspawn.c:2705
#, c-format
msgid "Failed to open file to remap file descriptor (%s)"
msgstr "打开文件以重新映射文件描述符失败(%s)"
-#: glib/gspawn.c:2553
+#: glib/gspawn.c:2713
#, c-format
msgid "Failed to duplicate file descriptor for child process (%s)"
msgstr "为子进程复制文件描述符失败(%s)"
-#: glib/gspawn.c:2562
+#: glib/gspawn.c:2722
#, c-format
msgid "Failed to fork child process (%s)"
msgstr "fork 子进程失败(%s)"
-#: glib/gspawn.c:2570
+#: glib/gspawn.c:2730
#, c-format
msgid "Failed to close file descriptor for child process (%s)"
msgstr "为子进程关闭文件描述符失败(%s)"
-#: glib/gspawn.c:2578
+#: glib/gspawn.c:2738
#, c-format
msgid "Unknown error executing child process “%s”"
msgstr "执行子进程“%s”时出现未知错误"
-#: glib/gspawn.c:2602
+#: glib/gspawn.c:2762
#, c-format
msgid "Failed to read enough data from child pid pipe (%s)"
msgstr "从子进程管道中读取足够的数据失败(%s)"
+#: glib/gspawn-private.h:134
+#, c-format
+msgid "Invalid source FDs argument"
+msgstr "无效的源文件描述符参数"
+
#: glib/gspawn-win32.c:337
msgid "Failed to read data from child process"
msgstr "从子进程中读取数据失败"
@@ -5783,47 +5798,47 @@ msgstr "在子进程中 dup() 失败(%s)"
msgid "Invalid program name: %s"
msgstr "无效的程序名:%s"
-#: glib/gspawn-win32.c:521 glib/gspawn-win32.c:853
+#: glib/gspawn-win32.c:521 glib/gspawn-win32.c:868
#, c-format
msgid "Invalid string in argument vector at %d: %s"
msgstr "%d 处的参数向量中有无效的字符串:%s"
-#: glib/gspawn-win32.c:532 glib/gspawn-win32.c:869
+#: glib/gspawn-win32.c:532 glib/gspawn-win32.c:884
#, c-format
msgid "Invalid string in environment: %s"
msgstr "环境中有无效的字符串:%s"
-#: glib/gspawn-win32.c:849
+#: glib/gspawn-win32.c:864
#, c-format
msgid "Invalid working directory: %s"
msgstr "无效的工作目录:%s"
-#: glib/gspawn-win32.c:914
+#: glib/gspawn-win32.c:929
#, c-format
msgid "Failed to execute helper program (%s)"
msgstr "执行助手程序(%s)失败"
-#: glib/gspawn-win32.c:1143
+#: glib/gspawn-win32.c:1158
msgid ""
"Unexpected error in g_io_channel_win32_poll() reading data from a child "
"process"
msgstr "g_io_channel_win32_poll() 从子进程中读取数据时出现异常错误"
-#: glib/gstrfuncs.c:3366 glib/gstrfuncs.c:3468
+#: glib/gstrfuncs.c:3370 glib/gstrfuncs.c:3472
msgid "Empty string is not a number"
msgstr "空字符串不是数字"
-#: glib/gstrfuncs.c:3390
+#: glib/gstrfuncs.c:3394
#, c-format
msgid "“%s” is not a signed number"
msgstr "“%s”不是有效的有符号数值"
-#: glib/gstrfuncs.c:3400 glib/gstrfuncs.c:3504
+#: glib/gstrfuncs.c:3404 glib/gstrfuncs.c:3508
#, c-format
msgid "Number “%s” is out of bounds [%s, %s]"
msgstr "数字“%s”越界 [%s, %s]"
-#: glib/gstrfuncs.c:3494
+#: glib/gstrfuncs.c:3498
#, c-format
msgid "“%s” is not an unsigned number"
msgstr "“%s”不是有效的无符号数值"
@@ -5902,138 +5917,138 @@ msgid "Character out of range for UTF-16"
msgstr "字符超出 UTF-16 范围"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 kB"
-#: glib/gutils.c:2857
+#: glib/gutils.c:2966
msgid "kB"
msgstr "kB"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 MB"
-#: glib/gutils.c:2859
+#: glib/gutils.c:2968
msgid "MB"
msgstr "MB"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 GB"
-#: glib/gutils.c:2861
+#: glib/gutils.c:2970
msgid "GB"
msgstr "GB"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 TB"
-#: glib/gutils.c:2863
+#: glib/gutils.c:2972
msgid "TB"
msgstr "TB"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 PB"
-#: glib/gutils.c:2865
+#: glib/gutils.c:2974
msgid "PB"
msgstr "PB"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 EB"
-#: glib/gutils.c:2867
+#: glib/gutils.c:2976
msgid "EB"
msgstr "EB"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 KiB"
-#: glib/gutils.c:2871
+#: glib/gutils.c:2980
msgid "KiB"
msgstr "KiB"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 MiB"
-#: glib/gutils.c:2873
+#: glib/gutils.c:2982
msgid "MiB"
msgstr "MiB"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 GiB"
-#: glib/gutils.c:2875
+#: glib/gutils.c:2984
msgid "GiB"
msgstr "GiB"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 TiB"
-#: glib/gutils.c:2877
+#: glib/gutils.c:2986
msgid "TiB"
msgstr "TiB"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 PiB"
-#: glib/gutils.c:2879
+#: glib/gutils.c:2988
msgid "PiB"
msgstr "PiB"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 EiB"
-#: glib/gutils.c:2881
+#: glib/gutils.c:2990
msgid "EiB"
msgstr "EiB"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 kb"
-#: glib/gutils.c:2885
+#: glib/gutils.c:2994
msgid "kb"
msgstr "kb"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mb"
-#: glib/gutils.c:2887
+#: glib/gutils.c:2996
msgid "Mb"
msgstr "Mb"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gb"
-#: glib/gutils.c:2889
+#: glib/gutils.c:2998
msgid "Gb"
msgstr "Gb"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tb"
-#: glib/gutils.c:2891
+#: glib/gutils.c:3000
msgid "Tb"
msgstr "Tb"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pb"
-#: glib/gutils.c:2893
+#: glib/gutils.c:3002
msgid "Pb"
msgstr "Pb"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eb"
-#: glib/gutils.c:2895
+#: glib/gutils.c:3004
msgid "Eb"
msgstr "Eb"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kib"
-#: glib/gutils.c:2899
+#: glib/gutils.c:3008
msgid "Kib"
msgstr "Kib"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mib"
-#: glib/gutils.c:2901
+#: glib/gutils.c:3010
msgid "Mib"
msgstr "Mib"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gib"
-#: glib/gutils.c:2903
+#: glib/gutils.c:3012
msgid "Gib"
msgstr "Gib"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tib"
-#: glib/gutils.c:2905
+#: glib/gutils.c:3014
msgid "Tib"
msgstr "Tib"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pib"
-#: glib/gutils.c:2907
+#: glib/gutils.c:3016
msgid "Pib"
msgstr "Pib"
#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eib"
-#: glib/gutils.c:2909
+#: glib/gutils.c:3018
msgid "Eib"
msgstr "Eib"
-#: glib/gutils.c:2947
+#: glib/gutils.c:3056
msgid "byte"
msgid_plural "bytes"
msgstr[0] "字节"
-#: glib/gutils.c:2951
+#: glib/gutils.c:3060
msgid "bit"
msgid_plural "bits"
msgstr[0] "位"
#. Translators: The "%u" is replaced with the size value, like "13"; it could
#. * be part of "13 bytes", but only the number is requested this time.
-#: glib/gutils.c:2959
+#: glib/gutils.c:3068
#, c-format
msgctxt "format-size"
msgid "%u"
@@ -6041,7 +6056,7 @@ msgstr "%u"
#. Translators: The first "%u" is replaced with the value, the "%s" with a unit of the value.
#. * The order can be changed with "%$2s %$1u". An example: "13 bytes"
-#: glib/gutils.c:2964
+#: glib/gutils.c:3073
#, c-format
msgctxt "format-size"
msgid "%u %s"
@@ -6049,7 +6064,7 @@ msgstr "%u %s"
#. Translators: The "%.1f" is replaced with the size value, like "13.0"; it could
#. * be part of "13.0 MB", but only the number is requested this time.
-#: glib/gutils.c:3000
+#: glib/gutils.c:3109
#, c-format
msgctxt "format-size"
msgid "%.1f"
@@ -6058,27 +6073,27 @@ msgstr "%.1f"
#. Translators: The first "%.1f" is replaced with the value, the "%s" with a unit of the value.
#. * The order can be changed with "%$2s %$1.1f". Keep the no-break space between the value and
#. * the unit symbol. An example: "13.0 MB"
-#: glib/gutils.c:3006
+#: glib/gutils.c:3115
#, c-format
msgctxt "format-size"
msgid "%.1f %s"
msgstr "%.1f %s"
#. Translators: the %s in "%s bytes" will always be replaced by a number.
-#: glib/gutils.c:3046
+#: glib/gutils.c:3155
#, c-format
msgid "%s byte"
msgid_plural "%s bytes"
msgstr[0] "%s 字节"
#. Translators: the %s in "%s bits" will always be replaced by a number.
-#: glib/gutils.c:3051
+#: glib/gutils.c:3160
#, c-format
msgid "%s bit"
msgid_plural "%s bits"
msgstr[0] "%s 位"
-#: glib/gutils.c:3092
+#: glib/gutils.c:3201
#, c-format
msgid "%u byte"
msgid_plural "%u bytes"
@@ -6089,32 +6104,32 @@ msgstr[0] "%u 字节"
#. * compatibility. Users will not see this string unless a program is using this deprecated function.
#. * Please translate as literally as possible.
#.
-#: glib/gutils.c:3105
+#: glib/gutils.c:3214
#, c-format
msgid "%.1f KB"
msgstr "%.1f KB"
-#: glib/gutils.c:3110
+#: glib/gutils.c:3219
#, c-format
msgid "%.1f MB"
msgstr "%.1f MB"
-#: glib/gutils.c:3115
+#: glib/gutils.c:3224
#, c-format
msgid "%.1f GB"
msgstr "%.1f GB"
-#: glib/gutils.c:3120
+#: glib/gutils.c:3229
#, c-format
msgid "%.1f TB"
msgstr "%.1f TB"
-#: glib/gutils.c:3125
+#: glib/gutils.c:3234
#, c-format
msgid "%.1f PB"
msgstr "%.1f PB"
-#: glib/gutils.c:3130
+#: glib/gutils.c:3239
#, c-format
msgid "%.1f EB"
msgstr "%.1f EB"
diff --git a/tools/check-abis.sh b/tools/check-abis.sh
deleted file mode 100755
index 5340f317d..000000000
--- a/tools/check-abis.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/sh -e
-
-list_leaked_symbols () {
- nm -D "$1" | grep ' T ' | cut -f 3 -d ' ' | grep -E -v "$2"
-}
-
-check_symbols () {
- if [ "$(list_leaked_symbols "$1" "$2" | wc -l)" -ne 0 ]; then
- echo File "$1" possibly leaking symbols:
- list_leaked_symbols "$1" "$2"
- exit 1
- fi
-}
-
-allowed="^_init$|^_fini$|^_ftext$|^g_"
-allowed_in_libglib="${allowed}|^glib__private__$|^glib_gettext$|^glib_pgettext$|^glib_check_version$"
-allowed_in_libgthread='^_init$|^_fini$|^_ftext$|^g_thread_init$|^g_thread_init_with_errorcheck_mutexes$'
-
-check_symbols glib/.libs/libglib-2.0.so "$allowed_in_libglib"
-check_symbols gthread/.libs/libgthread-2.0.so "$allowed_in_libgthread"
-for file in gmodule/.libs/libgmodule-2.0.so gobject/.libs/libgobject-2.0.so gio/.libs/libgio-2.0.so; do
- check_symbols "$file" "$allowed"
-done