[gtkmm-documentation: 1/4] update existing simplified chinese translation




commit dcc30145a1d5c3dbb8c2452b7cea460f899d3351
Author: CCTV-1 <script tar gz gmail com>
Date:   Wed Dec 23 11:45:15 2020 +0800

    update existing simplified chinese translation

 docs/tutorial/zh_CN/zh_CN.po | 15171 ++++++++++++++++++++++++-----------------
 1 file changed, 9055 insertions(+), 6116 deletions(-)
---
diff --git a/docs/tutorial/zh_CN/zh_CN.po b/docs/tutorial/zh_CN/zh_CN.po
index cdc40bc..50fde5a 100644
--- a/docs/tutorial/zh_CN/zh_CN.po
+++ b/docs/tutorial/zh_CN/zh_CN.po
@@ -6,142 +6,110 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: gtkmm-documentation master\n"
-"POT-Creation-Date: 2010-07-20 22:25+0000\n"
-"PO-Revision-Date: 2010-07-16 23:48+1000\n"
-"Last-Translator: Tao Wang <dancefire gmail com>\n"
+"POT-Creation-Date: 2020-12-21 21:37+8000\n"
+"PO-Revision-Date: 2020-12-23 11:40+8000\n"
+"Last-Translator: XiangQun Luo <Script tar gz gmail com>\n"
 "Language-Team: Chinese (China) <i18n-zh googlegroups com>\n"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: C/gtkmm-tutorial-in.xml:34(title)
-msgid "Programming with <application>gtkmm</application>"
-msgstr "<application>gtkmm</application> 程序设计"
-
-#: C/gtkmm-tutorial-in.xml:38(firstname)
-msgid "Murray"
-msgstr "Murray"
-
-#: C/gtkmm-tutorial-in.xml:39(surname)
-msgid "Cumming"
-msgstr "Cumming"
-
-#: C/gtkmm-tutorial-in.xml:42(firstname)
-msgid "Bernhard"
-msgstr "Bernhard"
-
-#: C/gtkmm-tutorial-in.xml:43(surname)
-msgid "Rieder"
-msgstr "Rieder"
-
-#: C/gtkmm-tutorial-in.xml:44(contrib)
-msgid "Chapter on \"Timeouts\"."
-msgstr "章节《超时》"
-
-#: C/gtkmm-tutorial-in.xml:47(firstname)
-msgid "Jonathon"
-msgstr "Jonathon"
-
-#: C/gtkmm-tutorial-in.xml:48(surname)
-msgid "Jongsma"
-msgstr "Jongsma"
-
-#: C/gtkmm-tutorial-in.xml:49(contrib)
-msgid "Chapter on \"Drawing with Cairo\"."
-msgstr "章节《使用 Cairo 绘图》"
-
-#: C/gtkmm-tutorial-in.xml:50(contrib)
-msgid "Chapter on \"Working with gtkmm's Source Code\"."
-msgstr "章节《使用 gtkmm 源代码》"
-
-#: C/gtkmm-tutorial-in.xml:51(contrib)
-msgid "Chapter on \"Recent Files\"."
-msgstr "章节《最近的文件》"
-
-#: C/gtkmm-tutorial-in.xml:54(firstname)
-msgid "Jason"
-msgstr "Jason"
-
-#: C/gtkmm-tutorial-in.xml:55(surname)
-msgid "M'Sadoques"
-msgstr "M'Sadoques"
-
-#: C/gtkmm-tutorial-in.xml:56(contrib)
-msgid "Chapter on \"Drawing Area\"."
-msgstr "章节《绘图区域》"
-
-#: C/gtkmm-tutorial-in.xml:59(firstname)
-msgid "Ole"
-msgstr "Ole"
-
-#: C/gtkmm-tutorial-in.xml:60(surname)
-msgid "Laursen"
-msgstr "Laursen"
-
-#: C/gtkmm-tutorial-in.xml:61(contrib) C/gtkmm-tutorial-in.xml:77(contrib)
-msgid "Parts of chapter on \"Internationalization\"."
-msgstr "部分章节《国际化》"
-
-#: C/gtkmm-tutorial-in.xml:64(firstname)
-msgid "Gene"
-msgstr "Gene"
-
-#: C/gtkmm-tutorial-in.xml:65(surname)
-msgid "Ruebsamen"
-msgstr "Ruebsamen"
-
-#: C/gtkmm-tutorial-in.xml:66(contrib) C/gtkmm-tutorial-in.xml:71(contrib)
-msgid "Chapter on \"Win32 Installation\"."
-msgstr "章节《Win32 安装》"
+msgctxt "_"
+msgid "translator-credits"
+msgstr ""
+"译者积分"
 
-#: C/gtkmm-tutorial-in.xml:69(firstname)
-msgid "Cedric"
-msgstr "Cedric"
+#: C/index-in.docbook:36
+msgid "Programming with <application>gtkmm</application> 4"
+msgstr "<application>gtkmm</application>4 程序设计"
 
-#: C/gtkmm-tutorial-in.xml:70(surname)
-msgid "Gustin"
-msgstr "Gustin"
+#: C/index-in.docbook:39
+msgid "<firstname>Murray</firstname> <surname>Cumming</surname>"
+msgstr "<firstname>Murray</firstname> <surname>Cumming</surname>"
 
-#: C/gtkmm-tutorial-in.xml:74(firstname)
-msgid "Marko"
-msgstr "Marko"
+#: C/index-in.docbook:43
+msgid ""
+"<firstname>Bernhard</firstname> <surname>Rieder</surname> <contrib>Chapter "
+"on \"Timeouts\".</contrib>"
+msgstr ""
+"<firstname>Bernhard</firstname> <surname>Rieder</surname>"
+"<contrib>编写\"Timeouts\"部分。</contrib>"
 
-#: C/gtkmm-tutorial-in.xml:75(surname)
-msgid "Anastasov"
-msgstr "Anastasov"
+#: C/index-in.docbook:48
+msgid ""
+"<firstname>Jonathon</firstname> <surname>Jongsma</surname> <contrib>Chapter "
+"on \"Drawing with Cairo\".</contrib> <contrib>Chapter on \"Working with "
+"gtkmm's Source Code\".</contrib> <contrib>Chapter on \"Recent Files\".</"
+"contrib>"
+msgstr ""
+"<firstname>Jonathon</firstname> <surname>Jongsma</surname>"
+"<contrib>编写使用Cairo绘图章节。</contrib>"
+"<contrib>编写使用gtkmm源代码章节。</contrib>"
+"<contrib>编写\"最近的文件\"。</contrib>"
 
-#: C/gtkmm-tutorial-in.xml:76(contrib)
-msgid "Chapter on \"Printing\"."
-msgstr "章节《打印》"
+#: C/index-in.docbook:55
+msgid ""
+"<firstname>Ole</firstname> <surname>Laursen</surname> <contrib>Parts of "
+"chapter on \"Internationalization\".</contrib>"
+msgstr ""
+"<firstname>Ole</firstname> <surname>Laursen</surname> "
+"<contrib>编写\"国际化\"章节的一部分。</contrib>"
 
-#: C/gtkmm-tutorial-in.xml:80(firstname)
-msgid "Alan"
-msgstr "Alan"
+#: C/index-in.docbook:60
+msgid ""
+"<firstname>Marko</firstname> <surname>Anastasov</surname> <contrib>Chapter "
+"on \"Printing\".</contrib> <contrib>Parts of chapter on "
+"\"Internationalization\".</contrib>"
+msgstr ""
+"<firstname>Marko</firstname> <surname>Anastasov</surname> "
+"<contrib>编写\"打印\"章节。</contrib> "
+"<contrib>编写\"国际化\"章节的一部分。</contrib>"
 
-#: C/gtkmm-tutorial-in.xml:81(surname)
-msgid "Ott"
-msgstr "Ott"
+#: C/index-in.docbook:66
+msgid ""
+"<firstname>Daniel</firstname> <surname>Elstner</surname> <contrib>Section "
+"\"Build Structure\" of chapter on \"Wrapping C Libraries with gmmproc\".</"
+"contrib>"
+msgstr ""
+"<firstname>Daniel</firstname> <surname>Elstner</surname>"
+"编写《使用 gmmproc 封装 C 库》〈构建结构〉章节。"
 
-#: C/gtkmm-tutorial-in.xml:82(contrib)
-msgid "Appendix on \"Visual Studio 2005\"."
-msgstr "章节《Visual Studio 2005》"
+#: C/index-in.docbook:72
+msgid ""
+"<firstname>Chris</firstname> <surname>Vine</surname> <contrib>Chapter on "
+"\"Multi-threaded programs\".</contrib>"
+msgstr ""
+"<firstname>Chris</firstname> <surname>Vine</surname>"
+"<contrib>编写\"多线程编程\"章节。</contrib>"
 
-#: C/gtkmm-tutorial-in.xml:85(firstname)
-msgid "Daniel"
-msgstr "Daniel"
+#: C/index-in.docbook:77
+msgid ""
+"<firstname>David</firstname> <surname>King</surname> <contrib>Section on "
+"Gtk::Grid.</contrib>"
+msgstr ""
+"<firstname>David</firstname> <surname>King</surname>"
+"<contrib>编写Gtk::Grid部分。</contrib>"
 
-#: C/gtkmm-tutorial-in.xml:86(surname)
-msgid "Elstner"
-msgstr "Elstner"
+#: C/index-in.docbook:82
+msgid ""
+"<firstname>Pedro</firstname> <surname>Ferreira</surname> <contrib>Chapter on "
+"Keyboard Events.</contrib>"
+msgstr ""
+"<firstname>Pedro</firstname> <surname>Ferreira</surname>"
+"<contrib>编写键盘事件章节。</contrib>"
 
-#: C/gtkmm-tutorial-in.xml:87(contrib)
+#: C/index-in.docbook:87
 msgid ""
-"Section \"Build Structure\" of chapter on \"Wrapping C Libraries with gmmproc"
-"\"."
-msgstr "《使用 gmmproc 封装 C 库》章的〈构建结构〉节。"
+"<firstname>Kjell</firstname> <surname>Ahlstedt</surname> <contrib>Update "
+"from gtkmm 3 to gtkmm 4.</contrib> <contrib>Chapter on \"Building "
+"applications\".</contrib>"
+msgstr ""
+"<firstname>Kjell</firstname> <surname>Ahlstedt</surname>"
+" <contrib>编写从gtkmm迁移到gtkmm4指南。</contrib> "
+"<contrib>编写\"构建应用\"章节。</contrib>"
 
-#. This text is copied from the introduction.
-#: C/gtkmm-tutorial-in.xml:95(para)
+#: C/index-in.docbook:98
 msgid ""
 "This book explains key concepts of the <application>gtkmm</application> C++ "
 "API for creating user interfaces. It also introduces the main user interface "
@@ -150,15 +118,15 @@ msgstr ""
 "本书说明了使用<application>gtkmm</application> C++ API 创建用户界面的重要概"
 "念,并且介绍了主要的用户界面元素(“widget”)。"
 
-#: C/gtkmm-tutorial-in.xml:101(year)
-msgid "2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010"
-msgstr "2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010"
-
-#: C/gtkmm-tutorial-in.xml:102(holder)
-msgid "Murray Cumming"
-msgstr "Murray Cumming"
+#: C/index-in.docbook:103
+msgid ""
+"<year>2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010</year> "
+"<holder>Murray Cumming</holder>"
+msgstr ""
+"<year>2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010</year> "
+"<holder>Murray Cumming</holder>"
 
-#: C/gtkmm-tutorial-in.xml:106(para)
+#: C/index-in.docbook:109
 msgid ""
 "Permission is granted to copy, distribute and/or modify this document under "
 "the terms of the GNU Free Documentation License, Version 1.2 or any later "
@@ -174,15 +142,15 @@ msgstr ""
 "Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 来获得一份 "
 "GNU 自由文档协议。"
 
-#: C/gtkmm-tutorial-in.xml:118(title)
+#: C/index-in.docbook:121
 msgid "Introduction"
 msgstr "序言"
 
-#: C/gtkmm-tutorial-in.xml:121(title)
+#: C/index-in.docbook:124
 msgid "This book"
 msgstr "本书"
 
-#: C/gtkmm-tutorial-in.xml:123(para)
+#: C/index-in.docbook:126
 msgid ""
 "This book explains key concepts of the <application>gtkmm</application> C++ "
 "API for creating user interfaces. It also introduces the main user interface "
@@ -195,13 +163,13 @@ msgstr ""
 "是并不会深入其细节。因此,如果需要完整的 API 信息,您应当顺着链接访问参考文"
 "档。"
 
-#: C/gtkmm-tutorial-in.xml:125(para)
+#: C/index-in.docbook:128
 msgid ""
 "This book assumes a good understanding of C++, and how to create C++ "
 "programs."
 msgstr "本书假定读者拥有对 C++ 良好的理解,并且知道如何去创建一个 C++ 程序。"
 
-#: C/gtkmm-tutorial-in.xml:127(para)
+#: C/index-in.docbook:130
 msgid ""
 "We would very much like to hear of any problems you have learning "
 "<application>gtkmm</application> with this document, and would appreciate "
@@ -212,39 +180,51 @@ msgstr ""
 "任何问题,并且感激对此作出的改进。请访问 <link linkend=\"chapter-contributing"
 "\">贡献</link> 节以获得进一步的信息。"
 
-#: C/gtkmm-tutorial-in.xml:134(title)
+#: C/index-in.docbook:136
+msgid ""
+"This book describes <application>gtkmm</application> 4, but some sections "
+"have not been fully updated. There are paragraphs that describe "
+"<application>gtkmm</application> 3 rather than <application>gtkmm</"
+"application> 4. All shown example programs are compatible with "
+"<application>gtkmm</application> 4, though."
+msgstr ""
+"本书介绍了<application>gtkmm</application>4, 但是有些部分还没有完成更新 "
+"以下是描述<application>gtkmm</application>3而不是<application>gtkmm</application>4的段落。"
+"不过显式的所有示例都与<application>gtkmm</application>4兼容。"
+
+#: C/index-in.docbook:145
 msgid "gtkmm"
 msgstr "gtkmm"
 
-#: C/gtkmm-tutorial-in.xml:135(para)
+#: C/index-in.docbook:146
 msgid ""
 "<application>gtkmm</application> is a C++ wrapper for <ulink url=\"http://";
-"www.gtk.org/\">GTK+</ulink>, a library used to create graphical user "
+"www.gtk.org/\">GTK</ulink>, a library used to create graphical user "
 "interfaces. It is licensed using the LGPL license, so you can develop open "
 "software, free software, or even commercial non-free software using "
 "<application>gtkmm</application> without purchasing licenses."
 msgstr ""
 "<application>gtkmm</application> 是一个 <ulink url=\"http://www.gtk.org/";
-"\">GTK+</ulink> 的 C++ 封装,GTK+ 是一个用于创建图形用户界面的软件库。它使用 "
+"\">GTK</ulink> 的 C++ 封装,GTK+ 是一个用于创建图形用户界面的软件库。它使用 "
 "LGPL 协议,因此您可以使用 <application>gtkmm</application> 开发开放软件、自由"
 "软件,甚至商业非免费软件而不需支付任何版权费用。"
 
-#: C/gtkmm-tutorial-in.xml:143(para)
+#: C/index-in.docbook:154
 msgid ""
-"<application>gtkmm</application> was originally named gtk-- because GTK+ "
-"already has a + in the name. However, as -- is not easily indexed by search "
-"engines the package generally went by the name <application>gtkmm</"
-"application>, and that's what we stuck with."
+"<application>gtkmm</application> was originally named gtk-- because GTK was "
+"originally named GTK+ and had a + in the name. However, as -- is not easily "
+"indexed by search engines, the package generally went by the name "
+"<application>gtkmm</application>, and that's what we stuck with."
 msgstr ""
 "<application>gtkmm</application> 曾经被称为 gtk--,那是因为 GTK+ 的名字中已经"
 "有了一个加号。但是,由于 -- 不容易被搜索引擎索引,所以项目名字就渐渐的变成了"
 "<application>gtkmm</application>,后来我们就一直使用这个名字。"
 
-#: C/gtkmm-tutorial-in.xml:146(title)
-msgid "Why use <application>gtkmm</application> instead of GTK+?"
-msgstr "为什么要使用 <application>gtkmm</application> 而不是 GTK+?"
+#: C/index-in.docbook:159
+msgid "Why use <application>gtkmm</application> instead of GTK?"
+msgstr "为什么要使用 <application>gtkmm</application> 而不是 GTK?"
 
-#: C/gtkmm-tutorial-in.xml:147(para)
+#: C/index-in.docbook:160
 msgid ""
 "<application>gtkmm</application> allows you to write code using normal C++ "
 "techniques such as encapsulation, derivation, and polymorphism. As a C++ "
@@ -255,7 +235,7 @@ msgstr ""
 "装、继承和多态。作为一个 C++ 程序员,你可能已经意识到这会让代码更加清晰、更加"
 "良好的管理代码。"
 
-#: C/gtkmm-tutorial-in.xml:148(para)
+#: C/index-in.docbook:161
 msgid ""
 "<application>gtkmm</application> is more type-safe, so the compiler can "
 "detect errors that would only be detected at run time when using C. This use "
@@ -266,39 +246,39 @@ msgstr ""
 "能在运行时才能检测出来的错误。这种使用特定类型的方法同样使得 API 更加清晰,因"
 "为你只需要通过看一下函数声明就可以知道应该使用什么类型了。"
 
-#: C/gtkmm-tutorial-in.xml:149(para)
+#: C/index-in.docbook:162
 msgid ""
 "Inheritance can be used to derive new widgets. The derivation of new widgets "
-"in GTK+ C code is so complicated and error prone that almost no C coders do "
+"in GTK C code is so complicated and error prone that almost no C coders do "
 "it. As a C++ developer you know that derivation is an essential Object "
 "Orientated technique."
 msgstr ""
-"可以使用继承来衍生新的部件。在 GTK+ 中使用 C 代码来衍生新部件是非常复杂的,并"
+"可以使用继承来衍生新的部件。在 GTK 中使用 C 代码来衍生新部件是非常复杂的,并"
 "且很容易出错,因此几乎没有 C 的程序员这么做。作为 C++ 开发人员,你知道继承是"
 "一个基本的面向对象技术。"
 
-#: C/gtkmm-tutorial-in.xml:150(para)
+#: C/index-in.docbook:163
 msgid ""
-"Member instances can be used, simplifying memory management. All GTK+ C "
+"Member instances can be used, simplifying memory management. All GTK C "
 "widgets are dealt with by use of pointers. As a C++ coder you know that "
 "pointers should be avoided where possible."
 msgstr ""
-"可以使用成员实例,简化了内存管理。所有的 GTK+ 的 C 部件都是使用指针进行操作"
+"可以使用成员实例,简化了内存管理。所有的 GTK 的 C 部件都是使用指针进行操作"
 "的。作为 C++ 程序员,你知道指针应当尽量避免使用。"
 
-#: C/gtkmm-tutorial-in.xml:151(para)
+#: C/index-in.docbook:164
 msgid ""
-"<application>gtkmm</application> involves less code compared to GTK+, which "
+"<application>gtkmm</application> involves less code compared to GTK, which "
 "uses prefixed function names and lots of cast macros."
 msgstr ""
-"<application>gtkmm</application> 比 GTK+ 的代码更加简短,GTK+ 使用了大量带前"
+"<application>gtkmm</application> 比 GTK 的代码更加简短,GTK 使用了大量带前"
 "缀的函数名以及大量的转型宏。"
 
-#: C/gtkmm-tutorial-in.xml:155(title)
+#: C/index-in.docbook:168
 msgid "<application>gtkmm</application> compared to Qt"
 msgstr "<application>gtkmm</application> 对比 Qt"
 
-#: C/gtkmm-tutorial-in.xml:156(para)
+#: C/index-in.docbook:169
 msgid ""
 "Trolltech's Qt is the closest competition to <application>gtkmm</"
 "application>, so it deserves discussion."
@@ -306,7 +286,7 @@ msgstr ""
 "Trolltech 公司的 Qt 是和 <application>gtkmm</application> 最相似的有竞争力的"
 "产品,所以应该对其进行一下讨论。"
 
-#: C/gtkmm-tutorial-in.xml:158(para)
+#: C/index-in.docbook:171
 msgid ""
 "<application>gtkmm</application> developers tend to prefer "
 "<application>gtkmm</application> to Qt because <application>gtkmm</"
@@ -317,8 +297,8 @@ msgid ""
 "significantly, Trolltech modified the C++ language to provide signals, so "
 "that Qt classes cannot be used easily with non-Qt classes. "
 "<application>gtkmm</application> was able to use standard C++ to provide "
-"signals without changing the C++ language. See the FAQ for more detailed "
-"differences."
+"signals without changing the C++ language. See the <ulink url=\"https://wiki.";
+"gnome.org/Projects/gtkmm/FAQ\">FAQ</ulink> for more detailed differences."
 msgstr ""
 "<application>gtkmm</application> 开发人员更倾向于使用 <application>gtkmm</"
 "application> 而不是 Qt,因为 <application>gtkmm</application> 的使用更加符合 "
@@ -326,21 +306,21 @@ msgstr ""
 "代。它重复了大量的现存于标准库中的东西,比如容器、类型信息等等。最重要的是,"
 "Trolltech 修改了 C++ 语言以提供信号的功能,这样 Qt 的类无法很容易的与非 Qt 类"
 "共同使用。<application>gtkmm</application> 则可以使用标准 C++ 提供信号功能,"
-"而无需修改 C++ 语言。请看常见问题以得到进一步的差异。"
+"而无需修改 C++ 语言。请看<ulink url=\"https://wiki.gnome.org/Projects/gtkmm/FAQ\";>常见问题</ulink>以了解具体差异。"
 
-#: C/gtkmm-tutorial-in.xml:162(title)
+#: C/index-in.docbook:176
 msgid "<application>gtkmm</application> is a wrapper"
 msgstr "<application>gtkmm</application> 是一个封装"
 
-#: C/gtkmm-tutorial-in.xml:163(para)
+#: C/index-in.docbook:177
 msgid ""
 "<application>gtkmm</application> is not a native C++ toolkit, but a C++ "
 "wrapper of a C toolkit. This separation of interface and implementation has "
 "advantages. The <application>gtkmm</application> developers spend most of "
 "their time talking about how <application>gtkmm</application> can present "
 "the clearest API, without awkward compromises due to obscure technical "
-"details. We contribute a little to the underlying GTK+ code base, but so do "
-"the C coders, and the Perl coders and the Python coders, etc. Therefore GTK+ "
+"details. We contribute a little to the underlying GTK code base, but so do "
+"the C coders, and the Perl coders and the Python coders, etc. Therefore GTK "
 "benefits from a broader user base than language-specific toolkits - there "
 "are more implementers, more developers, more testers, and more users."
 msgstr ""
@@ -348,72 +328,85 @@ msgstr ""
 "工具集的 C++ 封装。这种分离接口和实现的方式存在诸多优势。<application>gtkmm</"
 "application> 开发人员用了他们大量的时间来讨论如何让 <application>gtkmm</"
 "application> 提供一个最清晰的 API,而不必为模糊的技术细节尴尬的进行妥协。我们"
-"想其他的 C 程序员、Perl 程序员和 Python 程序员等等一样,对底层的 GTK+ 代码库"
-"进行了一点点贡献。因此,GTK+ 可以从比某个语言特定的工具集更广泛的用户群中获得"
+"想其他的 C 程序员、Perl 程序员和 Python 程序员等等一样,对底层的 GTK 代码库"
+"进行了一点点贡献。因此,GTK 可以从比某个语言特定的工具集更广泛的用户群中获得"
 "好处,有更多的实现、更多的开发人员、更多的测试人员以及更多的用户。"
 
-#: C/gtkmm-tutorial-in.xml:171(title)
+#: C/index-in.docbook:185
 msgid "Installation"
 msgstr "安装"
 
-#: C/gtkmm-tutorial-in.xml:173(title)
+#: C/index-in.docbook:187
 msgid "Dependencies"
 msgstr "依赖关系"
 
-#: C/gtkmm-tutorial-in.xml:174(para)
+#: C/index-in.docbook:188
 msgid ""
-"Before attempting to install <application>gtkmm</application> 2.4, you might "
-"first need to install these other packages."
+"Before attempting to install <application>gtkmm</"
+"application><application>-4.0</application>, you might first need to install "
+"these other packages."
 msgstr ""
-"在试图安装 <application>gtkmm</application> 2.4之前,你必须已经安装了这些包。"
+"在试图安装 <application>gtkmm</application><application>-4.0</application>之前,你必须已经安装了这些包。"
 
-#: C/gtkmm-tutorial-in.xml:179(application)
-msgid "libsigc++ 2.0"
-msgstr "libsigc++ 2.0"
+#: C/index-in.docbook:193
+msgid "<application>sigc++-3.0</application>"
+msgstr "<application>sigc++-3.0</application>"
 
-#: C/gtkmm-tutorial-in.xml:180(application)
-msgid "GTK+ 2.4"
-msgstr "GTK+ 2.4"
+#: C/index-in.docbook:194
+msgid "<application>gtk4</application>"
+msgstr "<application>gtkmm4</application>"
 
-#: C/gtkmm-tutorial-in.xml:181(application)
-msgid "cairomm"
-msgstr "cairomm"
+#: C/index-in.docbook:195
+msgid "<application>glibmm-2.68</application>"
+msgstr "<application>glibmm-2.68</application>"
 
-#: C/gtkmm-tutorial-in.xml:183(para)
+#: C/index-in.docbook:196
+msgid "<application>cairomm-1.16</application>"
+msgstr "<application>cairomm-1.16</application>"
+
+#: C/index-in.docbook:197
+msgid "<application>pangomm-2.48</application>"
+msgstr "<application>pangomm-2.48</application>"
+
+#: C/index-in.docbook:199
 msgid ""
 "These dependencies have their own dependencies, including the following "
 "applications and libraries:"
 msgstr "这些依赖有它们自己所依赖的软件包,包括下列应用程序和软件库:"
 
-#: C/gtkmm-tutorial-in.xml:188(application)
-msgid "pkg-config"
-msgstr "pkg-config"
+#: C/index-in.docbook:204
+msgid "<application>pkg-config</application>"
+msgstr "<application>pkg-config</application>"
 
-#: C/gtkmm-tutorial-in.xml:189(application)
-msgid "glib"
-msgstr "glib"
+#: C/index-in.docbook:205
+msgid "<application>glib-2.0</application>"
+msgstr "<application>glib-2.0</application>"
 
-#: C/gtkmm-tutorial-in.xml:190(application)
-msgid "ATK"
-msgstr "ATK"
+#: C/index-in.docbook:206
+msgid "<application>pango</application>"
+msgstr "<application>pango</application>"
 
-#: C/gtkmm-tutorial-in.xml:191(application)
-msgid "Pango"
-msgstr "Pango"
+#: C/index-in.docbook:207
+msgid "<application>cairo</application>"
+msgstr "<application>cairo</application>"
 
-#: C/gtkmm-tutorial-in.xml:192(application)
-msgid "cairo"
-msgstr "cairo"
+#: C/index-in.docbook:208
+msgid "<application>gdk-pixbuf-2.0</application>"
+msgstr "<application>gdk-pixbuf-2.0</application>"
 
-#: C/gtkmm-tutorial-in.xml:197(title)
+#: C/index-in.docbook:209
+msgid "<application>graphene-1.0</application>"
+msgstr "<application>graphene-1.0</application>"
+
+#: C/index-in.docbook:214
 msgid "Unix and Linux"
 msgstr "Unix 和 Linux"
 
-#: C/gtkmm-tutorial-in.xml:200(title)
+#: C/index-in.docbook:217
 msgid "Prebuilt Packages"
 msgstr "预编译的包"
 
-#: C/gtkmm-tutorial-in.xml:202(para)
+#: C/index-in.docbook:219
 msgid ""
 "Recent versions of <application>gtkmm</application> are packaged by nearly "
 "every major Linux distribution these days. So, if you use Linux, you can "
@@ -428,113 +421,107 @@ msgstr ""
 "们的软件库里面包含了 <application>gtkmm</application> 的发布版本有:Debian、"
 "Ubuntu、Red Hat、Fedora、Mandriva、SuSE 等等。"
 
-#: C/gtkmm-tutorial-in.xml:210(para)
+#: C/index-in.docbook:227
 msgid ""
 "The names of the <application>gtkmm</application> packages vary from "
-"distribution to distribution (e.g. <application>libgtkmm2.4-dev</"
-"application> on Debian and Ubuntu or <application>gtkmm24-devel</"
+"distribution to distribution (e.g. <application>libgtkmm-4.0-dev</"
+"application> on Debian and Ubuntu or <application>gtkmm40-devel</"
 "application> on Red Hat Fedora), so check with your distribution's package "
 "management program for the correct package name and install it like you "
 "would any other package."
 msgstr ""
 "<application>gtkmm</application> 软件包的名字可能在不同的发行版中所不同 (例"
-"如,在 Debian 和 Ubuntu 上的名字是<application>libgtkmm2.4-dev</"
-"application>,而在 Red Hat Fedora 上则是 <application>gtkmm24-devel</"
+"如,在 Debian 和 Ubuntu 上的名字是<application>libgtkmm-4.0-dev</"
+"application>,而在 Red Hat Fedora 上则是 <application>gtkmm40-devel</"
 "application>),因此,在你的发行版的软件包管理程序中查一下正确的名字,然后像其"
 "它软件包一样的安装它。"
 
-#: C/gtkmm-tutorial-in.xml:218(para)
+#: C/index-in.docbook:235
 msgid ""
 "The package names will not change when new API/ABI-compatible versions of "
 "<application>gtkmm</application> are released. Otherwise they would not be "
 "API/ABI-compatible. So don't be surprised, for instance, to find "
-"<application>gtkmm</application> 2.8 supplied by Debian's "
-"<application>libgtkmm2.4-dev</application> package."
+"<application>gtkmm</application> 4.8 supplied by Debian's "
+"<application>libgtkmm-4.0-dev</application> package."
 msgstr ""
 "当新的 API/ABI 兼容的 <application>gtkmm</application> 版本发布后,其包的名称"
 "将不会改变。否则的话,就说明 API/ABI 不兼容。所以,如果在 Debian 的 "
-"<application>libgtkmm2.4-dev</application> 包中发现提供的实际上是 "
-"<application>gtkmm</application> 2.8 的话不要太惊讶。"
+"<application>libgtkmm-4.0-dev</application> 包中发现提供的实际上是 "
+"<application>gtkmm</application> 4.8 的话不要太惊讶。"
 
-#: C/gtkmm-tutorial-in.xml:228(title)
+#: C/index-in.docbook:245
 msgid "Installing From Source"
 msgstr "从源代码安装"
 
-#: C/gtkmm-tutorial-in.xml:230(para)
+#: C/index-in.docbook:247
 msgid ""
 "If your distribution does not provide a pre-built <application>gtkmm</"
 "application> package, or if you want to install a different version than the "
 "one provided by your distribution, you can also install <application>gtkmm</"
 "application> from source. The source code for <application>gtkmm</"
-"application> can be downloaded from <ulink url=\"http://www.gtkmm.org/\"/>."
+"application> can be downloaded from <ulink url=\"https://download.gnome.org/";
+"sources/gtkmm/\"/>."
 msgstr ""
 "如果你的发行版没提供预编译的 <application>gtkmm</application> 包,或者如果你"
 "想安装一个和发行版所提供的不同的版本,那么你也可以从源代码安装 "
-"<application>gtkmm</application>。可以从 <ulink url=\"http://www.gtkmm.org/";
-"\"/> 中下载 <application>gtkmm</application> 的源代码。"
+"<application>gtkmm</application>。可以从 <ulink url=\"https://download.gnome.org/";
+"sources/gtkmm/\"/> 中下载 <application>gtkmm</application> 的源代码。"
 
-#: C/gtkmm-tutorial-in.xml:236(para)
+#: C/index-in.docbook:253
 msgid ""
 "After you've installed all of the dependencies, download the "
 "<application>gtkmm</application> source code, unpack it, and change to the "
-"newly created directory. <application>gtkmm</application> can be built and "
-"installed with the following sequence of commands:"
+"newly created directory. <application>gtkmm</application> can be built with "
+"Meson. See the <filename>README</filename> file in the <application>gtkmm</"
+"application> version you've downloaded."
 msgstr ""
 "在安装了所有依赖的库后,下载 <application>gtkmm</application> 源代码、解压"
-"缩,并且切换到新创建的目录。然后可以用下列命令序列构件和安装 "
-"<application>gtkmm</application>:"
-
-#: C/gtkmm-tutorial-in.xml:241(screen)
-#, no-wrap
-msgid ""
-"\n"
-"# ./configure\n"
-"# make\n"
-"# make install\n"
-msgstr ""
-"\n"
-"# ./configure\n"
-"# make\n"
-"# make install\n"
+"缩,并且切换到新创建的目录。<application>gtkmm</application>可以使用Meson构建。 "
+"参见你所下载的<application>gtkmm</application>源代码中的<filename>README</filename>。"
 
-#: C/gtkmm-tutorial-in.xml:247(para)
+#: C/index-in.docbook:260
 msgid ""
 "Remember that on a Unix or Linux operating system, you will probably need to "
-"be <literal>root</literal> to install software. The <command>su</command> "
-"command will allow you to enter the <literal>root</literal> password and "
-"have <literal>root</literal> status temporarily."
+"be <literal>root</literal> to install software. The <command>su</command> or "
+"<command>sudo</command> command will allow you to enter the <literal>root</"
+"literal> password and have <literal>root</literal> status temporarily."
 msgstr ""
-"记住,在 Unix 或 Linux 操作系统上,你也许需要 <literal>root</literal> 权限以"
-"安装软件。<command>su</command> 命令允许你输入 <literal>root</literal> 密码,"
+"记住,在 Unix 或 Linux 操作系统上,你也许需要 <literal>root</literal> 权限以安装软件。"
+"<command>su</command>或者<command>sudo</command> 命令允许你输入 <literal>root</literal> 密码,"
 "并且临时拥有 <literal>root</literal> 权限。"
 
-#: C/gtkmm-tutorial-in.xml:254(para)
+#: C/index-in.docbook:267
 msgid ""
-"The <filename>configure</filename> script will check to make sure all of the "
-"required dependencies are already installed. If you are missing any "
-"dependencies, it will exit and display an error."
+"The <filename>configure</filename> script or <command>meson</command> will "
+"check to make sure all of the required dependencies are already installed. "
+"If you are missing any dependencies, it will exit and display an error."
 msgstr ""
-"<filename>configure</filename> 将会检查以确认所有必须的依赖软件包都已经正确的"
+"<filename>configure</filename>脚本或者<command>meson</command>将会检查以确认所有必须的依赖软件包都已经正确的"
 "安装了。如果你遗漏了某个依赖软件包的话,它会退出并提示错误信息。"
 
-#: C/gtkmm-tutorial-in.xml:259(para)
+#: C/index-in.docbook:278
+#, no-wrap
 msgid ""
-"By default, <application>gtkmm</application> will be installed under the "
-"<filename>/usr/local</filename> directory. On some systems you may need to "
-"install to a different location. For instance, on Red Hat Linux systems you "
-"might use the <literal>--prefix</literal> option with configure, like so: "
-"<screen>\n"
+"\n"
 "# ./configure --prefix=/usr\n"
-"</screen>"
 msgstr ""
-"默认情况下,<application>gtkmm</application> 将会被安装在 <filename>/usr/"
-"local</filename> 目录。在有些系统中,你也许需要安装到不同的位置。比如,在 "
-"Red Hat Linux 系统中,你也许需要使用 <literal>--prefix</literal> 选项进行配"
-"置,例如:<screen>\n"
+"\n"
 "# ./configure --prefix=/usr\n"
-"</screen>"
 
-#: C/gtkmm-tutorial-in.xml:270(para)
+#: C/index-in.docbook:272
+msgid ""
+"By default, <application>gtkmm</application> if built with Autotools, will "
+"be installed under the <filename>/usr/local</filename> directory. On some "
+"systems you may need to install to a different location. For instance, on "
+"Red Hat Linux systems you might use the <literal>--prefix</literal> option "
+"with configure, like so: <_:screen-1/>"
+msgstr ""
+"默认情况下,如果使用Autotools构建<application>gtkmm</application> 则其将会被安装在"
+" <filename>/usr/local</filename> 目录。在有些系统中,你也许需要安装到不同的位置。比如,在 "
+"Red Hat Linux 系统中,你也许需要使用 <literal>--prefix</literal> 选项进行配"
+"置,例如:<_:screen-1/>"
+
+#: C/index-in.docbook:283
 msgid ""
 "You should be very careful when installing to standard system prefixes such "
 "as <filename>/usr</filename>. Linux distributions install software packages "
@@ -548,7 +535,7 @@ msgstr ""
 "会破坏或与使用软件包管理器安装的软件冲突。理想情况下,你应当将从源代码安装的"
 "软件都安装到一个独立位置。"
 
-#: C/gtkmm-tutorial-in.xml:279(para)
+#: C/index-in.docbook:292
 msgid ""
 "If you want to help develop <application>gtkmm</application> or experiment "
 "with new features, you can also install <application>gtkmm</application> "
@@ -562,31 +549,32 @@ msgstr ""
 "做,但是如果你对帮助 <application>gtkmm</application> 开发感兴趣,请看附录:"
 "<link linkend=\"chapter-working-with-source\">使用 gtkmm 源代码</link>。"
 
-#: C/gtkmm-tutorial-in.xml:290(title)
+#: C/index-in.docbook:303
 msgid "Microsoft Windows"
 msgstr "Microsoft Windows"
 
-#: C/gtkmm-tutorial-in.xml:291(para)
+#: C/index-in.docbook:304
 msgid ""
-"GTK+ and <application>gtkmm</application> were designed to work well with "
+"GTK and <application>gtkmm</application> were designed to work well with "
 "Microsoft Windows, and the developers encourage its use on the win32 "
 "platform. However, Windows has no standard installation system for "
-"development libraries. Please see the <ulink url=\"http://live.gnome.org/";
-"gtkmm/MSWindows\">Windows Installation</ulink> page for Windows-specific "
-"installation instructions and notes."
+"development libraries. Please see the <ulink url=\"https://wiki.gnome.org/";
+"Projects/gtkmm/MSWindows\">Windows Installation</ulink> page or the <link "
+"linkend=\"sec-windows-installation\"><application>gtkmm</application> and "
+"Win32</link> appendix for Windows-specific installation instructions and "
+"notes."
 msgstr ""
-"GTK+ and <application>gtkmm</application> 被设计成在 Microsoft Windows 上也能"
+"GTK和<application>gtkmm</application> 被设计成在 Microsoft Windows 上也能"
 "很好地工作,而且开发者们鼓励在 win32 平台上使用它们。然而,还有没为 Wnidows "
-"平台的开发库提供标准的安装方法。请参考 <ulink url=\"http://live.gnome.org/";
-"gtkmm/MSWindows\">Windows Intallation</ulink> (<ulink url=\"http://live.";
-"gnome.org/Chinese/gtkmm/MSWindows\">中文翻译</ulink>) 以得到进一步关于 "
-"Windows 相关的安装方法和注意事项。"
+"平台的开发库提供标准的安装方法。请参阅 <ulink url=\"https://wiki.gnome.org/";
+"Projects/gtkmm/MSWindows\">Windows Intallation</ulink>或者 
<linklinkend=\"sec-windows-installation\"><application>gtkmm</application>"
+" and Win32</link> 以得到关于Windows相关的安装方法和注意事项。"
 
-#: C/gtkmm-tutorial-in.xml:298(title)
+#: C/index-in.docbook:315
 msgid "Basics"
 msgstr "基础"
 
-#: C/gtkmm-tutorial-in.xml:300(para)
+#: C/index-in.docbook:317
 msgid ""
 "This chapter will introduce some of the most important aspects of "
 "<application>gtkmm</application> coding. These will be demonstrated with "
@@ -597,7 +585,7 @@ msgstr ""
 "一些可以运行的示例代码来演示。然而,这仅仅是一种尝试,你还需要继续看其它章"
 "节,以得到更实质性的信息。"
 
-#: C/gtkmm-tutorial-in.xml:303(para)
+#: C/index-in.docbook:320
 msgid ""
 "Your existing knowledge of C++ will help you with <application>gtkmm</"
 "application> as it would with any library. Unless we state otherwise, you "
@@ -610,11 +598,11 @@ msgstr ""
 "application> 类会像任何其它 C++ 类一样,并且你可以期待在 <application>gtkmm</"
 "application> 类上使用你现有的知识。"
 
-#: C/gtkmm-tutorial-in.xml:308(title) C/gtkmm-tutorial-in.xml:3748(title)
+#: C/index-in.docbook:325 C/index-in.docbook:3316
 msgid "Simple Example"
 msgstr "简单的例子"
 
-#: C/gtkmm-tutorial-in.xml:310(para)
+#: C/index-in.docbook:327
 msgid ""
 "To begin our introduction to <application>gtkmm</application>, we'll start "
 "with the simplest program possible. This program will create an empty 200 x "
@@ -623,50 +611,23 @@ msgstr ""
 "在开始介绍 <application>gtkmm</application> 之前,我们将以一个尽可能简单的程"
 "序开始。这个程序创建一个 200 x 200 像素大小的空窗口。"
 
-#: C/gtkmm-tutorial-in.xml:315(ulink) C/gtkmm-tutorial-in.xml:492(ulink)
-#: C/gtkmm-tutorial-in.xml:708(ulink) C/gtkmm-tutorial-in.xml:816(ulink)
-#: C/gtkmm-tutorial-in.xml:925(ulink) C/gtkmm-tutorial-in.xml:1090(ulink)
-#: C/gtkmm-tutorial-in.xml:1139(ulink) C/gtkmm-tutorial-in.xml:1194(ulink)
-#: C/gtkmm-tutorial-in.xml:1241(ulink) C/gtkmm-tutorial-in.xml:1268(ulink)
-#: C/gtkmm-tutorial-in.xml:1293(ulink) C/gtkmm-tutorial-in.xml:1441(ulink)
-#: C/gtkmm-tutorial-in.xml:1507(ulink) C/gtkmm-tutorial-in.xml:1531(ulink)
-#: C/gtkmm-tutorial-in.xml:1606(ulink) C/gtkmm-tutorial-in.xml:1647(ulink)
-#: C/gtkmm-tutorial-in.xml:1692(ulink) C/gtkmm-tutorial-in.xml:1727(ulink)
-#: C/gtkmm-tutorial-in.xml:1766(ulink) C/gtkmm-tutorial-in.xml:1895(ulink)
-#: C/gtkmm-tutorial-in.xml:2389(ulink) C/gtkmm-tutorial-in.xml:2432(ulink)
-#: C/gtkmm-tutorial-in.xml:2591(ulink) C/gtkmm-tutorial-in.xml:2641(ulink)
-#: C/gtkmm-tutorial-in.xml:2709(ulink) C/gtkmm-tutorial-in.xml:3306(ulink)
-#: C/gtkmm-tutorial-in.xml:3325(ulink) C/gtkmm-tutorial-in.xml:3344(ulink)
-#: C/gtkmm-tutorial-in.xml:3366(ulink) C/gtkmm-tutorial-in.xml:3388(ulink)
-#: C/gtkmm-tutorial-in.xml:3464(ulink) C/gtkmm-tutorial-in.xml:3477(ulink)
-#: C/gtkmm-tutorial-in.xml:3513(ulink) C/gtkmm-tutorial-in.xml:3526(ulink)
-#: C/gtkmm-tutorial-in.xml:3757(ulink) C/gtkmm-tutorial-in.xml:3932(ulink)
-#: C/gtkmm-tutorial-in.xml:3945(ulink) C/gtkmm-tutorial-in.xml:4001(ulink)
-#: C/gtkmm-tutorial-in.xml:4258(ulink) C/gtkmm-tutorial-in.xml:4320(ulink)
-#: C/gtkmm-tutorial-in.xml:4347(ulink) C/gtkmm-tutorial-in.xml:4369(ulink)
-#: C/gtkmm-tutorial-in.xml:4392(ulink) C/gtkmm-tutorial-in.xml:4588(ulink)
-#: C/gtkmm-tutorial-in.xml:4685(ulink) C/gtkmm-tutorial-in.xml:4766(ulink)
-#: C/gtkmm-tutorial-in.xml:4934(ulink) C/gtkmm-tutorial-in.xml:5148(ulink)
-#: C/gtkmm-tutorial-in.xml:5308(ulink) C/gtkmm-tutorial-in.xml:5328(ulink)
-#: C/gtkmm-tutorial-in.xml:5706(ulink) C/gtkmm-tutorial-in.xml:5921(ulink)
-#: C/gtkmm-tutorial-in.xml:6055(ulink) C/gtkmm-tutorial-in.xml:6161(ulink)
-#: C/gtkmm-tutorial-in.xml:6258(ulink) C/gtkmm-tutorial-in.xml:6295(ulink)
-#: C/gtkmm-tutorial-in.xml:6646(ulink) C/gtkmm-tutorial-in.xml:6714(ulink)
-#: C/gtkmm-tutorial-in.xml:7330(ulink) C/gtkmm-tutorial-in.xml:7354(ulink)
-#: C/gtkmm-tutorial-in.xml:8103(ulink)
-msgid "Source Code"
-msgstr "源代码"
-
-#: C/gtkmm-tutorial-in.xml:317(para)
+#: C/index-in.docbook:332
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/base\">Source Code</ulink>"
+msgstr ""
+"<ulink 
url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/examples/book/base\";>源代码</ulink>"
+
+#: C/index-in.docbook:334
 msgid "We will now explain each line of the example"
 msgstr "我们会逐行讲解这个例子"
 
-#: C/gtkmm-tutorial-in.xml:318(programlisting)
+#: C/index-in.docbook:335
 #, no-wrap
 msgid "#include &lt;gtkmm.h&gt;"
 msgstr "#include &lt;gtkmm.h&gt;"
 
-#: C/gtkmm-tutorial-in.xml:319(para)
+#: C/index-in.docbook:336
 msgid ""
 "All <application>gtkmm</application> programs must include certain "
 "<application>gtkmm</application> headers; <literal>gtkmm.h</literal> "
@@ -679,93 +640,99 @@ msgstr ""
 "有 <application>gtkmm</application> 的内容。通常来说,这并不是一个好主意,因"
 "为它包括了一兆左右的头文件。当然,对于这个简单的程序,这就够了。"
 
-#: C/gtkmm-tutorial-in.xml:329(programlisting)
+#: C/index-in.docbook:346
 #, no-wrap
-msgid "Gtk::Main kit(argc, argv);"
-msgstr "Gtk::Main kit(argc, argv);"
+msgid "auto app = Gtk::Application::create(\"org.gtkmm.examples.base\");"
+msgstr "auto app = Gtk::Application::create(\"org.gtkmm.examples.base\");"
 
-#: C/gtkmm-tutorial-in.xml:326(para)
+#: C/index-in.docbook:343
 msgid ""
-"The next line: <placeholder-1/> creates a <classname>Gtk::Main</classname> "
-"object. This is needed in all <application>gtkmm</application> applications. "
-"The constructor for this object initializes <application>gtkmm</"
-"application>, and checks the arguments passed to your application on the "
-"command line, looking for standard options such as <literal>-display</"
-"literal>. It takes these from the argument list, leaving anything it does "
-"not recognize for your application to parse or ignore. This ensures that all "
-"<application>gtkmm</application> applications accept the same set of "
-"standard arguments."
+"The next statement: <_:programlisting-1/> creates a <classname>Gtk::"
+"Application</classname> object, stored in a <classname>Glib::RefPtr</"
+"classname> smartpointer. This is needed in all <application>gtkmm</"
+"application> applications. The <methodname>create()</methodname> method for "
+"this object initializes <application>gtkmm</application>."
 msgstr ""
-"下面一行:<placeholder-1/> 创建了一个 <classname>Gtk::Main</classname> 对象。"
-"这是所有的 <application>gtkmm</application> 程序中所必须的。这个对象的构造函"
-"数初始化了 <application>gtkmm</application>,并且检查传递给你的程序的命令行参"
-"数,从中寻找像 <literal>-display</literal> 这样的标准选项。然后它会将这些可以"
-"识别的参数从参数列表中删除,留下那些它不能识别的选项,交由你的程序处理或者忽"
-"略。这样就保证了 <application>gtkmm</application> 应用程序能和其它程序一样接"
-"受所有的标准参数。"
+"下一条语句: 
<_:programlisting-1/>创建一个<classname>Gtk::Application</classname>对象,将其储存在一个<classname>Glib::RefPtr</classname>智能指针中。"
+"所有的<application>gtkmm</application>应用都需要如此做。"
+"该对象的<methodname>create()</methodname>方法将初始化<application>gtkmm</application>。"
 
-#: C/gtkmm-tutorial-in.xml:339(para)
-msgid "The next two lines of code create and display a window:"
-msgstr "接下来的两行代码创建并显示了一个窗口:"
+#: C/index-in.docbook:352
+msgid ""
+"The next two lines of code create a window and set its default (initial) "
+"size:"
+msgstr "接下来的两行代码创建一个窗口并设置其的初始大小:"
 
-#: C/gtkmm-tutorial-in.xml:342(programlisting)
+#: C/index-in.docbook:355
 #, no-wrap
-msgid "Gtk::Window window;"
-msgstr "Gtk::Window window;"
+msgid ""
+"Gtk::Window window;\n"
+"window.set_default_size(200, 200);"
+msgstr ""
+"Gtk::Window window;\n"
+"window.set_default_size(200, 200);"
 
-#: C/gtkmm-tutorial-in.xml:343(para)
+#: C/index-in.docbook:357
 msgid ""
 "The last line shows the window and enters the <application>gtkmm</"
 "application> main processing loop, which will finish when the window is "
-"closed."
+"closed. Your <function>main()</function> function will then return with an "
+"appropriate success or error code. The <parameter>argc</parameter> and "
+"<parameter>argv</parameter> arguments, passed to your application on the "
+"command line, can be checked when <methodname>run()</methodname> is called, "
+"but this simple application does not use those arguments."
 msgstr ""
-"最后一行显示窗口,并且进入 <application>gtkmm</application> 的主处理循环,它"
-"将一直运行到窗口被关闭。"
+"最后一行显示窗口并进入<application>gtkmm</application>主循环,当窗口被关闭。"
+"你的<function>main()</function>函数将会返回成功或者适当的错误码。"
+#. 之后关于argc与argv<的描述由于其在gtkmm4中被弃用了所以不进行翻译
 
-#: C/gtkmm-tutorial-in.xml:347(programlisting)
+#: C/index-in.docbook:364
 #, no-wrap
-msgid "Gtk::Main::run(window);"
-msgstr "Gtk::Main::run(window);"
+msgid "return app-&gt;run(window, argc, argv);"
+msgstr "return app-&gt;run(window, argc, argv);"
 
-#: C/gtkmm-tutorial-in.xml:351(programlisting)
+#: C/index-in.docbook:369
 #, no-wrap
-msgid "g++ simple.cc -o simple `pkg-config gtkmm-2.4 --cflags --libs`"
-msgstr "g++ simple.cc -o simple `pkg-config gtkmm-2.4 --cflags --libs`"
+msgid "g++ simple.cc -o simple `pkg-config gtkmm-4.0 --cflags --libs`"
+msgstr "g++ simple.cc -o simple `pkg-config gtkmm-4.0 --cflags --libs`"
 
-#: C/gtkmm-tutorial-in.xml:349(para)
+#: C/index-in.docbook:366
 msgid ""
 "After putting the source code in <literal>simple.cc</literal> you can "
-"compile the above program with gcc using: <placeholder-1/> Note that you "
-"must surround the <literal>pkg-config</literal> invocation with backquotes. "
-"Backquotes cause the shell to execute the command inside them, and to use "
-"the command's output as part of the command line."
+"compile the above program with <application>gcc</application> using: <_:"
+"programlisting-1/> Note that you must surround the <literal>pkg-config</"
+"literal> invocation with backquotes. Backquotes cause the shell to execute "
+"the command inside them, and to use the command's output as part of the "
+"command line. Note also that <literal>simple.cc</literal> must come before "
+"the <literal>pkg-config</literal> invocation on the command line."
 msgstr ""
 "将源代码保存到 <literal>simple.cc</literal> 后,你可以使用 gcc 编译上面的程"
-"序:<placeholder-1/> 注意,你必须将 <literal>pkg-config</literal> 的调用包含"
+"序:<_:programlisting-1/> 注意,你必须将 <literal>pkg-config</literal> 的调用包含"
 "在一对反单引号中。反单引号会导致其内的命令由 shell 执行,并且将命令的输出做为"
-"该命令行的一部分来使用。"
+"该命令行的一部分来使用。另外请注意,在命令行中<literal>simple.cc</literal>必须"
+"位于<literal>pkg-config</literal>调用之前。"
 
-#: C/gtkmm-tutorial-in.xml:360(title)
+#: C/index-in.docbook:379
 msgid "Headers and Linking"
 msgstr "头文件和链接"
 
-#: C/gtkmm-tutorial-in.xml:361(para)
+#: C/index-in.docbook:380
 msgid ""
 "Although we have shown the compilation command for the simple example, you "
 "really should use the automake and autoconf tools, as described in "
 "\"Autoconf, Automake, Libtool\", by G. V. Vaughan et al. The examples used "
-"in this book are included in the <application>gtkmm</application> package, "
-"with appropriate build files, so we won't show the build commands in future. "
-"You'll just need to find the appropriate directory and type <literal>make</"
-"literal>."
+"in this book are included in the <application>gtkmm-documentation</"
+"application> package, with appropriate build files, so we won't show the "
+"build commands in future. You'll just need to find the appropriate directory "
+"and type <literal>make</literal>."
 msgstr ""
 "虽然我们已经给出了这个简单的例子的编译命令,但是你最好还是使用 automake 和 "
 "autoconf 工具,就像 G. V. Vaughan 等在《Autoconf, Automake, Libtool》中所描述"
-"的那样。本书中用到的例子都包含在 <application>gtkmm</application> 包内,同时"
+"的那样。本书中用到的例子都包含在 <application>gtkmm-documentation</application> 包内,同时"
 "附有适当的编译构建的文件,所以我们以后不会再给出任何编译命令。你只需要找到恰"
 "当的目录然后键入 <literal>make</literal>。"
 
-#: C/gtkmm-tutorial-in.xml:364(para)
+#: C/index-in.docbook:383
 msgid ""
 "To simplify compilation, we use <literal>pkg-config</literal>, which is "
 "present in all (properly installed) <application>gtkmm</application> "
@@ -785,59 +752,70 @@ msgstr ""
 "一个需要编译器去链接的库列表和一个用于寻找它们的目录列表。试着在你的命令行提"
 "示符下运行它,看看在你的系统上会有什么样的结果。"
 
-#: C/gtkmm-tutorial-in.xml:377(programlisting)
+#: C/index-in.docbook:396
 #, no-wrap
-msgid "PKG_CHECK_MODULES([MYAPP], [gtkmm-2.4 &gt;= 2.8.0])"
-msgstr "PKG_CHECK_MODULES([MYAPP], [gtkmm-2.4 &gt;= 2.8.0])"
+msgid "PKG_CHECK_MODULES([MYAPP], [gtkmm-4.0 &gt;= 4.8.0])"
+msgstr "PKG_CHECK_MODULES([MYAPP], [gtkmm-4.0 &gt;= 4.8.0])"
 
-#: C/gtkmm-tutorial-in.xml:374(para)
+#: C/index-in.docbook:393
 msgid ""
 "However, this is even simpler when using the <function>PKG_CHECK_MODULES()</"
 "function> macro in a standard configure.ac file with autoconf and automake. "
-"For instance: <placeholder-1/> This checks for the presence of gtkmm and "
-"defines MYAPP_LIBS and MYAPP_CFLAGS for use in your Makefile.am files."
+"For instance: <_:programlisting-1/> This checks for the presence of gtkmm "
+"and defines MYAPP_LIBS and MYAPP_CFLAGS for use in your Makefile.am files."
 msgstr ""
 "然而,在标准的 configure.ac 中使用 <function>PKG_CHECK_MODULES()</function> "
-"宏,并且运行 autoconf 和 automake 后,这变的更加简单。例如:<placeholder-1/> "
+"宏,并且运行 autoconf 和 automake 后,这变的更加简单。例如:<_:programlisting-1/> "
 "这将会检查是否存在 gtkmm,并且定义了可以在你的 Makefile.am 文件中使用的 "
 "MYAPP_LIBS 和 MYAPP_CFLAGS 变量。"
 
-#: C/gtkmm-tutorial-in.xml:380(para)
+#: C/index-in.docbook:399
 msgid ""
-"gtkmm-2.4 is the name of the current stable API. There was an older API "
-"called gtkmm-2-0 which installs in parallel when it is available. There are "
-"several versions of gtkmm-2.4, such as gtkmm 2.10. Note that the API name "
-"does not change for every version because that would be an incompatible API "
-"and ABI break. Theoretically, there might be a future gtkmm-3.0 API which "
-"would install in parallel with gtkmm-2.4 without affecting existing "
-"applications."
+"gtkmm-4.0 is the name of the current stable API. There are older APIs called "
+"gtkmm-2.4 and gtkmm-3.0 which install in parallel when they are available. "
+"There are several versions of gtkmm-2.4, such as gtkmm 2.10 and there are "
+"several versions of the gtkmm-3.0 API. Note that the API name does not "
+"change for every version because that would be an incompatible API and ABI "
+"break. There might be a future gtkmm-5.0 API which would install in parallel "
+"with gtkmm-4.0 without affecting existing applications."
 msgstr ""
-"gtkmm-2.4 是当前稳定 API 的名字。更早期的 API 叫做 gtkmm-2.0,如果需要的话它"
-"可以和 gtkmm-2.4 同时安装到系统。gtkmm-2.4 有许多版本,例如,gtkmm-2.10。注"
-"意,API 的名字并不会随着每个版本变化而发生变化,因为如果这个发生变化了,则意"
-"味着 API 和 ABI 不再同以前保持兼容。理论上,将来可以有 gtkmm-3.0 API 与现在"
-"的 gtkmm-2.4 同时安装到系统,而现有应用程序不会受到影响。"
+"gtkmm-4.0 是当前稳定 API 的名字。更早期的 API 叫做 gtkmm-2.4和gtkmm-3.0,如果需要的话它"
+"可以和 gtkmm-2.4 ,gtkmm-3.0 同时安装到系统。gtkmm-2.4 有许多版本,例如,gtkmm-2.10,还有多个版本gtkmm-3.0的api。"
+"注意,API 的名字并不会随着每个版本变化而发生变化,因为如果这个发生变化了,则意"
+"味着 API 和 ABI 不再同以前保持兼容。理论上,将来可以有 gtkmm-5.0 API 与现在"
+"的 gtkmm-4.0 同时安装到系统,而现有应用程序不会受到影响。"
 
-#: C/gtkmm-tutorial-in.xml:383(para)
+#: C/index-in.docbook:406
 msgid ""
-"Note that if you mention extra modules in addition to gtkmm-2.4, they should "
+"Note that if you mention extra modules in addition to gtkmm-4.0, they should "
 "be separated by spaces, not commas."
 msgstr ""
-"注意,如果你提到了除 gtkmm-2.4 之外的模块,它们需要以空格分开,而不是逗号。"
+"注意,如果你提到了除 gtkmm-4.0 之外的模块,它们需要以空格分开,而不是逗号。"
 
-#: C/gtkmm-tutorial-in.xml:385(para)
+#: C/index-in.docbook:409
 msgid ""
-"Openismus has more <ulink url=\"http://www.openismus.com/documents/linux/";
-"automake/automake.shtml\">basic help with automake and autoconf</ulink>."
+"The GNU site has more information about <ulink url=\"https://www.gnu.org/";
+"software/autoconf/\">autoconf</ulink> and <ulink url=\"https://www.gnu.org/";
+"software/automake/\">automake</ulink>."
 msgstr ""
-"Openismus 有更多 <ulink url=\"http://www.openismus.com/documents/linux/";
-"automake/automake.shtml\">帮助使用 automake 和 autoconf 的基础知识</ulink>。"
+"GNU网站上拥有更多<ulink url=\"https://www.gnu.org/software/autoconf/\";>autoconf</ulink>和"
+"<ulink url=\"https://www.gnu.org/software/automake/\";>automake</ulink>的相关信息。"
 
-#: C/gtkmm-tutorial-in.xml:392(title) C/gtkmm-tutorial-in.xml:6318(title)
+#: C/index-in.docbook:412
+msgid ""
+"If you start by experimenting with a small application that you plan to use "
+"just for yourself, it's easier to start with a Makefile similar to the "
+"<filename>Makefile.example</filename> files in the <link linkend=\"chapter-"
+"building-applications\">Building applications</link> chapter."
+msgstr ""
+"如果你打算自己从小型应用程序开始试验,那么使用<link linkend=\"chapter-building-applications\"\>构建应用程序</link> "
+"章节的<filename>Makefile.example</filename>文件从MakeFile开始比较容易。"
+
+#: C/index-in.docbook:420 C/index-in.docbook:5869
 msgid "Widgets"
-msgstr "组件"
+msgstr "部件"
 
-#: C/gtkmm-tutorial-in.xml:393(para)
+#: C/index-in.docbook:421
 msgid ""
 "<application>gtkmm</application> applications consist of windows containing "
 "widgets, such as buttons and text boxes. In some other systems, widgets are "
@@ -845,51 +823,53 @@ msgid ""
 "a C++ object in your application's code. So you just need to call a method "
 "of the widget's class to affect the visible widget."
 msgstr ""
-"<application>gtkmm</application> 应用程序由一系列包含了如按钮、文本框之类组件"
-"的窗口构成。在一些其它的系统上,组件可能被称为“控件”。对于你的应用程序窗口中"
-"的每个组件,在你的代码里就会有一个对应的 C++ 对象。所以当你想控制组件行为的时"
-"候,只需要调用这个组件对象的相应方法即可。"
+"<application>gtkmm</application> 应用程序由一系列包含了如按钮、文本框之类部件"
+"的窗口构成。在一些其它的系统上,部件可能被称为“控件”。对于你的应用程序窗口中"
+"的每个部件,在你的代码里就会有一个对应的 C++ 对象。所以当你想控制部件行为的时"
+"候,只需要调用这个部件对象的相应方法即可。"
 
-#: C/gtkmm-tutorial-in.xml:395(programlisting)
+#: C/index-in.docbook:423
 #, no-wrap
 msgid ""
-"m_box.pack_start(m_Button1);\n"
-"m_box.pack_start(m_Button2);"
+"m_box.append(m_Button1);\n"
+"m_box.append(m_Button2);"
 msgstr ""
-"m_box.pack_start(m_Button1);\n"
-"m_box.pack_start(m_Button2);"
+"m_box.append(m_Button1);\n"
+"m_box.append(m_Button2);"
 
-#: C/gtkmm-tutorial-in.xml:398(programlisting)
+#: C/index-in.docbook:426
 #, no-wrap
-msgid "m_frame.add(m_box);"
-msgstr "m_frame.add(m_box);"
+msgid "m_frame.set_child(m_box);"
+msgstr "m_frame.set_child(m_box);"
 
-#: C/gtkmm-tutorial-in.xml:394(para)
+#: C/index-in.docbook:422
 msgid ""
 "Widgets are arranged inside container widgets such as frames and notebooks, "
 "in a hierarchy of widgets within widgets. Some of these container widgets, "
-"such as Gtk::VBox, are not visible - they exist only to arrange other "
-"widgets. Here is some example code that adds 2 Gtk::Button widgets to a Gtk::"
-"VBox container widgets: <placeholder-1/> and here is how to add the Gtk::"
-"VBox, containing those buttons, to a Gtk::Frame, which has a visible frame "
-"and title: <placeholder-2/>"
-msgstr ""
-"组件被安置在褚如 frame、notebook 这样的容器组件中,以一种组件包含组件的层次结"
-"构的形式。其中一些容器组件,像 Gtk::VBox 这样的容器组件是不可见的,它们只是被"
-"用来安置其它组件的。这有一些示例代码,将两个 Gtk::Button 组件放到一个 Gtk::"
-"VBox 容器组件中:<placeholder-1/> 接下来是如何把这个包含两个按钮的 Gtk::VBox "
-"添加到一个 Gtk::Frame 中,它包含一个可视的边框和标题:<placeholder-2/>"
-
-#: C/gtkmm-tutorial-in.xml:400(para)
+"such as <classname>Gtk::Grid</classname>, are not visible - they exist only "
+"to arrange other widgets. Here is some example code that adds 2 "
+"<classname>Gtk::Button</classname> widgets to a <classname>Gtk::Box</"
+"classname> container widget: <_:programlisting-1/> and here is how to add "
+"the <classname>Gtk::Box</classname>, containing those buttons, to a "
+"<classname>Gtk::Frame</classname>, which has a visible frame and title: <_:"
+"programlisting-2/>"
+msgstr ""
+"部件被安置在褚如 frame、notebook 这样的容器部件中,以一种部件包含部件的层次结"
+"构的形式。其中一些容器部件,像 <classname>Gtk::Grid</classname> 这样的容器部件是不可见的,它们只是被"
+"用来安置其它部件的。这里有一些示例代码,将两个 <classname>Gtk::Button</classname> 部件放到一个 "
+"<classname>Box</classname> 容器部件中:<_:programlisting-1/> 接下来是如何把这个包含两个按钮的 <classname>Gtk::Box</classname> "
+"添加到一个 <classname>Gtk::Frame</classname> 中,它包含一个可视的边框和标题:<_:programlisting-2/>"
+
+#: C/index-in.docbook:428
 msgid ""
 "Most of the chapters in this book deal with specific widgets. See the <link "
 "linkend=\"chapter-container-widgets\">Container Widgets</link> section for "
 "more details about adding widgets to container widgets."
 msgstr ""
-"本书中的大部分章节都是讲解特定的组件。要得到更多关于添加组件到容器组件的信"
-"息,请看 <link linkend=\"chapter-container-widgets\">容器组件</link> 这一章。"
+"本书中的大部分章节都是讲解特定的部件。要得到更多关于添加部件到容器部件的信"
+"息,请看 <link linkend=\"chapter-container-widgets\">容器部件</link> 这一章。"
 
-#: C/gtkmm-tutorial-in.xml:404(para)
+#: C/index-in.docbook:432
 msgid ""
 "Although you can specify the layout and appearance of windows and widgets "
 "with C++ code, you will probably find it more convenient to design your user "
@@ -897,38 +877,37 @@ msgid ""
 "<literal>Gtk::Builder</literal>. See the <link linkend=\"chapter-builder"
 "\">Glade and Gtk::Builder</link> chapter."
 msgstr ""
-"尽管你可以使用 C++ 代码来指定窗口和组件的外观和布局,但你可能会发现使用 "
+"尽管你可以使用 C++ 代码来指定窗口和部件的外观和布局,但你可能会发现使用 "
 "Glade 来设计你的界面,并且使用 <literal>Gtk::Builder</literal> 在运行时动态加"
 "载界面是更方便。请参考 <link linkend=\"chapter-builder\">Glade 与 Gtk::"
 "Builder</link> 这一章。"
 
-#: C/gtkmm-tutorial-in.xml:407(para)
+#: C/index-in.docbook:435
 msgid ""
 "Although <application>gtkmm</application> widget instances have lifetimes "
 "and scopes just like those of other C++ classes, <application>gtkmm</"
 "application> has an optional time-saving feature that you will see in some "
-"of the examples. <function>Gtk::manage()</function> allows you to say that a "
-"child widget is owned by the container into which you place it. This allows "
-"you to <function>new</function> the widget, add it to the container and "
-"forget about deleting it. You can learn more about <application>gtkmm</"
-"application> memory management techniques in the <link linkend=\"chapter-"
-"memory\">Memory Management chapter</link>."
-msgstr ""
-"尽管 <application>gtkmm</application> 组件实例拥有像其它 C++ 类那样的生存时间"
+"of the examples. The <function>Gtk::make_managed()</function> allows you to "
+"create a new widget and state that it will become owned by the container "
+"into which you place it. This allows you to create the widget, add it to the "
+"container and not be concerned about deleting it, since that will occur when "
+"the parent container (which may itself be managed) is deleted. You can learn "
+"more about <application>gtkmm</application> memory management techniques in "
+"the <link linkend=\"chapter-memory\">Memory Management chapter</link>."
+msgstr ""
+"尽管 <application>gtkmm</application> 部件实例拥有像其它 C++ 类那样的生存时间"
 "和作用域,<application>gtkmm</application> 还是有一些可选的节省时间的特性,接"
-"下来你会在接下来的一些例子中看到。<function>Gtk::manage()</function> 允许你指"
-"定一个子组件是被其容器组件所拥有。这将允许你 <function>new</function> 组件、"
-"添加到容器中,然后忘记删除它。如果你需要了解更多关于 <application>gtkmm</"
-"application> 内存管理技术的话,请看 <link linkend=\"chapter-memory\">内存管理"
-"</link> 章节。"
-
-#: C/gtkmm-tutorial-in.xml:413(title) C/gtkmm-tutorial-in.xml:712(title)
-#: C/gtkmm-tutorial-in.xml:5068(title) C/gtkmm-tutorial-in.xml:5361(title)
-#: C/gtkmm-tutorial-in.xml:7639(title)
+"下来你会在接下来的一些例子中看到。<function>Gtk::make_managed()</function> 允许你创建一个新的部件并"
+"声明该部件由放置它的容器部件所拥有。这将允许你创建部件然后将其添加到容器中,而不必承担记住删除它的心智负担,"
+"因为当它的父容器被删除时它将被一并删除。如果你需要了解更多关于 <application>gtkmm</application> 内存管理技术的话,"
+"请看 <link linkend=\"chapter-memory\">内存管理</link> 章节。"
+
+#: C/index-in.docbook:449 C/index-in.docbook:4689 C/index-in.docbook:4933
+#: C/index-in.docbook:8092
 msgid "Signals"
 msgstr "信号"
 
-#: C/gtkmm-tutorial-in.xml:415(para)
+#: C/index-in.docbook:451
 msgid ""
 "<application>gtkmm</application>, like most GUI toolkits, is <emphasis>event-"
 "driven</emphasis>. When an event occurs, such as the press of a mouse "
@@ -938,12 +917,12 @@ msgid ""
 "<emphasis>signal handler</emphasis> to catch the button's \"clicked\" signal."
 msgstr ""
 "像大多数 GUI 工具集一样,<application>gtkmm</application> 是<emphasis>事件驱"
-"动</emphasis>的。当一个事件发生时,比如说一个鼠标按键被按下,那么所点击的组件"
-"就会<emphasis>发出</emphasis>一个合适的信号。每种组件都可以发出一套不同的信"
+"动</emphasis>的。当一个事件发生时,比如说一个鼠标按键被按下,那么所点击的部件"
+"就会<emphasis>发出</emphasis>一个合适的信号。每种部件都可以发出一套不同的信"
 "号。为了使这个按钮点击产生一个动作,我们可以设置一个<emphasis>信号处理函数"
 "(signal handler)</emphasis>来捕捉这个“clicked”信号。"
 
-#: C/gtkmm-tutorial-in.xml:423(programlisting)
+#: C/index-in.docbook:459
 #, no-wrap
 msgid ""
 "m_button1.signal_clicked().connect( sigc::mem_fun(*this,\n"
@@ -952,18 +931,18 @@ msgstr ""
 "m_button1.signal_clicked().connect( sigc::mem_fun(*this,\n"
 "  &amp;HelloWorld::on_button_clicked) );"
 
-#: C/gtkmm-tutorial-in.xml:422(para)
+#: C/index-in.docbook:458
 msgid ""
 "<application>gtkmm</application> uses the libsigc++ library to implement "
 "signals. Here is an example line of code that connects a Gtk::Button's "
-"\"clicked\" signal with a signal handler called \"on_button_clicked\": "
-"<placeholder-1/>"
+"\"clicked\" signal with a signal handler called \"on_button_clicked\": <_:"
+"programlisting-1/>"
 msgstr ""
 "<application>gtkmm</application> 使用 libsigc++ 来实现信号操作。下面这个例子"
-"演示怎样把 Gtk::Button “clicked” 信号连接到命名为“on_button_clicked”的信号处"
-"理函数上:<placeholder-1/>"
+"演示怎样把 Gtk::Button 的“clicked” 信号连接到命名为“on_button_clicked”的信号处"
+"理函数上:<_:programlisting-1/>"
 
-#: C/gtkmm-tutorial-in.xml:427(para)
+#: C/index-in.docbook:463
 msgid ""
 "For more detailed information about signals, see the <link linkend=\"chapter-"
 "signals\">appendix</link>."
@@ -971,7 +950,7 @@ msgstr ""
 "要得到更多关于信号的信息,请参考<link linkend=\"chapter-signals\">附录</"
 "link>。"
 
-#: C/gtkmm-tutorial-in.xml:428(para)
+#: C/index-in.docbook:464
 msgid ""
 "For information about implementing your own signals rather than just "
 "connecting to the existing <application>gtkmm</application> signals, see the "
@@ -981,18 +960,19 @@ msgstr ""
 "application> 信号,请参考 <link linkend=\"chapter-custom-signals\">附录</"
 "link>。"
 
-#: C/gtkmm-tutorial-in.xml:434(title) C/gtkmm-tutorial-in.xml:9187(classname)
+#: C/index-in.docbook:470
 msgid "Glib::ustring"
 msgstr "Glib::ustring"
 
-#: C/gtkmm-tutorial-in.xml:435(para)
+#: C/index-in.docbook:471
 msgid ""
 "You might be surprised to learn that <application>gtkmm</application> "
-"doesn't use <classname>std::string</classname> in it its interfaces. Instead "
-"it uses <classname>Glib::ustring</classname>, which is so similar and "
-"unobtrusive that you could actually pretend that each Glib::ustring is a "
-"<classname>std::string</classname> and ignore the rest of this section. But "
-"read on if you want to use languages other than English in your application."
+"doesn't use <classname>std::string</classname> in its interfaces. Instead it "
+"uses <classname>Glib::ustring</classname>, which is so similar and "
+"unobtrusive that you could actually pretend that each <classname>Glib::"
+"ustring</classname> is a <classname>std::string</classname> and ignore the "
+"rest of this section. But read on if you want to use languages other than "
+"English in your application."
 msgstr ""
 "你一定很惊讶得知 <application>gtkmm</application> 没有在它的接口上使用 "
 "<classname>std::string</classname>,相反,它使用了 <classname>Glib::ustring</"
@@ -1001,23 +981,24 @@ msgstr ""
 "string</classname> 来使用,而忽略本节后面的内容。但是如果你希望在你的应用程序"
 "中使用英语以外的语言的话,那么请继续读下去。"
 
-#: C/gtkmm-tutorial-in.xml:436(para)
+#: C/index-in.docbook:472
 msgid ""
-"std::string uses 8 bit per character, but 8 bits aren't enough to encode "
+"std::string uses 8 bits per character, but 8 bits aren't enough to encode "
 "languages such as Arabic, Chinese, and Japanese. Although the encodings for "
-"these languages has now been specified by the Unicode Constortium, the C and "
-"C++ languages do not yet provide any standardised Unicode support. GTK+ and "
-"GNOME chose to implement Unicode using UTF-8, and that's what is wrapped by "
-"Glib::ustring. It provides almost exactly the same interface as std::string, "
-"along with automatic conversions to and from std::string."
+"these languages have been specified by the <ulink url=\"http://www.unicode.";
+"org/\">Unicode Consortium</ulink>, the C and C++ languages do not yet "
+"provide any standardised Unicode support for UTF-8 encoding. GTK and GNOME "
+"chose to implement Unicode using UTF-8, and that's what is wrapped by Glib::"
+"ustring. It provides almost exactly the same interface as std::string, along "
+"with automatic conversions to and from std::string."
 msgstr ""
 "std::string 对每个字符使用8位编码,但是这对于像阿拉伯语、汉语和日语这样的语言"
-"来说,8位是不够的。尽管 Unicode 协会已经详细定义了这些语言的编码,但是 C 和 C"
-"++ 仍未提供任何标准的 Unicode 支持。GTK+ 和 GNOME 采用 UTF-8 编码来实现 "
+"来说,8位是不够的。尽管<ulink url=\"http://www.unicode.org/\";>Unicode 协会</ulink>已经详细定义了这些语言的编码,"
+"但是C和C++尚未为UTF-8编码提供任何标准化的Unicode支持。GTK 和 GNOME 采用 UTF-8 编码来实现 "
 "Unicode,这就是 Glib::ustring 所包装的东西。它提供了和 std::string 几乎相同的"
 "接口,以及和 std::string 的自动类型转换的功能。"
 
-#: C/gtkmm-tutorial-in.xml:437(para)
+#: C/index-in.docbook:477
 msgid ""
 "One of the benefits of UTF-8 is that you don't need to use it unless you "
 "want to, so you don't need to retrofit all of your code at once. "
@@ -1033,7 +1014,7 @@ msgstr ""
 "还会崩溃。那时,你所需要做的就是开始使用 <classname>Glib::ustring</"
 "classname> 来取而代之。"
 
-#: C/gtkmm-tutorial-in.xml:438(para)
+#: C/index-in.docbook:478
 msgid ""
 "Note that UTF-8 isn't compatible with 8-bit encodings like ISO-8859-1. For "
 "instance, German umlauts are not in the ASCII range and need more than 1 "
@@ -1046,7 +1027,7 @@ msgstr ""
 "如果你的代码中包含8位的字符串文字,你需要把它们转变成 UTF-8 编码 (比如,巴伐"
 "利亚的问候语“Grüß Gott”可能会显示成“Gr\\xC3\\xBC\\xC3\\x9F Gott”)。"
 
-#: C/gtkmm-tutorial-in.xml:439(para)
+#: C/index-in.docbook:479
 msgid ""
 "You should avoid C-style pointer arithmetic, and functions such as strlen(). "
 "In UTF-8, each character might need anywhere from 1 to 6 bytes, so it's not "
@@ -1061,7 +1042,7 @@ msgstr ""
 "可以从字符的层面上考虑使用 Glib::ustring::substr() 这样的函数,而不用再去考虑"
 "字节这样的细节了。"
 
-#: C/gtkmm-tutorial-in.xml:441(para)
+#: C/index-in.docbook:481
 msgid ""
 "Unlike the Windows UCS-2 Unicode solution, this does not require any special "
 "compiler options to process string literals, and it does not result in "
@@ -1071,33 +1052,14 @@ msgstr ""
 "这样字符串,也不会导致为 Unicode 编译的可执行文件或库与含为 ASCII 的不兼容之"
 "类的问题。"
 
-#: C/gtkmm-tutorial-in.xml:443(ulink) C/gtkmm-tutorial-in.xml:692(ulink)
-#: C/gtkmm-tutorial-in.xml:790(ulink) C/gtkmm-tutorial-in.xml:805(ulink)
-#: C/gtkmm-tutorial-in.xml:908(ulink) C/gtkmm-tutorial-in.xml:962(ulink)
-#: C/gtkmm-tutorial-in.xml:980(ulink) C/gtkmm-tutorial-in.xml:1026(ulink)
-#: C/gtkmm-tutorial-in.xml:1123(ulink) C/gtkmm-tutorial-in.xml:1178(ulink)
-#: C/gtkmm-tutorial-in.xml:1224(ulink) C/gtkmm-tutorial-in.xml:1424(ulink)
-#: C/gtkmm-tutorial-in.xml:1472(ulink) C/gtkmm-tutorial-in.xml:1520(ulink)
-#: C/gtkmm-tutorial-in.xml:1595(ulink) C/gtkmm-tutorial-in.xml:1636(ulink)
-#: C/gtkmm-tutorial-in.xml:1677(ulink) C/gtkmm-tutorial-in.xml:1710(ulink)
-#: C/gtkmm-tutorial-in.xml:1750(ulink) C/gtkmm-tutorial-in.xml:2353(ulink)
-#: C/gtkmm-tutorial-in.xml:2420(ulink) C/gtkmm-tutorial-in.xml:2573(ulink)
-#: C/gtkmm-tutorial-in.xml:2630(ulink) C/gtkmm-tutorial-in.xml:2698(ulink)
-#: C/gtkmm-tutorial-in.xml:2745(ulink) C/gtkmm-tutorial-in.xml:2761(ulink)
-#: C/gtkmm-tutorial-in.xml:2779(ulink) C/gtkmm-tutorial-in.xml:2887(ulink)
-#: C/gtkmm-tutorial-in.xml:3410(ulink) C/gtkmm-tutorial-in.xml:3486(ulink)
-#: C/gtkmm-tutorial-in.xml:3565(ulink) C/gtkmm-tutorial-in.xml:3593(ulink)
-#: C/gtkmm-tutorial-in.xml:3622(ulink) C/gtkmm-tutorial-in.xml:3674(ulink)
-#: C/gtkmm-tutorial-in.xml:3694(ulink) C/gtkmm-tutorial-in.xml:3742(ulink)
-#: C/gtkmm-tutorial-in.xml:4240(ulink) C/gtkmm-tutorial-in.xml:4297(ulink)
-#: C/gtkmm-tutorial-in.xml:4308(ulink) C/gtkmm-tutorial-in.xml:4335(ulink)
-#: C/gtkmm-tutorial-in.xml:4357(ulink) C/gtkmm-tutorial-in.xml:4380(ulink)
-#: C/gtkmm-tutorial-in.xml:5176(ulink) C/gtkmm-tutorial-in.xml:5451(ulink)
-#: C/gtkmm-tutorial-in.xml:5483(ulink) C/gtkmm-tutorial-in.xml:7507(ulink)
-msgid "Reference"
-msgstr "参考"
-
-#: C/gtkmm-tutorial-in.xml:445(para)
+#: C/index-in.docbook:483
+msgid ""
+"<ulink url=\"http://developer.gnome.org/glibmm/unstable/classGlib_1_1ustring.";
+"html\">Reference</ulink>"
+msgstr ""
+"<ulink url=\"http://developer.gnome.org/glibmm/unstable/classGlib_1_1ustring.html\";>参考</ulink>"
+
+#: C/index-in.docbook:485
 msgid ""
 "See the <link linkend=\"chapter-internationalization\">Internationalization</"
 "link> section for information about providing the UTF-8 string literals."
@@ -1105,121 +1067,117 @@ msgstr ""
 "要得到更多关于 UTF-8 字符的信息,请参考<link linkend=\"chapter-"
 "internationalization\">国际化</link>这一节。"
 
-#: C/gtkmm-tutorial-in.xml:450(title)
-msgid "Intermediate types"
-msgstr "中间类型"
-
-#: C/gtkmm-tutorial-in.xml:453(para)
-msgid ""
-"<classname>Glib::StringArrayHandle</classname> or <classname>Glib::"
-"ArrayHandle&lt;Glib::ustring&gt;</classname>: Use <classname>std::vector&lt;"
-"Glib::ustring&gt;</classname>, <classname>std::list&lt;Glib::ustring&gt;</"
-"classname>, <type>const char*[]</type>, etc."
-msgstr ""
-"<classname>Glib::StringArrayHandle</classname> 或 <classname>Glib::"
-"ArrayHandle&lt;Glib::ustring&gt;</classname>:使用 <classname>std::vector&lt;"
-"Glib::ustring&gt;</classname>、<classname>std::list&lt;Glib::ustring&gt;</"
-"classname>、<type>const char*[]</type> 等。"
-
-#: C/gtkmm-tutorial-in.xml:454(para)
-msgid ""
-"<classname>Glib::ListHandle&lt;Gtk::Widget*&gt;</classname>: Use "
-"<classname>std::vector&lt;Gtk::Widget*&gt;</classname>, <classname>std::"
-"list&lt;Gtk::Widget*&gt;</classname>, etc."
-msgstr ""
-"<classname>Glib::ListHandle&lt;Gtk::Widget*&gt;</classname>:使用 "
-"<classname>std::vector&lt;Gtk::Widget*&gt;</classname>、<classname>std::"
-"list&lt;Gtk::Widget*&gt;</classname> 等。"
-
-#: C/gtkmm-tutorial-in.xml:455(para)
-msgid ""
-"<classname>Glib::SListHandle&lt;Gtk::Widget*&gt;</classname>: Use "
-"<classname>std::vector&lt;Gtk::Widget*&gt;</classname>, <classname>std::"
-"list&lt;Gtk::Widget*&gt;</classname>, etc."
-msgstr ""
-"<classname>Glib::SListHandle&lt;Gtk::Widget*&gt;</classname>:使用 "
-"<classname>std::vector&lt;Gtk::Widget*&gt;</classname>、<classname>std::"
-"list&lt;Gtk::Widget*&gt;</classname> 等。"
-
-#: C/gtkmm-tutorial-in.xml:451(para)
-msgid ""
-"Some parts of the <application>gtkmm</application> API use intermediate data "
-"containers, such as <classname>Glib::StringArrayHandle</classname> instead "
-"of a specific Standard C++ container such as <classname>std::vector</"
-"classname> or <classname>std::list</classname>. You should not declare these "
-"types yourself -- you should use whatever Standard C++ container you prefer "
-"instead. <application>gtkmm</application> will do the conversion for you. "
-"Here are some of these intermediate types: <placeholder-1/>"
-msgstr ""
-"部分 <application>gtkmm</application> API 使用了中间数据容器,如 "
-"<classname>Glib::StringArrayHandle</classname> 而不是特定的标准 C++ 容器 "
-"<classname>std::vector</classname> 或 <classname>std::list</classname>。但是"
-"你不应该自己声明这些类型,你应当使用你所倾向的标准 C++ 容器。"
-"<application>gtkmm</application> 将会帮你进行类型转换。这里有一些这类中间类"
-"型:<placeholder-1/>"
-
-#: C/gtkmm-tutorial-in.xml:463(title)
+#: C/index-in.docbook:490
 msgid "Mixing C and C++ APIs"
 msgstr "混合使用 C 和 C++ API"
 
-#: C/gtkmm-tutorial-in.xml:464(para)
+#: C/index-in.docbook:491
 msgid ""
 "You can use C APIs which do not yet have convenient C++ interfaces. It is "
 "generally not a problem to use C APIs from C++, and <application>gtkmm</"
 "application> helps by providing access to the underlying C object, and "
 "providing an easy way to create a C++ wrapper object from a C object, "
-"provided that the C API is also based on the GObject system."
+"provided that the C API is also based on the <classname>GObject</classname> "
+"system."
 msgstr ""
 "你可以使用那些尚未提供 C++ 接口的 C API。对于 C++ 而言这一般不是什么问题,"
 "<application>gtkmm</application> 可以提供帮助访问底层的 C 对象,并且也提供了"
 "一个简单的方式来从一个 C 对象创建一个 C++ 封装的对象,当然,这个 C API 是需要"
-"基于 GObject 系统的。"
-
-#: C/gtkmm-tutorial-in.xml:466(para)
-msgid ""
-"To use a <application>gtkmm</application> instance with a C function that "
-"requires a C GObject instance, use the <function>gobj()</function> function "
-"to obtain a pointer to the underlying GObject instance. For instance"
-msgstr ""
-"要用 C 函数使用一个 <application>gtkmm</application> 实例需要一个 C GObject "
-"实例,使用 <function>gobj()</function> 函数可以得到一个底层 GObject 实例的指"
-"针。例如"
+"基于 <classname>GObject</classname> 系统的。"
 
-#: C/gtkmm-tutorial-in.xml:469(programlisting)
+#: C/index-in.docbook:502
 #, no-wrap
 msgid ""
 "\n"
-"Gtk::Button* button = new Gtk::Button(\"example\");\n"
-"gtk_button_do_something_new(button-&gt;gobj());\n"
+"Gtk::Button button(\"example\");\n"
+"gtk_button_do_something_that_gtkmm_cannot(button.gobj());\n"
 msgstr ""
 "\n"
-"Gtk::Button* button = new Gtk::Button(\"example\");\n"
-"gtk_button_do_something_new(button-&gt;gobj());\n"
+"Gtk::Button button(\"example\");\n"
+"gtk_button_do_something_that_gtkmm_cannot(button.gobj());\n"
 
-#: C/gtkmm-tutorial-in.xml:475(para)
+#: C/index-in.docbook:497
 msgid ""
-"To obtain a <application>gtkmm</application> instance from a C GObject "
-"instance, use the Glib::wrap() function. For instance"
+"To use a <application>gtkmm</application> instance with a C function that "
+"requires a C <classname>GObject</classname> instance, use the C++ instance’s "
+"<function>gobj()</function> function to obtain a pointer to the underlying C "
+"instance. For example: <_:programlisting-1/>"
 msgstr ""
-"要从 C GObject 实例得到一个 <application>gtkmm</application> 实例,则使用 "
-"Glib::wrap() 函数。例如"
+"要用 C 函数使用一个 <application>gtkmm</application> 实例需要一个 C <classname>GObject</classname> "
+"实例,使用C++的<function>gobj()</function>接口函数可以得到一个底层 GObject 实例的指"
+"针。例如:<_:programlisting-1/>"
 
-#: C/gtkmm-tutorial-in.xml:477(programlisting)
+#: C/index-in.docbook:514
 #, no-wrap
 msgid ""
 "\n"
 "GtkButton* cbutton = get_a_button();\n"
 "Gtk::Button* button = Glib::wrap(cbutton);\n"
+"button-&gt;set_label(\"Now I speak C++ too!\");\n"
 msgstr ""
 "\n"
 "GtkButton* cbutton = get_a_button();\n"
 "Gtk::Button* button = Glib::wrap(cbutton);\n"
+"button-&gt;set_label(\"Now I speak C++ too!\");\n"
+
+#: C/index-in.docbook:521
+msgid ""
+"it's a widget or other class that inherits from <classname>Gtk::Object</"
+"classname>, and"
+msgstr ""
+"它是一个部件或者是继承自<classname>Gtk::Object</classname>的其他类,并且"
+
+#: C/index-in.docbook:522
+msgid ""
+"the C instance has a floating reference when the wrapper is created, and"
+msgstr "当封装被创建的时候C示例拥有一个浮动引用,并且"
+
+#: C/index-in.docbook:523
+msgid ""
+"<function>Gtk::manage()</function> has not been called on it (which includes "
+"if it was created with <function>Gtk::make_managed()</function>), or"
+msgstr ""
+"并未在其上调用<function>Gtk::manage()</function>(包括使用<function>Gtk::make_managed()</function>创建的) ,或者"
+
+#: C/index-in.docbook:524
+msgid ""
+"<function>Gtk::manage()</function> was called on it, but it was never added "
+"to, or was later removed from, its parent."
+msgstr ""
+"在其上调用了<function>Gtk::manage()</function>,但是从未将其加入到父项中,也从未将其从父项中删除。"
+
+#: C/index-in.docbook:508
+msgid ""
+"To obtain a <application>gtkmm</application> instance from a C "
+"<classname>GObject</classname> instance, use one of the many overloaded "
+"<function>Glib::wrap()</function> functions. The C instance’s reference "
+"count is not incremented, unless you set the optional <parameter>take_copy</"
+"parameter> argument to <literal>true</literal>. For example: <_:"
+"programlisting-1/> The C++ wrapper shall be explicitly deleted if <_:"
+"itemizedlist-2/> <function>Glib::wrap()</function> binds the C and C++ "
+"instances to each other. Don't delete the C++ instance before you want the C "
+"instance to die."
+msgstr ""
+"要从C的<classname>GObject</classname>实例获得一个<application>gtkmm</application>,请使用许多个<function>Glib::wrap()</function>"
+"函数的其中一个重载。除非你将可选的<parameter>take_copy</parameter>参数设置为<literal>true</literal>,否则C实例的引用计数将不会增加。"
+"例如:<_:programlisting-1/> 如果<_:itemizedlist-2/> <function>Glib::wrap()</function>将C和C++示例相互绑定,则应明确删除C++包装器。"
+"请不要在C示例死亡前删除C++实例。"
+
+#: C/index-in.docbook:529
+msgid ""
+"In all other cases the C++ instance is automatically deleted when the last "
+"reference to the C instance is dropped. This includes all <function>Glib::"
+"wrap()</function> overloads that return a <classname>Glib::RefPtr</"
+"classname>."
+msgstr ""
+"在所有其他情况下,当删除对C实例的最后一个引用时,C++实例将会自动被删除。这包括所有的<function>Glib::wrap()</function>"
+"所返回的<classname>Glib::RefPtr</classname>。"
 
-#: C/gtkmm-tutorial-in.xml:485(title)
+#: C/index-in.docbook:536
 msgid "Hello World in <application>gtkmm</application>"
 msgstr "用 <application>gtkmm</application> 写 Hello World"
 
-#: C/gtkmm-tutorial-in.xml:487(para)
+#: C/index-in.docbook:538
 msgid ""
 "We've now learned enough to look at a real example. In accordance with an "
 "ancient tradition of computer science, we now introduce Hello World, a la "
@@ -1228,17 +1186,24 @@ msgstr ""
 "目前我们已经可以自己所学的知识来写一个真正的程序了。根据计算机科学的传统,我"
 "们现在以 <application>gtkmm</application> 的方式来介绍 Hello World 程序:"
 
-#: C/gtkmm-tutorial-in.xml:494(para)
+#: C/index-in.docbook:543
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/helloworld\">Source Code</ulink>"
+msgstr ""
+"<ulink 
url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/examples/book/helloworld\";>源代码</ulink>"
+
+#: C/index-in.docbook:545
 msgid ""
 "Try to compile and run it before going on. You should see something like "
 "this:"
 msgstr "在继续讲解之前,可以尝试着编译并运行这个程序,你会看到这样的结果:"
 
-#: C/gtkmm-tutorial-in.xml:499(title)
+#: C/index-in.docbook:550
 msgid "Hello World"
 msgstr "Hello World"
 
-#: C/gtkmm-tutorial-in.xml:505(para)
+#: C/index-in.docbook:556
 msgid ""
 "Pretty thrilling, eh? Let's examine the code. First, the "
 "<classname>HelloWorld</classname> class:"
@@ -1246,19 +1211,18 @@ msgstr ""
 "真让人激动,不是吗?让我们回过头来看一下代码。首先看一下 "
 "<classname>HelloWorld</classname> 类:"
 
-#: C/gtkmm-tutorial-in.xml:510(programlisting)
+#: C/index-in.docbook:561
 #, no-wrap
 msgid ""
 "class HelloWorld : public Gtk::Window\n"
 "{\n"
-"\n"
 "public:\n"
 "  HelloWorld();\n"
-"  virtual ~HelloWorld();\n"
+"  ~HelloWorld() override;\n"
 "\n"
 "protected:\n"
 "  //Signal handlers:\n"
-"  virtual void on_button_clicked();\n"
+"  void on_button_clicked();\n"
 "\n"
 "  //Member widgets:\n"
 "  Gtk::Button m_button;\n"
@@ -1266,20 +1230,19 @@ msgid ""
 msgstr ""
 "class HelloWorld : public Gtk::Window\n"
 "{\n"
-"\n"
 "public:\n"
 "  HelloWorld();\n"
-"  virtual ~HelloWorld();\n"
+"  ~HelloWorld() override;\n"
 "\n"
 "protected:\n"
 "  //Signal handlers:\n"
-"  virtual void on_button_clicked();\n"
+"  void on_button_clicked();\n"
 "\n"
 "  //Member widgets:\n"
 "  Gtk::Button m_button;\n"
 "};"
 
-#: C/gtkmm-tutorial-in.xml:525(para)
+#: C/index-in.docbook:575
 msgid ""
 "This class implements the \"Hello World\" window. It's derived from "
 "<classname>Gtk::Window</classname>, and has a single <classname>Gtk::Button</"
@@ -1291,32 +1254,28 @@ msgstr ""
 "并且只有一个 <classname>Gtk::Button</classname> 成员。我们已经使用构造函数为"
 "该窗口完成了所有的初始化工作,包括挂接消息。在这,已经去掉注释的代码:"
 
-#: C/gtkmm-tutorial-in.xml:534(programlisting)
+#: C/index-in.docbook:584
 #, no-wrap
 msgid ""
 "HelloWorld::HelloWorld()\n"
-":\n"
-"  m_button (\"Hello World\")\n"
+": m_button(\"Hello World\")\n"
 "{\n"
-"  set_border_width(10);\n"
+"  m_button.set_margin(10);\n"
 "  m_button.signal_clicked().connect(sigc::mem_fun(*this,\n"
 "    &amp;HelloWorld::on_button_clicked));\n"
-"  add(m_button);.\n"
-"  m_button.show();\n"
+"  set_child(m_button);\n"
 "}"
 msgstr ""
 "HelloWorld::HelloWorld()\n"
-":\n"
-"  m_button (\"Hello World\")\n"
+": m_button(\"Hello World\")\n"
 "{\n"
-"  set_border_width(10);\n"
+"  m_button.set_margin(10);\n"
 "  m_button.signal_clicked().connect(sigc::mem_fun(*this,\n"
 "    &amp;HelloWorld::on_button_clicked));\n"
-"  add(m_button);.\n"
-"  m_button.show();\n"
+"  set_child(m_button);\n"
 "}"
 
-#: C/gtkmm-tutorial-in.xml:545(para)
+#: C/index-in.docbook:593
 msgid ""
 "Notice that we've used an initialiser statement to give the "
 "<literal>m_button</literal> object the label \"Hello World\"."
@@ -1324,572 +1283,972 @@ msgstr ""
 "注意,我们使用初始化列表的方式给 <literal>m_button</literal> 对象添加了一"
 "个“Hello World”的标签。"
 
-#: C/gtkmm-tutorial-in.xml:550(para)
+#: C/index-in.docbook:598
 msgid ""
-"Next we call the Window's <methodname>set_border_width()</methodname> "
-"method. This sets the amount of space between the sides of the window and "
-"the widget it contains."
+"Next we call the Button's <methodname>set_margin()</methodname> method. This "
+"sets the amount of space around the button."
 msgstr ""
-"接下来调用 Windows 类的 <methodname>set_border_width()</methodname> 方法。设"
-"置窗口的边框和它所包含的组件之间的空白距离。"
+"接下来调用 Button 类的 <methodname>set_margin()</methodname> 方法。这将设"
+"置按钮周围空间的大小。"
 
-#: C/gtkmm-tutorial-in.xml:556(para)
+#: C/index-in.docbook:603
 msgid ""
 "We then hook up a signal handler to <literal>m_button</literal>'s "
 "<literal>clicked</literal> signal. This prints our friendly greeting to "
 "<literal>stdout</literal>."
 msgstr ""
-"然后,把 <literal>m_button</literal> 的 <literal>clicked</literal> 消息挂接到"
+"然后,把 <literal>m_button</literal> 的 <literal>clicked</literal> 信号挂接到"
 "信号处理函数上。这会向 <literal>stdout</literal> (标准输出) 打印出友好的问候"
 "语。"
 
-#: C/gtkmm-tutorial-in.xml:561(para)
+#: C/index-in.docbook:608
 msgid ""
-"Next, we use the Window's <methodname>add()</methodname> method to put "
-"<literal>m_button</literal> in the Window. (<methodname>add()</methodname> "
-"comes from <classname>Gtk::Container</classname>, which is described in the "
-"chapter on container widgets.) The <methodname>add()</methodname> method "
-"places the Widget in the Window, but it doesn't display the widget. "
-"<application>gtkmm</application> widgets are always invisible when you "
-"create them - to display them, you must call their <methodname>show()</"
-"methodname> method, which is what we do in the next line."
+"Next, we use the Window's <methodname>set_child()</methodname> method to put "
+"<literal>m_button</literal> in the Window. The <methodname>set_child()</"
+"methodname> method places the Widget in the Window."
 msgstr ""
-"下一步,我们使用 Window 类的 <methodname>add()</methodname> 方法把 "
-"<literal>m_button</literal> 加到 Window 类中。(<methodname>add()</"
-"methodname> 方法由 <classname>Gtk::Container</classname> 类继承而来,我们将在"
-"容器组件这一章中具体介绍。) <methodname>add()</methodname> 方法仅仅将组件添加"
-"到窗口中,它并不负责显示这些组件。<application>gtkmm</application> 组件在创建"
-"以后都是不可见的。要显示它们,你必须调用 <methodname>show()</methodname> 方"
-"法,通常我们会在接下来的一行就调用它。"
+"接下来调用 Windows 类的 <methodname>set_child()</methodname> 方法将<literal>m_button</literal>"
+"放入窗口。<methodname>set_child()</methodname>方法会将部件放入窗口中。"
 
-#: C/gtkmm-tutorial-in.xml:571(para)
+#: C/index-in.docbook:614
 msgid ""
 "Now let's look at our program's <function>main()</function> function. Here "
 "it is, without comments:"
 msgstr "现在让我们来看看程序中没有注释过的 <function>main()</function> 函数:"
 
-#: C/gtkmm-tutorial-in.xml:576(programlisting)
+#: C/index-in.docbook:619
 #, no-wrap
 msgid ""
-"int main(int argc, char** argv)\n"
+"int main(int argc, char* argv[])\n"
 "{\n"
-"  Gtk::Main kit(argc, argv);\n"
-"\n"
+"  auto app = Gtk::Application::create(\"org.gtkmm.example\");\n"
 "  HelloWorld helloworld;\n"
-"  Gtk::Main::run(helloworld);\n"
-"\n"
-"  return 0;\n"
+"  return app-&gt;run(helloworld, argc, argv);\n"
 "}"
 msgstr ""
-"int main(int argc, char** argv)\n"
+"int main(int argc, char* argv[])\n"
 "{\n"
-"  Gtk::Main kit(argc, argv);\n"
-"\n"
+"  auto app = Gtk::Application::create(\"org.gtkmm.example\");\n"
 "  HelloWorld helloworld;\n"
-"  Gtk::Main::run(helloworld);\n"
-"\n"
-"  return 0;\n"
+"  return app-&gt;run(helloworld, argc, argv);\n"
 "}"
 
-#: C/gtkmm-tutorial-in.xml:586(para)
+#: C/index-in.docbook:626
 msgid ""
-"First we instantiate an object called <literal>kit</literal>. This is of "
-"type <classname>Gtk::Main</classname>. Every <application>gtkmm</"
-"application> program must have one of these. We pass our command-line "
-"arguments to its constructor. It takes the arguments it wants, and leaves "
-"you the rest, as we described earlier."
+"First we instantiate an object stored in a <classname>RefPtr</classname> "
+"smartpointer called <literal>app</literal>. This is of type <classname>Gtk::"
+"Application</classname>. Every <application>gtkmm</application> program must "
+"have one of these."
 msgstr ""
-"我们首先初始化一个名为 <literal>kit</literal> 的对象,它的类型为 "
-"<classname>Gtk::Main</classname> 。每一个 <application>gtkmm</application> 程"
-"序都有这样的一个东西。我们将命令行参数传递给它的构造函数。它会提取自己需要的"
-"参数,将剩下的部分留给我们,就像前面描述过的那样。"
+"我们首先实例化一个储存在名为 <literal>app</literal> 的<classname>RefPtr</classname>智能指针对象,它的类型为 "
+"<classname>Gtk::Application</classname> 。每一个 <application>gtkmm</application> 程"
+"序都有这样的一个东西。"
 
-#: C/gtkmm-tutorial-in.xml:593(para)
+#: C/index-in.docbook:631
 msgid ""
 "Next we make an object of our <classname>HelloWorld</classname> class, whose "
-"constructor takes no arguments, but it isn't visible yet. When we call Gtk::"
-"Main::run(), giving it the helloworld Window, it shows the Window and starts "
-"the <application>gtkmm</application><emphasis>event loop</emphasis>. During "
-"the event loop <application>gtkmm</application> idles, waiting for actions "
-"from the user, and responding appropriately. When the user closes the "
-"Window, run() will return, causing the final line of our main() function be "
-"to executed. The application will then finish."
+"constructor takes no arguments, but it isn't visible yet. When we call "
+"<methodname>Gtk::Application::run()</methodname>, giving it the helloworld "
+"Window and the command-line arguments, it shows the Window and starts the "
+"<application>gtkmm</application> <emphasis>event loop</emphasis>. During the "
+"event loop <application>gtkmm</application> idles, waiting for actions from "
+"the user, and responding appropriately. When the user closes the Window, "
+"<methodname>run()</methodname> will return, causing the final line of our "
+"<function>main()</function> function be to executed. The application will "
+"then finish."
 msgstr ""
 "接着我们创建了 <classname>HelloWorld</classname> 类的对象,它的构造函数没有参"
-"数,当然,它现在还不是可视的。当我们调用 Gtk::Main::run() 并给它提供一个 "
-"helloworld 窗口作为参数时,它将显示这个窗口并进入 <application>gtkmm</"
+"数,当然,它现在还不是可视的。当我们调用<methodname>Gtk::Application::run()</methodname>并给它提供一个 "
+"helloworld 窗口和命令行参数时,它将显示这个窗口并进入 <application>gtkmm</"
 "application><emphasis>消息循环</emphasis>。在消息循环中,<application>gtkmm</"
 "application> 是空闲的,它等待用户的操作并作出相应的反应。当用户关闭窗口时,"
-"run() 函数将返回,导致 main() 函数的最后一行将被执行。然后程序就结束了。"
+"<methodname>run()</methodname> 函数将返回,导致<function>main()</function>函数的最后一行将被执行。然后程序就结束了。"
 
-#: C/gtkmm-tutorial-in.xml:603(title)
-msgid "Buttons"
-msgstr "按钮"
-
-#: C/gtkmm-tutorial-in.xml:605(para)
-msgid "<application>gtkmm</application> provides four basic types of buttons:"
-msgstr "<application>gtkmm</application> 提供以下四种基本按钮控件:"
+#: C/index-in.docbook:640
+msgid ""
+"Like the simple example we showed earlier, this Hello World program does not "
+"use the command-line parameters. It's not necessary to pass them to "
+"<methodname>run()</methodname>."
+msgstr ""
+"就像我们之前显示的简单示例一样,这个 Hello World 程序不实用命令行参数。"
+"不需要将其传递给<methodname>run()</methodname>。"
 
-#: C/gtkmm-tutorial-in.xml:612(term)
-msgid "Push-Buttons"
-msgstr "按钮 (Button)"
+#: C/index-in.docbook:649
+msgid "Changes in <application>gtkmm</application> 3"
+msgstr "<application>gtkmm</application>3中的变更"
 
-#: C/gtkmm-tutorial-in.xml:614(para)
+#: C/index-in.docbook:651
 msgid ""
-"<ulink url=\"http://library.gnome.org/devel/gtkmm/unstable/";
-"classGtk_1_1Button.html\"><classname>Gtk::Button</classname></ulink>. "
-"Standard buttons, usually marked with a label or picture. Pushing one "
-"triggers an action. See the <link linkend=\"sec-pushbuttons\">Button</link> "
-"section."
+"<application>gtkmm</application>-3.0 is an old version of the "
+"<application>gtkmm</application> API that installs in parallel with the "
+"still older <application>gtkmm</application>-2.4 API and the new "
+"<application>gtkmm</application>-4.0 API. The last version of the "
+"<application>gtkmm</application>-2.4 API was <application>gtkmm</"
+"application> 2.24. <application>gtkmm</application> 3 has no major "
+"fundamental differences to <application>gtkmm</application> 2 but does make "
+"several small changes that were not possible while maintaining binary "
+"compatibility. If you never used the <application>gtkmm</application>-2.4 "
+"API then you can safely ignore this chapter."
 msgstr ""
-"<ulink url=\"http://library.gnome.org/devel/gtkmm/unstable/";
-"classGtk_1_1Button.html\"><classname>Gtk::Button</classname></ulink>。这是标"
-"准按钮,通常标有文字标签或者图片。按一下就会触发一个动作。参看 <link linkend="
-"\"sec-pushbuttons\">Button</link> 小节。"
-
-#: C/gtkmm-tutorial-in.xml:621(term)
-msgid "Toggle buttons"
-msgstr "开关按钮 (ToggleButton)"
+"<application>gtkmm</application>-3.0是<application>gtkmm</application> API的旧版本它依旧能与"
+"<application>gtkmm</application>-2.4和新的<application>gtkmm</application>-4.0 API并行安装。"
+"<application>gtkmm</application>-2.4 API的最新版本是<application>gtkmm</application> 2.24。"
+"<application>gtkmm</application>3于<application>gtkmm</application>2之间并没有重大的改变,但确实存在"
+"一些微小的变动,这些变动导致无法做到令他们保持二进制兼容。"
+"如果你从未用过<application>gtkmm</application>-2.4 API 则你可以放心的忽略本章。"
 
-#: C/gtkmm-tutorial-in.xml:623(para)
+#: C/index-in.docbook:653
 msgid ""
-"<ulink url=\"http://library.gnome.org/devel/gtkmm/unstable/";
-"classGtk_1_1ToggleButton.html\"><classname>Gtk::ToggleButton</classname></"
-"ulink>. Unlike a normal Button, which springs back up, a ToggleButton stays "
-"down until you press it again. It might be useful as an on/off switch. See "
-"the <link linkend=\"sec-toggle-buttons\">ToggleButton</link> section."
+"<application>gtkmm</application> 3's library is called "
+"<literal>libgtkmm-3.0</literal> rather than <literal>libgtkmm-2.4</literal> "
+"and installs its headers in a similarly-versioned directory, so your pkg-"
+"config check should ask for <literal>gtkmm-3.0</literal> rather than "
+"<literal>gtkmm-2.4</literal>."
 msgstr ""
-"<ulink url=\"http://library.gnome.org/devel/gtkmm/unstable/";
-"classGtk_1_1ToggleButton.html\"><classname>Gtk::ToggleButton</classname></"
-"ulink>。和一般按下后会自动弹起的按钮不一样,ToggleButton 需要你再按一次才会弹"
-"起。它作为一个开关可能比较有用。参看 <link linkend=\"sec-toggle-buttons"
-"\">ToggleButton</link> 小节。"
+"<application>gtkmm</application>3库调用<literal>libgtkmm-3.0</literal>而不是<literal>libgtkmm-2.4</literal> "
+"并将其的头文件安装于类似的目录下,所以你的pkg-config应该检索<literal>gtkmm-3.0</literal>而不是<literal>gtkmm-2.4</literal>。"
 
-#: C/gtkmm-tutorial-in.xml:631(term)
-msgid "Checkboxes"
-msgstr "复选框 (CheckButton)"
+#: C/index-in.docbook:656
+msgid "<application>gtkmm</application> 3 added some new classes:"
+msgstr "<application>gtkmm</application>3添加了一些新的类:"
 
-#: C/gtkmm-tutorial-in.xml:633(para)
+#: C/index-in.docbook:659
 msgid ""
-"<ulink url=\"http://library.gnome.org/devel/gtkmm/unstable/";
-"classGtk_1_1CheckButton.html\"><classname>Gtk::CheckButton</classname></"
-"ulink>. These act like ToggleButtons, but show their state in small squares, "
-"with their label at the side. They should be used in most situations which "
-"require an on/off setting. See the <link linkend=\"sec-checkboxes"
-"\">CheckBox</link> section."
+"<classname>Gtk::AppChooser</classname>, <classname>Gtk::AppChooserButton</"
+"classname>, <classname>Gtk::AppChooserDialog</classname> allow the user to "
+"select an installed application to open a particular type of content."
 msgstr ""
-"<ulink url=\"http://library.gnome.org/devel/gtkmm/unstable/";
-"classGtk_1_1CheckButton.html\"><classname>Gtk::CheckButton</classname></"
-"ulink>。它们用起来和 ToggleButtons 很像,只不过它们用一个小方块来显示自己的状"
-"态,而且旁边还有一个文字标签。在大多数需要布尔值设置的情况都可以使用它。参看 "
-"<link linkend=\"sec-checkboxes\">CheckBox</link> 小节。"
+"<classname>Gtk::AppChooser</classname>,<classname>Gtk::AppChooserButton</classname>"
+",<classname>Gtk::AppChooserDialog</classname>允许用户选择已安装的应用程序用以打开特定类型的内容。"
 
-#: C/gtkmm-tutorial-in.xml:643(term)
-msgid "Radio buttons"
-msgstr "单选框 (RadioButton)"
+#: C/index-in.docbook:660
+msgid ""
+"<classname>Gtk::Grid</classname> is a new container widget that will "
+"eventually replace <classname>Gtk::Box</classname> and <classname>Gtk::"
+"Table</classname>. It arranges its children according to properties of those "
+"children rather than its own layout details."
+msgstr ""
+"<classname>Gtk::Grid</classname>是一个新的容器部件他将在未来完全替换<classname>Gtk::Box</classname>和"
+"<classname>Gtk::Table</classname>。它根据它的子项的属性而不是自身的布局属性对子项进行排列。"
 
-#: C/gtkmm-tutorial-in.xml:645(para)
+#: C/index-in.docbook:661
 msgid ""
-"<ulink url=\"http://library.gnome.org/devel/gtkmm/unstable/";
-"classGtk_1_1RadioButton.html\"><classname>Gtk::RadioButton</classname></"
-"ulink>. Named after the station selectors on old car radios, these buttons "
-"are used in groups for options which are mutually exclusive. Pressing one "
-"causes all the others in its group to turn off. They are similar to "
-"CheckBoxes (a small widget with a label at the side), but usually look "
-"different. See the <link linkend=\"sec-radio-buttons\">RadioButton</link> "
-"section."
+"<classname>Gtk::Switch</classname> displays On/Off states more explictly "
+"than <classname>Gtk::CheckButton</classname>. It may be useful, for "
+"instance, when allowing users to activate hardware."
 msgstr ""
-"<ulink url=\"http://library.gnome.org/devel/gtkmm/unstable/";
-"classGtk_1_1RadioButton.html\"><classname>Gtk::RadioButton</classname></"
-"ulink>。它是根据老式汽车内的收音机的选台器来命名的,选台器是一组选择按钮并且"
-"它们是互斥的。按下其中任何一个都会使这一组中的其它按钮都弹起。它们的布局和 "
-"CheckButton (一个旁边有标签的小组件)很相似,但是通常看起来不太一样。参看 "
-"<link linkend=\"sec-radio-buttons\">RadioButton</link> 小节。"
+"与<classname>Gtk::CheckButton</classname>相比<classname>Gtk::Switch</classname>更明确的显示开/关状态。"
+"例如,在允许用户激活硬件的时候,他可能很有用。"
 
-#: C/gtkmm-tutorial-in.xml:659(para)
+#: C/index-in.docbook:664
 msgid ""
-"Note that, due to GTK+'s theming system, the appearance of these widgets "
-"will vary. In the case of checkboxes and radio buttons, they may vary "
-"considerably."
+"<application>gtkmm</application> 3 also made several small changes to the "
+"API, which you will probably encounter when porting code that used "
+"<application>gtkmm</application>-2.4. Here is a short list:"
 msgstr ""
-"请注意,由于GTK+的主题不同,这些控件外观可能会不同。特别是复选框和单选按钮可"
-"能会很不一样。"
+"<application>gtkmm</application>3还对API进行了一些小的变更,在移植<application>gtkmm</application>-2.4"
+"的代码的时候你可能会遇到这些变更。这是一个简短的清单:"
 
-#: C/gtkmm-tutorial-in.xml:666(title)
-msgid "Button"
-msgstr "Button (按钮)"
+#: C/index-in.docbook:669
+msgid ""
+"<classname>Gtk::CellLayout</classname>, used by <classname>Gtk::IconView</"
+"classname>, <classname>Gtk::TreeView::Column</classname> and <classname>Gtk::"
+"ComboBox</classname>, now has a <classname>Gtk::CellArea</classname> which "
+"can be used to specify more details of how the <classname>CellRenderer</"
+"classname>s are arranged and aligned."
+msgstr ""
+"<classname>Gtk::IconView</classname>, 
<classname>Gtk::TreeView::Column</classname>和<classname>Gtk::ComboBox</classname>"
+"使用<classname>Gtk::CellLayout</classname>,现在有<classname>Gtk::CellArea</classname>可以用于指示<classname>CellRenderer</classname>"
+"的排列与对齐方式的详情。"
 
-#: C/gtkmm-tutorial-in.xml:668(title)
-msgid "Constructors"
-msgstr "构造函数"
+#: C/index-in.docbook:671
+msgid ""
+"Gtk::ComboBox now derives from CellLayout, allowing easier layout and "
+"alignment of its <classname>Gtk::CellRenderer</classname>s."
+msgstr ""
+"Gtk::ComboBox现在从CellLayout派生,从而使更容易对<classname>Gtk::CellRenderer</classname>进行布局与对齐。"
 
-#: C/gtkmm-tutorial-in.xml:670(para)
+#: C/index-in.docbook:673
 msgid ""
-"There are two ways to create a Button. You can specify a label string in the "
-"<classname>Gtk::Button</classname> constructor, or set it later with "
-"<methodname>set_label()</methodname>."
+"<classname>Gtk::Adjustment</classname> and <classname>IconSet</classname> "
+"and <classname>Gdk::Cursor</classname> are now used via <classname>Glib::"
+"RefPtr</classname>."
 msgstr ""
-"可以通过两种方式来创建按钮,你可以在 <classname>Gtk::Button</classname> 构造"
-"函数中指定标签字符串,或者以后调用 <methodname>set_label()</methodname> 来指"
-"定标签。"
+"<classname>Gtk::Adjustment</classname>和<classname>Gtk::IconSet</classname>类和<classname>Gdk::Cursor</classname>类"
+"现在通过<classname>Glib::RefPtr</classname>使用。"
 
-#: C/gtkmm-tutorial-in.xml:676(para)
+#: C/index-in.docbook:675
 msgid ""
-"To define an accelerator key for keyboard navigation, place an underscore "
-"before one of the label's characters and specify <literal>true</literal> for "
-"the optional <literal>mnemonic</literal> parameter. For instance:"
+"<classname>Gtk::Box</classname>, <classname>Gtk::ButtonBox</classname>, "
+"<classname>Gtk::IconView</classname>, <classname>Gtk::Paned</classname>, "
+"<classname>Gtk::ProgressBar</classname>, <classname>Gtk::ScaleButton</"
+"classname>, <classname>Gtk::Scrollbar</classname> and <classname>Gtk::"
+"Separator</classname> now derive from <classname>Gtk::Orientable</"
+"classname>, allowing their orientation (vertical or horizontal) to be "
+"specified without requiring the use of a derived class such as "
+"<classname>Gtk::HBox</classname>."
 msgstr ""
-"如果你想为按钮定义一个快捷键,那么可以在标签字符串中的某个字符前面加上一个下"
-"划线,并且指定可选的参数助记符(mnemonic)为 true。例如:"
+"<classname>Gtk::Box</classname>, <classname>Gtk::ButtonBox</classname>,"
+"<classname>Gtk::IconView</classname>, <classname>Gtk::Paned</classname>, "
+"<classname>Gtk::ProgressBar</classname>, <classname>Gtk::ScaleButton</"
+"classname>, <classname>Gtk::Scrollbar</classname>和<classname>Gtk::Separator</classname>"
+"现在从<classname>Gtk::Orientable</classname>派生,允许在不使用派生类(例如<classname>Gtk::HBox</classname>)"
+"的情况指定其方向(垂直或者水平)。"
 
-#: C/gtkmm-tutorial-in.xml:678(programlisting)
-#, no-wrap
-msgid "Gtk::Button* pButton = new Gtk::Button(\"_Something\", true);"
-msgstr "Gtk::Button* pButton = new Gtk::Button(\"_Something\", true);"
+#: C/index-in.docbook:678
+msgid ""
+"<classname>Gtk::IconView</classname>, <classname>Gtk::TextView</classname>, "
+"<classname>Gtk::TreeView</classname> and other widgets derive from "
+"Scrollable instead of having their own methods such as "
+"<methodname>get_vadjustment()</methodname> and instead of having their own "
+"set_scroll_adjustments signal."
+msgstr ""
+"<classname>Gtk::IconView</classname>, <classname>Gtk::TextView</classname>, "
+"<classname>Gtk::TreeView</classname>和其他部件派生自Scrollable而不使用他们自己的方法,"
+"例如<methodname>get_vadjustment()</methodname>拥有自己的set_scroll_adjustments信号。"
 
-#: C/gtkmm-tutorial-in.xml:682(programlisting)
-#, no-wrap
-msgid "Gtk::Button* pButton = new Gtk::Button(Gtk::Stock::OK);"
-msgstr "Gtk::Button* pButton = new Gtk::Button(Gtk::Stock::OK);"
+#: C/index-in.docbook:680
+msgid ""
+"<classname>Gtk::Style</classname> and <classname>Gtk::Rc</classname> were "
+"removed, replaced by <classname>Gtk::StyleContext</classname>, and "
+"<classname>Gtk::StyleProvider</classname>s, such as <classname>Gtk::"
+"CssProvider</classname>."
+msgstr ""
+"<classname>Gtk::Style</classname>和<classname>Gtk::Rc</classname>已被删除,由"
+"<classname>Gtk::StyleContext</classname>和<classname>Gtk::StyleProvider</classname>替换,例如"
+"<classname>Gtk::CssProvider</classname>。"
 
-#: C/gtkmm-tutorial-in.xml:680(para)
+#: C/index-in.docbook:682
 msgid ""
-"Wherever possible you should use Stock items, to ensure consistency with "
-"other applications, and to improve the appearance of your applications by "
-"using icons. For instance, <placeholder-1/> This will use standard text, in "
-"all languages, with standard keyboard accelerators, with a standard icon."
+"Widget::on_expose_event() was replaced by Widget::on_draw(), which assumes "
+"that cairomm is used for drawing, via the provided <classname>Cairo::"
+"Context</classname> and does not require you to call <methodname>Cairo::"
+"Context::clip()</methodname>."
 msgstr ""
-"任何时候你都应尽可能的使用 Stock Item,这样可以使你的应用程序和其它的保持一"
-"致,并且可以通过使用图标来改善程序的外观。例如, <placeholder-1/> 这样在所有"
-"的语言中都会使用标准的文字,标准的快捷键,以及标准的图标。"
+"Widget::on_expose_event()被Widget::on_draw()取代,通过提供的<classname>Cairo::Context</classname>使用cairomm进行绘制,"
+"并且不需要你自己调用<methodname>Cairo::Context::clip()</methodname>。"
 
-#: C/gtkmm-tutorial-in.xml:686(para)
+#: C/index-in.docbook:684
 msgid ""
-"<classname>Gtk::Button</classname> is also a container so you could put any "
-"other widget, such as a <classname>Gtk::Image</classname> into it."
+"<classname>Gdk::RGBA</classname> replaces <classname>Color</classname>, "
+"adding an alpha component for opacity. <classname>Colormap</classname> was "
+"removed, along with its awkward use to allocate colors."
 msgstr ""
-"<classname>Gtk::Button</classname> 同时也是一个容器,因此你可以在其中放任何其"
-"它的组件,比如放一个 <classname>Gtk::Image</classname> 在里面。"
-
-#: C/gtkmm-tutorial-in.xml:695(title) C/gtkmm-tutorial-in.xml:807(title)
-#: C/gtkmm-tutorial-in.xml:912(title) C/gtkmm-tutorial-in.xml:1073(title)
-#: C/gtkmm-tutorial-in.xml:1125(title) C/gtkmm-tutorial-in.xml:1428(title)
-#: C/gtkmm-tutorial-in.xml:1498(title) C/gtkmm-tutorial-in.xml:1522(title)
-#: C/gtkmm-tutorial-in.xml:1597(title) C/gtkmm-tutorial-in.xml:1638(title)
-#: C/gtkmm-tutorial-in.xml:1679(title) C/gtkmm-tutorial-in.xml:1713(title)
-#: C/gtkmm-tutorial-in.xml:1753(title) C/gtkmm-tutorial-in.xml:2385(title)
-#: C/gtkmm-tutorial-in.xml:2423(title) C/gtkmm-tutorial-in.xml:2577(title)
-#: C/gtkmm-tutorial-in.xml:2632(title) C/gtkmm-tutorial-in.xml:2700(title)
-#: C/gtkmm-tutorial-in.xml:4243(title) C/gtkmm-tutorial-in.xml:4311(title)
-#: C/gtkmm-tutorial-in.xml:4338(title) C/gtkmm-tutorial-in.xml:4360(title)
-#: C/gtkmm-tutorial-in.xml:4383(title) C/gtkmm-tutorial-in.xml:4550(title)
-#: C/gtkmm-tutorial-in.xml:4673(title) C/gtkmm-tutorial-in.xml:4753(title)
-#: C/gtkmm-tutorial-in.xml:5138(title) C/gtkmm-tutorial-in.xml:5687(title)
-#: C/gtkmm-tutorial-in.xml:6640(title) C/gtkmm-tutorial-in.xml:6709(title)
-#: C/gtkmm-tutorial-in.xml:7317(title) C/gtkmm-tutorial-in.xml:7343(title)
-#: C/gtkmm-tutorial-in.xml:8097(title)
-msgid "Example"
-msgstr "示例"
+"<classname>Color</classname>被<classname>Gdk::RGBA</classname>替代,添加alpha分量以支持透明度。"
+"<classname>Colormap</classname>与其笨拙的颜色分配方式一并被删除。"
 
-#: C/gtkmm-tutorial-in.xml:697(para)
-msgid "This example creates a button with a picture and a label."
-msgstr "这个示例创建了一个有图片和文字标签的按钮。"
+#: C/index-in.docbook:686
+msgid ""
+"<classname>Gdk::Pixmap</classname> and <classname>Gdk::Bitmap</classname> "
+"were removed in favour of <classname>Gdk::Pixbuf</classname>."
+msgstr ""
+"<classname>Gdk::Pixmap</classname>和<classname>Gdk::Bitmap</classname>现在被<classname>Gdk::Pixbuf</classname>所取代。"
 
-#: C/gtkmm-tutorial-in.xml:702(title)
-msgid "buttons example"
-msgstr "按钮示例"
+#: C/index-in.docbook:688
+msgid ""
+"<classname>Gdk::Drawable</classname> was removed, with its methods moving "
+"into <classname>Gdk::Window</classname>."
+msgstr ""
+"<classname>Gdk::Drawable</classname>被删除,与其有关的方法被移动到了<classname>Gdk::Window</classname>。"
 
-#: C/gtkmm-tutorial-in.xml:714(para)
+#: C/index-in.docbook:690
 msgid ""
-"The <classname>Gtk::Button</classname> widget has the following signals, but "
-"most of the time you will just handle the <literal>clicked</literal> signal:"
+"We now use std::vector in several methods instead of the intermediate "
+"*Handle types to make the API clearer."
 msgstr ""
-"<classname>Gtk::Button</classname> 组件有下面列出的那些信号,不过大多数情况"
-"下,你只需要处理 <literal>clicked</literal> 信号:"
+"我们现在使用std::vector而不是使用中间类型(*Handle)以使API更加的清晰。"
 
-#: C/gtkmm-tutorial-in.xml:722(literal)
-msgid "pressed"
-msgstr "pressed (按下)"
+#: C/index-in.docbook:695
+msgid ""
+"All deprecated API was removed in <application>gtkmm</application> 3.0, "
+"though there have been new deprecations in later <application>gtkmm</"
+"application> 3.x versions."
+msgstr ""
+"在<application>gtkmm</application> 3.0中我们删除了所有弃用的API,尽管在<application>gtkmm</application> 3.x版本中出现了新的被弃用的AP。I"
 
-#: C/gtkmm-tutorial-in.xml:724(para)
-msgid "Emitted when the button is pressed."
-msgstr "当按钮按下时发出。"
+#: C/index-in.docbook:697
+msgid ""
+"As a first step to porting your source code to <application>gtkmm</"
+"application>-3.0 you should probably ensure that your application builds "
+"with the deprecated <application>gtkmm</application>-2.4 API disabled, by "
+"defining macro such as GTKMM_DISABLE_DEPRECATED. There are some autotools "
+"macros that can help with this by defining them optionally at build time. "
+"See the <ulink url=\"https://wiki.gnome.org/Projects/gtkmm/";
+"PortingToGtkmm3\">gtkmm 3 porting wiki page</ulink> for more details."
+msgstr ""
+"将源代码迁移到<application>gtkmm</application>-3.0的第一步,你应该通过定义"
+"GTKMM_DISABLE_DEPRECATED宏以检查你是否使用了在<application>gtkmm</application>-2.4中被弃用"
+"的API,然后删除他们。有一些autotools宏可以在编译时帮助你通过构建。"
+"访问<ulink url=\"https://wiki.gnome.org/Projects/gtkmm/PortingToGtkmm3\";>gtkmm3移植Wiki</ulink>了解更多详情。"
 
-#: C/gtkmm-tutorial-in.xml:730(literal)
-msgid "released"
-msgstr "released (释放)"
+#: C/index-in.docbook:702
+msgid ""
+"Changes in <application>gtkmm</application>-4.0 and "
+"<application>glibmm-2.68</application>"
+msgstr ""
+"<application>gtkmm</application>-4.0和<application>glibmm-2.68</application>中的变更。"
 
-#: C/gtkmm-tutorial-in.xml:732(para)
-msgid "Emitted when the button is released."
-msgstr "当按钮释放后发出。"
+#: C/index-in.docbook:704
+msgid ""
+"<application>gtkmm</application>-4.0 is a new version of the "
+"<application>gtkmm</application> API that installs in parallel with the "
+"older <application>gtkmm</application>-2.4 and <application>gtkmm</"
+"application>-3.0 APIs. The last version of the <application>gtkmm</"
+"application>-3.0 API is <application>gtkmm</application> 3.24. "
+"<application>gtkmm</application> 4 has no major fundamental differences to "
+"<application>gtkmm</application> 3 but does make several changes (both small "
+"and large ones) that were not possible while maintaining binary "
+"compatibility. If you never used the <application>gtkmm</application>-3.0 "
+"API then you can safely ignore this chapter."
+msgstr ""
+"<application>gtkmm</application>-4.0是<application>gtkmm</application> API的新版本。它可以与"
+"较早发行的<application>gtkmm</application>-2.4和<application>gtkmm</application>-3.0并行安装。"
+"<application>gtkmm</application>-3.0 API的最新版本是<application>gtkmm</application> 3.24。"
+"<application>gtkmm</application> 4与<application>gtkmm</application> 3没有根本性的区别,"
+"虽然有些变更但是保持了二进制兼容。如果你从未使用过<application>gtkmm</application>-3.0 API则你"
+"可以放心的忽略本章。"
 
-#: C/gtkmm-tutorial-in.xml:738(literal)
-msgid "clicked"
-msgstr "clicked (点击)"
+#: C/index-in.docbook:712
+msgid ""
+"<application>gtkmm</application> 4's library is called "
+"<literal>libgtkmm-4.0</literal> rather than <literal>libgtkmm-3.0</literal> "
+"and installs its headers in a similarly-versioned directory, so your "
+"<application>pkg-config</application> check should ask for "
+"<literal>gtkmm-4.0</literal> rather than <literal>gtkmm-3.0</literal>."
+msgstr ""
+"<application>gtkmm</application> 4库调用<literal>libgtkmm-4.0</literal>而不是<literal>libgtkmm-3.0</literal>,"
+"并将其的头文件安装于类似的目录下,所以你的<application>pkg-config</application>应该检索<literal>gtkmm-4.0</literal>"
+"而不是<literal>gtkmm-3.0</literal>。"
 
-#: C/gtkmm-tutorial-in.xml:740(para)
-msgid "Emitted when the button is pressed and released."
-msgstr "当按钮按下并抬起时发出。"
+#: C/index-in.docbook:718
+msgid ""
+"<application>gtkmm</application>-4.0 is used in combination with "
+"<application>glibmm-2.68</application>, which sets the global locale for "
+"your program. The older <application>glibmm-2.4</application> does not do "
+"that, and <application>gtkmm</application>-3.0 does it only to some extent. "
+"What this means is briefly that if your <application>gtkmm</application>-3.0 "
+"program contains a call to <function>std::locale::global(std::locale(\"\"))</"
+"function>, you can probably remove it. If you don't want "
+"<application>glibmm</application> or <application>gtkmm</application> to set "
+"the global locale for you, you should add a call to <function>Glib::"
+"set_init_to_users_preferred_locale(false)</function> before any call to "
+"<function>Glib::init()</function> or <methodname>Gtk::Application::create()</"
+"methodname>."
+msgstr ""
+"<application>gtkmm</application>-4.0与<application>glibmm-2.68</application>结合使用,将设置"
+"程序的全局语言环境。较旧的<application>glibmm-2.4</application>不会这样做,而<application>gtkmm</application>-3.0"
+"只在一定程度上做到了。简而言之,如果你的<application>gtkmm</application>-3.0应用包涵了对<function>std::locale::global(std::locale(\"\"))</function>"
+"的调用,则你大概可以将其删除。如果你不希望<application>glibmm</application>或者<application>gtkmm</application>为你"
+"设置程序的全局语言环境,则应该在调用任何<function>Glib::init()</function>函数或<methodname>Gtk::Application::create()</methodname>方法之前"
+"添加对<function>Glib::set_init_to_users_preferred_locale(false)</function>的调用。"
 
-#: C/gtkmm-tutorial-in.xml:746(literal)
-msgid "enter"
-msgstr "enter (进入)"
+#: C/index-in.docbook:728
+msgid ""
+"<ulink url=\"http://developer.gnome.org/glibmm/unstable/namespaceGlib.html";
+"\">Reference</ulink>"
+msgstr ""
+"<ulink url=\"http://developer.gnome.org/glibmm/unstable/namespaceGlib.html\";>参考</ulink>"
 
-#: C/gtkmm-tutorial-in.xml:748(para)
-msgid "Emitted when the mouse pointer moves over the button's window."
-msgstr "当鼠标指针移到按钮上时发出。"
+#: C/index-in.docbook:730
+msgid ""
+"There are lots and lots of differences between <application>gtkmm</"
+"application>-3.0 and <application>gtkmm</application>-4.0. The following "
+"lists are not complete."
+msgstr ""
+"<application>gtkmm</application>-3.0和<application>gtkmm</application>-4.0之间有很多不同之处。"
+"以下是不完整的列表。"
 
-#: C/gtkmm-tutorial-in.xml:754(literal)
-msgid "leave"
-msgstr "leave (离开)"
+#: C/index-in.docbook:733
+msgid ""
+"Some new classes were added in <application>gtkmm</application> 4 and "
+"<application>glibmm</application> 2.68:"
+msgstr ""
+"在<application>gtkmm</application> 4和<application>glibmm</application> 2.68中添加了一些新的类:"
 
-#: C/gtkmm-tutorial-in.xml:756(para)
-msgid "Emitted when the mouse pointer leaves the button's window."
-msgstr "当鼠标指针离开按钮时发出。"
+#: C/index-in.docbook:736
+msgid ""
+"<classname>Glib::ExtraClassInit</classname> and <classname>Gtk::Snapshot</"
+"classname>: These classes are needed only for writing custom widgets. See "
+"the <link linkend=\"sec-custom-widgets\">Custom Widgets</link> section."
+msgstr ""
+"<classname>Glib::ExtraClassInit</classname>和<classname>Gtk::Snapshot</classname>:这些类"
+"只用于编写自定义的窗口小部件。参见<link linkend=\"sec-custom-widgets\">自定义部件</link>小节。"
 
-#: C/gtkmm-tutorial-in.xml:768(title)
-msgid "ToggleButton"
-msgstr "ToggleButton (开关按钮)"
+#: C/index-in.docbook:739
+msgid ""
+"<classname>Gtk::EventControllerKey</classname>, <classname>Gtk::"
+"EventControllerMotion</classname>, <classname>Gtk::EventControllerScroll</"
+"classname> and <classname>Gtk::GestureStylus</classname>"
+msgstr ""
+"<classname>Gtk::EventControllerKey</classname>, <classname>Gtk::"
+"EventControllerMotion</classname>, <classname>Gtk::EventControllerScroll</"
+"classname>和<classname>Gtk::GestureStylus</classname>"
 
-#: C/gtkmm-tutorial-in.xml:770(para)
+#: C/index-in.docbook:742
 msgid ""
-"<classname>ToggleButton</classname>s are like normal <classname>Button</"
-"classname>s, but when clicked they remain activated, or pressed, until "
-"clicked again."
+"<classname>Gdk::Paintable</classname>, <classname>Gdk::Texture</classname>, "
+"<classname>Gtk::Picture</classname> and <classname>Gtk::WidgetPaintable</"
+"classname>"
 msgstr ""
-"<classname>ToggleButton</classname> 和普通的 <classname>Button</classname> 相"
-"似,但是它们在点击后会保持激活(或称为按下的)状态,直到再次点击它为止。"
+"<classname>Gdk::Paintable</classname>, <classname>Gdk::Texture</classname>, "
+"<classname>Gtk::Picture</classname>和<classname>Gtk::WidgetPaintable</"
+"classname>"
 
-#: C/gtkmm-tutorial-in.xml:772(para)
+#: C/index-in.docbook:745
 msgid ""
-"To retrieve the state of the <classname>ToggleButton</classname>, you can "
-"use the <methodname>get_active()</methodname> method. This returns "
-"<literal>true</literal> if the button is \"down\". You can also set the "
-"toggle button's state, with <methodname>set_active()</methodname>. Note "
-"that, if you do this, and the state actually changes, it causes the \"clicked"
-"\" signal to be emitted. This is usually what you want."
+"<classname>Gdk::Window</classname> has been renamed to <classname>Gdk::"
+"Surface</classname>. (<classname>Gtk::Window</classname> keeps its name.)"
 msgstr ""
-"要得到 <classname>ToggleButton</classname> 的状态,你可以使用 "
-"<methodname>get_active()</methodname> 方法。如果按钮被按下了,就返回 true。当"
-"然,你也可以通过 <methodname>set_active()</methodname> 来设置开关按钮的状态。"
-"请注意,如果你这样做了,并且它的状态的确改变了,那么这将会引发“clicked”信号。"
-"当然,一般来说,这就是你希望看到的结果。"
+"<classname>Gdk::Window</classname>被重命名为<classname>Gdk::Surface</classname>(<classname>Gtk::Window</classname>名称保持不变)。"
 
-#: C/gtkmm-tutorial-in.xml:779(para)
+#: C/index-in.docbook:747
 msgid ""
-"You can use the <methodname>toggled()</methodname> method to toggle the "
-"button, rather than forcing it to be up or down: This switches the button's "
-"state, and causes the <literal>toggled</literal> signal to be emitted."
+"<classname>Gdk::DrawContext</classname> and <classname>Gdk::CairoContext</"
+"classname> are new. <classname>Gdk::DrawingContext</classname> has been "
+"removed."
 msgstr ""
-"你可以使用 <methodname>toggled()</methodname> 方法来改变按钮的状态,而不要强"
-"行的是设置它是开还是关:这个方法将会改变按钮的状态,并会引发 "
-"<literal>toggled</literal> 信号。"
+"新添加了<classname>Gdk::DrawContext</classname>和<classname>Gdk::CairoContext</classname>。"
+"<classname>Gdk::DrawingContext</classname>已被删除。"
 
-#: C/gtkmm-tutorial-in.xml:784(para)
+#: C/index-in.docbook:749
 msgid ""
-"<classname>Gtk::ToggleButton</classname> is most useful as a base class for "
-"the <classname>Gtk::CheckButton</classname> and <classname>Gtk::RadioButton</"
-"classname> classes."
+"<classname>Gtk::Clipboard</classname> has been replaced by the new "
+"<classname>Gdk::Clipboard</classname>."
 msgstr ""
-"<classname>Gtk::ToggleButton</classname> 类最有用的是作为 <classname>Gtk::"
-"CheckButton</classname> 类和 <classname>Gtk::RadioButton</classname> 类的基"
-"类。"
+"<classname>Gtk::Clipboard</classname>被新的<classname>Gdk::Clipboard</classname>替换。"
 
-#: C/gtkmm-tutorial-in.xml:795(title) C/gtkmm-tutorial-in.xml:810(title)
-msgid "CheckButton"
-msgstr "CheckButton (多选按钮)"
+#: C/index-in.docbook:751
+msgid ""
+"<classname>Gdk::DragContext</classname> has been split into <classname>Gdk::"
+"Drag</classname> and <classname>Gdk::Drop</classname>."
+msgstr ""
+"<classname>Gdk::DragContext</classname>现在被拆分为<classname>Gdk::Drag</classname>和<classname>Gdk::Drop</classname>。"
 
-#: C/gtkmm-tutorial-in.xml:797(para)
+#: C/index-in.docbook:755
 msgid ""
-"<classname>Gtk::CheckButton</classname> inherits from <classname>Gtk::"
-"ToggleButton</classname>. The only real difference between the two is "
-"<classname>Gtk::CheckButton</classname>'s appearance. You can check, set, "
-"and toggle a checkbox using the same member methods as for <classname>Gtk::"
-"ToggleButton</classname>."
+"There have also been several changes to the API, which you will probably "
+"encounter when porting code that used <application>gtkmm</application>-3.0 "
+"and <application>glibmm</application>-2.4. Here is a short list:"
 msgstr ""
-"<classname>Gtk::CheckButton</classname> 继承自 <classname>Gtk::ToggleButton</"
-"classname>。二者实际上只是外观不同而已。因此你可以像 <classname>Gtk::"
-"ToggleButton</classname> 一样使用同样的方法来检查、设置和转换多选按钮的状态。"
+"API也进行了一些更改,在移植<application>gtkmm</application>-3.0和<application>glibmm</application>-2.4代码"
+"时你可能会遇到这些更改。以下是一个简短的变更列表:"
 
-#: C/gtkmm-tutorial-in.xml:822(title) C/gtkmm-tutorial-in.xml:919(title)
-msgid "RadioButton"
-msgstr "RadioButton (单选按钮)"
+#: C/index-in.docbook:760
+msgid "A C++17 compiler is required."
+msgstr "需要支持C++17的编译器"
 
-#: C/gtkmm-tutorial-in.xml:824(para)
+#: C/index-in.docbook:761
 msgid ""
-"Like checkboxes, radio buttons also inherit from <classname>Gtk::"
-"ToggleButton</classname>, but these work in groups, and only one RadioButton "
-"in a group can be selected at any one time."
+"<classname>Gtk::Button</classname>, <classname>Gtk::ToolButton</classname>, "
+"<classname>Gtk::MenuItem</classname> and <classname>Gtk::Switch</classname> "
+"implement the <classname>Gtk::Actionable</classname> interface instead of "
+"the removed <classname>Gtk::Activatable</classname> interface."
 msgstr ""
-"和 <classname>Gtk::CheckButton</classname> 一样,<classname>Gtk::"
-"RadioButton</classname> 也继承自 <classname>Gtk::ToggleButton</classname>,只"
-"是它们是按组工作的,并且一个组内一次只能选中一个 RadioButton。"
+"<classname>Gtk::Button</classname>,<classname>Gtk::ToolButton</classname>,"
+"<classname>Gtk::MenuItem</classname>和<classname>Gtk::Switch</classname> "
+"实现了<classname>Gtk::Actionable</classname>接口而不是已被删除的<classname>Gtk::Activatable</classname>接口。"
 
-#: C/gtkmm-tutorial-in.xml:830(title)
-msgid "Groups"
-msgstr "组"
+#: C/index-in.docbook:765
+msgid ""
+"<classname>Gtk::FontButton</classname> implements the <classname>Gtk::"
+"FontChooser</classname> interface."
+msgstr ""
+"<classname>Gtk::FontButton</classname>实现了<classname>Gtk::FontChooser</classname>接口。"
 
-#: C/gtkmm-tutorial-in.xml:831(para)
+#: C/index-in.docbook:766
 msgid ""
-"There are two ways to set up a group of radio buttons. The first way is to "
-"create the buttons, and set up their groups afterwards. Only the first two "
-"constructors are used. In the following example, we make a new window class "
-"called <classname>RadioButtons</classname>, and then put three radio buttons "
-"in it:"
+"<classname>Gtk::Widget</classname>: The <methodname>get_preferred_*_vfunc()</"
+"methodname>s have been replaced by <methodname>measure_vfunc()</methodname>. "
+"This change only affects custom widgets."
 msgstr ""
-"有两种方式创建一个单选按钮的组。第一种方式是先创建按钮,然后再设置它们的组。"
-"这种方式只用到了前两个构造函数。在下面的示例中,我们创建了一个新的窗口类 "
-"<classname>RadioButtons</classname>,然后在其中放置3个单选按钮:"
+"<classname>Gtk::Widget</classname>:<methodname>get_preferred_*_vfunc()</methodname>方法"
+"已被<methodname>measure_vfunc()</methodname>方法替代。此变更只影响自定义部件。"
 
-#: C/gtkmm-tutorial-in.xml:839(programlisting)
-#, no-wrap
+#: C/index-in.docbook:769
 msgid ""
-"class RadioButtons : public Gtk::Window\n"
-"{\n"
-"public:\n"
-"    RadioButtons();\n"
-"\n"
-"protected:\n"
-"    Gtk::RadioButton m_rb1, m_rb2, m_rb3;\n"
-"};\n"
-"\n"
-"RadioButtons::RadioButtons()\n"
-"  : m_rb1(\"button1\"),\n"
-"    m_rb2(\"button2\"),\n"
-"    m_rb3(\"button3\")\n"
-"{\n"
-"    Gtk::RadioButton::Group group = m_rb1.get_group();\n"
-"    m_rb2.set_group(group);\n"
-"    m_rb3.set_group(group);\n"
-"}"
+"<classname>sigc::slot</classname>s use the <classname>sigc::slot&lt;"
+"R(Args...)&gt;</classname> syntax. Example: <classname>sigc::slot&lt;"
+"void(int, int)&gt;</classname> instead of <classname>sigc::slot&lt;void, "
+"int, int&gt;</classname>."
 msgstr ""
-"class RadioButtons : public Gtk::Window\n"
-"{\n"
-"public:\n"
-"    RadioButtons();\n"
-"\n"
-"protected:\n"
-"    Gtk::RadioButton m_rb1, m_rb2, m_rb3;\n"
-"};\n"
-"\n"
-"RadioButtons::RadioButtons()\n"
-"  : m_rb1(\"button1\"),\n"
-"    m_rb2(\"button2\"),\n"
-"    m_rb3(\"button3\")\n"
-"{\n"
-"    Gtk::RadioButton::Group group = m_rb1.get_group();\n"
-"    m_rb2.set_group(group);\n"
-"    m_rb3.set_group(group);\n"
-"}"
+"<classname>sigc::slot</classname>使用<classname>sigc::slot&lt;"
+"R(Args...)&gt;</classname>语法。 例如: <classname>sigc::slot&lt;"
+"void(int, int)&gt;</classname>而不是使用<classname>sigc::slot&lt;void, "
+"int, int&gt;</classname>。"
 
-#: C/gtkmm-tutorial-in.xml:857(para)
+#: C/index-in.docbook:771
 msgid ""
-"We told <application>gtkmm</application> to put all three "
-"<classname>RadioButton</classname>s in the same group by obtaining the group "
-"with <methodname>get_group()</methodname> and using <methodname>set_group()</"
-"methodname> to tell the other <classname>RadioButton</classname>s to share "
-"that group."
+"<classname>Gtk::DrawingArea</classname> uses a draw function instead of the "
+"draw signal."
+msgstr ""
+"<classname>Gtk::DrawingArea</classname>使用绘制函数替代绘制信号。"
+
+#: C/index-in.docbook:772
+msgid ""
+"<classname>Glib::ArrayHandle</classname>, <classname>Glib::"
+"StringArrayHandle</classname>, <classname>Glib::ListHandle</classname> and "
+"<classname>Glib::SListHandle</classname> have been removed. They were used "
+"in <application>glibmm</application>-2.4, but not used in "
+"<application>gtkmm</application>-3.0. If you've ever used these classes, "
+"replace them with a standard C++ container, such as <classname>std::vector</"
+"classname>."
+msgstr ""
+"<classname>Glib::ArrayHandle</classname>, <classname>Glib::"
+"StringArrayHandle</classname>, <classname>Glib::ListHandle</classname>和"
+"<classname>Glib::SListHandle</classname>已被删除。他们曾在<application>glibmm</application>-2.4中"
+"被使用,而<application>gtkmm</application>-3.0并未使用他们。如果你曾经使用过他们,则将他们替换为"
+"标准C++容器,例如<classname>std::vector</classname>。"
+
+#: C/index-in.docbook:776
+msgid "<classname>Gtk::Container</classname> has been removed."
+msgstr "<classname>Gtk::Container</classname>已被删除。"
+
+#: C/index-in.docbook:777
+msgid ""
+"<methodname>Gtk::Widget::show_all()</methodname> has been removed. The "
+"default value of <methodname>Gtk::Widget::property_visible()</methodname>has "
+"been changed from <literal>false</literal> to <literal>true</literal>."
+msgstr ""
+"<methodname>Gtk::Widget::show_all()</methodname>已被删除。"
+"<methodname>Gtk::Widget::property_visible()</methodname>的默认值从<literal>false</literal>改为<literal>true</literal>。"
+
+#: C/index-in.docbook:780
+msgid ""
+"All event signals have been removed from <classname>Gtk::Widget</classname>. "
+"In most cases you can use one of the subclasses of <classname>Gtk::"
+"EventController</classname> as a replacement. For instance, use "
+"<classname>Gtk::GestureMultiPress</classname> instead of "
+"<methodname>signal_button_press_event()</methodname> and "
+"<methodname>signal_button_release_event()</methodname>, and <classname>Gtk::"
+"EventControllerKey</classname> instead of "
+"<methodname>signal_key_press_event()</methodname> and "
+"<methodname>signal_key_release_event()</methodname>."
+msgstr ""
+"<classname>Gtk::Widget</classname>上的所有事件信号均已被删除。 "
+"大多数时候你可以使用<classname>Gtk::EventController</classname>的子类之一进行替换。"
+"例如, 使用<classname>Gtk::GestureMultiPress</classname>替代<methodname>signal_button_press_event()</methodname>以及"
+"<methodname>signal_button_release_event()</methodname>,使用<classname>Gtk::EventControllerKey</classname>替代"
+"<methodname>signal_key_press_event()</methodname>和<methodname>signal_key_release_event()</methodname>。"
+
+#: C/index-in.docbook:787
+msgid ""
+"<classname>Glib::RefPtr</classname> is an alias for <classname>std::"
+"shared_ptr</classname>. If you make your own <classname>Glib::ObjectBase</"
+"classname>-derived classes with <methodname>create()</methodname> methods "
+"that return a <classname>Glib::RefPtr</classname>, you must use "
+"<methodname>Glib::make_refptr_for_instance()</methodname> in your "
+"<methodname>create()</methodname> methods."
+msgstr ""
+"<classname>Glib::RefPtr</classname>是<classname>std::shared_ptr</classname>的别名。"
+"如果你使用返回<classname>Glib::RefPtr</classname>的<methodname>create()</methodname>方法用以创建"
+"派生自<classname>Glib::ObjectBase</classname>的类,则你必须在你的<methodname>create()</methodname>方法"
+"中调用<methodname>Glib::make_refptr_for_instance()</methodname>。"
+
+#: C/index-in.docbook:792
+msgid ""
+"<methodname>Gtk::Box::pack_start()</methodname> and <methodname>Gtk::Box::"
+"pack_end()</methodname> have been removed. Use the new <classname>Gtk::Box</"
+"classname> methods <methodname>append()</methodname>, <methodname>prepend()</"
+"methodname>, <methodname>insert_child_after()</methodname> and "
+"<methodname>insert_child_at_start()</methodname>."
+msgstr ""
+"<methodname>Gtk::Box::pack_start()</methodname>和<methodname>Gtk::Box::pack_end()</methodname>已被删除。"
+"现在<classname>Gtk::Box</classname>使用新的<methodname>append()</methodname>,<methodname>prepend()</methodname>,"
+"<methodname>insert_child_after()</methodname>和<methodname>insert_child_at_start()</methodname>方法。"
+
+#: C/index-in.docbook:797
+msgid "<classname>Gtk::ButtonBox</classname> has been removed."
+msgstr "<classname>Gtk::ButtonBox</classname>已被删除"
+
+#: C/index-in.docbook:798
+msgid ""
+"<classname>Gtk::RadioButton</classname> and <classname>Gtk::"
+"RadioButtonGroup</classname> have been removed. Use <classname>Gtk::"
+"CheckButton</classname> or <classname>Gtk::ToggleButton</classname> with "
+"<methodname>set_group()</methodname>."
+msgstr ""
+"<classname>Gtk::RadioButton</classname>和<classname>Gtk::RadioButtonGroup</classname>已被删除。"
+"改为使用<classname>Gtk::CheckButton</classname>或者是<classname>Gtk::ToggleButton</classname>的<methodname>set_group()</methodname>。"
+
+#: C/index-in.docbook:804
+msgid ""
+"All deprecated API was removed in <application>gtkmm</application> 4.0 and "
+"<application>glibmm</application> 2.68, though there will be new "
+"deprecations in future versions."
+msgstr ""
+"<application>gtkmm</application>和<application>glibmm</application> 2.68移除了所有"
+"之前标记为弃用的API,未来还会有新的API被标记为弃用。"
+
+#: C/index-in.docbook:807
+msgid ""
+"As a first step to porting your source code to <application>gtkmm</"
+"application>-4.0 you should probably ensure that your application builds "
+"with the deprecated <application>gtkmm</application>-3.0 and "
+"<application>glibmm-2.4</application> API disabled, by defining the macros "
+"GTKMM_DISABLE_DEPRECATED, GDKMM_DISABLE_DEPRECATED, "
+"GLIBMM_DISABLE_DEPRECATED and GIOMM_DISABLE_DEPRECATED. There are some "
+"autotools macros that can help with this by defining them optionally at "
+"build time. See the <ulink url=\"https://wiki.gnome.org/Projects/gtkmm/";
+"PortingToGtkmm3\">Porting from gtkmm-2.4 to gtkmm-3.0</ulink> wiki page for "
+"more details."
+msgstr ""
+"将源代码移植到<application>gtkmm</application>-4.0的第一步,通过定义GTKMM_DISABLE_DEPRECATED,"
+"GDKMM_DISABLE_DEPRECATED,GLIBMM_DISABLE_DEPRECATED和GIOMM_DISABLE_DEPRECATED宏禁用所有在"
+"<application>gtkmm</application>-3.0和<application>glibmm-2.4</application>中弃用的API,"
+"有一些autotools宏可以帮助你在编译时定义他们。更多有关详情请参见"
+"<ulink url=\"https://wiki.gnome.org/Projects/gtkmm/PortingToGtkmm3\";>从gtkmm-2.4迁移到gtkmm-3.0</ulink>Wiki页面。"
+
+#: C/index-in.docbook:815
+msgid ""
+"See also <ulink url=\"https://developer.gnome.org/gtk4/unstable/gtk-";
+"migrating-3-to-4.html\"> Migrating from GTK 3.x to GTK 4</ulink>."
+msgstr ""
+"另请参见<ulink url=\"https://developer.gnome.org/gtk4/unstable/gtk-migrating-3-to-4.html\";>从GTK3.X迁移到GTK 
4</ulink>。"
+
+#: C/index-in.docbook:821
+msgid "Buttons"
+msgstr "按钮"
+
+#: C/index-in.docbook:823
+msgid "<application>gtkmm</application> provides four basic types of buttons:"
+msgstr "<application>gtkmm</application> 提供以下四种基本按钮控件:"
+
+#: C/index-in.docbook:830
+msgid "Push buttons"
+msgstr "按钮类"
+
+#: C/index-in.docbook:832
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1Button.";
+"html\"><classname>Gtk::Button</classname></ulink>. Standard buttons, usually "
+"marked with a label or picture. Pushing one triggers an action. See the "
+"<link linkend=\"sec-pushbuttons\">Button</link> section."
+msgstr ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/";
+"classGtk_1_1Button.html\"><classname>Gtk::Button</classname></ulink>。这是标"
+"准按钮,通常标有文字标签或者图片。按一下就会触发一个动作。参看 <link linkend="
+"\"sec-pushbuttons\">Button</link> 小节。"
+
+#: C/index-in.docbook:839
+msgid "Toggle buttons"
+msgstr "开关按钮 (ToggleButton)"
+
+#: C/index-in.docbook:841
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/";
+"classGtk_1_1ToggleButton.html\"><classname>Gtk::ToggleButton</classname></"
+"ulink>. Unlike a normal Button, which springs back up, a ToggleButton stays "
+"down until you press it again. It might be useful as an on/off switch. See "
+"the <link linkend=\"sec-toggle-buttons\">ToggleButton</link> section."
+msgstr ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/";
+"classGtk_1_1ToggleButton.html\"><classname>Gtk::ToggleButton</classname></"
+"ulink>。和一般按下后会自动弹起的按钮不一样,ToggleButton 需要你再按一次才会弹"
+"起。它作为一个开关可能比较有用。参看 <link linkend=\"sec-toggle-buttons"
+"\">ToggleButton</link> 小节。"
+
+#: C/index-in.docbook:849
+msgid "Check buttons"
+msgstr "复选按钮(CheckButtons)"
+
+#: C/index-in.docbook:851
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/";
+"classGtk_1_1CheckButton.html\"><classname>Gtk::CheckButton</classname></"
+"ulink>. These act like ToggleButtons, but show their state in small squares, "
+"with their label at the side. They should be used in most situations which "
+"require an on/off setting. See the <link linkend=\"sec-checkbuttons"
+"\">CheckButton</link> section."
+msgstr ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/";
+"classGtk_1_1CheckButton.html\"><classname>Gtk::CheckButton</classname></"
+"ulink>。它们用起来和 ToggleButtons 很像,只不过它们用一个小方块来显示自己的状"
+"态,而且旁边还有一个文字标签。在大多数需要布尔值设置的情况都可以使用它。参看 "
+"<link linkend=\"sec-checkbuttons\">CheckButton</link> 小节。"
+
+#: C/index-in.docbook:861
+msgid "Radio buttons"
+msgstr "单选按钮 (RadioButton)"
+
+#: C/index-in.docbook:863
+msgid ""
+"Named after the station selectors on old car radios, these buttons are used "
+"in groups for options which are mutually exclusive. Pressing one causes all "
+"the others in its group to turn off. They are similar to ToggleButtons or "
+"CheckButtons (a small widget with a label at the side), but usually look "
+"different. There is no separate radio button class. Check buttons and toggle "
+"buttons can act as radio buttons. See the <link linkend=\"sec-radio-buttons"
+"\">Radio Button</link> section."
+msgstr ""
+"它是根据老式汽车内的收音机的选台器来命名的,选台器是一组选择按钮并且"
+"它们是互斥的。按下其中任何一个都会使这一组中的其它按钮都弹起。它们的布局和 "
+"CheckButton (一个旁边有标签的小部件)很相似,但是通常看起来不太一样。没有单独的"
+"单选按钮类。复选按钮和开关按钮可以充当单选按钮。参见<link linkend=\"sec-radio-buttons\">RadioButton</link> 小节。"
+
+#: C/index-in.docbook:877
+msgid ""
+"Note that, due to GTK's theming system, the appearance of these widgets will "
+"vary. In the case of check buttons and radio buttons, they may vary "
+"considerably."
+msgstr ""
+"请注意,由于GTK的主题不同,这些控件外观可能会不同。特别是复选按钮和单选按钮可"
+"能会很不一样。"
+
+#: C/index-in.docbook:884
+msgid "Button"
+msgstr "Button (按钮)"
+
+#: C/index-in.docbook:886
+msgid ""
+"There are two ways to create a Button. You can specify a label string in the "
+"<classname>Gtk::Button</classname> constructor, or set it later with "
+"<methodname>set_label()</methodname>."
+msgstr ""
+"可以通过两种方式来创建按钮,你可以在 <classname>Gtk::Button</classname> 构造"
+"函数中指定标签字符串,或者以后调用 <methodname>set_label()</methodname> 来指"
+"定标签。"
+
+#: C/index-in.docbook:892
+msgid ""
+"To define an accelerator key for keyboard navigation, place an underscore "
+"before one of the label's characters and specify <literal>true</literal> for "
+"the optional <literal>mnemonic</literal> parameter. For instance:"
 msgstr ""
-"我们告诉 <application>gtkmm</application> 把三个 <classname>RadioButton</"
-"classname> 都放到一个组内,通过 <methodname>get_group()</methodname> 来得到这"
-"个组,然后使用 <methodname>set_group()</methodname> 告诉其它的 "
-"<classname>RadioButton</classname> 来共享这个组。"
+"如果你想为按钮定义一个快捷键,那么可以在标签字符串中的某个字符前面加上一个下"
+"划线,并且指定可选的参数助记符(mnemonic)为 true。例如:"
 
-#: C/gtkmm-tutorial-in.xml:866(programlisting)
+#: C/index-in.docbook:894
 #, no-wrap
-msgid "m_rb2.set_group(m_rb1.get_group()); //doesn't work"
-msgstr "m_rb2.set_group(m_rb1.get_group()); //无法工作"
+msgid "Gtk::Button* pButton = new Gtk::Button(\"_Something\", true);"
+msgstr "Gtk::Button* pButton = new Gtk::Button(\"_Something\", true);"
+
+#: C/index-in.docbook:896
+msgid ""
+"<classname>Gtk::Button</classname> is also a container so you could put any "
+"other widget, such as a <classname>Gtk::Image</classname> into it."
+msgstr ""
+"<classname>Gtk::Button</classname> 同时也是一个容器,因此你可以在其中放任何其"
+"它的部件,比如放一个 <classname>Gtk::Image</classname> 在里面。"
+
+#: C/index-in.docbook:902
+msgid ""
+"The <classname>Gtk::Button</classname> widget has the <literal>clicked</"
+"literal> signal which is emitted when the button is pressed and released."
+msgstr ""
+"<classname>Gtk::Button</classname>部件具有<literal>clicked</literal>信号,"
+"当按下或释放按钮时将会发出该信号。"
+
+#: C/index-in.docbook:907
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1Button.";
+"html\">Reference</ulink>"
+msgstr ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1Button.html\";>参考</ulink>"
+
+#: C/index-in.docbook:909 C/index-in.docbook:962 C/index-in.docbook:1019
+#: C/index-in.docbook:1137 C/index-in.docbook:1194 C/index-in.docbook:1502
+#: C/index-in.docbook:1567 C/index-in.docbook:1591 C/index-in.docbook:1621
+#: C/index-in.docbook:1676 C/index-in.docbook:1716 C/index-in.docbook:1757
+#: C/index-in.docbook:1791 C/index-in.docbook:2077 C/index-in.docbook:2107
+#: C/index-in.docbook:2161 C/index-in.docbook:2201 C/index-in.docbook:3874
+#: C/index-in.docbook:3901 C/index-in.docbook:3924 C/index-in.docbook:3948
+#: C/index-in.docbook:3980 C/index-in.docbook:4158 C/index-in.docbook:4304
+#: C/index-in.docbook:4379 C/index-in.docbook:4451 C/index-in.docbook:4516
+#: C/index-in.docbook:4753 C/index-in.docbook:5257 C/index-in.docbook:5563
+#: C/index-in.docbook:5612 C/index-in.docbook:6191 C/index-in.docbook:6311
+#: C/index-in.docbook:6941 C/index-in.docbook:7014 C/index-in.docbook:7240
+#: C/index-in.docbook:8675
+msgid "Example"
+msgstr "示例"
+
+#: C/index-in.docbook:911
+msgid "This example creates a button with a picture and a label."
+msgstr "这个示例创建了一个有图片和文字标签的按钮。"
+
+#: C/index-in.docbook:916
+msgid "buttons example"
+msgstr "按钮示例"
+
+#: C/index-in.docbook:922
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/buttons/button\">Source Code</ulink>"
+msgstr ""
+"<ulink 
url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/examples/book/buttons/button\";>源代码</ulink>"
+
+#: C/index-in.docbook:929
+msgid "ToggleButton"
+msgstr "ToggleButton (开关按钮)"
+
+#: C/index-in.docbook:931
+msgid ""
+"<classname>ToggleButton</classname>s are like normal <classname>Button</"
+"classname>s, but when clicked they remain activated, or pressed, until "
+"clicked again."
+msgstr ""
+"<classname>ToggleButton</classname> 和普通的 <classname>Button</classname> 相"
+"似,但是它们在点击后会保持激活(或称为按下的)状态,直到再次点击它为止。"
+
+#: C/index-in.docbook:933
+msgid ""
+"To retrieve the state of the <classname>ToggleButton</classname>, you can "
+"use the <methodname>get_active()</methodname> method. This returns "
+"<literal>true</literal> if the button is \"down\". You can also set the "
+"toggle button's state, with <methodname>set_active()</methodname>. Note "
+"that, if you do this, and the state actually changes, it causes the \"clicked"
+"\" signal to be emitted. This is usually what you want."
+msgstr ""
+"要得到 <classname>ToggleButton</classname> 的状态,你可以使用 "
+"<methodname>get_active()</methodname> 方法。如果按钮被按下了,就返回 true。当"
+"然,你也可以通过 <methodname>set_active()</methodname> 来设置开关按钮的状态。"
+"请注意,如果你这样做了,并且它的状态的确改变了,那么这将会引发“clicked”信号。"
+"当然,一般来说,这就是你希望看到的结果。"
+
+#: C/index-in.docbook:940
+msgid ""
+"You can use the <methodname>toggled()</methodname> method to toggle the "
+"button, rather than forcing it to be up or down: This switches the button's "
+"state, and causes the <literal>toggled</literal> signal to be emitted."
+msgstr ""
+"你可以使用 <methodname>toggled()</methodname> 方法来改变按钮的状态,而不要强"
+"行的是设置它是开还是关:这个方法将会改变按钮的状态,并会引发 "
+"<literal>toggled</literal> 信号。"
+
+#: C/index-in.docbook:945
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/";
+"classGtk_1_1ToggleButton.html\">Reference</ulink>"
+msgstr ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1ToggleButton.html\";>参考</ulink>"
+
+#: C/index-in.docbook:950 C/index-in.docbook:965
+msgid "CheckButton"
+msgstr "CheckButton (多选按钮)"
+
+#: C/index-in.docbook:952
+msgid ""
+"<classname>Gtk::CheckButton</classname> inherits directly from "
+"<classname>Gtk::Widget</classname>. It is similar to <classname>Gtk::"
+"ToggleButton</classname>. The only real difference between the two is "
+"<classname>Gtk::CheckButton</classname>'s appearance. You can check and set "
+"a check button using the same member methods as for <classname>Gtk::"
+"ToggleButton</classname>."
+msgstr ""
+"<classname>Gtk::CheckButton</classname> 继承自 <classname>Gtk::Widget</"
+"classname>。它与<classname>Gtk::ToggleButton</classname>类似,二者只有外观不同。
+因此你可以像<classname>Gtk::ToggleButton</classname>一样使用同样的方法来检查、设置和转换多选按钮的状态。"
+
+#: C/index-in.docbook:960
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/";
+"classGtk_1_1CheckButton.html\">Reference</ulink>"
+msgstr ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1CheckButton.html\";>参考</ulink>"
+
+#: C/index-in.docbook:971
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/buttons/checkbutton\">Source Code</ulink>"
+msgstr ""
+"<ulink 
url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/examples/book/buttons/checkbutton\";>源代码</ulink>"
 
-#: C/gtkmm-tutorial-in.xml:864(para)
+#: C/index-in.docbook:977
+msgid "Radio Button"
+msgstr "RadioButton (单选按钮)"
+
+#: C/index-in.docbook:979
 msgid ""
-"Note that you can't just do <placeholder-1/> because the group is modified "
-"by <methodname>set_group()</methodname> and therefore non-const."
+"There is no separate class for radio buttons. Check buttons and toggle "
+"buttons act as radio buttons when they form a group. Only one button in a "
+"group can be selected at any one time."
 msgstr ""
-"注意,你不能只是 <placeholder-1/> 因为该组会由 <methodname>set_group()</"
-"methodname> 修改,所以它不能是一个常量。"
+"单选按钮没有单独的类。当复选按钮和开关按钮在一个组中的时候它们充当单选按钮。任何时候只能选择一个组中的一个按钮。"
+
+#: C/index-in.docbook:985
+msgid "Groups"
+msgstr "组"
 
-#: C/gtkmm-tutorial-in.xml:872(para)
+#: C/index-in.docbook:986
 msgid ""
-"The second way to set up radio buttons is to make a group first, and then "
-"add radio buttons to it. Here's an example:"
+"You create the buttons, and set up their group afterwards. In the following "
+"example, we put 3 radio buttons in a group:"
 msgstr ""
-"第二种创建单选按钮的方式是,先创建一个组,然后再向该组加入按钮。请看下面的示"
-"例:"
+"你创建了三个按钮,然后为他们设置了组。在下面的例子中,我们将三个单选按钮放入一个组中。"
 
-#: C/gtkmm-tutorial-in.xml:876(programlisting)
+#: C/index-in.docbook:991
 #, no-wrap
 msgid ""
-"class RadioButtons : public Gtk::Window\n"
-"{\n"
-"public:\n"
-"    RadioButtons();\n"
-"};\n"
 "\n"
-"RadioButtons::RadioButtons()\n"
-"{\n"
-"    Gtk::RadioButton::Group group;\n"
-"    Gtk::RadioButton *m_rb1 = Gtk::manage(\n"
-"      new Gtk::RadioButton(group,\"button1\"));\n"
-"    Gtk::RadioButton *m_rb2 = manage(\n"
-"      new Gtk::RadioButton(group,\"button2\"));\n"
-"      Gtk::RadioButton *m_rb3 = manage(\n"
-"        new Gtk::RadioButton(group,\"button3\"));\n"
-"}"
+"auto rb1 = Gtk::make_managed&lt;Gtk::CheckButton&gt;(\"button1\");\n"
+"auto rb2 = Gtk::make_managed&lt;Gtk::CheckButton&gt;(\"button2\");\n"
+"auto rb3 = Gtk::make_managed&lt;Gtk::CheckButton&gt;(\"button3\");\n"
+"rb2-&gt;set_group(*rb1);\n"
+"rb3-&gt;set_group(*rb1);\n"
 msgstr ""
-"class RadioButtons : public Gtk::Window\n"
-"{\n"
-"public:\n"
-"    RadioButtons();\n"
-"};\n"
 "\n"
-"RadioButtons::RadioButtons()\n"
-"{\n"
-"    Gtk::RadioButton::Group group;\n"
-"    Gtk::RadioButton *m_rb1 = Gtk::manage(\n"
-"      new Gtk::RadioButton(group,\"button1\"));\n"
-"    Gtk::RadioButton *m_rb2 = manage(\n"
-"      new Gtk::RadioButton(group,\"button2\"));\n"
-"      Gtk::RadioButton *m_rb3 = manage(\n"
-"        new Gtk::RadioButton(group,\"button3\"));\n"
-"}"
+"auto rb1 = Gtk::make_managed&lt;Gtk::CheckButton&gt;(\"button1\");\n"
+"auto rb2 = Gtk::make_managed&lt;Gtk::CheckButton&gt;(\"button2\");\n"
+"auto rb3 = Gtk::make_managed&lt;Gtk::CheckButton&gt;(\"button3\");\n"
+"rb2-&gt;set_group(*rb1);\n"
+"rb3-&gt;set_group(*rb1);\n"
 
-#: C/gtkmm-tutorial-in.xml:893(para)
+#: C/index-in.docbook:999
 msgid ""
-"We made a new group by simply declaring a variable, <literal>group</"
-"literal>, of type <classname>Gtk::RadioButton::Group</classname>. Then we "
-"made three radio buttons, using a constructor to make each of them part of "
-"<literal>group</literal>."
+"We told <application>gtkmm</application> to put all three "
+"<classname>CheckButton</classname>s in the same group by using "
+"<methodname>set_group()</methodname> to tell the other "
+"<classname>CheckButton</classname>s to share group with the first "
+"<classname>CheckButton</classname>."
 msgstr ""
-"我们通过声明一个类型为 <classname>Gtk::RadioButton::Group</classname> 的名为 "
-"<literal>group</literal> 的变量。然后我们创建三个单选按钮,用构造函数把它们放"
-"置到组 <literal>group</literal> 中。"
+"我们告诉<application>gtkmm</application>把三个<classname>CheckButton</"
+"classname>都放到一个组内,通过<methodname>get_group()</methodname>来得到这"
+"个组,然后使用<methodname>set_group()</methodname>告诉其它的"
+"<classname>CheckButton</classname>与第一个<classname>CheckButton</classname>共享这个组。"
 
-#: C/gtkmm-tutorial-in.xml:901(title) C/gtkmm-tutorial-in.xml:1378(title)
-#: C/gtkmm-tutorial-in.xml:5011(title)
+#: C/index-in.docbook:1008 C/index-in.docbook:1464 C/index-in.docbook:4627
 msgid "Methods"
 msgstr "方法"
 
-#: C/gtkmm-tutorial-in.xml:902(para)
+#: C/index-in.docbook:1009
 msgid ""
-"<classname>RadioButtons</classname> are \"off\" when created; this means "
-"that when you first make a group of them, they will all be off. Don't forget "
-"to turn one of them on using <methodname>set_active()</methodname>:"
+"<classname>CheckButton</classname>s and <classname>ToggleButton</classname>s "
+"are \"off\" when created; this means that when you first make a group of "
+"them, they will all be off. Don't forget to turn one of them on using "
+"<methodname>set_active()</methodname>."
 msgstr ""
-"当 <classname>RadioButtons</classname> 创建后默认是未选中的,也就是说当你第一"
-"次创建一组单选按钮的时候,它们都会是未选中的。所以别忘了使用 "
-"<methodname>set_active()</methodname> 来选中一个:"
+"当<classname>CheckButton</classname>和<classname>ToggleButton</classname>创建后默认是未选中的,"
+"也就是说当你第一次创建一组单选按钮的时候,它们都会是未选中的。所以别忘了使用"
+"<methodname>set_active()</methodname>来选中一个。"
+
+#: C/index-in.docbook:1015
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/";
+"classGtk_1_1RadioButton.html\">Reference</ulink>"
+msgstr ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1RadioButton.html\";>参考</ulink>"
+
+#: C/index-in.docbook:1020
+msgid ""
+"The following example demonstrates the use of grouped "
+"<classname>CheckButton</classname>s:"
+msgstr "接下来的例子中演示了对<classname>CheckButton</classname>进行分组的用法:"
+
+#: C/index-in.docbook:1026
+msgid "RadioButton"
+msgstr "RadioButton (单选按钮)"
 
-#: C/gtkmm-tutorial-in.xml:913(para)
+#: C/index-in.docbook:1032
 msgid ""
-"The following example demonstrates the use of <classname>RadioButton</"
-"classname>s:"
-msgstr "接下来的例子中演示了 <classname>RadioButton</classname> 的用法:"
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/buttons/radiobutton\">Source Code</ulink>"
+msgstr ""
+"<ulink 
url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/examples/book/buttons/radiobutton\";>源代码</ulink>"
 
-#: C/gtkmm-tutorial-in.xml:935(title) C/gtkmm-tutorial-in.xml:1084(title)
+#: C/index-in.docbook:1042 C/index-in.docbook:1148
 msgid "Range Widgets"
-msgstr "Range 组件"
+msgstr "Range 部件"
 
-#: C/gtkmm-tutorial-in.xml:937(para)
+#: C/index-in.docbook:1044
 msgid ""
 "<classname>Gtk::Scale</classname> and <classname>Gtk::Scrollbar</classname> "
 "both inherit from <classname>Gtk::Range</classname> and share much "
@@ -1907,10 +2266,10 @@ msgstr ""
 "击的位置移动,可能是移动到终点,也可能是移动一段距离,这取决于你用的是鼠标的"
 "哪个按键。这和滚动条的行为很类似。"
 
-#: C/gtkmm-tutorial-in.xml:948(para)
+#: C/index-in.docbook:1055
 msgid ""
-"As will be explained in the <link linkend=\"chapter-adjustment\">Adjustment</"
-"link> section, all Range widgets are associated with a "
+"As will be explained in the <link linkend=\"chapter-adjustment"
+"\">Adjustments</link> section, all Range widgets are associated with an "
 "<classname>Adjustment</classname> object. To change the lower, upper, and "
 "current values used by the widget you need to use the methods of its "
 "<classname>Adjustment</classname>, which you can get with the "
@@ -1921,44 +2280,57 @@ msgid ""
 "See the <link linkend=\"chapter-adjustment\">Adjustments</link> section for "
 "further details."
 msgstr ""
-"就象将在后面的<link linkend=\"chapter-adjustment\">Adjustment</link> 小节要谈"
-"到的那样,所有的 Range 组件都有一个关联的 <classname>Adjustment</classname> "
-"对象。如果你想修改组件的最小值、最大值以及当前值,你需要调用该组件关联的 "
+"就象将在后面的<link linkend=\"chapter-adjustment\">Adjustments</link> 小节要谈"
+"到的那样,所有的 Range 部件都有一个关联的 <classname>Adjustment</classname> "
+"对象。如果你想修改部件的最小值、最大值以及当前值,你需要调用该部件关联的 "
 "<classname>Adjustment</classname> 对象的方法,该对象可以通过调用 "
 "<methodname>get_adjustment()</methodname> 方法来得到。<classname>Range</"
-"classname> 组件默认构造函数会自动的创建一个 <classname>Adjustment</"
+"classname> 部件默认构造函数会自动的创建一个 <classname>Adjustment</"
 "classname>,当然,你也可以指定一个现有的 <classname>Adjustment</classname>,"
-"而且还可以和其它组件共享。请参看 <link linkend=\"chapter-adjustment"
+"而且还可以和其它部件共享。请参看 <link linkend=\"chapter-adjustment"
 "\">Adjustments</link> 部分以得到更详细的信息。"
 
-#: C/gtkmm-tutorial-in.xml:965(title)
+#: C/index-in.docbook:1069
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1Range.html";
+"\">Reference</ulink>"
+msgstr ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1Range.html\";>参考</ulink>"
+
+#: C/index-in.docbook:1072
 msgid "Scrollbar Widgets"
-msgstr "滚动条组件 (Scrollbar)"
+msgstr "滚动条部件 (Scrollbar)"
 
-#: C/gtkmm-tutorial-in.xml:967(para)
+#: C/index-in.docbook:1074
 msgid ""
 "These are standard scrollbars. They should be used only to scroll another "
-"widget, such as, a <classname>Gtk::Entry</classname>, or a <classname>Gtk::"
+"widget, such as a <classname>Gtk::Entry</classname> or a <classname>Gtk::"
 "Viewport</classname>, though it's usually easier to use the <classname>Gtk::"
 "ScrolledWindow</classname> widget in most cases."
 msgstr ""
-"这些是标准的滚动条。它们应该只被用于滚动其它组件,比如 <classname>Gtk::"
+"这些是标准的滚动条。它们应该只被用于滚动其它部件,比如 <classname>Gtk::"
 "Entry</classname> 或 <classname>Gtk::Viewport</classname>,当然,通常使用 "
 "<classname>Gtk::ScrolledWindow</classname> 会更容易一些。"
 
-#: C/gtkmm-tutorial-in.xml:974(para)
+#: C/index-in.docbook:1081
 msgid ""
-"There are horizontal and vertical scrollbar classes - <classname>Gtk::"
-"HScrollbar</classname> and <classname>Gtk::VScrollbar</classname>."
+"The orientation of a <classname>Gtk::Scrollbar</classname> can be either "
+"horizontal or vertical."
 msgstr ""
-"分别有水平的和垂直的滚动条类:<classname>Gtk::HScrollbar</classname> 和 "
-"<classname>Gtk::VScrollbar</classname>。"
+"<classname>Gtk::Scrollbar</classname>的方向可以是水平的也可以是垂直的。"
 
-#: C/gtkmm-tutorial-in.xml:985(title)
+#: C/index-in.docbook:1086
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1Scrollbar.";
+"html\">Reference</ulink>"
+msgstr ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1Scrollbar.html\";>参考</ulink>"
+
+#: C/index-in.docbook:1091
 msgid "Scale Widgets"
-msgstr "比例组件 (Scale)"
+msgstr "比例部件 (Scale)"
 
-#: C/gtkmm-tutorial-in.xml:987(para)
+#: C/index-in.docbook:1093
 msgid ""
 "<classname>Gtk::Scale</classname> widgets (or \"sliders\") allow the user to "
 "visually select and manipulate a value within a specific range. You might "
@@ -1966,30 +2338,28 @@ msgid ""
 "of a picture, or to control the brightness of a colour, or to specify the "
 "number of minutes of inactivity before a screensaver takes over the screen."
 msgstr ""
-"<classname>Gtk::Scale</classname> 组件 (或者说“滑块”) 可以让用户在指定范围内"
+"<classname>Gtk::Scale</classname> 部件 (或者说“滑块”) 可以让用户在指定范围内"
 "直观地调节它的值。例如,你可以用它来调节一副预览图片的放大率、或者控制颜色的"
 "亮度,或者指定多少分钟后执行屏幕保护。"
 
-#: C/gtkmm-tutorial-in.xml:996(para)
+#: C/index-in.docbook:1102
 msgid ""
-"As with <classname>Scrollbar</classname>s, there are separate widget types "
-"for horizontal and vertical widgets - <classname>Gtk::HScale</classname> and "
-"<classname>Gtk::VScale</classname>. The default constructors create an "
+"As with <classname>Scrollbar</classname>s, the orientation can be either "
+"horizontal or vertical. The default constructor creates an "
 "<classname>Adjustment</classname> with all of its values set to "
 "<literal>0.0</literal>. This isn't useful so you will need to set some "
 "<classname>Adjustment</classname> details to get meaningful behaviour."
 msgstr ""
-"像 <classname>Scrollbar</classname> 一样,也分别有水平和垂直两种组件:"
-"<classname>Gtk::HScale</classname> 和 <classname>Gtk::VScale</classname>。默"
+"像 <classname>Scrollbar</classname> 一样,也分别有水平和垂直两种方向。默"
 "认构造函数会创建一个 <classname>Adjustment</classname>,并且所有值都设为 "
 "<literal>0.0</literal>。当然,这显然没有意义,所以你需要设置一些 "
 "<classname>Adjustment</classname> 的细节来让它获得有意义的行为。"
 
-#: C/gtkmm-tutorial-in.xml:1006(title)
+#: C/index-in.docbook:1111
 msgid "Useful methods"
 msgstr "一些有用的方法"
 
-#: C/gtkmm-tutorial-in.xml:1008(para)
+#: C/index-in.docbook:1113
 msgid ""
 "<classname>Scale</classname> widgets can display their current value as a "
 "number next to the trough. By default they show the value, but you can "
@@ -1999,18 +2369,18 @@ msgstr ""
 "个数值的,但是你可以通过调用 <methodname>set_draw_value()</methodname> 方法来"
 "设置是否显示该值。"
 
-#: C/gtkmm-tutorial-in.xml:1014(para)
+#: C/index-in.docbook:1119
 msgid ""
 "The value displayed by a scale widget is rounded to one decimal point by "
 "default, as is the <literal>value</literal> field in its <classname>Gtk::"
-"Adjustment</classname>. You can change this with the <methodname>set_digits()"
-"</methodname> method."
+"Adjustment</classname>. You can change this with the "
+"<methodname>set_digits()</methodname> method."
 msgstr ""
-"默认情况下,Scale 组件会显示 <classname>Gtk::Adjustment</classname> 的 "
+"默认情况下,Scale 部件会显示 <classname>Gtk::Adjustment</classname> 的 "
 "<literal>value</literal> 的数值,并且会被四舍五入到一位小数。你可以通过 "
 "<methodname>set_digits()</methodname> 方法来改变显示的小数位数。"
 
-#: C/gtkmm-tutorial-in.xml:1021(para)
+#: C/index-in.docbook:1126
 msgid ""
 "Also, the value can be drawn in different positions relative to the trough, "
 "specified by the <methodname>set_value_pos()</methodname> method."
@@ -2018,196 +2388,221 @@ msgstr ""
 "另外,通过使用 <methodname>set_value_pos()</methodname>,可以使值显示在相对于"
 "滑块不同的位置。"
 
-#: C/gtkmm-tutorial-in.xml:1032(title)
-msgid "Update Policies"
-msgstr "更新策略"
-
-#: C/gtkmm-tutorial-in.xml:1044(para)
-msgid ""
-"<literal>Gtk::UPDATE_CONTINUOUS</literal> - This is the default. The "
-"<literal>value_changed</literal> signal is emitted continuously, i.e. "
-"whenever the slider is moved by even the tiniest amount."
-msgstr ""
-"<literal>Gtk::UPDATE_CONTINUOUS</literal> - 这是默认的更新规则。会连续不断的"
-"发出 <literal>value_changed</literal> 信号,即使滑块只是被移动了一点点,也会"
-"发出该信号。"
-
-#: C/gtkmm-tutorial-in.xml:1052(para)
-msgid ""
-"<literal>Gtk::UPDATE_DISCONTINUOUS</literal> - The <literal>value_changed</"
-"literal> signal is only emitted once the slider has stopped moving and the "
-"user has released the mouse button."
-msgstr ""
-"<literal>Gtk::UPDATE_DISCONTINUOUS</literal> - 只有在滑块停止了移动并且用户释"
-"放了鼠标的时候才会发出 <literal>value_changed</literal> 信号。"
-
-#: C/gtkmm-tutorial-in.xml:1060(para)
-msgid ""
-"<literal>Gtk::UPDATE_DELAYED</literal> - The <literal>value_changed</"
-"literal> signal is emitted when the user releases the mouse button, or if "
-"the slider stops moving for a short period of time."
-msgstr ""
-"<literal>Gtk::UPDATE_DELAYED</literal> - 只有当用户释放鼠标,或者滑块停止移动"
-"一小段时间后,才发出 <literal>value_changed</literal> 信号。"
-
-#: C/gtkmm-tutorial-in.xml:1034(para)
+#: C/index-in.docbook:1131
 msgid ""
-"The <emphasis>update policy</emphasis> of a <classname>Range</classname> "
-"widget defines at what points during user interaction it will change the "
-"<literal>value</literal> field of its <classname>Gtk::Adjustment</classname> "
-"and emit the <literal>value_changed</literal> signal. The update policies, "
-"set with the <methodname>set_update_policy()</methodname> method, are: "
-"<placeholder-1/>"
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1Scale.html";
+"\">Reference</ulink>"
 msgstr ""
-"<classname>Range</classname> 组件的 <emphasis>更新策略</emphasis> 定义了在用"
-"户操作期间的什么时候更新 <classname>Gtk::Adjustment</classname> 的值 "
-"<literal>value</literal>,并且何时发出 <literal>value_changed</literal> 信"
-"号。可以使用 <methodname>set_update_policy()</methodname> 方法来设置更新策"
-"略。这些策略包括:<placeholder-1/>"
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1Scale.html\";>参考</ulink>"
 
-#: C/gtkmm-tutorial-in.xml:1075(para)
+#: C/index-in.docbook:1139
 msgid ""
 "This example displays a window with three range widgets all connected to the "
 "same adjustment, along with a couple of controls for adjusting some of the "
 "parameters mentioned above and in the section on adjustments, so you can see "
 "how they affect the way these widgets work for the user."
 msgstr ""
-"这个示例显示了一个窗口,其中有三个关联到同一个 Adjustment 对象的 Range 组件,"
-"还有几个控制组件用来调整前文讨论过的一些参数,这样你可以很清楚地看到那些参数"
-"是如何影响这些组件的行为方式的。"
+"这个示例显示了一个窗口,其中有三个关联到同一个Adjustment对象,"
+"还有几个控制部件用来调整前文讨论过的一些参数,这样你可以很清楚地看到那些参数"
+"是如何影响这些部件的行为方式的。"
 
-#: C/gtkmm-tutorial-in.xml:1097(title)
-msgid "Miscellaneous Widgets"
+#: C/index-in.docbook:1154
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/range_widgets\">Source Code</ulink>"
 msgstr ""
+"<ulink 
url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/examples/book/range_widgets\";>源代码</ulink>"
+
+#: C/index-in.docbook:1161
+msgid "Miscellaneous Widgets"
+msgstr "杂项部件"
 
-#: C/gtkmm-tutorial-in.xml:1100(title) C/gtkmm-tutorial-in.xml:1133(title)
+#: C/index-in.docbook:1164 C/index-in.docbook:1204
 msgid "Label"
-msgstr ""
+msgstr "标签"
 
-#: C/gtkmm-tutorial-in.xml:1102(para)
+#: C/index-in.docbook:1166
 msgid ""
 "Labels are the main method of placing non-editable text in windows, for "
-"instance to place a title next to a <classname>Entry</classname> widget. You "
-"can specify the text in the constructor, or with the <methodname>set_text()</"
-"methodname> method."
+"instance to place a title next to an <classname>Entry</classname> widget. "
+"You can specify the text in the constructor, or later with the "
+"<methodname>set_text()</methodname> or <methodname>set_markup()</methodname> "
+"methods."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1109(para)
+#: C/index-in.docbook:1173
 msgid ""
 "The width of the label will be adjusted automatically. You can produce multi-"
 "line labels by putting line breaks (\"\\n\") in the label string."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1113(para)
+#: C/index-in.docbook:1177
 msgid ""
 "The label text can be justified using the <methodname>set_justify()</"
-"methodname> method. The widget is also capable of word-wrapping - this can "
+"methodname> method. The widget is also capable of word-wrapping, which can "
 "be activated with <methodname>set_line_wrap()</methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1119(para)
-msgid "TODO: gtkmm2: markup."
+#: C/index-in.docbook:1183
+msgid ""
+"Gtk::Label supports some simple formatting, for instance allowing you to "
+"make some text bold, colored, or larger. You can do this by providing a "
+"string to <methodname>set_markup()</methodname>, using the <ulink url="
+"\"http://developer.gnome.org/pango/unstable/PangoMarkupFormat.html\";>Pango "
+"Markup syntax</ulink>. For instance, <code> &lt;b&gt;bold text&lt;/b&gt; and "
+"&lt;s&gt;strikethrough text&lt;/s&gt; </code> ."
+msgstr ""
+
+#: C/index-in.docbook:1192
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1Label.html";
+"\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1126(para)
+#: C/index-in.docbook:1195
 msgid ""
 "Below is a short example to illustrate these functions. This example makes "
 "use of the Frame widget to better demonstrate the label styles. (The Frame "
-"widget is explained in the <link linkend=\"sec-frame\">Frame</link> section.)"
+"widget is explained in the <link linkend=\"sec-frame\">Frame</link> "
+"section.) It is possible that the first character in "
+"<literal>m_Label_Normal</literal> is shown underlined only when you press "
+"the <keycap>Alt</keycap> key."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1146(title) C/gtkmm-tutorial-in.xml:1188(title)
+#: C/index-in.docbook:1210
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/label\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:1217 C/index-in.docbook:1274
 msgid "Entry"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1149(title)
+#: C/index-in.docbook:1220
 msgid "Simple Use"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1151(para)
+#: C/index-in.docbook:1222
 msgid ""
 "Entry widgets allow the user to enter text. You can change the contents with "
 "the <methodname>set_text()</methodname> method, and read the current "
 "contents with the <methodname>get_text()</methodname> method."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1156(para)
+#: C/index-in.docbook:1227
 msgid ""
 "Occasionally you might want to make an <classname>Entry</classname> widget "
 "read-only. This can be done by passing <literal>false</literal> to the "
 "<methodname>set_editable()</methodname> method."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1162(para)
+#: C/index-in.docbook:1233
 msgid ""
 "For the input of passwords, passphrases and other information you don't want "
 "echoed on the screen, calling <methodname>set_visibility()</methodname> with "
 "<literal>false</literal> will cause the text to be hidden."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1168(para)
+#: C/index-in.docbook:1239
 msgid ""
 "You might want to be notified whenever the user types in a text entry "
 "widget. <classname>Gtk::Entry</classname> provides two signals, "
-"<literal>activate</literal> and <literal>changed</literal>, for just this "
+"<literal>activate</literal> and <literal>changed</literal>, for this "
 "purpose. <literal>activate</literal> is emitted when the user presses the "
-"enter key in a text-entry widget; <literal>changed</literal> is emitted when "
-"the text in the widget changes. You can use these, for instance, to validate "
-"or filter the text the user types."
+"<keycap>Enter</keycap> key in a text-entry widget; <literal>changed</"
+"literal> is emitted when the text in the widget changes. You can use these, "
+"for instance, to validate or filter the text the user types. Moving the "
+"keyboard focus to another widget may also signal that the user has finished "
+"entering text. The <literal>focus_out_event</literal> signal that "
+"<classname>Gtk::Entry</classname> inherits from <classname>Gtk::Widget</"
+"classname> can notify you when that happens. The <link linkend=\"sec-"
+"comboboxentry\">ComboBox with an Entry</link> section contains example "
+"programs that use these signals."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1180(title)
-msgid "Simple Entry Example"
+#: C/index-in.docbook:1254
+msgid ""
+"If you pass <literal>true</literal> to the "
+"<methodname>set_activates_default()</methodname> method, pressing "
+"<keycap>Enter</keycap> in the <classname>Gtk::Entry</classname> will "
+"activate the default widget for the window containing the <classname>Gtk::"
+"Entry</classname>. This is especially useful in dialog boxes. The default "
+"widget is usually one of the dialog buttons, which e.g. will close the "
+"dialog box. To set a widget as the default widget, use <methodname>Gtk::"
+"Widget::set_can_default()</methodname> and <methodname>Gtk::Widget::"
+"grab_default()</methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1181(para)
+#: C/index-in.docbook:1264
 msgid ""
-"This example uses <classname>Gtk::Entry</classname>. It also has two "
-"<classname>CheckButton</classname>s, with which you can toggle the editable "
-"and visible flags."
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1Entry.html";
+"\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1201(title) C/gtkmm-tutorial-in.xml:1235(title)
+#: C/index-in.docbook:1266
+msgid "Simple Entry Example"
+msgstr ""
+
+#: C/index-in.docbook:1267
+msgid ""
+"This example uses <classname>Gtk::Entry</classname>. It also has two "
+"<classname>CheckButton</classname>s, with which you can toggle the editable "
+"and visible flags."
+msgstr ""
+
+#: C/index-in.docbook:1280
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/entry/simple\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:1287 C/index-in.docbook:1321
 msgid "Entry Completion"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1202(para)
+#: C/index-in.docbook:1288
 msgid ""
-"A <classname>Entry</classname> widget can offer a drop-down list of pre-"
+"An <classname>Entry</classname> widget can offer a drop-down list of pre-"
 "existing choices based on the first few characters typed by the user. For "
 "instance, a search dialog could suggest text from previous searches."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1207(para)
+#: C/index-in.docbook:1293
 msgid ""
-"To enable this functionality, you must create a <classname>EntryCompletion</"
+"To enable this functionality, you must create an <classname>EntryCompletion</"
 "classname> object, and provide it to the <classname>Entry</classname> widget "
 "via the <methodname>set_completion()</methodname> method."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1212(para)
+#: C/index-in.docbook:1298
 msgid ""
 "The <classname>EntryCompletion</classname> may use a <classname>TreeModel</"
-"classname> containing possible entries, specified with <methodname>set_model"
-"()</methodname>. You should then call <methodname>set_text_column()</"
-"methodname> to specify which of your model columns should be used to match "
-"possible text entries."
+"classname> containing possible entries, specified with "
+"<methodname>set_model()</methodname>. You should then call "
+"<methodname>set_text_column()</methodname> to specify which of your model "
+"columns should be used to match possible text entries."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1218(para)
+#: C/index-in.docbook:1304
 msgid ""
 "Alternatively, if a complete list of possible entries would be too large or "
 "too inconvenient to generate, a callback slot may instead be specified with "
-"<methodname>set_match_func()</methodname>. That callback function. This is "
-"also useful if you wish to match on a part of the string other than the "
-"start."
+"<methodname>set_match_func()</methodname>. This is also useful if you wish "
+"to match on a part of the string other than the start."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1226(title)
+#: C/index-in.docbook:1310
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/";
+"classGtk_1_1EntryCompletion.html\">Reference</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:1312
 msgid "Entry Completion Example"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1227(para)
+#: C/index-in.docbook:1313
 msgid ""
 "This example creates a <classname>Gtk::EntryCompletion</classname> and "
 "associates it with a <classname>Gtk::Entry</classname> widget. The "
@@ -2215,39 +2610,51 @@ msgid ""
 "and some additional actions."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1247(title)
+#: C/index-in.docbook:1327
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/entry/completion\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:1333
 msgid "Entry Icons"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1248(para)
+#: C/index-in.docbook:1334
 msgid ""
 "An <classname>Entry</classname> widget can show an icon at the start or end "
 "of the text area. The icon can be specifed by methods such as "
 "<methodname>set_icon_from_pixbuf()</methodname> or "
-"<methodname>set_icon_from_stock()</methodname>. An application can respond "
-"to the user pressing the icon by handling the <methodname>signal_icon_press</"
-"methodname> signal."
+"<methodname>set_icon_from_icon_name()</methodname>. An application can "
+"respond to the user pressing the icon by handling the "
+"<methodname>signal_icon_press</methodname> signal."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1255(title)
+#: C/index-in.docbook:1341
 msgid "Entry Icon Example"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1256(para)
+#: C/index-in.docbook:1342
 msgid ""
-"This example shows a <classname>Gtk::Entry</classname> widget with a stock "
+"This example shows a <classname>Gtk::Entry</classname> widget with a named "
 "search icon, and prints text to the terminal when the icon is pressed."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1262(title)
+#: C/index-in.docbook:1348
 msgid "Entry with Icon"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1274(title)
+#: C/index-in.docbook:1354
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/entry/icon\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:1360
 msgid "Entry Progress"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1275(para)
+#: C/index-in.docbook:1361
 msgid ""
 "An <classname>Entry</classname> widget can show a progress bar inside the "
 "text area, under the entered text. The progress bar will be shown if the "
@@ -2255,84 +2662,92 @@ msgid ""
 "<methodname>set_progress_pulse_step()</methodname> methods are called."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1280(title)
+#: C/index-in.docbook:1366
 msgid "Entry Progress Example"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1281(para)
+#: C/index-in.docbook:1367
 msgid ""
 "This example shows a <classname>Gtk::Entry</classname> widget with a "
 "progress bar."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1287(title)
+#: C/index-in.docbook:1373
 msgid "Entry with Progress Bar"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1301(title) C/gtkmm-tutorial-in.xml:1435(title)
+#: C/index-in.docbook:1379
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/entry/progress\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:1387 C/index-in.docbook:1509
 msgid "SpinButton"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1303(para)
+#: C/index-in.docbook:1389
 msgid ""
 "A <classname>SpinButton</classname> allows the user to select a value from a "
-"range of numeric values. It has an Entry widget with up and down arrow "
-"buttons at the side. Clicking the buttons causes the value to 'spin' up and "
-"down across the range of possible values. The <classname>Entry</classname> "
-"widget may also be used to enter a value directly."
+"range of numeric values. It has an <classname>Entry</classname> widget with "
+"increment and decrement buttons at the side. Clicking the buttons causes the "
+"value to 'spin' up and down across the range of possible values. The "
+"<classname>Entry</classname> widget may also be used to enter a value "
+"directly."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1311(para)
+#: C/index-in.docbook:1397
 msgid ""
 "The value can have an adjustable number of decimal places, and the step size "
 "is configurable. <classname>SpinButton</classname>s have an 'auto-repeat' "
-"feature as well: holding down one of the arrows can optionally cause the "
-"value to change more quickly the longer the arrow is held down."
+"feature as well: holding down the increment or decrement button can "
+"optionally cause the value to change more quickly the longer the button is "
+"held down."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1326(para)
+#: C/index-in.docbook:1412
 msgid "<literal>value</literal>: value for the Spin Button"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1332(para)
+#: C/index-in.docbook:1418
 msgid "<literal>lower</literal>: lower range value"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1338(para)
+#: C/index-in.docbook:1424
 msgid "<literal>upper</literal>: upper range value"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1343(para)
+#: C/index-in.docbook:1429
 msgid ""
 "<literal>step_increment</literal>: value to increment/decrement when "
-"pressing mouse button 1 on a button"
+"pressing mouse button 1"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1350(para)
+#: C/index-in.docbook:1436
 msgid ""
 "<literal>page_increment</literal>: value to increment/decrement when "
-"pressing mouse button 2 on a button"
+"pressing mouse button 2"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1357(para)
+#: C/index-in.docbook:1443
 msgid "<literal>page_size</literal>: unused"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1318(para)
+#: C/index-in.docbook:1404
 msgid ""
 "<classname>SpinButton</classname>s use an <link linkend=\"chapter-adjustment"
 "\">Adjustment</link> object to hold information about the range of values. "
-"These Adjustment attributes are used by the Spin Button like so: "
-"<placeholder-1/>"
+"These Adjustment attributes are used by the Spin Button like so: <_:"
+"itemizedlist-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1365(para)
+#: C/index-in.docbook:1451
 msgid ""
 "Additionally, mouse button 3 can be used to jump directly to the "
 "<literal>upper</literal> or <literal>lower</literal> values."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1370(para)
+#: C/index-in.docbook:1456
 msgid ""
 "The <classname>SpinButton</classname> can create a default "
 "<classname>Adjustment</classname>, which you can access via the "
@@ -2340,97 +2755,100 @@ msgid ""
 "existing <classname>Adjustment</classname> in the constructor."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1380(para)
+#: C/index-in.docbook:1466
 msgid ""
-"The number of decimal places can be altered using the <methodname>set_digits"
-"()</methodname> method."
+"The number of decimal places can be altered using the "
+"<methodname>set_digits()</methodname> method."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1385(para)
+#: C/index-in.docbook:1471
 msgid ""
 "You can set the spinbutton's value using the <methodname>set_value()</"
 "methodname> method, and retrieve it with <methodname>get_value()</"
 "methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1390(para)
+#: C/index-in.docbook:1476
 msgid ""
 "The <methodname>spin()</methodname> method 'spins' the "
-"<classname>SpinButton</classname>, as if one of its arrows had been clicked. "
-"You need to specify a <classname>Gtk::SpinType</classname> to specify the "
-"direction or new position."
+"<classname>SpinButton</classname>, as if its increment or decrement button "
+"had been clicked. You need to specify a <classname>Gtk::SpinType</classname> "
+"to specify the direction or new position."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1397(para)
+#: C/index-in.docbook:1483
 msgid ""
 "To prevent the user from typing non-numeric characters into the entry box, "
 "pass <literal>true</literal> to the <methodname>set_numeric()</methodname> "
 "method."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1402(para)
+#: C/index-in.docbook:1488
 msgid ""
 "To make the <classname>SpinButton</classname> 'wrap' between its upper and "
 "lower bounds, use the <methodname>set_wrap()</methodname> method."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1407(para)
+#: C/index-in.docbook:1493
 msgid ""
 "To force it to snap to the nearest <literal>step_increment</literal>, use "
 "<methodname>set_snap_to_ticks()</methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1412(para)
+#: C/index-in.docbook:1498
 msgid ""
-"You can modify the update policy using the <methodname>set_update_policy()</"
-"methodname> method, specifying either <literal>Gtk::UPDATE_ALWAYS</literal> "
-"or <literal>Gtk::UPDATE_IF_VALID</literal>. <literal>Gtk::UPDATE_ALWAYS</"
-"literal> causes the <classname>SpinButton</classname> to ignore errors "
-"encountered while converting the text in the entry box to a numeric value. "
-"This setting also therefore allows the <classname>SpinButton</classname> to "
-"accept non-numeric values. You can force an immediate update using the "
-"<methodname>update()</methodname> method."
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/";
+"classGtk_1_1SpinButton.html\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1430(para)
+#: C/index-in.docbook:1504
 msgid "Here's an example of a <classname>SpinButton</classname> in action:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1448(title) C/gtkmm-tutorial-in.xml:1501(title)
+#: C/index-in.docbook:1515
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/spinbutton\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:1522 C/index-in.docbook:1570
 msgid "ProgressBar"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1450(para)
+#: C/index-in.docbook:1524
 msgid ""
 "Progress bars are used to show the status of an ongoing operation. For "
 "instance, a <classname>ProgressBar</classname> can show how much of a task "
 "has been completed."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1456(para)
+#: C/index-in.docbook:1530
 msgid ""
 "To change the value shown, use the <methodname>set_fraction()</methodname> "
-"method, passing a double between 0 and 1 to provide the new percentage."
+"method, passing a <type>double</type> between 0.0 and 1.0 to provide the new "
+"fraction."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1461(para)
+#: C/index-in.docbook:1535
 msgid ""
-"where <literal>percentage</literal> is a number, from 0 to 1, indicating "
-"what fraction of the bar should be filled."
+"A <classname>ProgressBar</classname> is horizontal and left-to-right by "
+"default, but you can change it to a vertical progress bar by using the "
+"<methodname>set_orientation()</methodname> method."
 msgstr ""
+"<classname>ProgressBar</classname>默认是水平且从左向右的,但是你可以使用"
+"<methodname>set_orientation()</methodname>方法来改变这个行为。"
 
-#: C/gtkmm-tutorial-in.xml:1466(para)
+#: C/index-in.docbook:1541
 msgid ""
-"A <classname>ProgressBar</classname>is horizontal and left-to-right by "
-"default, but you can change it to a vertical progress bar by using the "
-"<methodname>set_orientation()</methodname> method."
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/";
+"classGtk_1_1ProgressBar.html\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1475(title)
+#: C/index-in.docbook:1544
 msgid "Activity Mode"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1476(para)
+#: C/index-in.docbook:1545
 msgid ""
 "Besides indicating the amount of progress that has occured, the progress bar "
 "can also be used to indicate that there is some activity; this is done by "
@@ -2441,164 +2859,229 @@ msgid ""
 "unknown length)."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1486(para)
+#: C/index-in.docbook:1555
 msgid ""
 "To do this, you need to call the <methodname>pulse()</methodname> method at "
 "regular intervals. You can also choose the step size, with the "
 "<methodname>set_pulse_step()</methodname> method."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1492(para)
+#: C/index-in.docbook:1561
 msgid ""
-"When in continuous mode, the progress bar can also display a configurable "
-"text string within its trough, using the <methodname>set_text()</methodname> "
-"method."
+"The progress bar can also display a configurable text string next to the "
+"bar, using the <methodname>set_text()</methodname> method."
 msgstr ""
+"进度条还可以使用<methodname>set_text()</methodname>方法来在其边上显示可配置的文本字符串。"
 
-#: C/gtkmm-tutorial-in.xml:1515(title) C/gtkmm-tutorial-in.xml:1525(title)
+#: C/index-in.docbook:1576
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/progressbar\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:1584 C/index-in.docbook:1594
 msgid "InfoBar"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1517(para)
+#: C/index-in.docbook:1586
+msgid ""
+"An <classname>InfoBar</classname> may show small items of information or ask "
+"brief questions. Unlike a <classname>Dialog</classname>, it appears at the "
+"top of the current window instead of opening a new window. Its API is very "
+"similar to the <link linkend=\"chapter-dialogs\">Gtk::Dialog</link> API."
+msgstr ""
+
+#: C/index-in.docbook:1589
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1InfoBar.";
+"html\">Reference</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:1600
 msgid ""
-"An <classname>InfoBar</classname> may show small items of information or to "
-"ask brief questions. Unlike a <classname>Dialog</classname>, it appears at "
-"the top of the current window instead of opening a new window. Its API is "
-"very similar to the <link linkend=\"chapter-dialogs\">Gtk::Dialog</link> API."
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/infobar\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1538(title)
+#: C/index-in.docbook:1607
 msgid "Tooltips"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1540(para)
+#: C/index-in.docbook:1609
 msgid ""
 "Tooltips are the little information windows that pop up when you leave your "
 "pointer over a widget for a few seconds. Use <methodname>set_tooltip_text()</"
 "methodname> to set a text string as a tooltip on any <classname>Widget</"
-"classname>. <classname>Gtk::ToolItem</classname>s are not <classname>Widget</"
-"classname>s, but have the same method for convenience. <classname>Gtk::"
-"Tooltip</classname> is used for more advanced tooltip usage, such as showing "
-"an image as well as text."
+"classname>. <classname>Gtk::Tooltip</classname> is used for more advanced "
+"tooltip usage, such as showing an image as well as text."
+msgstr ""
+
+#: C/index-in.docbook:1618
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1Widget.";
+"html\">Widget Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1550(ulink)
-msgid "Widget Reference"
+#: C/index-in.docbook:1619
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1Tooltip.";
+"html\">Tooltip Reference</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:1624
+msgid "Tooltip"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1551(ulink)
-msgid "Tooltip Reference"
+#: C/index-in.docbook:1630
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/tooltips\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1558(title)
+#: C/index-in.docbook:1639
 msgid "Container Widgets"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1560(para)
+#: C/index-in.docbook:1641
 msgid ""
-"All container widgets derive from <classname>Gtk::Container</classname>, not "
-"always directly. Some container widgets, such as <classname>Gtk::Table</"
-"classname> can hold many child widgets, so these typically have more complex "
+"Container widgets, like other widgets, derive from <classname>Gtk::Widget</"
+"classname>. Some container widgets, such as <classname>Gtk::Grid</classname> "
+"can hold many child widgets, so these typically have more complex "
 "interfaces. Others, such as <classname>Gtk::Frame</classname> contain only "
 "one child widget."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1569(title)
+#: C/index-in.docbook:1649
 msgid "Single-item Containers"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1571(para)
+#: C/index-in.docbook:1651
 msgid ""
-"The single-item container widgets derive from <classname>Gtk::Bin</"
-"classname>, which provides the <methodname>add()</methodname> and "
-"<methodname>remove()</methodname> methods for the child widget. Note that "
+"Most single-item container widgets have <methodname>set_child()</methodname> "
+"and <methodname>unset_child()</methodname> methods for the child widget. "
 "<classname>Gtk::Button</classname> and <classname>Gtk::Window</classname> "
 "are technically single-item containers, but we have discussed them already "
 "elsewhere."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1579(para)
+#: C/index-in.docbook:1658
 msgid ""
 "We also discuss the <classname>Gtk::Paned</classname> widget, which allows "
 "you to divide a window into two separate \"panes\". This widget actually "
 "contains two child widgets, but the number is fixed so it seems appropriate."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1586(title) C/gtkmm-tutorial-in.xml:1600(title)
+#: C/index-in.docbook:1665 C/index-in.docbook:1679
 msgid "Frame"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1588(para)
+#: C/index-in.docbook:1667
 msgid ""
 "Frames can enclose one or a group of widgets within a box, optionally with a "
-"title. For instance, you might place a group of <classname>RadioButton</"
+"title. For instance, you might place a group of <classname>ToggleButton</"
 "classname>s or <classname>CheckButton</classname>s in a <classname>Frame</"
 "classname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1614(title) C/gtkmm-tutorial-in.xml:1641(title)
+#: C/index-in.docbook:1674
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1Frame.html";
+"\">Reference</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:1685
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/frame\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:1693 C/index-in.docbook:1719
 msgid "Paned"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1616(para)
+#: C/index-in.docbook:1695
 msgid ""
-"Panes divide a widget into two halves, separated by a moveable divider. "
-"There are two such widgets: <classname>Gtk::HPaned</classname> adds a "
-"horizontal divider, and <classname>Gtk::VPaned</classname> adds a vertical "
-"one. Other than the names and the orientations, there's no difference "
-"between the two."
+"Panes divide a widget into two halves, separated by a moveable divider. The "
+"two halves (panes) can be oriented either horizontally (side by side) or "
+"vertically (one above the other)."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1623(para)
+#: C/index-in.docbook:1701
 msgid ""
-"Unlike the other widgets in this chapter, pane widgets contain not one but "
+"Unlike the other widgets in this section, pane widgets contain not one but "
 "two child widgets, one in each pane. Therefore, you should use "
-"<methodname>add1()</methodname> and <methodname>add2()</methodname> instead "
-"of the <methodname>add()</methodname> method."
+"<methodname>set_start_child()</methodname> and <methodname>set_end_child()</"
+"methodname> instead of a <methodname>set_child()</methodname> method."
+msgstr ""
+
+#: C/index-in.docbook:1708
+msgid ""
+"You can adjust the position of the divider using the "
+"<methodname>set_position()</methodname> method, and you will probably need "
+"to do so."
+msgstr ""
+
+#: C/index-in.docbook:1714
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1Paned.html";
+"\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1630(para)
+#: C/index-in.docbook:1725
 msgid ""
-"You can adjust the position of the divider using the <methodname>set_position"
-"()</methodname> method, and you will probably need to do so."
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/paned\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1654(title) C/gtkmm-tutorial-in.xml:1686(title)
+#: C/index-in.docbook:1732 C/index-in.docbook:1764
 msgid "ScrolledWindow"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1656(para)
+#: C/index-in.docbook:1734
 msgid ""
 "<classname>ScrolledWindow</classname> widgets create a scrollable area. You "
-"can insert any type of widget into a <classname>ScrolledWindow</classname> "
-"window, and it will be accessible regardless of its size by using the "
-"scrollbars. Note that <classname>ScrolledWindow</classname> is not a "
-"<classname>Gtk::Window</classname> despite the slightly misleading name."
+"can insert any type of widget into a <classname>ScrolledWindow</classname>, "
+"and it will be accessible regardless of its size by using the scrollbars. "
+"Note that <classname>ScrolledWindow</classname> is not a <classname>Gtk::"
+"Window</classname> despite the slightly misleading name."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1665(para)
+#: C/index-in.docbook:1743
 msgid ""
 "Scrolled windows have <emphasis>scrollbar policies</emphasis> which "
 "determine whether the <classname>Scrollbar</classname>s will be displayed. "
 "The policies can be set with the <methodname>set_policy()</methodname> "
-"method. The policy may be one of <literal>Gtk::POLICY_AUTOMATIC</literal> or "
-"<literal>Gtk::POLICY_ALWAYS</literal>. <literal>Gtk::POLICY_AUTOMATIC</"
-"literal> will cause the scrolled window to display the scrollbar only if the "
-"contained widget is larger than the visible area. <literal>Gtk::"
-"POLICY_ALWAYS</literal> will cause the scrollbar to be displayed always."
+"method. The policy may be for instance <literal>Gtk::PolicyType::AUTOMATIC</"
+"literal> or <literal>Gtk::PolicyType::ALWAYS</literal>. <literal>Gtk::"
+"PolicyType::AUTOMATIC</literal> will cause the scrolled window to display "
+"the scrollbar only if the contained widget is larger than the visible area. "
+"<literal>Gtk::PolicyType::ALWAYS</literal> will cause the scrollbar to be "
+"displayed always."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1681(para)
+#: C/index-in.docbook:1755
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/";
+"classGtk_1_1ScrolledWindow.html\">Reference</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:1759
 msgid ""
 "Here is a simple example that packs 100 toggle buttons into a "
 "ScrolledWindow. Try resizing the window to see the scrollbars react."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1699(title) C/gtkmm-tutorial-in.xml:1721(title)
+#: C/index-in.docbook:1770
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/scrolledwindow\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:1777 C/index-in.docbook:1799
 msgid "AspectFrame"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1701(para)
+#: C/index-in.docbook:1779
 msgid ""
 "The <classname>AspectFrame</classname> widget looks like a <classname>Frame</"
 "classname> widget, but it also enforces the <emphasis>aspect ratio</"
@@ -2608,86 +3091,90 @@ msgid ""
 "vertically while resizing."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1714(para)
+#: C/index-in.docbook:1788
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/";
+"classGtk_1_1AspectFrame.html\">Reference</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:1792
 msgid ""
 "The following program uses a <classname>Gtk::AspectFrame</classname> to "
 "present a drawing area whose aspect ratio will always be 2:1, no matter how "
 "the user resizes the top-level window."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1734(title) C/gtkmm-tutorial-in.xml:1760(title)
-msgid "Alignment"
+#: C/index-in.docbook:1805
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/aspectframe\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1736(para)
-msgid ""
-"The <classname>Alignment</classname> widget allows you to place a widget at "
-"a position and size relative to the size of the <classname>Alignment</"
-"classname> widget itself. For instance, it might be used to center a widget."
+#: C/index-in.docbook:1812
+msgid "Other Single-item Containers"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1742(para)
+#: C/index-in.docbook:1814
 msgid ""
-"You need to specify the <classname>Alignment</classname>'s characteristics "
-"to the constructor, or to the <methodname>set()</methodname> method. In "
-"particular, you won't notice much effect unless you specify a number other "
-"than 1.0 for the <literal>xscale</literal> and <literal>yscale</literal> "
-"parameters, because 1.0 simply means that the child widget will expand to "
-"fill all available space."
+"There are other single-item containers. See the reference documentation for "
+"a complete list. Here are links to some example programs that show "
+"containers, which are not mentioned elsewhere in this tutorial."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1754(para)
+#: C/index-in.docbook:1820
 msgid ""
-"This example right-aligns a button in a window by using an "
-"<classname>Alignment</classname> widget."
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/expander\">Source Code, Expander</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1768(para)
+#: C/index-in.docbook:1821
 msgid ""
-"See the <link linkend=\"sec-progressbar\">ProgressBar</link> section for "
-"another example that uses an <classname>Alignment</classname>."
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/popover\">Source Code, Popover</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1780(title)
-msgid "Multiple-item widgets"
+#: C/index-in.docbook:1828
+msgid "Multiple-item Containers"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1782(para)
+#: C/index-in.docbook:1830
 msgid ""
-"Multiple-item widgets inherit from <classname>Gtk::Container</classname>; "
-"just as with <classname>Gtk::Bin</classname>, you use the <methodname>add()</"
-"methodname> and <methodname>remove()</methodname> methods to add and remove "
-"contained widgets. Unlike <methodname>Gtk::Bin::remove()</methodname>, "
-"however, the <methodname>remove()</methodname> method for <classname>Gtk::"
-"Container</classname> takes an argument, specifiying which widget to remove."
+"Multiple-item container widgets have other methods than "
+"<methodname>set_child()</methodname> and <methodname>unset_child()</"
+"methodname>. Different containers can have different methods for adding and "
+"removing child widgets. For instance, <classname>Gtk::Box</classname> has "
+"<methodname>append()</methodname> and <methodname>remove()</methodname> as "
+"well as other methods. The <methodname>remove()</methodname> method for "
+"multiple-item containers takes an argument, specifying which widget to "
+"remove."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1792(title)
+#: C/index-in.docbook:1840
 msgid "Packing"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1793(para)
+#: C/index-in.docbook:1841
 msgid ""
 "You've probably noticed that <application>gtkmm</application> windows seem "
 "\"elastic\" - they can usually be stretched in many different ways. This is "
 "due to the <emphasis>widget packing</emphasis> system."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1798(para)
+#: C/index-in.docbook:1846
 msgid ""
 "Many GUI toolkits require you to precisely place widgets in a window, using "
 "absolute positioning, often using a visual editor. This leads to several "
 "problems:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1805(para)
+#: C/index-in.docbook:1853
 msgid ""
 "The widgets don't rearrange themselves when the window is resized. Some "
 "widgets are hidden when the window is made smaller, and lots of useless "
 "space appears when the window is made larger."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1809(para)
+#: C/index-in.docbook:1857
 msgid ""
 "It's impossible to predict the amount of space necessary for text after it "
 "has been translated to other languages, or displayed in a different font. On "
@@ -2695,2119 +3182,1841 @@ msgid ""
 "window manager."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1813(para)
+#: C/index-in.docbook:1861
 msgid ""
 "Changing the layout of a window \"on the fly\", to make some extra widgets "
 "appear, for instance, is complex. It requires tedious recalculation of every "
 "widget's position."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1819(para)
+#: C/index-in.docbook:1867
 msgid ""
 "<application>gtkmm</application> uses the packing system to solve these "
 "problems. Rather than specifying the position and size of each widget in the "
-"window, you can arrange your widgets in rows, columns, and/or tables. "
+"window, you can arrange your widgets in rows, columns, and/or grids. "
 "<application>gtkmm</application> can size your window automatically, based "
 "on the sizes of the widgets it contains. And the sizes of the widgets are, "
 "in turn, determined by the amount of text they contain, or the minimum and "
 "maximum sizes that you specify, and/or how you have requested that the "
 "available space should be shared between sets of widgets. You can perfect "
-"your layout by specifying padding distance and centering values for each of "
-"your widgets. <application>gtkmm</application> then uses all this "
-"information to resize and reposition everything sensibly and smoothly when "
-"the user manipulates the window."
+"your layout by specifying margins and centering values for each of your "
+"widgets. <application>gtkmm</application> then uses all this information to "
+"resize and reposition everything sensibly and smoothly when the user "
+"manipulates the window."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1828(para)
+#: C/index-in.docbook:1876
 msgid ""
 "<application>gtkmm</application> arranges widgets hierarchically, using "
-"<emphasis>containers</emphasis>. A Container widget contains other widgets. "
+"<emphasis>containers</emphasis>. A container widget contains other widgets. "
 "Most <application>gtkmm</application> widgets are containers. Windows, "
 "Notebook tabs, and Buttons are all container widgets. There are two flavours "
-"of containers: single-child containers, which are all descendants of "
-"<classname>Gtk::Bin</classname>, and multiple-child containers, which are "
-"descendants of <classname>Gtk::Container</classname>. Most widgets in "
-"<application>gtkmm</application> are descendants of <classname>Gtk::Bin</"
-"classname>, including <classname>Gtk::Window</classname>."
+"of containers: single-child containers and multiple-child containers. Most "
+"container widgets in <application>gtkmm</application> are single-child "
+"containers, including <classname>Gtk::Window</classname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1839(para)
+#: C/index-in.docbook:1885
 msgid ""
 "Yes, that's correct: a Window can contain at most one widget. How, then, can "
 "we use a window for anything useful? By placing a multiple-child container "
-"in the window. The most useful container widgets are <classname>Gtk:VBox</"
-"classname>, <classname>Gtk::HBox</classname>, and <classname>Gtk::Table</"
-"classname>."
+"in the window. The most useful container widgets are <classname>Gtk::Grid</"
+"classname> and <classname>Gtk::Box</classname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1851(para)
+#: C/index-in.docbook:1896
 msgid ""
-"<classname>Gtk::VBox</classname> and <classname>Gtk::HBox</classname> "
-"arrange their child widgets vertically and horizontally, respectively. Use "
-"<methodname>pack_start()</methodname> and <methodname>pack_end()</"
-"methodname> to insert child widgets."
+"<classname>Gtk::Grid</classname> arranges its child widgets in rows and "
+"columns. Use <methodname>attach()</methodname> and "
+"<methodname>attach_next_to()</methodname> to insert child widgets."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1860(para)
+#: C/index-in.docbook:1904
 msgid ""
-"<classname>Gtk::Table</classname> arranges its widgets in a grid. Use "
-"<methodname>attach()</methodname> to insert widgets."
+"<classname>Gtk::Box</classname> arranges its child widgets vertically or "
+"horizontally. Use <methodname>append()</methodname> to insert child widgets."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1868(para)
+#: C/index-in.docbook:1912
 msgid "There are several other containers, which we will also discuss."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1872(para)
+#: C/index-in.docbook:1916
 msgid ""
 "If you've never used a packing toolkit before, it can take some getting used "
 "to. You'll probably find, however, that you don't need to rely on visual "
 "form editors quite as much as you might with other toolkits."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1882(title)
+#: C/index-in.docbook:1926
 msgid "An improved Hello World"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1884(para)
+#: C/index-in.docbook:1928
 msgid ""
 "Let's take a look at a slightly improved <literal>helloworld</literal>, "
 "showing what we've learnt."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1889(title)
+#: C/index-in.docbook:1933
 msgid "Hello World 2"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1897(para)
+#: C/index-in.docbook:1939
 msgid ""
-"After building and running this program, try resizing the window to see the "
-"behaviour. Also, try playing with the options to <methodname>pack_start()</"
-"methodname> while reading the <link linkend=\"sec-boxes\">Boxes</link> "
-"section."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:1907(title)
-msgid "STL-style APIs"
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/helloworld2\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1909(para)
+#: C/index-in.docbook:1941
 msgid ""
-"TODO: Use 'Standard Library' instead of STL. If you're an accomplished C++ "
-"programmer, you'll be happy to hear that most of the <application>gtkmm</"
-"application><classname>Container</classname> widgets provide STL-style APIs, "
-"available via accessor methods, such as <methodname>Gtk::Box::children()</"
-"methodname> or <methodname>Gtk::Notebook::pages()</methodname>. They don't "
-"use actual STL containers (there are good reasons for this), but they look, "
-"feel, and act much like STL container classes."
+"After building and running this program, try resizing the window to see the "
+"behaviour. Also, try playing with <methodname>set_expand()</methodname>, "
+"<methodname>set_hexpand()</methodname>, <methodname>set_vexpand()</"
+"methodname>, <methodname>set_halign()</methodname> and "
+"<methodname>set_valign()</methodname> while reading the <link linkend=\"sec-"
+"boxes\">Boxes</link> section."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1920(para)
-msgid ""
-"These APIs are so similar to STL container APIs that, rather than explaining "
-"them in detail, we can refer you to the STL documentation for most of their "
-"methods. This is all part of <application>gtkmm</application>'s policy of "
-"reusing existing standards."
+#: C/index-in.docbook:1952
+msgid "Boxes"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1924(para)
+#: C/index-in.docbook:1954
 msgid ""
-"However, STL-style APIs can require awkward or lengthy code in some "
-"situations, so some people prefer not to use them, while other people use "
-"them religiously. Therefore, you are not forced to use them - most container "
-"widgets have a simpler non-STL-style API, with methods such as "
-"<methodname>append()</methodname> and <methodname>prepend()</methodname>."
+"Most packing uses boxes as in the above example. These are invisible "
+"containers into which we can pack our widgets. When packing widgets into a "
+"horizontal box, the objects are inserted horizontally from left to right. In "
+"a vertical box, widgets are packed from top to bottom. You may use any "
+"combination of boxes inside or beside other boxes to create the desired "
+"effect."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1938(para)
-msgid ""
-"<methodname>begin()</methodname> returns a <literal>begin</literal> iterator"
+#: C/index-in.docbook:1963
+msgid "Adding widgets"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1944(para)
-msgid ""
-"<methodname>end()</methodname> returns an <literal>end</literal> iterator"
+#: C/index-in.docbook:1964
+msgid "Per-child packing options"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1950(para)
+#: C/index-in.docbook:1965
 msgid ""
-"<methodname>rbegin()</methodname> returns a reverse <literal>begin</literal> "
-"iterator"
+"The <methodname>append()</methodname> method places widgets inside these "
+"containers. It will start at the top and work its way down in a "
+"<classname>Box</classname> with vertical orientation, or pack left to right "
+"in a <classname>Box</classname> with horizontal orientation. If it's "
+"inconvenient to add widgets in this order, use "
+"<methodname>insert_child_after()</methodname> or "
+"<methodname>insert_child_at_start()</methodname>. We will use "
+"<methodname>append()</methodname> in our examples."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1956(para)
+#: C/index-in.docbook:1975
 msgid ""
-"<methodname>rend()</methodname> returns a reverse <literal>end</literal> "
-"iterator"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:1963(methodname)
-msgid "size()"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:1969(methodname)
-msgid "max_size()"
+"There are several options governing how widgets are to be packed, and this "
+"can be confusing at first. You can modify the packing by using "
+"<methodname>set_expand()</methodname>, <methodname>set_hexpand()</"
+"methodname>, <methodname>set_vexpand()</methodname>, "
+"<methodname>set_halign()</methodname>, <methodname>set_valign()</methodname> "
+"and/or <methodname>set_margin()</methodname> on the child widgets. If you "
+"have difficulties, then it is sometimes a good idea to play with the "
+"<application>glade</application> GUI designer to see what is possible. You "
+"might even decide to use the <classname>Gtk::Builder</classname> API to load "
+"your GUI at runtime."
+msgstr ""
+
+#: C/index-in.docbook:1987
+msgid "There are basically five different styles, as shown in this picture:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1975(methodname)
-msgid "empty()"
+#: C/index-in.docbook:1993
+msgid "Box Packing 1"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1981(methodname)
-msgid "insert()"
+#: C/index-in.docbook:1999
+msgid ""
+"Each line contains one horizontal <classname>Box</classname> with several "
+"buttons. Each of the buttons on a line is packed into the <classname>Box</"
+"classname> with the same arguments to the <methodname>set_hexpand()</"
+"methodname>, <methodname>set_halign()</methodname>, "
+"<methodname>set_margin_start()</methodname> and "
+"<methodname>set_margin_end()</methodname> methods."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1987(methodname)
-msgid "push_front()"
+#: C/index-in.docbook:2008
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1Box.html";
+"\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1993(methodname)
-msgid "push_back()"
+#: C/index-in.docbook:2012
+msgid "Per-container packing options"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1999(methodname)
-msgid "pop_front()"
+#: C/index-in.docbook:2016
+#, no-wrap
+msgid ""
+"Gtk::Box(Gtk::Orientation orientation = Gtk::Orientation::HORIZONTAL, int spacing = 0);\n"
+"void set_orientation(Gtk::Orientation orientation);\n"
+"void set_spacing(int spacing);\n"
+"void set_homogeneous(bool homogeneous = true);"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2005(methodname)
-msgid "pop_back()"
+#: C/index-in.docbook:2013
+msgid ""
+"Here's the constructor for the <classname>Box</classname> widget, and "
+"methods that set per-container packing options: <_:programlisting-1/> "
+"Passing <literal>true</literal> to <methodname>set_homogeneous()</"
+"methodname> will cause all of the contained widgets to be the same size. "
+"<parameter>spacing</parameter> is a (minimum) number of pixels to leave "
+"between each widget."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2011(methodname)
-msgid "clear()"
+#: C/index-in.docbook:2026
+msgid ""
+"What's the difference between spacing (set when the box is created) and "
+"margins (set separately for each child widget)? Spacing is added between "
+"objects, and margins are added on one or more sides of a widget. The "
+"following figure should make it clearer. The shown margins are the left and "
+"right margins of each button in the row."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2017(methodname)
-msgid "erase()"
+#: C/index-in.docbook:2035
+msgid "Box Packing 2"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2023(methodname)
-msgid "remove()"
+#: C/index-in.docbook:2045
+msgid "Gtk::Application and command-line options"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2029(methodname)
-msgid "find()"
+#: C/index-in.docbook:2046
+msgid ""
+"The following example program requires a command-line option. The source "
+"code shows two ways of handling command-line options in combination with "
+"<classname>Gtk::Application</classname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2035(methodname)
-msgid "front()"
+#: C/index-in.docbook:2052
+msgid ""
+"Handle the options in <function>main()</function> and hide them from "
+"<classname>Gtk::Application</classname> by setting <literal>argc = 1</"
+"literal> in the call to <methodname>Gtk::Application::run()</methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2041(methodname)
-msgid "back()"
+#: C/index-in.docbook:2058
+msgid ""
+"Give all command-line options to <methodname>Gtk::Application::run()</"
+"methodname> and add the flag <literal>Gio::Application::Flags::"
+"HANDLES_COMMAND_LINE</literal> to <methodname>Gtk::Application::create()</"
+"methodname>. Connect a signal handler to the <literal>command_line</literal> "
+"signal, and handle the command-line options in the signal handler."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:1932(para)
+#: C/index-in.docbook:2065
 msgid ""
-"At a minimum, <application>gtkmm</application> container lists support "
-"iterators and the usual insertion, deletion, and addition methods. You can "
-"always expect the following methods to be available for <application>gtkmm</"
-"application> STL-style APIs: <placeholder-1/>"
+"You must set the optional parameter <literal>after = false</literal> in the "
+"call to <literal>signal_command_line().connect()</literal>, because your "
+"signal handler must be called before the default signal handler. You must "
+"also call <methodname>Gio::Application::activate()</methodname> in the "
+"signal handler, unless you want your application to exit without showing its "
+"main window. (<classname>Gio::Application</classname> is a base class of "
+"<classname>Gtk::Application</classname>.)"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2049(para)
+#: C/index-in.docbook:2078
 msgid ""
-"Also, the <literal>[]</literal> operator is overloaded, but that is usually "
-"order N, so if performance is a consideration, or the list has a large "
-"number of elements, think carefully before using it."
+"Here is the source code for the example that produced the screenshots above. "
+"When you run this example, provide a number between 1 and 3 as a command-"
+"line option, to see different packing options in use."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2055(para)
+#: C/index-in.docbook:2081
 msgid ""
-"The element objects and list objects are defined, for each container, in a "
-"namespace whose name ends in <literal>_Helpers</literal>. For example, the "
-"helper namespace for the notebook widget is <classname>Gtk::"
-"Notebook_Helpers</classname>."
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/box\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2063(title)
-msgid "Adding items"
+#: C/index-in.docbook:2087 C/index-in.docbook:2116
+msgid "Grid"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2064(para)
+#: C/index-in.docbook:2089
 msgid ""
-"There is a major difference between <application>gtkmm</application> STL-"
-"style APIs and real STL containers. Normally, when you use a <classname>std::"
-"vector</classname>, for example, you expect that whatever you put in, you'll "
-"get out, unmodified. You wouldn't make a <classname>std::vector&lt;int&gt;</"
-"classname> and expect to get <literal>double</literal>s out of it. But, "
-"<application>gtkmm</application> STL-style APIs don't always work like that "
-"- you will often put one kind of object in, and later get a different kind "
-"out. Why this odd behaviour?"
+"A <classname>Grid</classname> dynamically lays out child widgets in rows and "
+"columns. The dimensions of the grid do not need to be specified in the "
+"constructor."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2074(para)
+#: C/index-in.docbook:2094
 msgid ""
-"Consider a menu widget, which must maintain a hierarchical list of menus and "
-"menu items. Menus can only contain certain objects, such as menu items, "
-"separators, and submenus. To ensure consistency, a \"filter\" is needed to "
-"keep out illegal objects. Also, since only a few types of objects are "
-"allowed, convenience methods can be provided to make it easy to build up "
-"menus."
+"Child widgets can span multiple rows or columns, using <methodname>attach()</"
+"methodname>, or added next to an existing widget inside the grid with "
+"<methodname>attach_next_to()</methodname>. Individual rows and columns of "
+"the grid can be set to have uniform height or width with "
+"<methodname>set_row_homogeneous()</methodname> and "
+"<methodname>set_column_homogeneous()</methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2083(para)
+#: C/index-in.docbook:2101
 msgid ""
-"<application>gtkmm</application> takes care of both requirements using "
-"special <emphasis>helper elements</emphasis>. Helper elements are temporary "
-"- they're typically constructed and passed to an insertion method in the "
-"same call. The list insertion method uses the information in the helper "
-"element to construct the real object, which is then inserted into the "
-"container."
+"You can set the <emphasis>margin</emphasis> and <emphasis>expand</emphasis> "
+"properties of the child <classname>Widget</classname>s to control their "
+"spacing and their behaviour when the Grid is resized."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2091(para)
+#: C/index-in.docbook:2105
 msgid ""
-"As an example, let's look at the <classname>Notebook</classname> widget "
-"(explained in the section on <link linkend=\"sec-notebook\">Notebooks</"
-"link>). <classname>Notebook</classname> widgets contain a series of \"pages"
-"\"."
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1Grid.html";
+"\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2097(para)
+#: C/index-in.docbook:2108
 msgid ""
-"Each page in a notebook requires, at minimum, the following information:"
+"This example creates a window with three buttons in a grid. The first two "
+"buttons are in the upper row, from left to right. A third button is attached "
+"underneath the first button, in a new lower row, spanning two columns."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2105(para)
-msgid "A child widget (zero or one), to be placed in the page"
+#: C/index-in.docbook:2122
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/grid\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2111(para)
-msgid "A label for the page's tab"
+#: C/index-in.docbook:2129 C/index-in.docbook:2164
+msgid "Notebook"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2118(para)
+#: C/index-in.docbook:2131
 msgid ""
-"(The <application>gtkmm</application> notebook widget keeps other data for "
-"each page as well.)"
+"A <classname>Notebook</classname> has a set of stacked <literal>pages</"
+"literal>, each of which contains widgets. Labelled <literal>tabs</literal> "
+"allow the user to select the pages. <classname>Notebook</classname>s allow "
+"several sets of widgets to be placed in a small space, by only showing one "
+"page at a time. For instance, they are often used in preferences dialogs."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2122(para)
+#: C/index-in.docbook:2140
 msgid ""
-"To insert a new page in a notebook, we can use one of the notebook helper "
-"classes, like this:"
+"Use the <methodname>append_page()</methodname>, <methodname>prepend_page()</"
+"methodname> and <methodname>insert_page()</methodname> methods to add tabbed "
+"pages to the <literal>Notebook</literal>, supplying the child widget and the "
+"name for the tab."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2126(programlisting)
-#, no-wrap
+#: C/index-in.docbook:2147
 msgid ""
-"notebook-&gt;pages().push_back(\n"
-"          Gtk::Notebook_Helpers::TabElem(*frame, bufferl));"
+"To discover the currently visible page, use the "
+"<methodname>get_current_page()</methodname> method. This returns the page "
+"number, and then calling <methodname>get_nth_page()</methodname> with that "
+"number will give you a pointer to the actual child widget."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2129(para)
+#: C/index-in.docbook:2154
 msgid ""
-"Let's see what's going on here. Assume we have a pointer to a "
-"<classname>Notebook</classname> widget called <literal>notebook</literal>; "
-"we go from that to a member method called <methodname>pages()</methodname>, "
-"which returns an STL-like list object. On this we call the method "
-"<methodname>push_back()</methodname> (this should be familiar to those who "
-"know STL)."
+"To programmatically change the selected page, use the "
+"<methodname>set_current_page()</methodname> method."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2138(para)
+#: C/index-in.docbook:2159
 msgid ""
-"The object that the <methodname>pages()</methodname> method returns is "
-"called a <classname>Notebook_Helpers::PageList</classname>. It's one of the "
-"STL-like containers that we keep referring to. Let's take a look at this "
-"class (this has been heavily edited for clarity; see <filename>&lt;gtkmm/"
-"notebook.h&gt;</filename> for the actual definition):"
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1Notebook.";
+"html\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2146(programlisting)
-#, no-wrap
+#: C/index-in.docbook:2170
 msgid ""
-"namespace Notebook_Helpers\n"
-"{\n"
-"    class PageList\n"
-"    {\n"
-"    public:\n"
-"             . . .\n"
-"        void push_back(const Element&amp; e);\n"
-"             . . .\n"
-"        Page* operator[](size_type l);\n"
-"    };\n"
-"};"
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/notebook/\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2163(para)
-msgid ""
-"The <methodname>push_back()</methodname> method takes as argument an "
-"<classname>Element</classname> object (helper);"
+#: C/index-in.docbook:2177 C/index-in.docbook:2204
+msgid "Assistant"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2170(para)
+#: C/index-in.docbook:2179
 msgid ""
-"The overloaded <literal>[]</literal> operator returns a pointer to a "
-"<classname>Page</classname>."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:2158(para)
-msgid "There are two important things to notice here: <placeholder-1/>"
+"An <classname>Assistant</classname> splits a complex operation into steps. "
+"Each step is a page, containing a header, a child widget and an action area. "
+"The Assistant's action area has navigation buttons which update "
+"automatically depending on the type of the page, set with "
+"<methodname>set_page_type()</methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2180(para)
-msgid "This scheme has some important advantages:"
+#: C/index-in.docbook:2183
+msgid ""
+"Use the <methodname>append_page()</methodname>, <methodname>prepend_page</"
+"methodname> and <methodname>insert_page()</methodname> methods to add pages "
+"to the <classname>Assistant</classname>, supplying the child widget for each "
+"page."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2187(para)
+#: C/index-in.docbook:2187
 msgid ""
-"We can provide as many different Helper objects as desired, making it simple "
-"to construct complex widgets like Menus."
+"To determine the currently-visible page, use the "
+"<methodname>get_current_page()</methodname> method, and pass the result to "
+"<methodname>get_nth_page()</methodname>, which returns a pointer to the "
+"actual widget. To programmatically change the current page, use the "
+"<methodname>set_current_page()</methodname> method."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2195(para)
+#: C/index-in.docbook:2191
 msgid ""
-"Construction of the actual objects can be delayed until an appropriate time. "
-"Sometimes we don't have enough information until later with GTK+."
+"To set the title of a page, use the <methodname>set_page_title()</"
+"methodname> method."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2202(para)
+#: C/index-in.docbook:2195
 msgid ""
-"The definitions of the objects contained in the list can change; their "
-"interfaces need not concern the programmer. For example, even if the "
-"<classname>Page</classname> object changes drastically, the programmer need "
-"not be concerned; the <classname>Element</classname>s need not change, and "
-"will continue to work as expected."
+"To add widgets to the action area, use the <methodname>add_action_widget()</"
+"methodname> method. They will be packed alongside the default buttons. Use "
+"the <methodname>remove_action_widget()</methodname> method to remove widgets."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2212(para)
+#: C/index-in.docbook:2199
 msgid ""
-"New <classname>Element</classname> objects can be added at any time to "
-"support new features, without breaking existing code."
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1Assistant.";
+"html\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2220(para)
+#: C/index-in.docbook:2210
 msgid ""
-"All multi-item containers have an <classname>Element</classname> object in "
-"their helper namespaces, and usually there are additional classes available "
-"(like <classname>TabElem</classname> and <classname>MenuElem</classname>) "
-"which derive from <classname>Element</classname>. <classname>Element</"
-"classname> classes vary from container to container, since each contains "
-"different kinds of objects."
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/assistant/\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2229(para)
-msgid ""
-"It's very important to remember that <classname>Element</classname>s are not "
-"\"real\" objects. They exist only temporarily, and they are never stored in "
-"the container. They are used <emphasis>only</emphasis> as temporary "
-"\"parameter-holders\". Therefore, the following segment of code is illegal:"
+#: C/index-in.docbook:2217
+msgid "Other Multi-item Containers"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2235(programlisting)
-#, no-wrap
+#: C/index-in.docbook:2219
 msgid ""
-"MenuElem* m = new MenuElem(\"hello\");\n"
-"m-&gt;right_justify();\n"
-"items().push_back(*m);"
+"There are other multi-item containers. See the reference documentation for a "
+"complete list. Here are links to some example programs that show containers, "
+"which are not mentioned elsewhere in this tutorial."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2239(para)
+#: C/index-in.docbook:2225
 msgid ""
-"We constructed a new <classname>MenuElem</classname> helper object, and then "
-"tried to invoke <methodname>right_justify()</methodname> on it before adding "
-"it to the menu. The trouble is that there is no <methodname>right_justify()</"
-"methodname> method in the <classname>MenuElem</classname> class. The correct "
-"way to accomplish this would be:"
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/actionbar\">Source Code, ActionBar</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2247(programlisting)
-#, no-wrap
+#: C/index-in.docbook:2226
 msgid ""
-"items().push_back(MenuElem(\"hello\"));\n"
-"items().back()-&gt;right_justify();"
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/flowbox\">Source Code, FlowBox</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2250(para)
+#: C/index-in.docbook:2227
 msgid ""
-"Here, we've constructed a <classname>MenuElem</classname> and inserted it "
-"into the menu by passing it to <methodname>push_back()</methodname>, causing "
-"the real menu item to be created. We've then called <methodname>right_justify"
-"()</methodname> on the object retrieved from the list. This is correct - the "
-"object retrieved from the list is not a <classname>MenuElem</classname>, but "
-"a real <classname>MenuItem</classname>, and therefore supports the "
-"<methodname>right_justify()</methodname> method as expected."
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/iconview\">Source Code, IconView</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2266(title)
-msgid "Boxes"
+#: C/index-in.docbook:2237
+msgid "The TreeView widget"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2268(para)
+#: C/index-in.docbook:2238
 msgid ""
-"Most packing uses boxes as in the above example. These are invisible "
-"containers into which we can pack our widgets. When packing widgets into a "
-"horizontal box, the objects are inserted horizontally from left to right or "
-"right to left depending on whether <methodname>pack_start()</methodname> or "
-"<methodname>pack_end()</methodname> is used. In a vertical box, widgets are "
-"packed from top to bottom or vice versa. You may use any combination of "
-"boxes inside or beside other boxes to create the desired effect."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:2279(title) C/gtkmm-tutorial-in.xml:2478(title)
-msgid "Adding widgets"
+"The <classname>Gtk::TreeView</classname> widget can contain lists or trees "
+"of data, in columns."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2280(title)
-msgid "Per-child packing options"
+#: C/index-in.docbook:2244
+msgid "The Model"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2281(para)
+#: C/index-in.docbook:2245
 msgid ""
-"The <methodname>pack_start()</methodname> and <methodname>pack_end()</"
-"methodname> methods place widgets inside these containers. The "
-"<methodname>pack_start()</methodname> method will start at the top and work "
-"its way down in a <classname>VBox</classname>, or pack left to right in an "
-"<classname>HBox</classname>. <methodname>pack_end()</methodname> will do the "
-"opposite, packing from bottom to top in a <classname>VBox</classname>, or "
-"right to left in an <classname>HBox</classname>. Using these methods allows "
-"us to right justify or left justify our widgets. We will use "
-"<methodname>pack_start()</methodname> in most of our examples."
+"Each <classname>Gtk::TreeView</classname> has an associated <classname>Gtk::"
+"TreeModel</classname>, which contains the data displayed by the "
+"<classname>TreeView</classname>. Each <classname>Gtk::TreeModel</classname> "
+"can be used by more than one <classname>Gtk::TreeView</classname>. For "
+"instance, this allows the same underlying data to be displayed and edited in "
+"2 different ways at the same time. Or the 2 Views might display different "
+"columns from the same Model data, in the same way that 2 SQL queries (or "
+"\"views\") might show different fields from the same database table."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2294(para)
+#: C/index-in.docbook:2255
 msgid ""
-"There are several options governing how widgets are to be packed, and this "
-"can be confusing at first. If you have difficulties then it is sometimes a "
-"good idea to play with the <application>glade</application> GUI designer to "
-"see what is possible. You might even decide to use the <application>Gtk::"
-"Builder</application> API to load your GUI at runtime."
+"Although you can theoretically implement your own Model, you will normally "
+"use either the <classname>ListStore</classname> or <classname>TreeStore</"
+"classname> model classes."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2302(para)
-msgid "There are basically five different styles, as shown in this picture:"
+#: C/index-in.docbook:2261
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1TreeModel.";
+"html\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2308(title)
-msgid "Box Packing 1"
+#: C/index-in.docbook:2264
+msgid "ListStore, for rows"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2314(para)
+#: C/index-in.docbook:2265
 msgid ""
-"Each line contains one horizontal box (<classname>HBox</classname>) with "
-"several buttons. Each of the buttons on a line is packed into the "
-"<classname>HBox</classname> with the same arguments to the "
-"<methodname>pack_start()</methodname> method)."
+"The <classname>ListStore</classname> contains simple rows of data, and each "
+"row has no children."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2321(para)
-msgid ""
-"This is the declaration of the <methodname>pack_start()</methodname> method:"
+#: C/index-in.docbook:2271 C/index-in.docbook:2839
+msgid "TreeView - ListStore"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2324(programlisting)
-#, no-wrap
+#: C/index-in.docbook:2277
 msgid ""
-"void pack_start(Gtk::Widget&amp; child,\n"
-"                PackOptions options = PACK_EXPAND_WIDGET,\n"
-"                guint padding = 0);"
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1ListStore.";
+"html\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2328(para)
-msgid ""
-"The first argument is the widget you're packing. In our example these are "
-"all <classname>Button</classname>s."
+#: C/index-in.docbook:2282
+msgid "TreeStore, for a hierarchy"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2335(para)
+#: C/index-in.docbook:2283
 msgid ""
-"<literal>PACK_SHRINK</literal>: Space is contracted to the child widget "
-"size. The widget will take up just-enough space and never expand."
+"The <classname>TreeStore</classname> contains rows of data, and each row may "
+"have child rows."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2336(para)
-msgid ""
-"<literal>PACK_EXPAND_PADDING</literal>: Extra space is filled with padding. "
-"The widgets will be spaced out evenly, but their sizes won't change - there "
-"will be empty space between the widgets instead."
+#: C/index-in.docbook:2289 C/index-in.docbook:2858
+msgid "TreeView - TreeStore"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2337(para)
+#: C/index-in.docbook:2295
 msgid ""
-"<literal>PACK_EXPAND_WIDGET</literal>: Extra space is taken up by increasing "
-"the child widget size, without changing the amount of space between widgets."
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1TreeStore.";
+"html\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2332(para)
-msgid ""
-"The <parameter>options</parameter> argument can take one of these three "
-"options: <placeholder-1/>"
+#: C/index-in.docbook:2300
+msgid "Model Columns"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2341(para)
+#: C/index-in.docbook:2301
 msgid ""
-"The <parameter>padding</parameter> argument specifies the width of an extra "
-"border area to leave around the packed widget."
+"The <classname>TreeModelColumnRecord</classname> class is used to keep track "
+"of the columns and their data types. You add <classname>TreeModelColumn</"
+"classname> instances to the <classname>ColumnRecord</classname> and then use "
+"those <classname>TreeModelColumns</classname> when getting and setting the "
+"data in model rows. You will probably find it convenient to derive a new "
+"<classname>TreeModelColumnRecord</classname> which has your "
+"<classname>TreeModelColumn</classname> instances as member data."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2346(para)
+#: C/index-in.docbook:2312
+#, no-wrap
 msgid ""
-"Instead of the <methodname>pack_start()</methodname> and <methodname>pack_end"
-"()</methodname> methods, you might prefer to use the STL-style API, "
-"available via the <literal>children</literal> method. See the <link linkend="
-"\"sec-stl-style\">STL-style APIs</link> section for more details."
+"class ModelColumns : public Gtk::TreeModelColumnRecord\n"
+"{\n"
+"public:\n"
+"\n"
+"  ModelColumns()\n"
+"    { add(m_col_text); add(m_col_number); }\n"
+"\n"
+"  Gtk::TreeModelColumn&lt;Glib::ustring&gt; m_col_text;\n"
+"  Gtk::TreeModelColumn&lt;int&gt; m_col_number;\n"
+"};\n"
+"\n"
+"ModelColumns m_Columns;"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2357(title)
-msgid "Per-container packing options"
+#: C/index-in.docbook:2325
+msgid ""
+"You specify the <classname>ColumnRecord</classname> when creating the Model, "
+"like so:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2360(programlisting)
+#: C/index-in.docbook:2329
 #, no-wrap
-msgid "Gtk::Box(bool homogeneous = false, int spacing = 0);"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:2358(para)
 msgid ""
-"Here's the constructor for the box widgets: <placeholder-1/> Passing "
-"<literal>true</literal> for <parameter>homogeneous</parameter> will cause "
-"all of the contained widgets to be the same size. <parameter>spacing</"
-"parameter> is a (minimum) number of pixels to leave between each widget."
+"Glib::RefPtr&lt;Gtk::ListStore&gt; refListStore =\n"
+"    Gtk::ListStore::create(m_Columns);"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2367(para)
+#: C/index-in.docbook:2331
 msgid ""
-"What's the difference between spacing (set when the box is created) and "
-"padding (set when elements are packed)? Spacing is added between objects, "
-"and padding is added on either side of a widget. The following figure should "
-"make it clearer:"
+"As a <classname>TreeModelColumnRecord</classname> describes structure, not "
+"data, it can be shared among multiple models, and this is preferable for "
+"efficiency. However, the instance (such as <varname>m_Columns</varname> "
+"here) should usually not be static, because it often needs to be "
+"instantiated after <application>glibmm</application> has been initialized. "
+"The best solution is to make it a lazily instantiated singleton, so that it "
+"will be constructed on-demand, whenever the first model accesses it."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2375(title)
-msgid "Box Packing 2"
+#: C/index-in.docbook:2343
+msgid "Adding Rows"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2386(para)
+#: C/index-in.docbook:2344
 msgid ""
-"Here is the source code for the example that produced the screenshots above. "
-"When you run this example, provide a number between 1 and 3 as a command-"
-"line option, to see different packing options in use."
+"Add rows to the model with the <methodname>append()</methodname>, "
+"<methodname>prepend()</methodname>, or <methodname>insert()</methodname> "
+"methods."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2395(title)
-msgid "ButtonBoxes"
+#: C/index-in.docbook:2348
+#, no-wrap
+msgid "auto iter = m_refListStore-&gt;append();"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2397(para)
-msgid ""
-"Button boxes are a convenient way to quickly arrange a group of buttons. "
-"They come in both horizontal (<classname>Gtk::HButtonBox</classname>) and "
-"vertical (<classname>Gtk::VButtonBox</classname>) flavours. They are exactly "
-"alike, except in name and orientation."
+#: C/index-in.docbook:2349
+msgid "You can dereference the iterator to get the Row:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2404(para)
-msgid ""
-"<classname>ButtonBox</classname>es help to make applications appear "
-"consistent because they use standard settings, such as inter-button spacing "
-"and packing."
+#: C/index-in.docbook:2351
+#, no-wrap
+msgid "auto row = *iter;"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2409(para)
-msgid ""
-"Buttons are added to a <classname>ButtonBox</classname> with the "
-"<methodname>add()</methodname> method."
+#: C/index-in.docbook:2352
+msgid "Adding child rows"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2414(para)
+#: C/index-in.docbook:2353
 msgid ""
-"Button boxes support several layout styles. The style can be retrieved and "
-"changed using <methodname>get_layout()</methodname> and "
-"<methodname>set_layout()</methodname>."
+"<classname>Gtk::TreeStore</classname> models can have child items. Add them "
+"with the <methodname>append()</methodname>, <methodname>prepend()</"
+"methodname>, or <methodname>insert()</methodname> methods, like so:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2426(title)
-msgid "ButtonBox"
+#: C/index-in.docbook:2358
+#, no-wrap
+msgid ""
+"auto iter_child =\n"
+"    m_refTreeStore-&gt;append(row.children());"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2439(title) C/gtkmm-tutorial-in.xml:2585(title)
-msgid "Table"
+#: C/index-in.docbook:2365
+msgid "Setting values"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2441(para)
-msgid "Tables allows us to place widgets in a grid."
+#: C/index-in.docbook:2366
+msgid ""
+"You can use the <methodname>operator[]</methodname> overload to set the data "
+"for a particular column in the row, specifying the "
+"<classname>TreeModelColumn</classname> used to create the model."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2445(title)
-msgid "Constructor"
+#: C/index-in.docbook:2371
+#, no-wrap
+msgid "row[m_Columns.m_col_text] = \"sometext\";"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2446(para)
-msgid "The grid's dimensions need to be specified in the constructor:"
+#: C/index-in.docbook:2375
+msgid "Getting values"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2449(programlisting)
-#, no-wrap
-msgid "Gtk::Table(int rows = 1, int columns = 1, bool homogeneous = false);"
+#: C/index-in.docbook:2376
+msgid ""
+"You can use the <methodname>operator[]</methodname> overload to get the data "
+"in a particular column in a row, specifying the <classname>TreeModelColumn</"
+"classname> used to create the model."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2451(para)
+#: C/index-in.docbook:2381
+#, no-wrap
 msgid ""
-"The first argument is the number of rows to make in the table, while the "
-"second, obviously, is the number of columns. If <parameter>homogeneous</"
-"parameter> is <literal>true</literal>, the table cells will all be the same "
-"size (the size of the largest widget in the table)."
+"auto strText = row[m_Columns.m_col_text];\n"
+"auto number = row[m_Columns.m_col_number];"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2458(para)
+#: C/index-in.docbook:2383
 msgid ""
-"The rows and columns are indexed starting at 0. If you specify "
-"<parameter>rows</parameter> = 2 and <parameter>columns</parameter> = 2, the "
-"layout would look something like this:"
+"The compiler will complain if you use an inappropriate type. For instance, "
+"this would generate a compiler error:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2464(programlisting)
+#: C/index-in.docbook:2387
 #, no-wrap
 msgid ""
-"\n"
-" 0          1          2\n"
-"0+----------+----------+\n"
-" |          |          |\n"
-"1+----------+----------+\n"
-" |          |          |\n"
-"2+----------+----------+\n"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:2473(para)
-msgid "Note that the coordinate system starts in the upper left hand corner."
+"//compiler error - no conversion from ustring to int.\n"
+"int number = row[m_Columns.m_col_text];"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2479(para)
-msgid "To place a widget into a box, use the following method:"
+#: C/index-in.docbook:2392
+msgid "\"Hidden\" Columns"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2482(programlisting)
-#, no-wrap
+#: C/index-in.docbook:2393
 msgid ""
-"void Gtk::Table::attach(Gtk::Widget&amp; child,\n"
-"                        guint left_attach, guint right_attach,\n"
-"                        guint top_attach, guint bottom_attach,\n"
-"                        guint xoptions = Gtk::FILL | Gtk::EXPAND,\n"
-"                        guint yoptions = Gtk::FILL | Gtk::EXPAND,\n"
-"                        guint xpadding = 0, guint ypadding = 0);"
+"You might want to associate extra data with each row. If so, just add it as "
+"a Model column, but don't add it to the View."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2488(para)
-msgid "The first argument is the widget you wish to place in the table."
+#: C/index-in.docbook:2402 C/index-in.docbook:3248
+msgid "The View"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2492(para)
+#: C/index-in.docbook:2403
 msgid ""
-"The <parameter>left_attach</parameter> and <parameter>right_attach</"
-"parameter> arguments specify where to place the widget, and how many boxes "
-"to use. For example, if you want a button in the lower-right cell of a 2 x 2 "
-"table, and want it to occupy that cell <emphasis>only</emphasis>, then "
-"<parameter>left_attach</parameter> would be 1, <parameter>right_attach</"
-"parameter> 2, <parameter>top_attach</parameter> 1, and "
-"<parameter>bottom_attach</parameter> 2. If, on the other hand, you wanted a "
-"widget to take up the entire top row of our 2 x 2 table, you'd set "
-"<parameter>left_attach</parameter> = 0, <parameter>right_attach</parameter> "
-"= 2, <parameter>top_attach</parameter> = 0, and <parameter>bottom_attach</"
-"parameter> = 1."
+"The View is the actual widget (<classname>Gtk::TreeView</classname>) that "
+"displays the model (<classname>Gtk::TreeModel</classname>) data and allows "
+"the user to interact with it. The View can show all of the model's columns, "
+"or just some, and it can show them in various ways."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2508(para)
+#: C/index-in.docbook:2410
 msgid ""
-"<parameter>xoptions</parameter> and <parameter>yoptions</parameter> are used "
-"to specify packing options and may be bitwise ORed together to allow "
-"multiple options. These options are:"
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1TreeView.";
+"html\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2518(literal)
-msgid "Gtk::FILL"
+#: C/index-in.docbook:2413
+msgid "Using a Model"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2520(para)
+#: C/index-in.docbook:2414
 msgid ""
-"If the table box is larger than the widget, and <literal>Gtk::FILL</literal> "
-"is specified, the widget will expand to use all the room available."
+"You can specify a <classname>Gtk::TreeModel</classname> when constructing "
+"the <classname>Gtk::TreeView</classname>, or you can use the "
+"<methodname>set_model()</methodname> method, like so:"
+msgstr ""
+
+#: C/index-in.docbook:2419
+#, no-wrap
+msgid "m_TreeView.set_model(m_refListStore);"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2528(literal)
-msgid "Gtk::SHRINK"
+#: C/index-in.docbook:2423
+msgid "Adding View Columns"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2530(para)
+#: C/index-in.docbook:2424
 msgid ""
-"If the table widget is allocated less space than it requested (because the "
-"user resized the window), then the widgets will normally just disappear off "
-"the bottom of the window. If <literal>Gtk::SHRINK</literal> is specified, "
-"the widgets will shrink with the table."
+"You can use the <methodname>append_column()</methodname> method to tell the "
+"View that it should display certain Model columns, in a certain order, with "
+"a certain column title."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2541(literal)
-msgid "Gtk::EXPAND"
+#: C/index-in.docbook:2429
+#, no-wrap
+msgid "m_TreeView.append_column(\"Messages\", m_Columns.m_col_text);"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2543(para)
+#: C/index-in.docbook:2430
 msgid ""
-"This will cause the table to expand to use up anyremaining space in the "
-"window."
+"When using this simple <methodname>append_column()</methodname> overload, "
+"the <classname>TreeView</classname> will display the model data with an "
+"appropriate <classname>CellRenderer</classname>. For instance, strings and "
+"numbers are shown in a simple <classname>Gtk::Entry</classname> widget, and "
+"booleans are shown in a <classname>Gtk::CheckButton</classname>. This is "
+"usually what you need. For other column types you must either connect a "
+"callback that converts your type into a string representation, with "
+"<methodname>TreeViewColumn::set_cell_data_func()</methodname>, or derive a "
+"custom <classname>CellRenderer</classname>. Note that (unsigned) short is "
+"not supported by default - You could use (unsigned) int or (unsigned) long "
+"as the column type instead."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2551(para)
-msgid ""
-"The padding arguments work just as they do for <methodname>pack_start()</"
-"methodname>."
+#: C/index-in.docbook:2446
+msgid "More than one Model Column per View Column"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2557(title)
-msgid "Other methods"
+#: C/index-in.docbook:2447
+msgid ""
+"To render more than one model column in a view column, you need to create "
+"the <classname>TreeView::Column</classname> widget manually, and use "
+"<methodname>pack_start()</methodname> to add the model columns to it."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2559(para)
+#: C/index-in.docbook:2453
 msgid ""
-"<methodname>set_row_spacing()</methodname> and <methodname>set_col_spacing()"
-"</methodname> set the spacing between the rows at the specified row or "
-"column. Note that for columns, the space goes to the right of the column, "
-"and for rows, the space goes below the row."
+"Then use <methodname>append_column()</methodname> to add the view Column to "
+"the View. Notice that <methodname>Gtk::TreeView::append_column()</"
+"methodname> is overloaded to accept either a prebuilt <classname>Gtk::"
+"TreeView::Column</classname> widget, or just the <classname>TreeModelColumn</"
+"classname> from which it generates an appropriate <classname>Gtk::TreeView::"
+"Column</classname> widget."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2566(para)
+#: C/index-in.docbook:2460
 msgid ""
-"You can also set a consistent spacing for all rows and/or columns with "
-"<methodname>set_row_spacings()</methodname> and <methodname>set_col_spacings"
-"()</methodname>. Note that with these calls, the last row and last column do "
-"not get any spacing."
+"Here is some example code, which has a pixbuf icon and a text name in the "
+"same column:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2578(para)
+#: C/index-in.docbook:2463
+#, no-wrap
 msgid ""
-"In the following example, we make a window with three buttons in a 2 x 2 "
-"table. The first two buttons will be placed in the upper row. A third button "
-"is placed in the lower row, spanning both columns."
+"\n"
+"auto pColumn = Gtk::make_managed&lt;Gtk::TreeView::Column&gt;(\"Icon Name\");\n"
+"\n"
+"// m_columns.icon and m_columns.iconname are columns in the model.\n"
+"// pColumn is the column in the TreeView:\n"
+"pColumn-&gt;pack_start(m_columns.icon, /* expand= */ false);\n"
+"pColumn-&gt;pack_start(m_columns.iconname);\n"
+"\n"
+"m_TreeView.append_column(*pColumn);"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2598(title) C/gtkmm-tutorial-in.xml:2635(title)
-msgid "Notebook"
+#: C/index-in.docbook:2475
+msgid "Specifying CellRenderer details"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2600(para)
+#: C/index-in.docbook:2476
 msgid ""
-"A <classname>Notebook</classname> has a set of stacked <literal>pages</"
-"literal>, each of which contains widgets. Labelled <literal>tabs</literal> "
-"allow the user to select the pages. <classname>Notebook</classname>s allow "
-"several sets of widgets to be placed in a small space, by only showing one "
-"page at a time. For instance, they are often used in preferences dialogs."
+"The default <classname>CellRenderers</classname> and their default behaviour "
+"will normally suffice, but you might occasionally need finer control. For "
+"instance, this example code from <filename>gtkmm/demos/gtk-demo/"
+"example_treeview_treestore.cc</filename>, appends a <classname>Gtk::"
+"CellRenderer</classname> widget and instructs it to render the data from "
+"various model columns through various aspects of its appearance."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2609(para)
+#: C/index-in.docbook:2484
+#, no-wrap
 msgid ""
-"Use the <methodname>append_page()</methodname>, <methodname>prepend_page()</"
-"methodname> and <methodname>insert_page()</methodname> methods to add tabbed "
-"pages to the <literal>Notebook</literal>, supplying the child widget and the "
-"name for the tab."
+"auto cols_count = m_TreeView.append_column_editable(\"Alex\", m_columns.alex);\n"
+"auto pColumn = m_TreeView.get_column(cols_count-1);\n"
+"if(pColumn)\n"
+"{\n"
+"  auto pRenderer = static_cast&lt;Gtk::CellRendererToggle*&gt;(pColumn-&gt;get_first_cell());\n"
+"  pColumn-&gt;add_attribute(pRenderer-&gt;property_visible(), m_columns.visible);\n"
+"  pColumn-&gt;add_attribute(pRenderer-&gt;property_activatable(), m_columns.world);"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2616(para)
+#: C/index-in.docbook:2492
 msgid ""
-"To discover the currently visible page, use the <methodname>get_current_page"
-"()</methodname> method. This returns the page number, and then calling "
-"<methodname>get_nth_page()</methodname> with that number will give you a "
-"pointer to the actual child widget."
+"You can also connect to <classname>CellRenderer</classname> signals to "
+"detect user actions. For instance:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2623(para)
+#: C/index-in.docbook:2496
+#, no-wrap
 msgid ""
-"To programmatically change the selected page, use the "
-"<methodname>set_current_page()</methodname> method."
+"\n"
+"auto pRenderer = Gtk::make_managed&lt;Gtk::CellRendererToggle&gt;();\n"
+"pRenderer-&gt;signal_toggled().connect(\n"
+"    sigc::bind( sigc::mem_fun(*this,\n"
+"        &amp;Example_TreeView_TreeStore::on_cell_toggled), m_columns.dave)\n"
+");"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2628(para)
-msgid ""
-"There is also an <link linkend=\"sec-notebook-stl-style\">STL-style API</"
-"link> which you might find more obvious."
+#: C/index-in.docbook:2505 C/index-in.docbook:2868
+msgid "Editable Cells"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2646(title)
-msgid "STL-style API"
+#: C/index-in.docbook:2508
+msgid "Automatically-stored editable cells."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2647(para)
+#: C/index-in.docbook:2509
 msgid ""
-"The <classname>Gtk::Notebook</classname> widget has an STL-style API, "
-"available via the <methodname>pages()</methodname> method, which you might "
-"prefer to use to add and access pages. See the <link linkend=\"sec-stl-style"
-"\">STL-style APIs</link> section for generic information."
+"Cells in a <classname>TreeView</classname> can be edited in-place by the "
+"user. To allow this, use the <classname>Gtk::TreeView</classname> "
+"<methodname>insert_column_editable()</methodname> and "
+"<methodname>append_column_editable()</methodname> methods instead of "
+"<methodname>insert_column()</methodname> and <methodname>append_column()</"
+"methodname>. When these cells are edited the new values will be stored "
+"immediately in the Model. Note that these methods are templates which can "
+"only be instantiated for simple column types such as <classname>Glib::"
+"ustring</classname>, int, and long."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2653(ulink)
-msgid "PageList Reference"
+#: C/index-in.docbook:2523
+msgid "Implementing custom logic for editable cells."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2655(para)
+#: C/index-in.docbook:2524
 msgid ""
-"To insert pages into a notebook, use the <classname>TabElem</classname> "
-"helper class, like so:"
+"However, you might not want the new values to be stored immediately. For "
+"instance, maybe you want to restrict the input to certain characters or "
+"ranges of values."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2659(programlisting)
-#, no-wrap
+#: C/index-in.docbook:2529
 msgid ""
-"m_Notebook.pages().push_back(\n"
-"    Gtk::Notebook_Helpers::TabElem(m_ChildWidget, \"tab 1\") );"
+"To achieve this, you should use the normal <classname>Gtk::TreeView</"
+"classname> <methodname>insert_column()</methodname> and "
+"<methodname>append_column()</methodname> methods, then use "
+"<methodname>get_column_cell_renderer()</methodname> to get the "
+"<classname>Gtk::CellRenderer</classname> used by that column."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2662(para)
+#: C/index-in.docbook:2535
 msgid ""
-"<ulink url=\"http://library.gnome.org/devel/gtkmm/unstable/";
-"classGtk_1_1Notebook__Helpers_1_1TabElem.html\">TabElem Reference</ulink>. "
-"TODO: Correct URL."
+"You should then cast that <classname>Gtk::CellRenderer*</classname> to the "
+"specific <classname>CellRenderer</classname> that you expect, so you can use "
+"specific API."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2664(para)
+#: C/index-in.docbook:2539
 msgid ""
-"To access an existing child widget, you can call <methodname>get_child()</"
-"methodname> on one of the <classname>Page</classname> elements of the "
-"<classname>PageList</classname>:"
+"For instance, for a CellRendererText, you would set the cell's "
+"<emphasis>editable</emphasis> property to true, like so:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2669(programlisting)
+#: C/index-in.docbook:2542
 #, no-wrap
-msgid "Gtk::Widget* pWidget = m_Notebook.pages()[2].get_child();"
+msgid "cell-&gt;property_editable() = true;"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2676(title) C/gtkmm-tutorial-in.xml:2703(title)
-msgid "Assistant"
+#: C/index-in.docbook:2543
+msgid ""
+"For a CellRendererToggle, you would set the <emphasis>activatable</emphasis> "
+"property instead."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2678(para)
+#: C/index-in.docbook:2547
 msgid ""
-"An <classname>Assistant</classname> splits a complex operation into steps. "
-"Each step is a page, containing a header, a child widget and an action area. "
-"The Assistant's action area has navigation buttons which update "
-"automatically depending on the type of the page, set with "
-"<methodname>set_page_type()</methodname>."
+"You can then connect to the appropriate \"edited\" signal. For instance, "
+"connect to <methodname>Gtk::CellRendererText::signal_edited()</methodname>, "
+"or <methodname>Gtk::CellRendererToggle::signal_toggled()</methodname>. If "
+"the column contains more than one <classname>CellRenderer</classname> then "
+"you will need to use <methodname>Gtk::TreeView::get_column()</methodname> "
+"and then call <methodname>get_cells()</methodname> on that view Column."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2682(para)
+#: C/index-in.docbook:2555
 msgid ""
-"Use the <methodname>append_page()</methodname>, <methodname>prepend_page</"
-"methodname> and <methodname>insert_page()</methodname> methods to add pages "
-"to the <classname>Assistant</classname>, supplying the child widget for each "
-"page."
+"In your signal handler, you should examine the new value and then store it "
+"in the Model if that is appropriate for your application."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2686(para)
-msgid ""
-"To determine the currently-visible page, use the <methodname>get_current_page"
-"()</methodname> method, and pass the result to <methodname>get_nth_page()</"
-"methodname>, which returns a pointer to the actual widget. To "
-"programmatically change the current page, use the "
-"<methodname>set_current_page()</methodname> method."
+#: C/index-in.docbook:2567
+msgid "Iterating over Model Rows"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2690(para)
+#: C/index-in.docbook:2568
 msgid ""
-"To set the title of a page, use the <methodname>set_page_title()</"
-"methodname> method. The header and side images of a page can be set with the "
-"<methodname>set_page_header_image()</methodname> and "
-"<methodname>set_page_side_image()</methodname> methods."
+"<classname>Gtk::TreeModel</classname> provides a C++ Standard Library-style "
+"container of its children, via the <methodname>children()</methodname> "
+"method. You can use the familiar <methodname>begin()</methodname> and "
+"<methodname>end()</methodname> methods iterator incrementing, like so:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2694(para)
+#: C/index-in.docbook:2574
+#, no-wrap
 msgid ""
-"To add widgets to the action area, use the <methodname>add_action_widget()</"
-"methodname> method. They will be packed alongside the default buttons. Use "
-"the <methodname>remove_action_widget()</methodname> method to remove widgets."
+"\n"
+"auto children = refModel-&gt;children();\n"
+"for (auto iter = children.begin(), end = children.end(); iter != end; ++iter)\n"
+"{\n"
+"  auto row = *iter;\n"
+"  //Do something with the row - see above for set/get.\n"
+"}"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2721(title)
-msgid "The TreeView widget"
+#: C/index-in.docbook:2581
+msgid ""
+"If you always want to iterate across the entire range, much more succinct "
+"syntax is possible using C++'s range-based <literal>for</literal> loop:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2722(para)
+#: C/index-in.docbook:2585
+#, no-wrap
 msgid ""
-"The <classname>Gtk::TreeView</classname> widget can contain lists or trees "
-"of data, in columns."
+"\n"
+"for (auto row: refModel-&gt;children())\n"
+"{\n"
+"  //Do something with the row - see above for set/get.\n"
+"}"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2728(title)
-msgid "The Model"
+#: C/index-in.docbook:2592
+msgid "Row children"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2729(para)
-msgid ""
-"Each <classname>Gtk::TreeView</classname> has an associated <classname>Gtk::"
-"TreeModel</classname>, which contains the data displayed by the "
-"<classname>TreeView</classname>. Each <classname>Gtk::TreeModel</classname> "
-"can be used by more than one <classname>Gtk::TreeView</classname>. For "
-"instance, this allows the same underlying data to be displayed and edited in "
-"2 different ways at the same time. Or the 2 Views might display different "
-"columns from the same Model data, in the same way that 2 SQL queries (or "
-"\"views\") might show different fields from the same database table."
+#: C/index-in.docbook:2597
+#, no-wrap
+msgid "Gtk::TreeModel::Children children = row.children();"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2739(para)
+#: C/index-in.docbook:2593
 msgid ""
-"Although you can theoretically implement your own Model, you will normally "
-"use either the <classname>ListStore</classname> or <classname>TreeStore</"
-"classname> model classes."
+"When using a <classname>Gtk::TreeStore</classname>, the rows can have child "
+"rows, which can have their own children in turn. Use <methodname>Gtk::"
+"TreeModel::Row::children()</methodname> to get the container of child "
+"<classname>Row</classname>s: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2748(title)
-msgid "ListStore, for rows"
+#: C/index-in.docbook:2604
+msgid "The Selection"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2749(para)
+#: C/index-in.docbook:2605
 msgid ""
-"The <classname>ListStore</classname> contains simple rows of data, and each "
-"row has no children."
+"To find out what rows the user has selected, get the <classname>Gtk::"
+"TreeView::Selection</classname> object from the <classname>TreeView</"
+"classname>, like so:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2755(title) C/gtkmm-tutorial-in.xml:3300(title)
-msgid "TreeView - ListStore"
+#: C/index-in.docbook:2610
+#, no-wrap
+msgid "auto refTreeSelection = m_TreeView.get_selection();"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2766(title)
-msgid "TreeStore, for a hierarchy"
+#: C/index-in.docbook:2613
+msgid "Single or multiple selection"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2767(para)
-msgid ""
-"The <classname>TreeStore</classname> contains rows of data, and each row may "
-"have child rows."
+#: C/index-in.docbook:2617
+#, no-wrap
+msgid "refTreeSelection-&gt;set_mode(Gtk::SELECTION_MULTIPLE);"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2773(title) C/gtkmm-tutorial-in.xml:3319(title)
-msgid "TreeView - TreeStore"
+#: C/index-in.docbook:2614
+msgid ""
+"By default, only single rows can be selected, but you can allow multiple "
+"selection by setting the mode, like so: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2784(title)
-msgid "Model Columns"
+#: C/index-in.docbook:2622
+msgid "The selected rows"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2785(para)
+#: C/index-in.docbook:2623
 msgid ""
-"The <classname>TreeModelColumnRecord</classname> class is used to keep track "
-"of the columns and their data types. You add <classname>TreeModelColumn</"
-"classname> instances to the <classname>ColumnRecord</classname> and then use "
-"those <classname>TreeModelColumns</classname> when getting and setting the "
-"data in model rows. You will probably find it convenient to derive a new "
-"<classname>TreeModelColumnRecord</classname> which has your "
-"<classname>TreeModelColumn</classname> instances as member data."
+"For single-selection, you can just call <methodname>get_selected()</"
+"methodname>, like so:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2796(programlisting)
+#: C/index-in.docbook:2627
 #, no-wrap
 msgid ""
-"class ModelColumns : public Gtk::TreeModelColumnRecord\n"
+"auto iter = refTreeSelection-&gt;get_selected();\n"
+"if(iter) //If anything is selected\n"
 "{\n"
-"public:\n"
-"\n"
-"  ModelColumns()\n"
-"    { add(m_col_text); add(m_col_number); }\n"
-"\n"
-"  Gtk::TreeModelColumn&lt;Glib::ustring&gt; m_col_text;\n"
-"  Gtk::TreeModelColumn&lt;int&gt; m_col_number;\n"
-"};\n"
-"\n"
-"ModelColumns m_Columns;"
+"  auto row = *iter;\n"
+"  //Do something with the row.\n"
+"}"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2809(para)
+#: C/index-in.docbook:2634
 msgid ""
-"You specify the <classname>ColumnRecord</classname> when creating the Model, "
-"like so:"
+"For multiple-selection, you need to call <methodname>get_selected_rows()</"
+"methodname> or define a callback, and give it to "
+"<methodname>selected_foreach()</methodname>, "
+"<methodname>selected_foreach_path()</methodname>, or "
+"<methodname>selected_foreach_iter()</methodname>, like so:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2813(programlisting)
+#: C/index-in.docbook:2641
 #, no-wrap
 msgid ""
-"Glib::RefPtr&lt;Gtk::ListStore&gt; refListStore =\n"
-"    Gtk::ListStore::create(m_Columns);"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:2815(para)
-msgid ""
-"Note that the instance (such as m_Columns here) should usually not be "
-"static, because it often needs to be instantiated after glibmm has been "
-"instantiated."
+"refTreeSelection-&gt;selected_foreach_iter(\n"
+"    sigc::mem_fun(*this, &amp;TheClass::selected_row_callback) );\n"
+"\n"
+"void TheClass::selected_row_callback(\n"
+"    const Gtk::TreeModel::const_iterator&amp; iter)\n"
+"{\n"
+"  auto row = *iter;\n"
+"  //Do something with the row.\n"
+"}"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2820(title)
-msgid "Adding Rows"
+#: C/index-in.docbook:2654
+msgid "The \"changed\" signal"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2821(para)
+#: C/index-in.docbook:2655
 msgid ""
-"Add rows to the model with the <methodname>append()</methodname>, "
-"<methodname>prepend()</methodname>, or <methodname>insert()</methodname> "
-"methods."
+"To respond to the user clicking on a row or range of rows, connect to the "
+"signal like so:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2825(programlisting)
+#: C/index-in.docbook:2659
 #, no-wrap
-msgid "Gtk::TreeModel::iterator iter = m_refListStore-&gt;append();"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:2826(para)
-msgid "You can dereference the iterator to get the Row:"
+msgid ""
+"refTreeSelection-&gt;signal_changed().connect(\n"
+"    sigc::mem_fun(*this, &amp;Example_IconTheme::on_selection_changed)\n"
+");"
 msgstr ""
+"refTreeSelection-&gt;signal_changed().connect(\n"
+"    sigc::mem_fun(*this, &amp;Example_IconTheme::on_selection_changed)\n"
+");"
 
-#: C/gtkmm-tutorial-in.xml:2828(programlisting)
-#, no-wrap
-msgid "Gtk::TreeModel::Row row = *iter;"
+#: C/index-in.docbook:2665
+msgid "Preventing row selection"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2829(title)
-msgid "Adding child rows"
+#: C/index-in.docbook:2666
+msgid ""
+"Maybe the user should not be able to select every item in your list or tree. "
+"For instance, in the gtk-demo, you can select a demo to see the source code, "
+"but it doesn't make any sense to select a demo category."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2830(para)
+#: C/index-in.docbook:2671
 msgid ""
-"<classname>Gtk::TreeStore</classname> models can have child items. Add them "
-"with the <methodname>append()</methodname>, <methodname>prepend()</"
-"methodname>, or <methodname>insert()</methodname> methods, like so:"
+"To control which rows can be selected, use the "
+"<methodname>set_select_function()</methodname> method, providing a "
+"<classname>sigc::slot</classname> callback. For instance:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2835(programlisting)
+#: C/index-in.docbook:2676
 #, no-wrap
 msgid ""
-"Gtk::TreeModel::iterator iter_child =\n"
-"    m_refListStore-&gt;append(row.children());"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:2842(title)
-msgid "Setting values"
+"m_refTreeSelection-&gt;set_select_function( sigc::mem_fun(*this,\n"
+"    &amp;DemoWindow::select_function) );"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2843(para)
-msgid ""
-"You can use the <methodname>operator[]</methodname> override to set the data "
-"for a particular column in the row, specifying the "
-"<classname>TreeModelColumn</classname> used to create the model."
+#: C/index-in.docbook:2678
+msgid "and then"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2848(programlisting)
+#: C/index-in.docbook:2681
 #, no-wrap
-msgid "row[m_Columns.m_col_text] = \"sometext\";"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:2852(title)
-msgid "Getting values"
+msgid ""
+"bool DemoWindow::select_function(\n"
+"    const Glib::RefPtr&lt;Gtk::TreeModel&gt;&amp; model,\n"
+"    const Gtk::TreeModel::Path&amp; path, bool)\n"
+"{\n"
+"  const auto iter = model-&gt;get_iter(path);\n"
+"  return iter-&gt;children().empty(); // only allow leaf nodes to be selected\n"
+"}"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2853(para)
+#: C/index-in.docbook:2691
+msgid "Changing the selection"
+msgstr ""
+
+#: C/index-in.docbook:2692
 msgid ""
-"You can use the <methodname>operator[]</methodname> override to get the data "
-"in a particular column in a row, specifiying the <classname>TreeModelColumn</"
-"classname> used to create the model."
+"To change the selection, specify a <classname>Gtk::TreeModel::iterator</"
+"classname> or <classname>Gtk::TreeModel::Row</classname>, like so:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2858(programlisting)
+#: C/index-in.docbook:2697
 #, no-wrap
 msgid ""
-"Glib::ustring strText = row[m_Columns.m_col_text];\n"
-"int number = row[m_Columns.m_col_number];"
+"auto row = m_refModel-&gt;children()[5]; //The sixth row.\n"
+"if(row)\n"
+"  refTreeSelection-&gt;select(row.get_iter());"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2860(para)
-msgid ""
-"The compiler will complain if you use an inappropriate type. For instance, "
-"this would generate a compiler error:"
+#: C/index-in.docbook:2700
+msgid "or"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2864(programlisting)
+#: C/index-in.docbook:2703
 #, no-wrap
 msgid ""
-"//compiler error - no conversion from ustring to int.\n"
-"int number = row[m_Columns.m_col_text];"
+"auto iter = m_refModel-&gt;children().begin()\n"
+"if(iter)\n"
+"  refTreeSelection-&gt;select(iter);"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2869(title)
-msgid "\"Hidden\" Columns"
+#: C/index-in.docbook:2712
+msgid "Sorting"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2870(para)
+#: C/index-in.docbook:2713
 msgid ""
-"You might want to associate extra data with each row. If so, just add it as "
-"a Model column, but don't add it to the View."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:2879(title) C/gtkmm-tutorial-in.xml:3679(title)
-msgid "The View"
+"The standard tree models (<classname>TreeStore</classname> and "
+"<classname>ListStore</classname>) derive from <classname>TreeSortable</"
+"classname>, so they offer sorting functionality. For instance, call "
+"<methodname>set_sort_column()</methodname>, to sort the model by the "
+"specified column. Or supply a callback function to "
+"<methodname>set_sort_func()</methodname> to implement a more complicated "
+"sorting algorithm."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2880(para)
+#: C/index-in.docbook:2717
 msgid ""
-"The View is the actual widget (<classname>Gtk::TreeView</classname>) that "
-"displays the model (<classname>Gtk::TreeModel</classname>) data and allows "
-"the user to interact with it. The View can show all of the model's columns, "
-"or just some, and it can show them in various ways."
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/";
+"classGtk_1_1TreeSortable.html\">TreeSortable Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2890(title)
-msgid "Using a Model"
+#: C/index-in.docbook:2720
+msgid "Sorting by clicking on columns"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2891(para)
+#: C/index-in.docbook:2721
 msgid ""
-"You can specify a <classname>Gtk::TreeModel</classname> when constructing "
-"the <classname>Gtk::TreeView</classname>, or you can use the "
-"<methodname>set_model()</methodname> method, like so:"
+"So that a user can click on a <classname>TreeView</classname>'s column "
+"header to sort the <classname>TreeView</classname>'s contents, call "
+"<methodname>Gtk::TreeView::Column::set_sort_column()</methodname>, supplying "
+"the model column on which model should be sorted when the header is clicked. "
+"For instance:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2896(programlisting)
+#: C/index-in.docbook:2724
 #, no-wrap
-msgid "m_TreeView.set_model(m_refListStore);"
+msgid ""
+"auto pColumn = treeview.get_column(0);\n"
+"if(pColumn)\n"
+"  pColumn-&gt;set_sort_column(m_columns.m_col_id);"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2900(title)
-msgid "Adding View Columns"
+#: C/index-in.docbook:2730
+msgid "Independently sorted views of the same model"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2901(para)
+#: C/index-in.docbook:2731
 msgid ""
-"You can use the <methodname>append_column()</methodname> method to tell the "
-"View that it should display certain Model columns, in a certain order, with "
-"a certain column title."
+"The <classname>TreeView</classname> already allows you to show the same "
+"<classname>TreeModel</classname> in two <classname>TreeView</classname> "
+"widgets. If you need one of these TreeViews to sort the model differently "
+"than the other then you should use a <classname>TreeModelSort</classname> "
+"instead of just, for instance, <methodname>Gtk::TreeViewColumn::"
+"set_sort_column()</methodname>. <classname>TreeModelSort</classname> is a "
+"model that contains another model, presenting a sorted version of that "
+"model. For instance, you might add a sorted version of a model to a "
+"<classname>TreeView</classname> like so:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2906(programlisting)
+#: C/index-in.docbook:2739
 #, no-wrap
-msgid "m_TreeView.append_column(\"Messages\", m_Columns.m_col_text);"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:2907(para)
 msgid ""
-"When using this simple <methodname>append_column()</methodname> override, "
-"the <classname>TreeView</classname> will display the model data with an "
-"appropriate <classname>CellRenderer</classname>. For instance, strings and "
-"numbers are shown in a simple <classname>Gtk::Entry</classname> widget, and "
-"booleans are shown in a <classname>Gtk::CheckButton</classname>. This is "
-"usually what you need. For other column types you must either connect a "
-"callback that converts your type into a string representation, with "
-"<methodname>TreeViewColumn::set_cell_data_func()</methodname>, or derive a "
-"custom <classname>CellRenderer</classname>. Note that (unsigned) short is "
-"not supported by default - You could use (unsigned) int or (unsigned) long "
-"as the column type instead."
+"auto sorted_model = Gtk::TreeModelSort::create(model);\n"
+"sorted_model-&gt;set_sort_column(columns.m_col_name, Gtk::SORT_ASCENDING);\n"
+"treeview.set_model(sorted_model);"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2923(title)
-msgid "More than one Model Column per View Column"
+#: C/index-in.docbook:2743
+msgid ""
+"Note, however, that the TreeView will provide iterators to the sorted model. "
+"You must convert them to iterators to the underlying child model in order to "
+"perform actions on that model. For instance:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2924(para)
+#: C/index-in.docbook:2745
+#, no-wrap
 msgid ""
-"To render more than one model column in a view column, you need to create "
-"the <classname>TreeView::Column</classname> widget manually, and use "
-"<methodname>pack_start()</methodname> to add the model columns to it."
+"void ExampleWindow::on_button_delete()\n"
+"{\n"
+"  auto refTreeSelection = m_treeview.get_selection();\n"
+"  if(refTreeSelection)\n"
+"  {\n"
+"    auto sorted_iter = m_refTreeSelection-&gt;get_selected();\n"
+"    if(sorted_iter)\n"
+"    {\n"
+"      auto iter = m_refModelSort-&gt;convert_iter_to_child_iter(sorted_iter);\n"
+"      m_refModel-&gt;erase(iter);\n"
+"    }\n"
+"  }\n"
+"}"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2930(para)
+#: C/index-in.docbook:2759
 msgid ""
-"Then use <methodname>append_column()</methodname> to add the view Column to "
-"the View. Notice that <methodname>Gtk::View::append_column()</methodname> is "
-"overridden to accept either a prebuilt <classname>Gtk::View::Column</"
-"classname> widget, or just the <classname>TreeModelColumn</classname> from "
-"which it generates an appropriate <classname>Gtk::View::Column</classname> "
-"widget."
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/";
+"classGtk_1_1TreeModelSort.html\">TreeModelSort Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2937(para)
-msgid ""
-"Here is some example code from <filename>demos/gtk-demo/example_stockbrowser."
-"cc</filename>, which has a pixbuf icon and a text name in the same column:"
+#: C/index-in.docbook:2765 C/index-in.docbook:2887 C/index-in.docbook:4604
+#: C/index-in.docbook:4757
+msgid "Drag and Drop"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2942(programlisting)
-#, no-wrap
+#: C/index-in.docbook:2766
 msgid ""
-"Gtk::TreeView::Column* pColumn =\n"
-"    Gtk::manage( new Gtk::TreeView::Column(\"Symbol\") );\n"
-"\n"
-"// m_columns.icon and m_columns.symbol are columns in the model.\n"
-"// pColumn is the column in the TreeView:\n"
-"pColumn-&gt;pack_start(m_columns.icon, false); //false = don't expand.\n"
-"pColumn-&gt;pack_start(m_columns.symbol);\n"
-"\n"
-"m_TreeView.append_column(*pColumn);"
+"<classname>Gtk::TreeView</classname> already implements simple drag-and-drop "
+"when used with the <classname>Gtk::ListStore</classname> or <classname>Gtk::"
+"TreeStore</classname> models. If necessary, it also allows you to implement "
+"more complex behaviour when items are dragged and dropped, using the normal "
+"<link linkend=\"chapter-draganddrop\">Drag and Drop</link> API."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2954(title)
-msgid "Specifying CellRenderer details"
+#: C/index-in.docbook:2775
+msgid "Reorderable rows"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2955(para)
+#: C/index-in.docbook:2776
 msgid ""
-"The default <classname>CellRenderers</classname> and their default behaviour "
-"will normally suffice, but you might occasionally need finer control. For "
-"instance, this example code from <filename>demos/gtk-demo/example_treestore."
-"cc</filename>, manually constructs a <classname>Gtk::CellRenderer</"
-"classname> widget and instructs it to render the data from various model "
-"columns through various aspects of its appearance."
+"If you call <methodname>Gtk::TreeView::set_reorderable()</methodname> then "
+"your TreeView's items can be moved within the treeview itself. This is "
+"demonstrated in the <classname>TreeStore</classname> example."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2963(programlisting)
-#, no-wrap
+#: C/index-in.docbook:2781
 msgid ""
-"Gtk::CellRendererToggle* pRenderer =\n"
-"    Gtk::manage( new Gtk::CellRendererToggle() );\n"
-"int cols_count = m_TreeView.append_column(\"Alex\", *pRenderer);\n"
-"Gtk::TreeViewColumn* pColumn = m_TreeView.get_column(cols_count-1);\n"
-"if(pColumn)\n"
-"{\n"
-"  pColumn-&gt;add_attribute(pRenderer-&gt;property_active(),\n"
-"      m_columns.alex);\n"
-"  pColumn-&gt;add_attribute(pRenderer-&gt;property_visible(),\n"
-"      m_columns.visible);\n"
-"  pColumn-&gt;add_attribute(pRenderer-&gt;property_activatable(),\n"
-"      m_columns.world);"
+"However, this does not allow you any control of which items can be dragged, "
+"and where they can be dropped. If you need that extra control then you might "
+"create a derived <literal>Gtk::TreeModel</literal> from <literal>Gtk::"
+"TreeStore</literal> or <literal>Gtk::ListStore</literal> and override the "
+"<literal>Gtk::TreeDragSource::row_draggable_vfunc()</literal> and "
+"<literal>Gtk::TreeDragDest::row_drop_possible_vfunc()</literal> virtual "
+"methods. You can examine the <literal>Gtk::TreeModel::Path</literal>s "
+"provided and allow or disallow dragging or dropping by returning "
+"<literal>true</literal> or <literal>false</literal>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2976(para)
-msgid ""
-"You can also connect to <classname>CellRenderer</classname> signals to "
-"detect user actions. For instance:"
+#: C/index-in.docbook:2788
+msgid "This is demonstrated in the drag_and_drop example."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2980(programlisting)
-#, no-wrap
-msgid ""
-"Gtk::CellRendererToggle* pRenderer =\n"
-"    Gtk::manage( new Gtk::CellRendererToggle() );\n"
-"pRenderer-&gt;signal_toggled().connect(\n"
-"    sigc::bind( sigc::mem_fun(*this,\n"
-"        &amp;Example_TreeView_TreeStore::on_cell_toggled), m_columns.dave)\n"
-");"
+#: C/index-in.docbook:2794 C/index-in.docbook:2909
+msgid "Popup Context Menu"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2989(title) C/gtkmm-tutorial-in.xml:3329(title)
-msgid "Editable Cells"
+#: C/index-in.docbook:2795
+msgid ""
+"Lots of people need to implement right-click context menus for "
+"<classname>TreeView</classname>'s so we will explain how to do that here to "
+"save you some time. Apart from one or two points, it's much the same as a "
+"normal context menu, as described in the <link linkend=\"sec-menus-popup"
+"\">menus chapter</link>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2992(title)
-msgid "Automatically-stored editable cells."
+#: C/index-in.docbook:2804
+msgid "Handling <literal>button_press_event</literal>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:2993(para)
+#: C/index-in.docbook:2805
 msgid ""
-"Cells in a <classname>TreeView</classname> can be edited in-place by the "
-"user. To allow this, use the <classname>Gtk::TreeView</"
-"classname><methodname>insert_column_editable()</methodname> and "
-"<methodname>append_column_editable()</methodname> methods instead of "
-"<methodname>insert_column()</methodname> and <methodname>append_column()</"
-"methodname>. When these cells are edited the new values will be stored "
-"immediately in the Model. Note that these methods are templates which can "
-"only be instantiated for simple column types such as <classname>Glib::"
-"ustring</classname>, int, and long."
+"To detect a click of the right mouse button, you need to handle the "
+"<literal>button_press_event</literal> signal, and check exactly which button "
+"was pressed. Because the <classname>TreeView</classname> normally handles "
+"this signal completely, you need to either override the default signal "
+"handler in a derived <classname>TreeView</classname> class, use "
+"<methodname>connect_notify()</methodname> or use <methodname>connect(slot, /"
+"* after= */ false)</methodname>. You probably also want to call the default "
+"handler before doing anything else, so that the right-click will cause the "
+"row to be selected first."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3007(title)
-msgid "Implementing custom logic for editable cells."
+#: C/index-in.docbook:2815
+msgid "This is demonstrated in the Popup Context Menu example."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3008(para)
+#: C/index-in.docbook:2820 C/index-in.docbook:3314 C/index-in.docbook:3618
+#: C/index-in.docbook:4867
+msgid "Examples"
+msgstr ""
+
+#: C/index-in.docbook:2822
 msgid ""
-"However, you might not want the new values to be stored immediately. For "
-"instance, maybe you want to restrict the input to certain characters or "
-"ranges of values."
+"Some <classname>TreeView</classname> examples are shown here. There are more "
+"examples in the <ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-";
+"documentation/tree/master/examples/book/treeview/\">treeview directory</"
+"ulink> in <application>gtkmm-documentation</application>'s examples."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3013(para)
+#: C/index-in.docbook:2826
 msgid ""
-"To achieve this, you should use the normal <classname>Gtk::TreeView</"
-"classname><methodname>insert_column()</methodname> and "
-"<methodname>append_column()</methodname> methods, then use "
-"<methodname>get_column_cell_renderer()</methodname> to get the "
-"<classname>Gtk::CellRenderer</classname> used by that column."
+"If neither <classname>ListStore</classname> nor <classname>TreeStore</"
+"classname> is suitable for your application, look at the <ulink url="
+"\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/examples/";
+"book/treeview/custom_treemodel\">custom TreeModel</ulink> example. It shows "
+"how you can make your own implementation of the <classname>TreeModel</"
+"classname> interface."
+msgstr ""
+
+#: C/index-in.docbook:2832
+msgid "ListStore"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3019(para)
+#: C/index-in.docbook:2833
 msgid ""
-"You should then cast that <classname>Gtk::CellRenderer*</classname> to the "
-"specific <classname>CellRenderer</classname> that you expect, so you can use "
-"specific API."
+"This example has a <classname>Gtk::TreeView</classname> widget, with a "
+"<classname>Gtk::ListStore</classname> model."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3023(para)
+#: C/index-in.docbook:2845
 msgid ""
-"For instance, for a CellRendererText, you would set the cell's "
-"<emphasis>editable</emphasis> property to true, like so:"
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/treeview/list/\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3026(programlisting)
-#, no-wrap
-msgid "cell.property_editable() = true;"
+#: C/index-in.docbook:2849
+msgid "TreeStore"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3027(para)
+#: C/index-in.docbook:2851
 msgid ""
-"For a CellRendererToggle, you would set the <emphasis>activatable</emphasis> "
-"property instead."
+"This example is very similar to the <classname>ListStore</classname> "
+"example, but uses a <classname>Gtk::TreeStore</classname> model instead, and "
+"adds children to the rows."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3031(para)
+#: C/index-in.docbook:2864
 msgid ""
-"You can then connect to the appropriate \"edited\" signal. For instance, "
-"connect to <methodname>Gtk::CellRendererText::signal_edited()</methodname>, "
-"or <methodname>Gtk::CellRendererToggle::signal_toggled()</methodname>. If "
-"the column contains more than one <classname>CellRenderer</classname> then "
-"you will need to use <methodname>Gtk::TreeView::get_column()</methodname> "
-"and then call <methodname>get_cell_renderers()</methodname> on that view "
-"Column."
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/treeview/tree/\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3039(para)
+#: C/index-in.docbook:2870
 msgid ""
-"In your signal handler, you should examine the new value and then store it "
-"in the Model if that is appropriate for your application."
+"This example is identical to the <classname>ListStore</classname> example, "
+"but it uses <methodname>TreeView::append_column_editable()</methodname> "
+"instead of <methodname>TreeView::append_column()</methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3051(title)
-msgid "Iterating over Model Rows"
+#: C/index-in.docbook:2877
+msgid "TreeView - Editable Cells"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3052(para)
+#: C/index-in.docbook:2883
 msgid ""
-"<classname>Gtk::TreeModel</classname> provides an STL-style container of its "
-"children, via the <methodname>children()</methodname> method. You can use "
-"the familiar <methodname>begin()</methodname> and <methodname>end()</"
-"methodname> methods iterator incrementing, like so:"
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/treeview/editable_cells/\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3058(programlisting)
-#, no-wrap
+#: C/index-in.docbook:2889
 msgid ""
-"typedef Gtk::TreeModel::Children type_children; //minimise code length.\n"
-"type_children children = refModel-&gt;children();\n"
-"for(type_children::iterator iter = children.begin();\n"
-"    iter != children.end(); ++iter)\n"
-"{\n"
-"  Gtk::TreeModel::Row row = *iter;\n"
-"  //Do something with the row - see above for set/get.\n"
-"}"
+"This example is much like the <classname>TreeStore</classname> example, but "
+"has 2 extra columns to indicate whether the row can be dragged, and whether "
+"it can receive drag-and-dropped rows. It uses a derived <classname>Gtk::"
+"TreeStore</classname> which overrides the virtual functions as described in "
+"the <link linkend=\"sec-treeview-draganddrop\">TreeView Drag and Drop</link> "
+"section."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3068(title)
-msgid "Row children"
+#: C/index-in.docbook:2899
+msgid "TreeView - Drag And Drop"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3074(programlisting)
-#, no-wrap
-msgid "Gtk::TreeModel::Children children = row.children();"
+#: C/index-in.docbook:2905
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/treeview/drag_and_drop/\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3069(para)
+#: C/index-in.docbook:2911
 msgid ""
-"When using a <classname>Gtk::TreeStore</classname>, the rows can have child "
-"rows, which can have their own children in turn. Use <methodname>Gtk::"
-"TreeModel::Row::children()</methodname> to get the STL-style container of "
-"child <classname>Row</classname>s: <placeholder-1/>"
+"This example is much like the <classname>ListStore</classname> example, but "
+"derives a custom <classname>TreeView</classname> in order to override the "
+"<literal>button_press_event</literal>, and also to encapsulate the tree "
+"model code in our derived class. See the <link linkend=\"sec-treeview-"
+"contextmenu\">TreeView Popup Context Menu</link> section."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3081(title)
-msgid "The Selection"
+#: C/index-in.docbook:2921
+msgid "TreeView - Popup Context Menu"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3082(para)
+#: C/index-in.docbook:2927
 msgid ""
-"To find out what rows the user has selected, get the <classname>Gtk::"
-"TreeView::Selection</classname> object from the <classname>TreeView</"
-"classname>, like so:"
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/treeview/popup/\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3087(programlisting)
-#, no-wrap
-msgid ""
-"Glib::RefPtr&lt;Gtk::TreeSelection&gt; refTreeSelection =\n"
-"    m_TreeView.get_selection();"
+#: C/index-in.docbook:2934
+msgid "Combo Boxes"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3091(title)
-msgid "Single or multiple selection"
+#: C/index-in.docbook:2936
+msgid ""
+"The <classname>ComboBox</classname> widget offers a list (or tree) of "
+"choices in a dropdown menu. If appropriate, it can show extra information "
+"about each item, such as text, a picture, a check button, or a progress bar. "
+"The <classname>ComboBox</classname> widget usually restricts the user to the "
+"available choices, but it can optionally have an <classname>Entry</"
+"classname>, allowing the user to enter arbitrary text if none of the "
+"available choices are suitable."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3095(programlisting)
-#, no-wrap
-msgid "refTreeSelection-&gt;set_mode(Gtk::SELECTION_MULTIPLE);"
+#: C/index-in.docbook:2939
+msgid ""
+"The list is provided via a <classname>TreeModel</classname>, and columns "
+"from this model are added to the ComboBox's view with the "
+"<methodname>ComboBox::pack_start()</methodname> method. This provides "
+"flexibility and compile-time type-safety, but the <classname>ComboBoxText</"
+"classname> class provides a simpler text-based specialization in case that "
+"flexibility is not required."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3092(para)
+#: C/index-in.docbook:2942
 msgid ""
-"By default, only single rows can be selected, but you can allow multiple "
-"selection by setting the mode, like so: <placeholder-1/>"
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1ComboBox.";
+"html\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3100(title)
-msgid "The selected rows"
+#: C/index-in.docbook:2945
+msgid "The model"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3101(para)
+#: C/index-in.docbook:2946
 msgid ""
-"For single-selection, you can just call <methodname>get_selected()</"
-"methodname>, like so:"
+"The model for a ComboBox can be defined and filled exactly as for a "
+"<classname>TreeView</classname>. For instance, you might derive a ComboBox "
+"class with one integer and one text column, like so:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3105(programlisting)
+#: C/index-in.docbook:2948
 #, no-wrap
 msgid ""
-"TreeModel::iterator iter = refTreeSelection-&gt;get_selected();\n"
-"if(iter) //If anything is selected\n"
+"class ModelColumns : public Gtk::TreeModel::ColumnRecord\n"
 "{\n"
-"  TreeModel::Row row = *iter;\n"
-"  //Do something with the row.\n"
-"}"
+"public:\n"
+"  ModelColumns()\n"
+"  { add(m_col_id); add(m_col_name); }\n"
+"\n"
+"  Gtk::TreeModelColumn&lt;int&gt; m_col_id;\n"
+"  Gtk::TreeModelColumn&lt;Glib::ustring&gt; m_col_name;\n"
+"};\n"
+"\n"
+"ModelColumns m_columns;"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3112(para)
+#: C/index-in.docbook:2960
 msgid ""
-"For multiple-selection, you need to define a callback, and give it to "
-"<methodname>selected_foreach()</methodname>, "
-"<methodname>selected_foreach_path()</methodname>, or "
-"<methodname>selected_foreach_iter()</methodname>, like so:"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3118(programlisting)
-#, no-wrap
-msgid ""
-"refTreeSelection-&gt;selected_foreach_iter(\n"
-"    sigc::mem_fun(*this, &amp;TheClass::selected_row_callback) );\n"
-"\n"
-"void TheClass::selected_row_callback(\n"
-"    const Gtk::TreeModel::iterator&amp; iter)\n"
-"{\n"
-"  TreeModel::Row row = *iter;\n"
-"  //Do something with the row.\n"
-"}"
+"After appending rows to this model, you should provide the model to the "
+"<classname>ComboBox</classname> with the <methodname>set_model()</"
+"methodname> method. Then use the <methodname>pack_start()</methodname> or "
+"<methodname>pack_end()</methodname> methods to specify what columns will be "
+"displayed in the ComboBox. As with the TreeView you may either use the "
+"default cell renderer by passing the <classname>TreeModelColumn</classname> "
+"to the pack methods, or you may instantiate a specific "
+"<classname>CellRenderer</classname> and specify a particular mapping with "
+"either <methodname>add_attribute()</methodname> or "
+"<methodname>set_cell_data_func()</methodname>. Note that these methods are "
+"in the <classname>CellLayout</classname> base class."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3131(title)
-msgid "The \"changed\" signal"
+#: C/index-in.docbook:2964
+msgid "The chosen item"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3132(para)
+#: C/index-in.docbook:2965
 msgid ""
-"To respond to the user clicking on a row or range of rows, connect to the "
-"signal like so:"
+"To discover what item, if any, the user has chosen from the ComboBox, call "
+"<methodname>ComboBox::get_active()</methodname>. This returns a "
+"<classname>TreeModel::iterator</classname> that you can dereference to a "
+"<classname>Row</classname> in order to read the values in your columns. For "
+"instance, you might read an integer ID value from the model, even though you "
+"have chosen only to show the human-readable description in the ComboBox. For "
+"instance:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3136(programlisting)
+#: C/index-in.docbook:2967
 #, no-wrap
 msgid ""
-"refTreeSelection-&gt;signal_changed().connect(\n"
-"    sigc::mem_fun(*this, &amp;Example_StockBrowser::on_selection_changed)\n"
-");"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3142(title)
-msgid "Preventing row selection"
+"Gtk::TreeModel::iterator iter = m_Combo.get_active();\n"
+"if(iter)\n"
+"{\n"
+"  auto row = *iter;\n"
+"\n"
+"  //Get the data for the selected row, using our knowledge\n"
+"  //of the tree model:\n"
+"  auto id = row[m_Columns.m_col_id];\n"
+"  set_something_id_chosen(id); //Your own function.\n"
+"}\n"
+"else\n"
+"  set_nothing_chosen(); //Your own function."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3143(para)
-msgid ""
-"Maybe the user should not be able to select every item in your list or tree. "
-"For instance, in the gtk-demo, you can select a demo to see the source code, "
-"but it doesn't make any sense to select a demo category."
+#: C/index-in.docbook:2982 C/index-in.docbook:3038
+msgid "Responding to changes"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3148(para)
+#: C/index-in.docbook:2983
 msgid ""
-"To control which rows can be selected, use the "
-"<methodname>set_select_function()</methodname> method, providing a "
-"<classname>sigc::slot</classname> callback. For instance:"
+"You might need to react to every change of selection in the ComboBox, for "
+"instance to update other widgets. To do so, you should handle the "
+"<literal>changed</literal> signal. For instance:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3153(programlisting)
+#: C/index-in.docbook:2986
 #, no-wrap
 msgid ""
-"m_refTreeSelection-&gt;set_select_function( sigc::mem_fun(*this,\n"
-"    &amp;DemoWindow::select_function) );"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3155(para)
-msgid "and then"
+"m_combo.signal_changed().connect( sigc::mem_fun(*this,\n"
+"      &amp;ExampleWindow::on_combo_changed) );"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3158(programlisting)
-#, no-wrap
-msgid ""
-"bool DemoWindow::select_function(\n"
-"    const Glib::RefPtr&lt;Gtk::TreeModel&gt;&amp; model,\n"
-"    const Gtk::TreeModel::Path&amp; path, bool)\n"
-"{\n"
-"  const Gtk::TreeModel::iterator iter = model-&gt;get_iter(path);\n"
-"  return iter-&gt;children().empty(); // only allow leaf nodes to be selected\n"
-"}"
+#: C/index-in.docbook:2990 C/index-in.docbook:3071
+msgid "Full Example"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3168(title)
-msgid "Changing the selection"
+#: C/index-in.docbook:2993
+msgid "ComboBox"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3169(para)
+#: C/index-in.docbook:2999
 msgid ""
-"To change the selection, specify a <classname>Gtk::TreeModel::iterator</"
-"classname> or <classname>Gtk::TreeModel::Row</classname>, like so:"
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/combobox/complex\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3174(programlisting)
-#, no-wrap
-msgid ""
-"Gtk::TreeModel::Row row = m_refModel-&gt;children()[5]; //The fifth row.\n"
-"if(row)\n"
-"  refTreeSelection-&gt;select(row);"
+#: C/index-in.docbook:3003 C/index-in.docbook:3084
+msgid "Simple Text Example"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3177(para)
-msgid "or"
+#: C/index-in.docbook:3006
+msgid "ComboBoxText"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3180(programlisting)
-#, no-wrap
+#: C/index-in.docbook:3012
 msgid ""
-"Gtk::TreeModel::iterator iter = m_refModel-&gt;children().begin()\n"
-"if(iter)\n"
-"  refTreeSelection-&gt;select(iter);"
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/combobox/text\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3189(title)
-msgid "Sorting"
+#: C/index-in.docbook:3017
+msgid "ComboBox with an Entry"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3190(para)
+#: C/index-in.docbook:3019
 msgid ""
-"The standard tree models (<classname>TreeStore</classname> and "
-"<classname>ListStore</classname> derive from <classname>TreeSortable</"
-"classname>, so they offer sorting functionality. For instance, call "
-"<methodname>set_sort_column()</methodname>, to sort the model by the "
-"specified column. Or supply a callback function to <methodname>set_sort_func"
-"()</methodname> to implement a more complicated sorting algorithm."
+"A <classname>ComboBox</classname> may contain an <classname>Entry</"
+"classname> widget for entering of arbitrary text, by specifying "
+"<literal>true</literal> for the constructor's <literal>has_entry</literal> "
+"parameter."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3194(ulink)
-msgid "TreeSortable Reference"
+#: C/index-in.docbook:3022
+msgid "The text column"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3197(title)
-msgid "Sorting by clicking on columns"
+#: C/index-in.docbook:3024
+#, no-wrap
+msgid "m_combo.set_entry_text_column(m_columns.m_col_name);"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3198(para)
+#: C/index-in.docbook:3023
 msgid ""
-"So that a user can click on a <classname>TreeView</classname>'s column "
-"header to sort the <classname>TreeView</classname>'s contents, call "
-"<methodname>Gtk::TreeViewModel::set_sort_column()</methodname>, supplying "
-"the model column on which model should be sorted when the header is clicked. "
-"For instance:"
+"So that the <classname>Entry</classname> can interact with the drop-down "
+"list of choices, you must specify which of your model columns is the text "
+"column, with <methodname>set_entry_text_column()</methodname>. For instance: "
+"<_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3201(programlisting)
-#, no-wrap
+#: C/index-in.docbook:3026
 msgid ""
-"Gtk::TreeView::Column* pColumn = treeview.get_column(0);\n"
-"if(pColumn)\n"
-"  pColumn-&gt;set_sort_column(m_columns.m_col_id);"
+"When you select a choice from the drop-down menu, the value from this column "
+"will be placed in the <classname>Entry</classname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3207(title)
-msgid "Independently sorted views of the same model"
+#: C/index-in.docbook:3032
+msgid "The entry"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3208(para)
+#: C/index-in.docbook:3033
 msgid ""
-"The <classname>TreeView</classname> already allows you to show the same "
-"<classname>TreeModel</classname> in two <classname>TreeView</classname> "
-"widgets. If you need one of these TreeViews to sort the model differently "
-"than the other then you should use a <classname>TreeModelSort</classname> "
-"instead of just, for instance, <methodname>Gtk::TreeViewModel::"
-"set_sort_column()</methodname>. <classname>TreeModelSort</classname> is a "
-"model that contains another model, presenting a sorted version of that "
-"model. For instance, you might add a sorted version of a model to a "
-"<classname>TreeView</classname> like so:"
+"Because the user may enter arbitrary text, an active model row isn't enough "
+"to tell us what text the user has entered. Therefore, you should retrieve "
+"the <classname>Entry</classname> widget with the <methodname>ComboBox::"
+"get_entry()</methodname> method and call <methodname>get_text()</methodname> "
+"on that."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3211(programlisting)
+#: C/index-in.docbook:3047
 #, no-wrap
 msgid ""
-"Glib::RefPtr&lt;Gtk::TreeModelSort&gt; sorted_model =\n"
-"    Gtk::TreeModelSort::create(model);\n"
-"sorted_model-&gt;set_sort_column(columns.m_col_name, Gtk::SORT_ASCENDING);\n"
-"treeview.set_model(sorted_model);"
+"auto entry = m_Combo.get_entry();\n"
+"if (entry)\n"
+"{\n"
+"  // Alternatively you can connect to m_Combo.signal_changed().\n"
+"  entry-&gt;signal_changed().connect(sigc::mem_fun(*this,\n"
+"    &amp;ExampleWindow::on_entry_changed) );\n"
+"\n"
+"  entry-&gt;signal_activate().connect(sigc::mem_fun(*this,\n"
+"    &amp;ExampleWindow::on_entry_activate) );\n"
+"\n"
+"  entry-&gt;signal_focus_out_event().connect(sigc::mem_fun(*this,\n"
+"    &amp;ExampleWindow::on_entry_focus_out_event) );\n"
+"}"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3216(para)
+#: C/index-in.docbook:3039
 msgid ""
-"Note, however, that the TreeView will provide iterators to the sorted model. "
-"You must convert them to iterators to the underlying child model in order to "
-"perform actions on that model. For instance:"
+"When the user enters arbitrary text, it may not be enough to connect to the "
+"<literal>changed</literal> signal, which is emitted for every typed "
+"character. It is not emitted when the user presses the <keycap>Enter</"
+"keycap> key. Pressing the <keycap>Enter</keycap> key or moving the keyboard "
+"focus to another widget may signal that the user has finished entering text. "
+"To be notified of these events, connect to the <classname>Entry</"
+"classname>'s <literal>activate</literal> and <literal>focus_out_event</"
+"literal> signals, like so <_:programlisting-1/> The <literal>changed</"
+"literal> signals of <classname>ComboBox</classname> and <classname>Entry</"
+"classname> are both emitted for every change. It doesn't matter which one "
+"you connect to. But only <classname>Entry</classname>'s "
+"<literal>focus_out_event</literal> signal is useful here."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3218(programlisting)
-#, no-wrap
+#: C/index-in.docbook:3065
 msgid ""
-"void ExampleWindow::on_button_delete()\n"
-"{\n"
-"  Glib::RefPtr&lt;Gtk::TreeSelection&gt; refTreeSelection =\n"
-"      m_treeview.get_selection();\n"
-"  if(refTreeSelection)\n"
-"  {\n"
-"    Gtk::TreeModel::iterator sorted_iter =\n"
-"        m_refTreeSelection-&gt;get_selected();\n"
-"    if(sorted_iter)\n"
-"    {\n"
-"      Gtk::TreeModel::iterator iter =\n"
-"          m_refModelSort-&gt;convert_iter_to_child_iter(sorted_iter);\n"
-"      m_refModel-&gt;erase(iter);\n"
-"    }\n"
-"  }\n"
-"}"
+"X events are described in more detail in the <link linkend=\"sec-"
+"xeventsignals\">X Event signals</link> section in the appendix."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3235(ulink)
-msgid "TreeModelSort Reference"
+#: C/index-in.docbook:3074
+msgid "ComboBox with Entry"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3241(title) C/gtkmm-tutorial-in.xml:3348(title)
-#: C/gtkmm-tutorial-in.xml:3985(title) C/gtkmm-tutorial-in.xml:4982(title)
-#: C/gtkmm-tutorial-in.xml:5142(title)
-msgid "Drag and Drop"
+#: C/index-in.docbook:3080
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/combobox/entry_complex\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:3087
+msgid "ComboBoxText with Entry"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3242(para)
+#: C/index-in.docbook:3093
 msgid ""
-"<classname>Gtk::TreeView</classname> already implments simple drag-and-drop "
-"when used with the <classname>Gtk::ListStore</classname> or <classname>Gtk::"
-"TreeStore</classname> models. If necessary, it also allows you to implement "
-"more complex behaviour when items are dragged and dropped, using the normal "
-"<link linkend=\"chapter-draganddrop\">Drag and Drop</link> API."
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/combobox/entry_text\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3251(title)
-msgid "Reorderable rows"
+#: C/index-in.docbook:3106 C/index-in.docbook:3319
+msgid "TextView"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3252(para)
+#: C/index-in.docbook:3107
 msgid ""
-"If you call <methodname>Gtk::TreeView::set_reorderable()</methodname> then "
-"your TreeView's items can be moved within the treeview itself. This is "
-"demonstrated in the <classname>TreeStore</classname> example."
+"The <classname>TextView</classname> widget can be used to display and edit "
+"large amounts of formatted text. Like the <classname>TreeView</classname>, "
+"it has a model/view design. In this case the <classname>TextBuffer</"
+"classname> is the model."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3257(para)
-msgid ""
-"However, this does not allow you any control of which items can be dragged, "
-"and where they can be dropped. If you need that extra control then you might "
-"create a derived <literal>Gtk::TreeModel</literal> from <literal>Gtk::"
-"TreeStore</literal> or <literal>Gtk::ListStore</literal> and override the "
-"<literal>Gtk::TreeDragSource::row_draggable()</literal> and <literal>Gdk::"
-"TreeDragDest::row_drop_possible()</literal> virtual methods. You can examine "
-"the <literal>Gtk::TreeModel::Path</literal>s provided and allow or disallow "
-"dragging or dropping by return <literal>true</literal> or <literal>false</"
-"literal>."
+#: C/index-in.docbook:3115
+msgid "The Buffer"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3258(para)
-msgid "This is demonstrated in the drag_and_drop example."
+#: C/index-in.docbook:3116
+msgid ""
+"<classname>Gtk::TextBuffer</classname> is a model containing the data for "
+"the <classname>Gtk::TextView</classname>, like the <classname>Gtk::"
+"TreeModel</classname> used by <classname>Gtk::TreeView</classname>. This "
+"allows two or more <classname>Gtk::TextView</classname>s to share the same "
+"<classname>TextBuffer</classname>, and allows those TextBuffers to be "
+"displayed slightly differently. Or you could maintain several "
+"<classname>Gtk::TextBuffer</classname>s and choose to display each one at "
+"different times in the same <classname>Gtk::TextView</classname> widget."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3264(title) C/gtkmm-tutorial-in.xml:3370(title)
-msgid "Popup Context Menu"
+#: C/index-in.docbook:3126
+msgid ""
+"The <classname>TextView</classname> creates its own default "
+"<classname>TextBuffer</classname>, which you can access via the "
+"<methodname>get_buffer()</methodname> method."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3265(para)
+#: C/index-in.docbook:3132
 msgid ""
-"Lots of people need to implement right-click context menus for "
-"<classname>TreeView</classname>'s so we will explain how to do that here to "
-"save you some time. Apart from one or two points, it's much the same as a "
-"normal context menu, as described in the <link linkend=\"sec-menus-popup"
-"\">menus chapter</link>."
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/";
+"classGtk_1_1TextBuffer.html\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3274(title)
-msgid "Handling <literal>button_press_event</literal>"
+#: C/index-in.docbook:3135
+msgid "Iterators"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3275(para)
+#: C/index-in.docbook:3136
 msgid ""
-"To detect a click of the right mouse button, you need to handle the "
-"<literal>button_press_event</literal> signal, and check exactly which button "
-"was pressed. Because the <classname>TreeView</classname> normally handles "
-"this signal completely, you need to either override the default signal "
-"handler in a derived <classname>TreeView</classname> class, or use "
-"<methodname>connect_nofify()</methodname> instead of <methodname>connect()</"
-"methodname>. You probably also want to call the default handler before doing "
-"anything else, so that the right-click will cause the row to be selected "
-"first."
+"A <classname>Gtk::TextBuffer::iterator</classname> and a <classname>Gtk::"
+"TextBuffer::const_iterator</classname> represent a position between two "
+"characters in the text buffer. Whenever the buffer is modified in a way that "
+"affects the number of characters in the buffer, all outstanding iterators "
+"become invalid. Because of this, iterators can't be used to preserve "
+"positions across buffer modifications. To preserve a position, use "
+"<classname>Gtk::TextBuffer::Mark</classname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3285(para)
-msgid "This is demonstrated in the Popup Custom Menu example."
+#: C/index-in.docbook:3143
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1TextIter.";
+"html\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3290(title) C/gtkmm-tutorial-in.xml:3746(title)
-#: C/gtkmm-tutorial-in.xml:3921(title) C/gtkmm-tutorial-in.xml:5291(title)
-msgid "Examples"
+#: C/index-in.docbook:3147
+msgid "Tags and Formatting"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3292(title)
-msgid "ListStore"
+#: C/index-in.docbook:3150
+msgid "Tags"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3293(para)
+#: C/index-in.docbook:3151
 msgid ""
-"This example has a <classname>Gtk::TreeView</classname> widget, with a "
-"<classname>Gtk::ListStore</classname> model."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3310(title)
-msgid "TreeStore"
+"To specify that some text in the buffer should have specific formatting, you "
+"must define a tag to hold that formatting information, and then apply that "
+"tag to the region of text. For instance, to define the tag and its "
+"properties:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3312(para)
+#: C/index-in.docbook:3154
+#, no-wrap
 msgid ""
-"This example is very similar to the <classname>ListStore</classname> "
-"example, but uses a <classname>Gtk::TreeStore</classname> model instead, and "
-"adds children to the rows."
+"auto refTagMatch = Gtk::TextBuffer::Tag::create();\n"
+"refTagMatch-&gt;property_background() = \"orange\";"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3331(para)
+#: C/index-in.docbook:3156
 msgid ""
-"This example is identical to the <classname>ListStore</classname> example, "
-"but it uses <methodname>TreeView::append_column_editable()</methodname> "
-"instead of <methodname>TreeView::append_column()</methodname>."
+"You can specify a name for the <classname>Tag</classname> when using the "
+"<methodname>create()</methodname> method, but it is not necessary."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3338(title)
-msgid "TreeView - Editable Cells"
+#: C/index-in.docbook:3161
+msgid "The <classname>Tag</classname> class has many other properties."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3350(para)
+#: C/index-in.docbook:3165
 msgid ""
-"This example is much like the <classname>TreeStore</classname> example, but "
-"has 2 extra columns to indicate whether the row can be dragged, and whether "
-"it can receive drag-and-dropped rows. It uses a derived <classname>Gtk::"
-"TreeStore</classname> which overrides the virtual functions as described in "
-"the <link linkend=\"sec-treeview-draganddrop\">TreeView Drag and Drop</link> "
-"section.."
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1TextTag.";
+"html\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3360(title)
-msgid "TreeView - Drag And Drop"
+#: C/index-in.docbook:3170
+msgid "TagTable"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3372(para)
+#: C/index-in.docbook:3172
 msgid ""
-"This example is much like the <classname>ListStore</classname> example, but "
-"derives a custom <classname>TreeView</classname> in order to override the "
-"<literal>button_press_event</literal>, and also to encapsulate the tree "
-"model code in our derived class. See the <link linkend=\"sec-treeview-"
-"contextmenu\">TreeView Popup Context Menu</link> section."
+"Each <classname>Gtk::TextBuffer</classname> uses a <classname>Gtk::"
+"TextBuffer::TagTable</classname>, which contains the <classname>Tag</"
+"classname>s for that buffer. 2 or more <classname>TextBuffer</classname>s "
+"may share the same <classname>TagTable</classname>. When you create "
+"<classname>Tag</classname>s you should add them to the <classname>TagTable</"
+"classname>. For instance:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3382(title)
-msgid "TreeView - Popup Context Menu"
+#: C/index-in.docbook:3180
+#, no-wrap
+msgid ""
+"auto refTagTable = Gtk::TextBuffer::TagTable::create();\n"
+"refTagTable-&gt;add(refTagMatch);\n"
+"//Hopefully a future version of <application>gtkmm</application> will have a set_tag_table() method,\n"
+"//for use after creation of the buffer.\n"
+"auto refBuffer = Gtk::TextBuffer::create(refTagTable);"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3399(title)
-msgid "Combo Boxes"
+#: C/index-in.docbook:3186
+msgid ""
+"You can also use <methodname>get_tag_table()</methodname> to get, and maybe "
+"modify, the <classname>TextBuffer</classname>'s default <classname>TagTable</"
+"classname> instead of creating one explicitly."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3401(para)
+#: C/index-in.docbook:3192
 msgid ""
-"The <classname>ComboBox</classname> and <classname>ComboBoxEntry</classname> "
-"widgets offers a list (or tree) of choices in a dropdown menu. If "
-"appropriate, they can show extra information about each item, such as text, "
-"a picture, a checkbox, or a progress bar. The <classname>ComboBox</"
-"classname> widget restricts the user to the available choices, but the "
-"<classname>ComboBoxEntry</classname> contains an <classname>Entry</"
-"classname>, allowing the user to enter arbitrary text if the none of the "
-"available choices are suitable."
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/";
+"classGtk_1_1TextTagTable.html\">Reference</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:3197
+msgid "Applying Tags"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3404(para)
+#: C/index-in.docbook:3198
 msgid ""
-"For both widgets, the list is provided via a <classname>TreeModel</"
-"classname>, and columns from this model are added to the ComboBox's view "
-"with the <methodname>ComboBox::pack_start()</methodname>. This provides a "
-"great deal of flexibility and compile-time type-safety, but the "
-"<classname>ComboBoxText</classname> and <classname>ComboBoxEntryText</"
-"classname> classes provide a simple text-based specialisation in case that "
-"flexibility is not required."
+"If you have created a <classname>Tag</classname> and added it to the "
+"<classname>TagTable</classname>, you may apply that tag to part of the "
+"<classname>TextBuffer</classname> so that some of the text is displayed with "
+"that formatting. You define the start and end of the range of text by "
+"specifying <classname>Gtk::TextBuffer::iterator</classname>s. For instance:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3408(title) C/gtkmm-tutorial-in.xml:3458(title)
-#: C/gtkmm-tutorial-in.xml:3471(title)
-msgid "ComboBox"
+#: C/index-in.docbook:3205
+#, no-wrap
+msgid "refBuffer-&gt;apply_tag(refTagMatch, iterRangeStart, iterRangeStop);"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3413(title)
-msgid "The model"
+#: C/index-in.docbook:3208
+#, no-wrap
+msgid "refBuffer-&gt;insert_with_tag(iter, \"Some text\", refTagMatch);"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3414(para)
+#: C/index-in.docbook:3206
 msgid ""
-"The model for a ComboBox can be defined and filled exactly as for a "
-"<classname>TreeView</classname>. For instance, you might derive a ComboBox "
-"class with one integer and one text columns, like so:"
+"Or you could specify the tag when first inserting the text: <_:"
+"programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3416(programlisting)
-#, no-wrap
-msgid ""
-"ModelColumns()\n"
-"{ add(m_col_id); add(m_col_name); }\n"
-"\n"
-"  Gtk::TreeModelColumn&lt;int&gt; m_col_id;\n"
-"  Gtk::TreeModelColumn&lt;Glib::ustring&gt; m_col_name;\n"
-"};\n"
-"\n"
-"ModelColumns m_columns;"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3425(para)
-msgid ""
-"After appending rows to this model, you should provide the model to the "
-"<classname>ComboBox</classname> with the <methodname>set_model()</"
-"methodname> method. Then use the <methodname>pack_start()</methodname> or "
-"<methodname>pack_end()</methodname> methods to specify what methods will be "
-"displayed in the ComboBox. As with the TreeView you may either use the "
-"default cell renderer by passing the <classname>TreeModelColumn</classname> "
-"to the pack methods, or you may instantiate a specific "
-"<classname>CellRenderer</classname> and specify a particular mapping with "
-"either <methodname>add_attribute()</methodname> or "
-"<methodname>set_cell_data_func()</methodname>. Note that these methods are "
-"in the <classname>CellLayout</classname> base class."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3429(title)
-msgid "The chosen item"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3430(para)
-msgid ""
-"To discover what item, if any, the user has chosen from the ComboBox, call "
-"<methodname>ComboBox::get_active()</methodname>. This returns a "
-"<classname>TreeModel::iterator</classname> that you can dereference to a "
-"<classname>Row</classname> in order to read the values in your columns. For "
-"instance, you might read an integer ID value from the model, even though you "
-"have chosen only to show the human-readable description in the Combo. For "
-"instance:"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3432(programlisting)
-#, no-wrap
-msgid ""
-"Gtk::TreeModel::iterator iter = m_Combo.get_active();\n"
-"if(iter)\n"
-"{\n"
-"  Gtk::TreeModel::Row row = *iter;\n"
-"\n"
-"  //Get the data for the selected row, using our knowledge\n"
-"  //of the tree model:\n"
-"  int id = row[m_Columns.m_col_id];\n"
-"  set_something_id_chosen(id); //Your own function.\n"
-"}\n"
-"else\n"
-"  set_nothing_chosen(); //Your own function."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3447(title)
-msgid "Responding to changes"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3448(para)
-msgid ""
-"You might need to react to every change of selection in the ComboBox, for "
-"instance to update other widgets. To do so, you should handle the \"changed"
-"\" signal. For instance:"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3451(programlisting)
-#, no-wrap
-msgid ""
-"m_combo.signal_changed().connect( sigc::mem_fun(*this,\n"
-"      &amp;ExampleWindow::on_combo_changed) );"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3455(title) C/gtkmm-tutorial-in.xml:3504(title)
-msgid "Full Example"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3468(title) C/gtkmm-tutorial-in.xml:3517(title)
-msgid "Simple Text Example"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3484(title) C/gtkmm-tutorial-in.xml:3507(title)
-msgid "ComboBoxEntry"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3489(title)
-msgid "The text column"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3491(programlisting)
-#, no-wrap
-msgid "m_combo.set_text_column(m_columns.m_col_name);"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3490(para)
-msgid ""
-"Unlike a regular <classname>ComboBox</classname>, a "
-"<classname>ComboBoxEntry</classname> contains a <classname>Entry</classname> "
-"widget for entering of arbitrary text. So that this Entry can interact with "
-"the drop-down list of choices, you must specify which of your model columns "
-"are the text column, with <methodname>set_text_column()</methodname>. For "
-"instance: <placeholder-1/>"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3493(para)
-msgid ""
-"When you select a choice from the drop-down menu, the value from this column "
-"will be placed in the <classname>Entry</classname>."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3499(title)
-msgid "The entry"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3500(para)
-msgid ""
-"Because the user may enter arbitrary text, an active model row isn't enough "
-"to tell us what text the user has inputted. Therefore, you should retrieve "
-"the <classname>Entry</classname> widget with the <methodname>ComboBoxEntry::"
-"get_entry()</methodname> method and call <methodname>get_text()</methodname> "
-"on that."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3520(title)
-msgid "ComboBoxEntryText"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3539(title) C/gtkmm-tutorial-in.xml:3751(title)
-msgid "TextView"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3540(para)
-msgid ""
-"The <classname>TextView</classname> widget can be used to display and edit "
-"large amounts of formatted text. Like the <classname>TreeView</classname>, "
-"it has a model/view design. In this case the <classname>TextBuffer</"
-"classname> is the model."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3548(title)
-msgid "The Buffer"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3549(para)
-msgid ""
-"<classname>Gtk::TextBuffer</classname> is a model containing the data for "
-"the <classname>Gtk::TextView</classname>, like the <classname>Gtk::"
-"TreeModel</classname> used by <classname>Gtk::TreeView</classname>. This "
-"allows two or more <classname>Gtk::TextView</classname>s to share the same "
-"<classname>TextBuffer</classname>, and allows those TextBuffers to be "
-"displayed slightly differently. Or you could maintain several "
-"<classname>Gtk::TextBuffer</classname>s and choose to display each one at "
-"different times in the same <classname>Gtk::TextView</classname> widget."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3559(para)
-msgid ""
-"The <classname>TextView</classname> creates its own default "
-"<classname>TextBuffer</classname>, which you can access via the "
-"<methodname>get_buffer()</methodname> method."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3568(title)
-msgid "Iterators"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3574(title)
-msgid "Tags and Formatting"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3577(title)
-msgid "Tags"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3578(para)
-msgid ""
-"To specify that some text in the buffer should have specific formatting, you "
-"must define a tag to hold that formatting information, and then apply that "
-"tag to the region of text. For instance, to define the tag and its "
-"properties:"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3581(programlisting)
-#, no-wrap
-msgid ""
-"Glib::RefPtr&lt;Gtk::TextBuffer::Tag&gt; refTagMatch =\n"
-"    Gtk::TextBuffer::Tag::create();\n"
-"refTagMatch-&gt;property_background() = \"orange\";"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3584(para)
-msgid ""
-"You can specify a name for the <classname>Tag</classname> when using the "
-"<methodname>create()</methodname> method, but it is not necessary."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3589(para)
-msgid "The <classname>Tag</classname> class has many other properties."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3598(title)
-msgid "TagTable"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3600(para)
-msgid ""
-"Each <classname>Gtk::TextBuffer</classname> uses a <classname>Gtk::"
-"TextBuffer::TagTable</classname>, which contains the <classname>Tag</"
-"classname>s for that buffer. 2 or more <classname>TextBuffer</classname>s "
-"may share the same <classname>TagTable</classname>. When you create "
-"<classname>Tag</classname>s you should add them to the <classname>TagTable</"
-"classname>. For instance:"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3608(programlisting)
-#, no-wrap
-msgid ""
-"Glib::RefPtr&lt;Gtk::TextBuffer::TagTable&gt; refTagTable =\n"
-"    Gtk::TextBuffer::TagTable::create();\n"
-"refTagTable-&gt;add(refTagMatch);\n"
-"//Hopefully a future version of <application>gtkmm</application> will have a set_tag_table() method,\n"
-"//for use after creation of the buffer.\n"
-"Glib::RefPtr&lt;Gtk::TextBuffer&gt; refBuffer =\n"
-"    Gtk::TextBuffer::create(refTagTable);"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3616(para)
-msgid ""
-"You can also use <methodname>get_tag_table()</methodname> to get, and maybe "
-"modify, the <classname>TextBuffer</classname>'s default <classname>TagTable</"
-"classname> instead of creating one explicitly."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3627(title)
-msgid "Applying Tags"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3628(para)
-msgid ""
-"If you have created a <classname>Tag</classname> and added it to the "
-"<classname>TagTable</classname>, you may apply that tag to part of the "
-"<classname>TextBuffer</classname> so that some of the text is displayed with "
-"that formatting. You define the start and end of the range of text by "
-"specifying <classname>Gtk::TextBuffer::iterator</classname>s. For instance:"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3635(programlisting)
-#, no-wrap
-msgid "refBuffer-&gt;apply_tag(refTagMatch, iterRangeStart, iterRangeStop);"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3636(para)
-msgid ""
-"Or you could specify the tag when first inserting the text: refBuffer-&gt;"
-"insert_with_tag(iter, \"Some text\", refTagMatch);"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3641(para)
+#: C/index-in.docbook:3211
 msgid ""
 "You can apply more than one <classname>Tag</classname> to the same text, by "
 "using <methodname>apply_tag()</methodname> more than once, or by using "
@@ -4816,46 +5025,50 @@ msgid ""
 "these conflicts by using <methodname>Tag::set_priority()</methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3653(title)
+#: C/index-in.docbook:3223
 msgid "Marks"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3654(para)
+#: C/index-in.docbook:3224
 msgid ""
 "<classname>TextBuffer</classname> iterators are generally invalidated when "
 "the text changes, but you can use a <classname>Gtk::TextBuffer::Mark</"
 "classname> to remember a position in these situations. For instance,"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3659(programlisting)
+#: C/index-in.docbook:3229
 #, no-wrap
-msgid ""
-"Glib::RefPtr&lt;Gtk::TextBuffer::Mark&gt; refMark =\n"
-"    refBuffer-&gt;create_mark(iter);"
+msgid "auto refMark = refBuffer-&gt;create_mark(iter);"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3662(para)
+#: C/index-in.docbook:3231
 msgid ""
 "You can then use the <methodname>get_iter()</methodname> method later to "
 "create an iterator for the <classname>Mark</classname>'s new position."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3667(para)
+#: C/index-in.docbook:3236
 msgid ""
 "There are two built-in <classname>Mark</classname>s - <literal>insert</"
-"literal> and <literal>select_bound</literal>, which you can access with "
+"literal> and <literal>selection_bound</literal>, which you can access with "
 "<classname>TextBuffer</classname>'s <methodname>get_insert()</methodname> "
 "and <methodname>get_selection_bound()</methodname> methods."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3680(para)
+#: C/index-in.docbook:3243
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1TextMark.";
+"html\">Reference</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:3249
 msgid ""
 "As mentioned above, each <classname>TextView</classname> has a "
 "<classname>TextBuffer</classname>, and one or more <classname>TextView</"
-"classname> can share the same <classname>TextBuffer</classname>."
+"classname>s can share the same <classname>TextBuffer</classname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3687(para)
+#: C/index-in.docbook:3256
 msgid ""
 "Like the <classname>TreeView</classname>, you should probably put your "
 "<classname>TextView</classname> inside a <classname>ScrolledWindow</"
@@ -4863,11 +5076,17 @@ msgid ""
 "scrollbars."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3697(title)
+#: C/index-in.docbook:3263
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1TextView.";
+"html\">Reference</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:3266
 msgid "Default formatting"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3698(para)
+#: C/index-in.docbook:3267
 msgid ""
 "<classname>TextView</classname> has various methods which allow you to "
 "change the presentation of the buffer for this particular view. Some of "
@@ -4877,24 +5096,24 @@ msgid ""
 "methodname>, <methodname>set_indent()</methodname>, etc."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3709(title)
+#: C/index-in.docbook:3278
 msgid "Scrolling"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3710(para)
+#: C/index-in.docbook:3279
 msgid ""
-"<classname>Gtk::TextView</classname> has various <methodname>scroll_to_*()</"
+"<classname>Gtk::TextView</classname> has various <methodname>scroll_to()</"
 "methodname> methods. These allow you to ensure that a particular part of the "
 "text buffer is visible. For instance, your application's Find feature might "
-"use <methodname>Gtk::TextView::scroll_to_iter()</methodname> to show the "
-"found text."
+"use <methodname>Gtk::TextView::scroll_to()</methodname> to show the found "
+"text."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3725(title)
+#: C/index-in.docbook:3294
 msgid "Widgets and ChildAnchors"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3726(para)
+#: C/index-in.docbook:3295
 msgid ""
 "You can embed widgets, such as <classname>Gtk::Button</classname>s, in the "
 "text. Each such child widget needs a <classname>ChildAnchor</classname>. "
@@ -4903,191 +5122,228 @@ msgid ""
 "<methodname>Gtk::TextBuffer::create_child_anchor()</methodname>:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3733(programlisting)
+#: C/index-in.docbook:3302
 #, no-wrap
-msgid ""
-"Glib::RefPtr&lt;Gtk::TextChildAnchor&gt; refAnchor =\n"
-"    refBuffer-&gt;create_child_anchor(iter);"
+msgid "auto refAnchor = refBuffer-&gt;create_child_anchor(iter);"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3736(para)
+#: C/index-in.docbook:3304
 msgid ""
 "Then, to add a widget at that position, use <methodname>Gtk::TextView::"
 "add_child_at_anchor()</methodname>:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3740(programlisting)
+#: C/index-in.docbook:3308
 #, no-wrap
 msgid "m_TextView.add_child_at_anchor(m_Button, refAnchor);"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3766(title)
-msgid "Menus and Toolbars"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3768(para)
+#: C/index-in.docbook:3310
 msgid ""
-"There are specific APIs for Menus and toolbars, but you should usually deal "
-"with them together, using the <classname>UIManager</classname> to define "
-"<classname>Action</classname>s which you can then arrange in menu and "
-"toolbars. In this way you can handle activation of the action instead of "
-"responding to the menu and toolbar items separately. And you can enable or "
-"disable both the menu and toolbar item via the action."
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/";
+"classGtk_1_1TextChildAnchor.html\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3776(para)
+#: C/index-in.docbook:3325
 msgid ""
-"This involves the use of the <classname>Gtk::ActionGroup</classname>, "
-"<classname>Gtk::Action</classname>, and <classname>UIManager</classname> "
-"classes, all of which should be instantiated via their <methodname>create()</"
-"methodname> methods, which return <classname>RefPtr</classname>s."
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/textview/\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3785(title)
-msgid "Actions"
+#: C/index-in.docbook:3334
+msgid "Menus and Toolbars"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3786(para)
+#: C/index-in.docbook:3336
 msgid ""
-"First create the <classname>Action</classname>s and add them to an "
-"<classname>ActionGroup</classname>, with <methodname>ActionGroup::add()</"
-"methodname>."
+"There are specific APIs for menus and toolbars, but you should usually deal "
+"with them together, creating <classname>Gio::SimpleAction</classname>s that "
+"you can refer to in both menus and toolbars. In this way you can handle "
+"activation of the action instead of responding to the menu and toolbar items "
+"separately. And you can enable or disable both the menu and toolbar item via "
+"the action. <classname>Gtk::Builder</classname> can create menus and "
+"toolbars."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3792(para)
+#: C/index-in.docbook:3344
 msgid ""
-"The arguments to <methodname>Action::create()</methodname> specify the "
-"action's name and how it will appear in menus and toolbars. Use stock items "
-"where possible so that you don't need to specify the label, accelerator, "
-"icon, and tooltips, and so you can use pre-existing translations."
+"This involves the use of the <classname>Gio::SimpleActionGroup</classname>, "
+"<classname>Gio::SimpleAction</classname> and <classname>Gtk::Builder</"
+"classname> classes, all of which should be instantiated via their "
+"<methodname>create()</methodname> methods, which return <classname>RefPtr</"
+"classname>s."
+msgstr ""
+
+#: C/index-in.docbook:3352
+msgid "Actions"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3798(para)
+#: C/index-in.docbook:3353
 msgid ""
-"You can also specify a signal handler when calling <methodname>ActionGroup::"
-"add()</methodname>. This signal handler will be called when the action is "
-"activated via either a menu item or a toolbar button."
+"First create the <classname>Gio::SimpleAction</classname>s and add them to a "
+"<classname>Gio::SimpleActionGroup</classname>, with <methodname>Gio::"
+"ActionMap::add_action()</methodname>. (<classname>Gio::ActionMap</classname> "
+"is a base class of <classname>Gio::SimpleActionGroup</classname>.) Then add "
+"the action group to your window with <methodname>Gtk::Widget::"
+"insert_action_group()</methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3803(para)
-msgid "Note that you must specify actions for sub menus as well as menu items."
+#: C/index-in.docbook:3361
+msgid ""
+"The arguments to <methodname>add_action()</methodname> specify the action's "
+"name, which is used in the menu items and toolbar buttons. You can also "
+"specify a signal handler when calling <methodname>add_action()</methodname>. "
+"This signal handler will be called when the action is activated via either a "
+"menu item or a toolbar button."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3805(para)
+#: C/index-in.docbook:3369 C/index-in.docbook:3495
 msgid "For instance:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3807(programlisting)
+#: C/index-in.docbook:3371
 #, no-wrap
 msgid ""
-"m_refActionGroup = Gtk::ActionGroup::create();\n"
 "\n"
-"m_refActionGroup-&gt;add( Gtk::Action::create(\"MenuFile\", \"_File\") );\n"
-"m_refActionGroup-&gt;add( Gtk::Action::create(\"New\", Gtk::Stock::NEW),\n"
-"  sigc::mem_fun(*this, &amp;ExampleWindow::on_action_file_new) );\n"
-"m_refActionGroup-&gt;add( Gtk::Action::create(\"ExportData\", \"Export Data\"),\n"
-"  sigc::mem_fun(*this, &amp;ExampleWindow::on_action_file_open) );\n"
-"m_refActionGroup-&gt;add( Gtk::Action::create(\"Quit\", Gtk::Stock::QUIT),\n"
-"  sigc::mem_fun(*this, &amp;ExampleWindow::on_action_file_quit) );"
+"m_refActionGroup = Gio::SimpleActionGroup::create();\n"
+"\n"
+"m_refActionGroup-&gt;add_action(\"new\", sigc::mem_fun(*this, &amp;ExampleWindow::on_action_file_new));\n"
+"m_refActionGroup-&gt;add_action(\"open\", sigc::mem_fun(*this, &amp;ExampleWindow::on_action_file_open));\n"
+"m_refActionGroup-&gt;add_action(\"quit\", sigc::mem_fun(*this, &amp;ExampleWindow::on_action_file_quit));\n"
+"\n"
+"insert_action_group(\"example\", m_refActionGroup);\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3817(para)
+#: C/index-in.docbook:3381
 msgid ""
-"Note that this is where we specify the names of the actions as they will be "
-"seen by users in menus and toolbars. Therefore, this is where you should "
-"make strings translatable, by putting them inside the _() macro. When we use "
-"the Gtk::Stock items, of course, translations are automatically available."
+"If you use an <classname>Gtk::ApplicationWindow</classname>, you don't have "
+"to create your own action group. <classname>Gio::ActionGroup</classname> and "
+"<classname>Gio::ActionMap</classname> are base classes of <classname>Gtk::"
+"ApplicationWindow</classname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3822(title)
-msgid "UIManager"
+#: C/index-in.docbook:3392
+msgid "Menubar and Toolbar"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3823(para)
+#: C/index-in.docbook:3393
 msgid ""
-"Next you should create a <classname>UIManager</classname> and add the "
-"<classname>ActionGroup</classname> to the <classname>UIManager</classname> "
-"with <methodname>insert_action_group()</methodname> At this point is also a "
-"good idea to tell the parent window to respond to the specified keyboard "
-"shortcuts, by using <methodname>add_accel_group()</methodname>."
+"Next you should create a <classname>Gtk::Builder</classname>. At this point "
+"is also a good idea to tell the application to respond to keyboard "
+"shortcuts, by using <methodname>Gtk::Application::set_accel_for_action()</"
+"methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3831(para) C/gtkmm-tutorial-in.xml:5209(para)
+#: C/index-in.docbook:3399
 msgid "For instance,"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3833(programlisting)
+#: C/index-in.docbook:3401
 #, no-wrap
 msgid ""
-"Glib::RefPtr&lt;Gtk::UIManager&gt; m_refUIManager =\n"
-"    Gtk::UIManager::create();\n"
-"m_refUIManager-&gt;insert_action_group(m_refActionGroup);\n"
-"add_accel_group(m_refUIManager-&gt;get_accel_group());"
+"\n"
+"m_refBuilder = Gtk::Builder::create();\n"
+"\n"
+"app-&gt;set_accel_for_action(\"example.new\", \"&lt;Primary&gt;n\");\n"
+"app-&gt;set_accel_for_action(\"example.quit\", \"&lt;Primary&gt;q\");\n"
+"app-&gt;set_accel_for_action(\"example.copy\", \"&lt;Primary&gt;c\");\n"
+"app-&gt;set_accel_for_action(\"example.paste\", \"&lt;Primary&gt;v\");\n"
+msgstr ""
+
+#: C/index-in.docbook:3409
+msgid ""
+"If your main window is derived from <classname>ApplicationWindow</classname> "
+"and you instantiate your menubar with <methodname>Gtk::Application::"
+"set_menubar()</methodname>, then you don't have to call "
+"<methodname>set_accel_for_action()</methodname>. See <link linkend=\"menu-"
+"example-main\">Application Menu and Main Menu example</link> for an example."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3837(para)
+#: C/index-in.docbook:3417
 msgid ""
 "Then, you can define the actual visible layout of the menus and toolbars, "
-"and add the UI layout to the <classname>UIManager</classname>. This \"ui "
-"string\" uses an XML format, in which you should mention the names of the "
-"actions that you have already created. For instance:"
+"and add the UI layout to the <classname>Builder</classname>. This \"ui string"
+"\" uses an XML format, in which you should mention the names of the actions "
+"that you have already created. For instance:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3843(programlisting)
+#: C/index-in.docbook:3423
 #, no-wrap
 msgid ""
+"\n"
 "Glib::ustring ui_info =\n"
-"    \"&lt;ui&gt;\"\n"
-"    \"  &lt;menubar name='MenuBar'&gt;\"\n"
-"    \"    &lt;menu action='MenuFile'&gt;\"\n"
-"    \"      &lt;menuitem action='New'/&gt;\"\n"
-"    \"      &lt;menuitem action='Open'/&gt;\"\n"
-"    \"      &lt;separator/&gt;\"\n"
-"    \"      &lt;menuitem action='Quit'/&gt;\"\n"
-"    \"    &lt;/menu&gt;\"\n"
-"    \"    &lt;menu action='MenuEdit'&gt;\"\n"
-"    \"      &lt;menuitem action='Cut'/&gt;\"\n"
-"    \"      &lt;menuitem action='Copy'/&gt;\"\n"
-"    \"      &lt;menuitem action='Paste'/&gt;\"\n"
-"    \"    &lt;/menu&gt;\"\n"
-"    \"  &lt;/menubar&gt;\"\n"
-"    \"  &lt;toolbar  name='ToolBar'&gt;\"\n"
-"    \"    &lt;toolitem action='Open'/&gt;\"\n"
-"    \"    &lt;toolitem action='Quit'/&gt;\"\n"
-"    \"  &lt;/toolbar&gt;\"\n"
-"    \"&lt;/ui&gt;\";\n"
-"\n"
-"m_refUIManager-&gt;add_ui_from_string(ui_info);"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3866(para)
-msgid ""
-"Remember that these names are just the identifiers that we used when "
-"creating the actions. They are not the text that the user will see in the "
-"menus and toolbars. We provided those human-readable names when we created "
-"the actions."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3867(para)
-msgid ""
-"To instantiate a <classname>Gtk::MenuBar</classname> or <classname>Gtk::"
+"  \"&lt;interface&gt;\"\n"
+"  \"  &lt;menu id='menubar'&gt;\"\n"
+"  \"    &lt;submenu&gt;\"\n"
+"  \"      &lt;attribute name='label' translatable='yes'&gt;_File&lt;/attribute&gt;\"\n"
+"  \"      &lt;section&gt;\"\n"
+"  \"        &lt;item&gt;\"\n"
+"  \"          &lt;attribute name='label' translatable='yes'&gt;_New&lt;/attribute&gt;\"\n"
+"  \"          &lt;attribute name='action'&gt;example.new&lt;/attribute&gt;\"\n"
+"  \"          &lt;attribute name='accel'&gt;&amp;lt;Primary&amp;gt;n&lt;/attribute&gt;\"\n"
+"  \"        &lt;/item&gt;\"\n"
+"  \"      &lt;/section&gt;\"\n"
+"  \"      &lt;section&gt;\"\n"
+"  \"        &lt;item&gt;\"\n"
+"  \"          &lt;attribute name='label' translatable='yes'&gt;_Quit&lt;/attribute&gt;\"\n"
+"  \"          &lt;attribute name='action'&gt;example.quit&lt;/attribute&gt;\"\n"
+"  \"          &lt;attribute name='accel'&gt;&amp;lt;Primary&amp;gt;q&lt;/attribute&gt;\"\n"
+"  \"        &lt;/item&gt;\"\n"
+"  \"      &lt;/section&gt;\"\n"
+"  \"    &lt;/submenu&gt;\"\n"
+"  \"    &lt;submenu&gt;\"\n"
+"  \"      &lt;attribute name='label' translatable='yes'&gt;_Edit&lt;/attribute&gt;\"\n"
+"  \"      &lt;item&gt;\"\n"
+"  \"        &lt;attribute name='label' translatable='yes'&gt;_Copy&lt;/attribute&gt;\"\n"
+"  \"        &lt;attribute name='action'&gt;example.copy&lt;/attribute&gt;\"\n"
+"  \"        &lt;attribute name='accel'&gt;&amp;lt;Primary&amp;gt;c&lt;/attribute&gt;\"\n"
+"  \"      &lt;/item&gt;\"\n"
+"  \"      &lt;item&gt;\"\n"
+"  \"        &lt;attribute name='label' translatable='yes'&gt;_Paste&lt;/attribute&gt;\"\n"
+"  \"        &lt;attribute name='action'&gt;example.paste&lt;/attribute&gt;\"\n"
+"  \"        &lt;attribute name='accel'&gt;&amp;lt;Primary&amp;gt;v&lt;/attribute&gt;\"\n"
+"  \"      &lt;/item&gt;\"\n"
+"  \"    &lt;/submenu&gt;\"\n"
+"  \"  &lt;/menu&gt;\"\n"
+"  \"&lt;/interface&gt;\";\n"
+"\n"
+"m_refBuilder-&gt;add_from_string(ui_info);\n"
+"m_refBuilder-&gt;add_from_resource(\"/toolbar/toolbar.glade\");\n"
+msgstr ""
+
+#: C/index-in.docbook:3464
+msgid ""
+"This is where we specify the names of the menu items as they will be seen by "
+"users in the menu. Therefore, this is where you should make strings "
+"translatable, by adding <literal>translatable='yes'</literal>."
+msgstr ""
+
+#: C/index-in.docbook:3468
+msgid ""
+"To instantiate a <classname>Gtk::MenuBar</classname> and <classname>Gtk::"
 "Toolbar</classname> which you can actually show, you should use the "
-"<methodname>UIManager::get_widget()</methodname> method, and then add the "
-"widget to a container. For instance:"
+"<methodname>Builder::get_object()</methodname> and <methodname>Builder::"
+"get_widget()</methodname> methods, and then add the widgets to a container. "
+"For instance:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3873(programlisting)
+#: C/index-in.docbook:3475
 #, no-wrap
 msgid ""
-"Gtk::Widget* pMenubar = m_refUIManager-&gt;get_widget(\"/MenuBar\");\n"
-"pBox-&gt;add(*pMenuBar, Gtk::PACK_SHRINK);"
+"\n"
+"auto gmenu = m_refBuilder-&gt;get_object&lt;Gio::Menu&gt;(\"menubar\");\n"
+"auto pMenuBar = Gtk::make_managed&lt;Gtk::MenuBar&gt;(gmenu);\n"
+"m_Box.append(*pMenuBar);\n"
+"\n"
+"auto toolbar = m_refBuilder-&gt;get_widget&lt;Gtk::Toolbar&gt;(\"toolbar\");\n"
+"m_Box.append(*toolbar);\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3879(title)
+#: C/index-in.docbook:3487
 msgid "Popup Menus"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3880(para)
+#: C/index-in.docbook:3488
 msgid ""
 "<classname>Menus</classname> are normally just added to a window, but they "
 "can also be displayed temporarily as the result of a mouse button click. For "
@@ -5095,28 +5351,37 @@ msgid ""
 "mouse button."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3887(para)
-msgid ""
-"The UI layout for a popup menu should use the <literal>popup</literal> node. "
-"For instance:"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3889(programlisting)
+#: C/index-in.docbook:3497
 #, no-wrap
 msgid ""
-"Glib::ustring ui_info =\n"
-"    \"&lt;ui&gt;\"\n"
-"    \"  &lt;popup name='PopupMenu'&gt;\"\n"
-"    \"    &lt;menuitem action='ContextEdit'/&gt;\"\n"
-"    \"    &lt;menuitem action='ContextProcess'/&gt;\"\n"
-"    \"    &lt;menuitem action='ContextRemove'/&gt;\"\n"
-"    \"  &lt;/popup&gt;\"\n"
-"    \"&lt;/ui&gt;\";\n"
 "\n"
-"m_refUIManager-&gt;add_ui_from_string(ui_info);"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3900(para)
+"Glib::ustring ui_info =\n"
+"  \"&lt;interface&gt;\"\n"
+"  \"  &lt;menu id='menu-examplepopup'&gt;\"\n"
+"  \"    &lt;section&gt;\"\n"
+"  \"      &lt;item&gt;\"\n"
+"  \"        &lt;attribute name='label' translatable='yes'&gt;Edit&lt;/attribute&gt;\"\n"
+"  \"        &lt;attribute name='action'&gt;examplepopup.edit&lt;/attribute&gt;\"\n"
+"  \"      &lt;/item&gt;\"\n"
+"  \"      &lt;item&gt;\"\n"
+"  \"        &lt;attribute name='label' translatable='yes'&gt;Process&lt;/attribute&gt;\"\n"
+"  \"        &lt;attribute name='action'&gt;examplepopup.process&lt;/attribute&gt;\"\n"
+"  \"      &lt;/item&gt;\"\n"
+"  \"      &lt;item&gt;\"\n"
+"  \"        &lt;attribute name='label' translatable='yes'&gt;Remove&lt;/attribute&gt;\"\n"
+"  \"        &lt;attribute name='action'&gt;examplepopup.remove&lt;/attribute&gt;\"\n"
+"  \"      &lt;/item&gt;\"\n"
+"  \"    &lt;/section&gt;\"\n"
+"  \"  &lt;/menu&gt;\"\n"
+"  \"&lt;/interface&gt;\";\n"
+"\n"
+"m_refBuilder-&gt;add_from_string(ui_info);\n"
+"\n"
+"auto gmenu = m_refBuilder-&gt;get_object&lt;Gio::Menu&gt;(\"menu-examplepopup\");\n"
+"m_pMenuPopup = std::make_unique&lt;Gtk::Menu&gt;(gmenu);\n"
+msgstr ""
+
+#: C/index-in.docbook:3524
 msgid ""
 "To show the popup menu, use <classname>Gtk::Menu</classname>'s "
 "<methodname>popup()</methodname> method, providing the button identifier and "
@@ -5124,148 +5389,194 @@ msgid ""
 "literal> signal, which you will need to handle anyway. For instance:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3906(programlisting)
+#: C/index-in.docbook:3530
 #, no-wrap
 msgid ""
+"\n"
 "bool ExampleWindow::on_button_press_event(GdkEventButton* event)\n"
 "{\n"
-"  if( (event-&gt;type == GDK_BUTTON_PRESS) &amp;&amp;\n"
-"      (event-&gt;button == 3) )\n"
+"  if( (event-&gt;type == GDK_BUTTON_PRESS) &amp;&amp; (event-&gt;button == 3) )\n"
 "  {\n"
-"    m_Menu_Popup-&gt;popup(event-&gt;button, event-&gt;time);\n"
+"    if(!m_pMenuPopup-&gt;get_attach_widget())\n"
+"      m_pMenuPopup-&gt;attach_to_widget(*this);\n"
+"\n"
+"    m_pMenuPopup-&gt;popup(event-&gt;button, event-&gt;time);\n"
 "    return true; //It has been handled.\n"
 "  }\n"
 "  else\n"
 "    return false;\n"
-"}"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3923(title)
-msgid "Main Menu example"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3926(title)
-msgid "Main Menu"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3936(title)
-msgid "Popup Menu example"
+"}\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3939(title)
-msgid "Popup Menu"
+#: C/index-in.docbook:3549
+msgid "Gio::Resource and glib-compile-resources"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3954(title) C/gtkmm-tutorial-in.xml:3995(title)
-msgid "ToolPalette"
+#: C/index-in.docbook:3551
+msgid ""
+"Applications and libraries often contain binary or textual data that is "
+"really part of the application, rather than user data. For instance "
+"<classname>Gtk::Builder</classname> <filename class=\"extension\">.glade</"
+"filename> files, splashscreen images, <classname>Gio::Menu</classname> "
+"markup xml, CSS files, icons, etc. These are often shipped as files in "
+"<filename class=\"directory\">$datadir/appname</filename>, or manually "
+"included as literal strings in the code."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3956(para)
+#: C/index-in.docbook:3559
 msgid ""
-"A <classname>ToolPalette</classname> is similar to a <classname>Toolbar</"
-"classname> but can contain a grid of items, categorized into groups. The "
-"user may hide or expand each group. As in a toolbar, the items may be "
-"displayed as only icons, as only text, or as icons with text."
+"The <classname>Gio::Resource</classname> API and the <application>glib-"
+"compile-resources</application> program provide a convenient and efficient "
+"alternative to this, which has some nice properties. You maintain the files "
+"as normal files, so it's easy to edit them, but during the build the files "
+"are combined into a binary bundle that is linked into the executable. This "
+"means that loading the resource files is efficient (as they are already in "
+"memory, shared with other instances) and simple (no need to check for things "
+"like I/O errors or locate the files in the filesystem). It also makes it "
+"easier to create relocatable applications."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3958(para)
+#: C/index-in.docbook:3568
 msgid ""
-"The <classname>ToolPalette</classname>'s items might be dragged or simply "
-"activated. For instance, the user might drag objects to a canvas to create "
-"new items there. Or the user might click an item to activate a certain brush "
-"size in a drawing application."
+"Resource bundles are created by the <ulink url=\"https://developer.gnome.org/";
+"gio/stable/glib-compile-resources.html\">glib-compile-resources</ulink> "
+"program which takes an xml file that describes the bundle, and a set of "
+"files that the xml references. These are combined into a binary resource "
+"bundle."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3959(para)
+#: C/index-in.docbook:3574
 msgid ""
-"<classname>ToolItemGroup</classname>s should be added to the tool pallete "
-"via the base class's <function>Gtk::Container::add()</function> method, for "
-"instance like so:"
+"<ulink url=\"http://developer.gnome.org/glibmm/unstable/classGio_1_1Resource.";
+"html\">Gio::Resource Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3962(programlisting)
+#: C/index-in.docbook:3577
 #, no-wrap
 msgid ""
 "\n"
-"Gtk::ToolItemGroup* group_brushes =\n"
-"  Gtk::manage(new Gtk::ToolItemGroup(\"Brushes\"));\n"
-"m_ToolPalette.add(*group_brushes);\n"
+"&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n"
+"&lt;gresources&gt;\n"
+"  &lt;gresource prefix=\"/toolbar\"&gt;\n"
+"    &lt;file preprocess=\"xml-stripblanks\"&gt;toolbar.glade&lt;/file&gt;\n"
+"    &lt;file&gt;rain.png&lt;/file&gt;\n"
+"  &lt;/gresource&gt;\n"
+"&lt;/gresources&gt;\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3968(para)
-msgid ""
-"<classname>Gtk::ToolItem</classname>s can then be added to the group. For "
-"instance, like so:"
+#: C/index-in.docbook:3588
+msgid "<filename>/toolbar/toolbar.glade</filename>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3972(programlisting)
-#, no-wrap
-msgid ""
-"\n"
-"Gtk::ToolButton* button = Gtk::manage(new Gtk::ToolButton(icon, \"Big\"));\n"
-"button-&gt;set_tooltip_text(\"Big Brush);\n"
-"group_brushes-&gt;insert(*button);\n"
+#: C/index-in.docbook:3589
+msgid "<filename>/toolbar/rain.png</filename>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3978(para)
+#: C/index-in.docbook:3575
 msgid ""
-"You might then handle the <classname>ToolButton</classname>'s "
-"<literal>clicked</literal> signal. Alternatively, you could allow the item "
-"to be dragged to another widget, by calling <methodname>Gtk::ToolPalette::"
-"add_drag_dest()</methodname> and then using <methodname>Gtk::ToolPalette::"
-"get_drag_item()</methodname> in the other widget's "
-"<literal>drag_data_received</literal> signal handler."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:3980(ulink)
-msgid "ToolPalette Reference"
+"An example: <_:programlisting-1/> This will create a resource bundle with "
+"the files <_:itemizedlist-2/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3981(ulink)
-msgid "ToolItemGroup Reference"
+#: C/index-in.docbook:3597
+#, no-wrap
+msgid "$ glib-compile-resources --target=resources.c --generate-source toolbar.gresource.xml"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3982(ulink)
-msgid "ToolItem Reference"
+#: C/index-in.docbook:3592
+msgid ""
+"You can then use <application>glib-compile-resources</application> to "
+"compile the xml to a binary bundle that you can load with <methodname>Gio::"
+"Resource::create_from_file()</methodname>. However, it's more common to use "
+"the <parameter class=\"command\">--generate-source</parameter> argument to "
+"create a C source file to link directly into your application. E.g. <_:"
+"screen-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3986(para)
+#: C/index-in.docbook:3599
 msgid ""
-"Call <methodname>add_drag_dest()</methodname> to allow items or groups to be "
-"dragged from the tool palette to a particular destination widget. You can "
-"then use <methodname>get_drag_item()</methodname> to discover which ToolItem "
-"or ToolItemGroup is being dragged. You can use <literal>dynamic_cast</"
-"literal> to discover whether is it an item or a group. For instance, you "
-"might use this in your <literal>drag_data_received</literal> signal handler, "
-"to add a dropped item, or to show a suitable icon while dragging."
+"Once a <classname>Gio::Resource</classname> has been created and registered "
+"all the data in it can be accessed globally in the process by using API "
+"calls like <methodname>Gio::Resource::open_stream_from_global_resources()</"
+"methodname> to stream the data or <methodname>Gio::Resource::"
+"lookup_data_in_global_resources()</methodname> to get a direct pointer to "
+"the data. You can also use URIs like <uri>resource:///toolbar/rain.png</uri> "
+"with <classname>Gio::File</classname> to access the resource data."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3987(para)
+#: C/index-in.docbook:3607
 msgid ""
-"See the <link linkend=\"chapter-draganddrop\">Drag and Drop</link> chapter "
-"for general advice about Drag and Drop with gtkmm."
+"Often you don't need a <classname>Gio::Resource</classname> instance, "
+"because resource data can be loaded with methods such as <methodname>Gdk::"
+"Pixbuf::create_from_resource()</methodname>, <methodname>Gtk::Builder::"
+"add_from_resource()</methodname> and <methodname>Gtk::Image::"
+"set_from_resource()</methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3990(title)
-msgid "ToolPalette Example"
+#: C/index-in.docbook:3620
+msgid "Application Menu and Main Menu example"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:3992(para)
+#: C/index-in.docbook:3621
 msgid ""
-"This example adds a <classname>ToolPalette</classname> and a "
-"<classname>DrawingArea</classname> to a window and allows the user to drag "
-"icons from the tool palette to the drawing area. The tool palette contains "
-"several groups of items. The combo boxes allow the user to change the style "
-"and orientation of the tool palette."
+"This program contains an application menu, a menubar and a toolbar. Classes "
+"are derived from <classname>Gtk::Application</classname> and <classname>Gtk::"
+"ApplicationWindow</classname>."
 msgstr ""
+"该程序拥有一个应用程序菜单,一个菜单栏和一个工具栏。这个类是自<classname>Gtk::Application</classname>"
+"和<classname>Gtk::ApplicationWindow</classname>派生而来的。"
 
-#: C/gtkmm-tutorial-in.xml:4008(title)
-msgid "Adjustments"
+#: C/index-in.docbook:3628
+msgid "App and Main Menu"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4010(para)
+#: C/index-in.docbook:3634
 msgid ""
-"<application>gtkmm</application> has various widgets that can be visually "
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/menus/main_menu/\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:3638
+msgid "Main Menu example"
+msgstr ""
+
+#: C/index-in.docbook:3639
+msgid ""
+"This program contains a menubar and a toolbar. A class is derived from "
+"<classname>Gtk::Window</classname>."
+msgstr ""
+
+#: C/index-in.docbook:3645
+msgid "Main Menu"
+msgstr ""
+
+#: C/index-in.docbook:3651
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/menus_and_toolbars\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:3655
+msgid "Popup Menu example"
+msgstr ""
+
+#: C/index-in.docbook:3658
+msgid "Popup Menu"
+msgstr ""
+
+#: C/index-in.docbook:3664
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/menus/popup/\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:3673
+msgid "Adjustments"
+msgstr ""
+
+#: C/index-in.docbook:3675
+msgid ""
+"<application>gtkmm</application> has various widgets that can be visually "
 "adjusted using the mouse or the keyboard, such as the <classname>Range</"
 "classname> widgets (described in the <link linkend=\"chapter-range-widgets"
 "\">Range Widgets</link> section). There are also a few widgets that display "
@@ -5274,66 +5585,68 @@ msgid ""
 "objects that express this common part of their API."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4020(para)
+#: C/index-in.docbook:3685
 msgid ""
 "So that applications can react to changes, for instance when a user moves a "
-"scrollbar, <classname>Gtk::Adjustment</classname> has a <literal>changed</"
-"literal> signal. You can then use the <methodname>get_changed()</methodname> "
-"method to discover the new value."
+"scrollbar, <classname>Gtk::Adjustment</classname> has a "
+"<literal>value_changed</literal> signal. You can then use the "
+"<methodname>get_value()</methodname> method to discover the new value."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4028(title)
+#: C/index-in.docbook:3693
 msgid "Creating an Adjustment"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4030(para)
-msgid "The <classname>Gtk::Adjustment</classname> constructor is as follows:"
+#: C/index-in.docbook:3695
+msgid ""
+"The <classname>Gtk::Adjustment</classname> is created by its "
+"<methodname>create()</methodname> method which is as follows:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4034(programlisting)
+#: C/index-in.docbook:3700
 #, no-wrap
 msgid ""
-"Gtk::Adjustment(float value,\n"
-"                float lower,\n"
-"                float upper,\n"
-"                float step_increment = 1,\n"
-"                float page_increment = 10,\n"
-"                float page_size = 0);"
+"Glib::RefPtr&lt;Gtk::Adjustment&gt; Gtk::Adjustment::create(\n"
+"  double value,\n"
+"  double lower,\n"
+"  double upper,\n"
+"  double step_increment = 1,\n"
+"  double page_increment = 10,\n"
+"  double page_size = 0);"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4041(para)
+#: C/index-in.docbook:3708
 msgid ""
 "The <parameter>value</parameter> argument is the initial value of the "
 "adjustment, usually corresponding to the topmost or leftmost position of an "
 "adjustable widget. The <parameter>lower</parameter> and <parameter>upper</"
-"parameter> arguments specifies the possible range of values which the "
+"parameter> arguments specify the possible range of values which the "
 "adjustment can hold. The <parameter>step_increment</parameter> argument "
 "specifies the smaller of the two increments by which the user can change the "
 "value, while the <parameter>page_increment</parameter> is the larger one. "
 "The <parameter>page_size</parameter> argument usually corresponds somehow to "
 "the visible area of a panning widget. The <parameter>upper</parameter> "
-"argument is used to represent the bottom most or right most coordinate in a "
-"panning widget's child. TODO: Investigate the upper argument properly. There "
-"was some unclear stuff about it not always being the upper value."
+"argument is used to represent the bottommost or rightmost coordinate in a "
+"panning widget's child."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4060(title)
+#: C/index-in.docbook:3727
 msgid "Using Adjustments the Easy Way"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4062(para)
+#: C/index-in.docbook:3729
 msgid ""
 "The adjustable widgets can be roughly divided into those which use and "
 "require specific units for these values, and those which treat them as "
 "arbitrary numbers."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4067(para)
+#: C/index-in.docbook:3734
 msgid ""
 "The group which treats the values as arbitrary numbers includes the "
-"<classname>Range</classname> widgets (<classname>Scrollbars</classname> and "
-"<classname>Scales</classname>, the <classname>Progressbar</classname> "
-"widget, and the <classname>SpinButton</classname> widget). These widgets are "
+"<classname>Range</classname> widgets (<classname>Scrollbar</classname> and "
+"<classname>Scale</classname>), the <classname>ScaleButton</classname> "
+"widget, and the <classname>SpinButton</classname> widget. These widgets are "
 "typically \"adjusted\" directly by the user with the mouse or keyboard. They "
 "will treat the <parameter>lower</parameter> and <parameter>upper</parameter> "
 "values of an adjustment as a range within which the user can manipulate the "
@@ -5341,7 +5654,7 @@ msgid ""
 "the <parameter>value</parameter> of an adjustment."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4079(para)
+#: C/index-in.docbook:3746
 msgid ""
 "The other group includes the <classname>Viewport</classname> widget and the "
 "<classname>ScrolledWindow</classname> widget. All of these widgets use pixel "
@@ -5351,28 +5664,27 @@ msgid ""
 "this particular category of widgets create its own adjustments."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4088(para)
+#: C/index-in.docbook:3755
 msgid ""
-"TODO: Text widget is deprecated: Look at GTK+ tutorial for up-to-date "
-"example. If you share an adjustment object between a Scrollbar and a Text "
-"widget, manipulating the scrollbar will automagically adjust the Text "
-"widget. You can set it up like this:"
+"If you share an adjustment object between a Scrollbar and a TextView widget, "
+"manipulating the scrollbar will automagically adjust the TextView widget. "
+"You can set it up like this:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4094(programlisting)
+#: C/index-in.docbook:3760
 #, no-wrap
 msgid ""
 "// creates its own adjustments\n"
-"Gtk::Text text(0, 0);\n"
+"Gtk::TextView textview;\n"
 "// uses the newly-created adjustment for the scrollbar as well\n"
-"Gtk::VScrollbar vscrollbar (*(text.get_vadjustment()));"
+"Gtk::Scrollbar vscrollbar (textview.get_vadjustment(), Gtk::ORIENTATION_VERTICAL);"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4102(title)
+#: C/index-in.docbook:3768
 msgid "Adjustment Internals"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4104(para)
+#: C/index-in.docbook:3770
 msgid ""
 "OK, you say, that's nice, but what if I want to create my own handlers to "
 "respond when the user adjusts a <classname>Range</classname> widget or a "
@@ -5381,7 +5693,7 @@ msgid ""
 "and <methodname>set_value()</methodname> methods:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4112(para)
+#: C/index-in.docbook:3778
 msgid ""
 "As mentioned earlier, <classname>Gtk::Adjustment</classname> can emit "
 "signals. This is, of course, how updates happen automatically when you share "
@@ -5391,34 +5703,34 @@ msgid ""
 "signal, as can your program."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4121(para)
+#: C/index-in.docbook:3787
 msgid ""
 "So, for example, if you have a <classname>Scale</classname> widget, and you "
 "want to change the rotation of a picture whenever its value changes, you "
 "would create a signal handler like this:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4126(programlisting)
+#: C/index-in.docbook:3792
 #, no-wrap
 msgid ""
-"void cb_rotate_picture (Gtk::Widget *picture)\n"
+"void cb_rotate_picture (MyPicture* picture)\n"
 "{\n"
-"  picture-&gt;set_rotation (adj-&gt;value);\n"
+"  picture-&gt;set_rotation(adj-&gt;get_value());\n"
 "..."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4130(para)
+#: C/index-in.docbook:3796
 msgid "and connect it to the scale widget's adjustment like this:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4133(programlisting)
+#: C/index-in.docbook:3799
 #, no-wrap
 msgid ""
-"adj.value_changed.connect(sigc::bind&lt;Widget*&gt;(sigc::mem_fun(*this,\n"
+"adj-&gt;signal_value_changed().connect(sigc::bind&lt;MyPicture*&gt;(sigc::mem_fun(*this,\n"
 "    &amp;cb_rotate_picture), picture));"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4136(para)
+#: C/index-in.docbook:3802
 msgid ""
 "What if a widget reconfigures the <parameter>upper</parameter> or "
 "<parameter>lower</parameter> fields of its <classname>Adjustment</"
@@ -5426,7 +5738,7 @@ msgid ""
 "case, it emits the <literal>changed</literal> signal."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4143(para)
+#: C/index-in.docbook:3809
 msgid ""
 "<classname>Range</classname> widgets typically connect a handler to this "
 "signal, which changes their appearance to reflect the change - for example, "
@@ -5435,244 +5747,227 @@ msgid ""
 "<parameter>upper</parameter> values of its <classname>Adjustment</classname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4152(para)
+#: C/index-in.docbook:3818
 msgid ""
 "You probably won't ever need to attach a handler to this signal, unless "
 "you're writing a new type of range widget."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4156(programlisting)
+#: C/index-in.docbook:3822
 #, no-wrap
-msgid "adjustment-&gt;changed();"
+msgid "adjustment-&gt;signal_changed();"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4163(title)
-msgid "Widgets Without X-Windows"
+#: C/index-in.docbook:3829
+msgid "Dialogs"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4165(para)
+#: C/index-in.docbook:3831
 msgid ""
-"Some Widgets do not have an associated X-Window, so they therefore do not "
-"receive X events. This means that the signals described in the <link linkend="
-"\"sec-xeventsignals\">X event signals</link> section will not be emitted. If "
-"you want to capture events for these widgets you can use a special container "
-"called <classname>Gtk::EventBox</classname>, which is described in the <link "
-"linkend=\"sec-eventbox\">EventBox</link> section."
+"Dialogs are used as secondary windows, to provide specific information or to "
+"ask questions. <classname>Gtk::Dialog</classname> windows contain a few pre-"
+"packed widgets to ensure consistency, and a <methodname>run()</methodname> "
+"method which blocks until the user dismisses the dialog."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4174(para)
-msgid "Here is a list of some of these Widgets:"
+#: C/index-in.docbook:3838
+msgid ""
+"There are several derived <classname>Dialog</classname> classes which you "
+"might find useful. <classname>Gtk::MessageDialog</classname> is used for "
+"most simple notifications. But at other times you might need to derive your "
+"own dialog class to provide more complex functionality."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4177(programlisting)
-#, no-wrap
+#: C/index-in.docbook:3845
 msgid ""
-"Gtk::Alignment\n"
-"Gtk::Arrow\n"
-"Gtk::Bin\n"
-"Gtk::Box\n"
-"Gtk::Button\n"
-"Gtk::CheckButton\n"
-"Gtk::Fixed\n"
-"Gtk::Image\n"
-"Gtk::Item\n"
-"Gtk::Label\n"
-"Gtk::MenuItem\n"
-"Gtk::Notebook\n"
-"Gtk::Paned\n"
-"Gtk::Pixmap\n"
-"Gtk::RadioButton\n"
-"Gtk::Range\n"
-"Gtk::ScrolledWindow\n"
-"Gtk::Separator\n"
-"Gtk::Table\n"
-"Gtk::Toolbar\n"
-"Gtk::AspectFrame\n"
-"Gtk::Frame\n"
-"Gtk::VBox\n"
-"Gtk::HBox\n"
-"Gtk::VSeparator\n"
-"Gtk::HSeparator"
+"To pack widgets into a custom dialog, you should pack them into the "
+"<classname>Gtk::Box</classname>, available via "
+"<methodname>get_content_area()</methodname>. To just add a "
+"<classname>Button</classname> to the bottom of the <classname>Dialog</"
+"classname>, you could use the <methodname>add_button()</methodname> method."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4204(para)
+#: C/index-in.docbook:3853
 msgid ""
-"These widgets are mainly used for decoration or layout, so you won't often "
-"need to capture events on them. They are intended to have no X-Window in "
-"order to improve performance."
+"The <methodname>run()</methodname> method returns an <literal>int</literal>. "
+"This may be a value from the <literal>Gtk::ResponseType</literal> if the "
+"user closed the dialog by clicking a standard button, or it could be the "
+"custom response value that you specified when using "
+"<methodname>add_button()</methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4210(title) C/gtkmm-tutorial-in.xml:4252(title)
-msgid "EventBox"
+#: C/index-in.docbook:3860
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1Dialog.";
+"html\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4212(para)
-msgid ""
-"Some <application>gtkmm</application> widgets don't have associated X "
-"windows; they draw on their parents' windows. Because of this, they cannot "
-"receive events. Also, if they are incorrectly sized, they don't clip, so you "
-"can get messy overwriting etc. To receive events on one of these widgets, "
-"you can it inside an <classname>EventBox</classname> widget and then call "
-"<methodname>Gtk::Widget::set_events()</methodname> on the EventBox before "
-"showing it."
+#: C/index-in.docbook:3862 C/index-in.docbook:3877
+msgid "MessageDialog"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4220(para)
+#: C/index-in.docbook:3863
 msgid ""
-"Although the name <classname>EventBox</classname> emphasises the event-"
-"handling method, the widget can also be used for clipping (and more; see the "
-"example below)."
+"<classname>MessageDialog</classname> is a convenience class, used to create "
+"simple, standard message dialogs, with a message, an icon, and buttons for "
+"user response. You can specify the type of message and the text in the "
+"constructor, as well as specifying standard buttons via the <literal>Gtk::"
+"ButtonsType</literal> enum."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4224(para)
+#: C/index-in.docbook:3871
 msgid ""
-"TODO: Why don't they have X Windows - explain clipping. Also, how does this "
-"affect platform such as Windows and MacOS that don't use X."
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/";
+"classGtk_1_1MessageDialog.html\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4228(para)
-msgid "The constructor for <classname>Gtk::EventBox</classname> is:"
+#: C/index-in.docbook:3883
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/dialogs/messagedialog\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4232(programlisting)
-#, no-wrap
-msgid "Gtk::EventBox();"
+#: C/index-in.docbook:3888
+msgid "FileChooserDialog"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4234(para)
+#: C/index-in.docbook:3889
 msgid ""
-"A child widget can be added to the <classname>EventBox</classname> using:"
+"The <classname>FileChooserDialog</classname> is suitable for use with \"Open"
+"\" or \"Save\" menu items."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4238(programlisting)
-#, no-wrap
-msgid "event_box.add(child_widget);"
+#: C/index-in.docbook:3893
+msgid ""
+"Most of the useful member methods for this class are actually in the "
+"<classname>Gtk::FileChooser</classname> base class."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4244(para)
+#: C/index-in.docbook:3898
 msgid ""
-"The following example demonstrates both uses of an <classname>EventBox</"
-"classname> - a label is created that is clipped to a small box, and set up "
-"so that a mouse-click on the label causes the program to exit. Resizing the "
-"window reveals varying amounts of the label."
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/";
+"classGtk_1_1FileChooserDialog.html\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4266(title)
-msgid "Dialogs"
+#: C/index-in.docbook:3904 C/index-in.docbook:5437
+msgid "FileChooser"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4268(para)
+#: C/index-in.docbook:3910
 msgid ""
-"Dialogs are used as secondary windows, to provide specific information or to "
-"ask questions. <classname>Gtk::Dialog</classname> windows contain a few pre-"
-"packed widgets to ensure consistency, and a <methodname>run()</methodname> "
-"method which blocks until the user dismisses the dialog."
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/dialogs/filechooserdialog\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:3914 C/index-in.docbook:3927
+msgid "ColorChooserDialog"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4275(para)
+#: C/index-in.docbook:3915
 msgid ""
-"There are several derived <classname>Dialog</classname> classes which you "
-"might find useful. <classname>Gtk::MessageDialog</classname> is used for "
-"most simple notifications. But at other times you might need to derive your "
-"own dialog class to provide more complex functionality."
+"The <classname>ColorChooserDialog</classname> allows the user to choose a "
+"color. The <classname>ColorButton</classname> opens a color selection dialog "
+"when it is clicked."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4282(para)
+#: C/index-in.docbook:3921
 msgid ""
-"To pack widgets into a custom dialog, you should pack them into the "
-"<classname>Gtk::VBox</classname>, available via <methodname>get_vbox()</"
-"methodname>. To just add a <classname>Button</classname> to the bottom of "
-"the <classname>Dialog</classname>, you could use the <methodname>add_button()"
-"</methodname> method."
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/";
+"classGtk_1_1ColorChooserDialog.html\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4290(para)
+#: C/index-in.docbook:3933
 msgid ""
-"The <methodname>run()</methodname> method returns an <literal>int</literal>. "
-"This may be a value from the <literal>Gtk::ResponseType</literal> if the "
-"user closed the button by clicking a standard button, or it could be the "
-"custom response value that you specified when using <methodname>add_button()"
-"</methodname>."
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/dialogs/colorchooserdialog\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4299(title) C/gtkmm-tutorial-in.xml:4314(title)
-msgid "MessageDialog"
+#: C/index-in.docbook:3938 C/index-in.docbook:3951
+msgid "FontChooserDialog"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4300(para)
+#: C/index-in.docbook:3939
 msgid ""
-"<classname>MessageDialog</classname> is a convenience class, used to create "
-"simple, standard message dialogs, with a message, an icon, and buttons for "
-"user response. You can specify the type of message and the text in the "
-"constructor, as well as specifying standard buttons via the <literal>Gtk::"
-"ButtonsType</literal> enum."
+"The <classname>FontChooserDialog</classname> allows the user to choose a "
+"font. The <classname>FontButton</classname> opens a font chooser dialog when "
+"it is clicked."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4325(title)
-msgid "FileChooserDialog"
+#: C/index-in.docbook:3945
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/";
+"classGtk_1_1FontChooserDialog.html\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4326(para)
+#: C/index-in.docbook:3957
 msgid ""
-"The <classname>FileChooserDialog</classname> is suitable for use with \"Open"
-"\" or \"Save\" menu items."
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/dialogs/fontchooserdialog\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4330(para)
-msgid ""
-"Most of the useful member methods for this class are actually in the "
-"<classname>Gtk::FileChooser</classname> base class."
+#: C/index-in.docbook:3962
+msgid "Non-modal AboutDialog"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4341(title)
-msgid "FileChooser"
+#: C/index-in.docbook:3963
+msgid ""
+"The <classname>AboutDialog</classname> offers a simple way to display "
+"information about a program, like its logo, name, copyright, website and "
+"license."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4351(title) C/gtkmm-tutorial-in.xml:4363(title)
-msgid "ColorSelectionDialog"
+#: C/index-in.docbook:3967
+msgid ""
+"Most dialogs in this chapter are modal, that is, they freeze the rest of the "
+"application while they are shown. It's also possible to create a non-modal "
+"dialog, which does not freeze other windows in the application. The "
+"following example shows a non-modal <classname>AboutDialog</classname>. This "
+"is perhaps not the kind of dialog you would normally make non-modal, but non-"
+"modal dialogs can be useful in other cases. E.g. <application>gedit</"
+"application>'s search-and-replace dialog is non-modal."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4352(para)
+#: C/index-in.docbook:3977
 msgid ""
-"The <classname>ColorSelectionDialog</classname> allows the user to choose a "
-"color."
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/";
+"classGtk_1_1AboutDialog.html\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4374(title) C/gtkmm-tutorial-in.xml:4386(title)
-msgid "FontSelectionDialog"
+#: C/index-in.docbook:3983
+msgid "AboutDialog"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4375(para)
+#: C/index-in.docbook:3989
 msgid ""
-"The <classname>FontSelectionDialog</classname> allows the user to choose a "
-"font."
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/dialogs/aboutdialog\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4401(title)
-msgid "The Drawing Area Widget"
-msgstr ""
+#: C/index-in.docbook:3997
+msgid "The DrawingArea Widget"
+msgstr "绘图区域部件(DrawingArea Widget)"
 
-#: C/gtkmm-tutorial-in.xml:4402(para)
+#: C/index-in.docbook:3998
 msgid ""
 "The <classname>DrawingArea</classname> widget is a blank window that gives "
 "you the freedom to create any graphic you desire. Along with that freedom "
-"comes the responsibility to handle expose events on the widget. When a "
-"widget is first shown, or when it is covered and then uncovered again it "
-"needs to redraw itself. Most widgets have code to do this, but the "
-"DrawingArea does not, allowing you to write your own expose event signal "
-"handler to determine how the contents of the widget will be drawn. This is "
-"most often done by overriding the virtual <methodname>on_expose_event()</"
+"comes the responsibility to draw on the widget. When a widget is first "
+"shown, or when it is covered and then uncovered again it needs to redraw "
+"itself. Most widgets have code to do this, but the <classname>DrawingArea</"
+"classname> does not, allowing you to write your own draw function to "
+"determine how the contents of the widget will be drawn. This is done by "
+"setting a draw function with a call to the <methodname>set_draw_func()</"
 "methodname> member function."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4414(para)
+#: C/index-in.docbook:4010
 msgid ""
-"GTK+ uses the <ulink url=\"http://cairographics.org\";>Cairo</ulink> drawing "
-"API. With gtkmm, you may use the <ulink url=\"http://www.cairographics.org/";
-"cairomm/\">cairomm</ulink> C++ API for cairo."
+"GTK uses the <ulink url=\"http://cairographics.org\";>Cairo</ulink> drawing "
+"API. With <application>gtkmm</application>, you may use the <ulink url="
+"\"http://www.cairographics.org/cairomm/\";>cairomm</ulink> C++ API for cairo."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4419(para)
+#: C/index-in.docbook:4015
 msgid ""
 "You can draw very sophisticated shapes using Cairo, but the methods to do so "
 "are quite basic. Cairo provides methods for drawing straight lines, curved "
@@ -5683,11 +5978,11 @@ msgid ""
 "text."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4429(title)
+#: C/index-in.docbook:4025
 msgid "Cairo and Pango"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4430(para)
+#: C/index-in.docbook:4026
 msgid ""
 "Although Cairo can render text, it's not meant to be a replacement for "
 "Pango. Pango is a better choice if you need to perform more advanced text "
@@ -5695,7 +5990,7 @@ msgid ""
 "should only be done if the text is part of a graphic."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4435(para)
+#: C/index-in.docbook:4031
 msgid ""
 "In this section of the tutorial, we'll cover the basic Cairo drawing model, "
 "describe each of the basic drawing elements in some detail (with examples), "
@@ -5703,57 +5998,66 @@ msgid ""
 "widget."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4442(title)
+#: C/index-in.docbook:4038
 msgid "The Cairo Drawing Model"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4443(para)
+#: C/index-in.docbook:4039
 msgid ""
 "The basic concept of drawing in Cairo involves defining 'invisible' paths "
 "and then stroking or filling them to make them visible."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4447(para)
+#: C/index-in.docbook:4043
 msgid ""
 "To do any drawing in <application>gtkmm</application> with Cairo, you must "
-"first create a <classname>Cairo::Context</classname> object. This class "
-"holds all of the graphics state parameters that describe how drawing is to "
-"be done. This includes information such as line width, color, the surface to "
+"first get a <classname>Cairo::Context</classname> object. This class holds "
+"all of the graphics state parameters that describe how drawing is to be "
+"done. This includes information such as line width, color, the surface to "
 "draw to, and many other things. This allows the actual drawing functions to "
-"take fewer arguments to simplify the interface. In <application>gtkmm</"
-"application>, a <classname>Cairo::Context</classname> is created by calling "
-"the <methodname>Gdk::Window::create_cairo_context()</methodname> function. "
-"Since Cairo context are reference-counted objects, this function returns a "
-"<classname>Cairo::RefPtr&lt;Cairo::Context&gt;</classname> object."
+"take fewer arguments to simplify the interface. Usually, you use the "
+"<classname>Cairo::Context</classname> that you get as input data to the draw "
+"function that you set with the call to <methodname>set_draw_func()</"
+"methodname>. It's also possible to create a <classname>Cairo::Context</"
+"classname> by calling the <methodname>Gdk::Surface::create_cairo_context()</"
+"methodname> and <methodname>Gdk::CairoContext::cairo_create()</methodname> "
+"functions. Since Cairo contexts are reference-counted objects, "
+"<methodname>cairo_create()</methodname> returns a <classname>Cairo::"
+"RefPtr&lt;Cairo::Context&gt;</classname> object. (Note the difference "
+"between <classname>Gdk::CairoContext</classname> and <classname>Cairo::"
+"Context</classname>.)"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4460(para)
+#: C/index-in.docbook:4060
 msgid ""
 "The following example shows how to set up a Cairo context with a foreground "
 "color of red and a width of 2. Any drawing functions that use this context "
 "will use these settings."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4465(programlisting)
+#: C/index-in.docbook:4065
 #, no-wrap
 msgid ""
+"\n"
 "Gtk::DrawingArea myArea;\n"
-"Cairo::RefPtr&lt;Cairo::Context&gt; myContext = myArea.get_window()-&gt;create_cairo_context();\n"
+"auto gdkCairoContext = myArea.get_surface()-&gt;create_cairo_context();\n"
+"auto myContext = gdkCairoContext-&gt;cairo_create();\n"
 "myContext-&gt;set_source_rgb(1.0, 0.0, 0.0);\n"
-"myContext-&gt;set_line_width(2.0);"
+"myContext-&gt;set_line_width(2.0);\n"
+"    "
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4469(para)
+#: C/index-in.docbook:4072
 msgid ""
 "Each <classname>Cairo::Context</classname> is associated with a particular "
-"<classname>Gdk::Window</classname>, so the first line of the above example "
-"creates a <classname>Gtk::DrawingArea</classname> widget and the second line "
-"uses its associated <classname>Gdk::Window</classname> to create a "
+"<classname>Gdk::Surface</classname>, so the first line of the above example "
+"creates a <classname>Gtk::DrawingArea</classname> widget and the next two "
+"lines use its associated <classname>Gdk::Surface</classname> to create a "
 "<classname>Cairo::Context</classname> object. The final two lines change the "
 "graphics state of the context."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4478(para)
+#: C/index-in.docbook:4080
 msgid ""
 "There are a number of graphics state variables that can be set for a Cairo "
 "context. The most common context attributes are color (using "
@@ -5770,7 +6074,7 @@ msgid ""
 "cairographics.org/cairomm/\">cairomm</ulink> API documentation."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4510(para)
+#: C/index-in.docbook:4112
 msgid ""
 "It is good practice to put all modifications to the graphics state between "
 "<methodname>save()</methodname>/<methodname>restore()</methodname> function "
@@ -5779,19 +6083,19 @@ msgid ""
 "follows:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4516(programlisting)
+#: C/index-in.docbook:4118
 #, no-wrap
 msgid ""
-"void doSomething(Cairo::RefPtr&lt;Cairo::Context&gt; context, int x)\n"
+"void doSomething(const Cairo::RefPtr&lt;Cairo::Context&gt;&amp; context, int x)\n"
 "{\n"
 "    context-&gt;save();\n"
 "    // change graphics state\n"
-"    // peform drawing operations\n"
+"    // perform drawing operations\n"
 "    context-&gt;restore();\n"
 "}"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4493(para)
+#: C/index-in.docbook:4095
 msgid ""
 "The current state of a <classname>Cairo::Context</classname> can be saved to "
 "an internal stack of saved states and later be restored to the state it was "
@@ -5799,20 +6103,28 @@ msgid ""
 "method and the <methodname>restore()</methodname> method. This can be useful "
 "if you need to temporarily change the line width and color (or any other "
 "graphics setting) in order to draw something and then return to the previous "
-"settings. In this situation, you could call <methodname>Cairo::Context::save"
-"()</methodname>, change the graphics settings, draw the lines, and then call "
-"<methodname>Cairo::Context::restore()</methodname> to restore the original "
-"graphics state. Multiple calls to <methodname>save()</methodname> and "
-"<methodname>restore()</methodname> can be nested; each call to "
+"settings. In this situation, you could call <methodname>Cairo::Context::"
+"save()</methodname>, change the graphics settings, draw the lines, and then "
+"call <methodname>Cairo::Context::restore()</methodname> to restore the "
+"original graphics state. Multiple calls to <methodname>save()</methodname> "
+"and <methodname>restore()</methodname> can be nested; each call to "
 "<methodname>restore()</methodname> restores the state from the matching "
-"paired <methodname>save()</methodname>. <placeholder-1/>"
+"paired <methodname>save()</methodname>. <_:tip-1/>"
+msgstr ""
+
+#: C/index-in.docbook:4127
+msgid ""
+"The draw function that you set with a call to <methodname>set_draw_func()</"
+"methodname> is called with a Cairo context that you shall use for drawing in "
+"the <classname>Gtk::DrawingArea</classname> widget. It is not necessary to "
+"save and restore this Cairo context in the draw function."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4527(title)
+#: C/index-in.docbook:4135
 msgid "Drawing Straight Lines"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4536(para)
+#: C/index-in.docbook:4144
 msgid ""
 "Since the Cairo graphics library was written with support for multiple "
 "output targets (the X window system, PNG images, OpenGL, etc), there is a "
@@ -5821,21 +6133,21 @@ msgid ""
 "values map roughly to pixels on the screen, but this setting can be adjusted "
 "if desired. Sometimes it may be useful to scale the coordinates so that the "
 "full width and height of a window both range from 0 to 1 (the 'unit square') "
-"or some other mapping that works for your application. this can be done with "
+"or some other mapping that works for your application. This can be done with "
 "the <methodname>Cairo::Context::scale()</methodname> function."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4528(para)
+#: C/index-in.docbook:4136
 msgid ""
 "Now that we understand the basics of the Cairo graphics library, we're "
 "almost ready to start drawing. We'll start with the simplest of drawing "
 "elements: the straight line. But first you need to know a little bit about "
 "Cairo's coordinate system. The origin of the Cairo coordinate system is "
 "located in the upper-left corner of the window with positive x values to the "
-"right and positive y values going down. <placeholder-1/>"
+"right and positive y values going down. <_:tip-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4551(para)
+#: C/index-in.docbook:4159
 msgid ""
 "In this example, we'll construct a small but fully functional "
 "<application>gtkmm</application> program and draw some lines into the "
@@ -5848,7 +6160,7 @@ msgid ""
 "between two points, use the <methodname>line_to()</methodname> function."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4563(para)
+#: C/index-in.docbook:4171
 msgid ""
 "After you've finished creating your path, you still haven't drawn anything "
 "visible yet. To make the path visible, you must use the function "
@@ -5858,7 +6170,7 @@ msgid ""
 "you can start on your next path."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4572(para)
+#: C/index-in.docbook:4180
 msgid ""
 "Many Cairo drawing functions have a <methodname>_preserve()</methodname> "
 "variant. Normally drawing functions such as <methodname>clip()</methodname>, "
@@ -5868,73 +6180,75 @@ msgid ""
 "with the next drawing function."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4582(title) C/gtkmm-tutorial-in.xml:4679(title)
+#: C/index-in.docbook:4190 C/index-in.docbook:4310
 msgid "Drawing Area - Lines"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4590(para)
+#: C/index-in.docbook:4196
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/drawingarea/simple\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:4198
 msgid ""
 "This program contains a single class, <classname>MyArea</classname>, which "
 "is a subclass of <classname>Gtk::DrawingArea</classname> and contains an "
-"<methodname>on_expose_event()</methodname> member function. This method is "
-"called whenever the image in the drawing area needs to be redrawn. This "
-"function is passed a pointer to a <classname>GdkEventExpose</classname> "
-"structure which defines the area that needs to be redrawn. We use these "
-"values to create a rectangle path in Cairo (using the <methodname>rectangle()"
-"</methodname> function) and then <methodname>clip()</methodname> to this "
-"path. The <methodname>clip()</methodname> function sets a clip region. The "
-"current clip region affects all drawing operations by effectively masking "
-"out any changes to the surface that are outside the current clip region. "
-"This allows us to limit our redrawing to only the area that needs to be "
-"redrawn. The actual drawing code sets the color we want to use for drawing "
-"by using <methodname>set_source_rgb()</methodname> which takes arguments "
-"defining the Red, Green, and Blue components of the desired color (valid "
-"values are between 0 and 1). After setting the color, we created a new path "
-"using the functions <methodname>move_to()</methodname> and "
-"<methodname>line_to()</methodname>, and then stroked this path with "
-"<methodname>stroke()</methodname>."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:4614(title)
+"<methodname>on_draw()</methodname> member function. This function becomes "
+"the draw function by a call to <methodname>set_draw_func()</methodname> in "
+"<classname>MyArea</classname>'s constructor. <methodname>on_draw()</"
+"methodname> is then called whenever the image in the drawing area needs to "
+"be redrawn. It is passed a <classname>Cairo::RefPtr</classname> pointer to a "
+"<classname>Cairo::Context</classname> that we use for the drawing. The "
+"actual drawing code sets the color we want to use for drawing by using "
+"<methodname>set_source_rgb()</methodname> which takes arguments defining the "
+"Red, Green, and Blue components of the desired color (valid values are "
+"between 0 and 1). After setting the color, we created a new path using the "
+"functions <methodname>move_to()</methodname> and <methodname>line_to()</"
+"methodname>, and then stroked this path with <methodname>stroke()</"
+"methodname>."
+msgstr ""
+
+#: C/index-in.docbook:4217
 msgid "Drawing with relative coordinates"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4615(para)
+#: C/index-in.docbook:4218
 msgid ""
 "In the example above we drew everything using absolute coordinates. You can "
 "also draw using relative coordinates. For a straight line, this is done with "
 "the function <methodname>Cairo::Context::rel_line_to()</methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4621(title)
+#: C/index-in.docbook:4224
 msgid "Line styles"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4622(para)
+#: C/index-in.docbook:4225
 msgid ""
 "In addition to drawing basic straight lines, there are a number of things "
 "that you can customize about a line. You've already seen examples of setting "
 "a line's color and width, but there are others as well."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4628(para)
+#: C/index-in.docbook:4231
 msgid ""
 "If you've drawn a series of lines that form a path, you may want them to "
 "join together in a certain way. Cairo offers three different ways to join "
 "lines together: Miter, Bevel, and Round. These are show below:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4635(title)
+#: C/index-in.docbook:4238
 msgid "Different join types in Cairo"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4640(para)
+#: C/index-in.docbook:4243
 msgid ""
 "The line join style is set using the function <methodname>Cairo::Context::"
 "set_line_join()</methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4644(para)
+#: C/index-in.docbook:4247
 msgid ""
 "Line ends can have different styles as well. The default style is for the "
 "line to start and stop exactly at the destination points of the line. This "
@@ -5944,71 +6258,109 @@ msgid ""
 "the function <methodname>Cairo::Context::set_line_cap()</methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4654(para)
+#: C/index-in.docbook:4257
 msgid ""
 "There are other things you can customize as well, including creating dashed "
-"lines and other things. For more information , see the Cairo API "
+"lines and other things. For more information, see the Cairo API "
 "documentation."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4662(title)
+#: C/index-in.docbook:4264
+msgid "Drawing thin lines"
+msgstr ""
+
+#: C/index-in.docbook:4265
+msgid ""
+"If you try to draw one pixel wide lines, you may notice that the line "
+"sometimes comes up blurred and wider than it ought to be. This happens "
+"because Cairo will try to draw from the selected position, to both sides "
+"(half to each), so if you're positioned right on the intersection of the "
+"pixels, and want a one pixel wide line, Cairo will try to use half of each "
+"adjacent pixel, which isn't possible (a pixel is the smallest unit "
+"possible). This happens when the width of the line is an odd number of "
+"pixels (not just one pixel)."
+msgstr ""
+
+#: C/index-in.docbook:4275
+msgid ""
+"The trick is to position in the middle of the pixel where you want the line "
+"to be drawn, and thus guaranteeing you get the desired results. See <ulink "
+"url=\"http://cairographics.org/FAQ/#sharp_lines\";>Cairo FAQ</ulink>."
+msgstr ""
+
+#: C/index-in.docbook:4282
+msgid "Drawing Area - Thin Lines"
+msgstr ""
+
+#: C/index-in.docbook:4288
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/drawingarea/thin_lines\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:4293
 msgid "Drawing Curved Lines"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4663(para)
+#: C/index-in.docbook:4294
 msgid ""
 "In addition to drawing straight lines Cairo allows you to easily draw curved "
 "lines (technically a cubic Bézier spline) using the <methodname>Cairo::"
-"Context::curve_to()</methodname> and <methodname>Cairo::Context::rel_curve_to"
-"()</methodname> functions. These functions take coordinates for a "
-"destination point as well as coordinates for two 'control' points. This is "
+"Context::curve_to()</methodname> and <methodname>Cairo::Context::"
+"rel_curve_to()</methodname> functions. These functions take coordinates for "
+"a destination point as well as coordinates for two 'control' points. This is "
 "best explained using an example, so let's dive in."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4674(para)
+#: C/index-in.docbook:4305
 msgid ""
 "This simple application draws a curve with Cairo and displays the control "
 "points for each end of the curve."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4686(para)
+#: C/index-in.docbook:4316
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/drawingarea/curve\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:4317
 msgid ""
 "The only difference between this example and the straight line example is in "
-"the <methodname>on_expose_event()</methodname> function, but there are a few "
-"new concepts and functions introduced here, so let's examine them briefly."
+"the <methodname>on_draw()</methodname> function, but there are a few new "
+"concepts and functions introduced here, so let's examine them briefly."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4692(para)
+#: C/index-in.docbook:4323
 msgid ""
-"Note that we clip to the area that needs re-exposing just as we did in the "
-"last example. After clipping, however, we make a call to <methodname>Cairo::"
-"Context::scale()</methodname>, passing in the width and height of the "
-"drawing area. This scales the user-space coordinate system such that the the "
-"width and height of the widget are both equal to 1.0 'units'. There's no "
-"particular reason to scale the coordinate system in this case, but sometimes "
-"it can make drawing operations easier."
+"We make a call to <methodname>Cairo::Context::scale()</methodname>, passing "
+"in the width and height of the drawing area. This scales the user-space "
+"coordinate system such that the width and height of the widget are both "
+"equal to 1.0 'units'. There's no particular reason to scale the coordinate "
+"system in this case, but sometimes it can make drawing operations easier."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4702(para)
+#: C/index-in.docbook:4332
 msgid ""
 "The call to <methodname>Cairo::Context::curve_to()</methodname> should be "
 "fairly self-explanatory. The first pair of coordinates define the control "
 "point for the beginning of the curve. The second set of coordinates define "
 "the control point for the end of the curve, and the last set of coordinates "
 "define the destination point. To make the concept of control points a bit "
-"easier to visualize, a line has been draw from each control point to the end-"
-"point on the curve that it is associated with. Note that these control point "
-"lines are both translucent. This is achieved with a variant of "
-"<methodname>set_source_rgb()</methodname> called <methodname>set_source_rgba"
-"()</methodname>. This function takes a fourth argument specifying the alpha "
-"value of the color (valid values are between 0 and 1)."
+"easier to visualize, a line has been drawn from each control point to the "
+"end-point on the curve that it is associated with. Note that these control "
+"point lines are both translucent. This is achieved with a variant of "
+"<methodname>set_source_rgb()</methodname> called "
+"<methodname>set_source_rgba()</methodname>. This function takes a fourth "
+"argument specifying the alpha value of the color (valid values are between 0 "
+"and 1)."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4720(title)
+#: C/index-in.docbook:4350
 msgid "Drawing Arcs and Circles"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4721(para)
+#: C/index-in.docbook:4351
 msgid ""
 "With Cairo, the same function is used to draw arcs, circles, or ellipses: "
 "<methodname>Cairo::Context::arc()</methodname>. This function takes five "
@@ -6020,10 +6372,11 @@ msgid ""
 "user-space). An angle of M_PI/2 radians (90 degrees) is in the direction of "
 "the positive Y axis (in user-space). Angles increase in the direction from "
 "the positive X axis toward the positive Y axis. So with the default "
-"transformation matrix, angles increase in a clockwise direction."
+"transformation matrix, angles increase in a clockwise direction. (Remember "
+"that the positive Y axis points downwards.)"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4742(programlisting)
+#: C/index-in.docbook:4372
 #, no-wrap
 msgid ""
 "context-&gt;save();\n"
@@ -6033,37 +6386,40 @@ msgid ""
 "context-&gt;restore();"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4735(para)
+#: C/index-in.docbook:4366
 msgid ""
 "To draw an ellipse, you can scale the current transformation matrix by "
 "different amounts in the X and Y directions. For example, to draw an ellipse "
-"in the box given by <varname>x</varname>, <varname>y</varname>, "
-"<varname>width</varname>, <varname>height</varname>: <placeholder-1/> Note "
-"that this contradicts the <ulink url=\"http://www.cairographics.org/manual/";
-"cairo-Paths.html#cairo-arc\">advice given in the official Cairo "
-"documentation</ulink>, but it seems to work."
+"with center at <varname>x</varname>, <varname>y</varname> and size "
+"<varname>width</varname>, <varname>height</varname>: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4754(para)
+#: C/index-in.docbook:4380
 msgid ""
 "Here's an example of a simple program that draws an arc, a circle and an "
 "ellipse into a drawing area."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4759(title)
+#: C/index-in.docbook:4385
 msgid "Drawing Area - Arcs"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4768(para)
+#: C/index-in.docbook:4392
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/drawingarea/arcs\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:4394
 msgid ""
 "There are a couple of things to note about this example code. Again, the "
 "only real difference between this example and the previous ones is the "
-"<methodname>on_expose_event()</methodname> function, so we'll limit our "
-"focus to that function. In addition, the first part of the function is "
-"nearly identical to the previous examples, so we'll skip that portion."
+"<methodname>on_draw()</methodname> function, so we'll limit our focus to "
+"that function. In addition, the first part of the function is nearly "
+"identical to the previous examples, so we'll skip that portion."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4776(para)
+#: C/index-in.docbook:4402
 msgid ""
 "Note that in this case, we've expressed nearly everything in terms of the "
 "height and width of the window, including the width of the lines. Because of "
@@ -6073,7 +6429,7 @@ msgid ""
 "methodname> pair so that we're back at a known state after each drawing."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4785(para)
+#: C/index-in.docbook:4411
 msgid ""
 "The section for drawing an arc introduces one new function, "
 "<methodname>close_path()</methodname>. This function will in effect draw a "
@@ -6085,124 +6441,135 @@ msgid ""
 "lines will end at the same point, but Cairo won't do any special joining."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4798(title)
+#: C/index-in.docbook:4424
 msgid "Drawing counter-clockwise"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4799(para)
+#: C/index-in.docbook:4425
 msgid ""
 "The function <methodname>Cairo::Context::arc_negative()</methodname> is "
 "exactly the same as <methodname>Cairo::Context::arc()</methodname> but the "
 "angles go the opposite direction."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4811(title)
+#: C/index-in.docbook:4437
 msgid "Drawing Text"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4813(title)
+#: C/index-in.docbook:4439
 msgid "Drawing Text with Pango"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4814(para)
+#: C/index-in.docbook:4440
 msgid ""
 "Text is drawn via Pango Layouts. The easiest way to create a "
-"<classname>Pango::Layout</classname> is to use "
-"<methodname>create_pango_layout</methodname>. Once created, the layout can "
-"be manipulated in various ways, including changing the text, font, etc. "
-"Finally, the layout can be rendered using the <methodname>draw_layout</"
-"methodname> method of <classname>Gdk::Drawable</classname>, which takes a "
-"<classname>Gdk::GC</classname> object, an x-position, a y-position and the "
-"layout itself. TODO: Update this section for Cairo instead of Gdk::GC."
+"<classname>Pango::Layout</classname> is to use <methodname>Gtk::Widget::"
+"create_pango_layout()</methodname>. Once created, the layout can be "
+"manipulated in various ways, including changing the text, font, etc. "
+"Finally, the layout can be rendered using the <methodname>Pango::Layout::"
+"show_in_cairo_context()</methodname> method."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4836(title)
-msgid "Drawing Images"
+#: C/index-in.docbook:4452
+msgid ""
+"Here is an example of a program that draws some text, some of it upside-"
+"down. The Printing chapter contains another <link linkend=\"sec-printing-"
+"example\">example</link> of drawing text."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4838(title)
-msgid "Drawing Images with Gdk"
+#: C/index-in.docbook:4458
+msgid "Drawing Area - Text"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4839(para)
+#: C/index-in.docbook:4464
 msgid ""
-"There are a couple of drawing methods for putting image data into a drawing "
-"area. <methodname>draw_pixmap()</methodname> can copy the contents of a "
-"<classname>Gdk::Drawable</classname> (the window of a drawing area is one) "
-"into the drawing area. There is also <methodname>draw_bitmap()</methodname> "
-"for drawing a two-color image into the drawing area, and "
-"<methodname>draw_image()</methodname> for drawing an image with more than "
-"two colors."
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/drawingarea/pango_text\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4848(para)
-msgid ""
-"For all of these methods, the first argument is the <classname>Gdk::GC</"
-"classname>. The second argument is the object of the appropriate type to "
-"copy in: <classname>Gdk::Drawable</classname>, <classname>Gdk::Bitmap</"
-"classname>, <classname>Gdk::Image</classname>. The next two arguments are "
-"the x and y points in the image to begin copying from. Then come the x and y "
-"points in the drawing area to copy to. The final two arguments are the width "
-"and height of the area to copy."
+#: C/index-in.docbook:4475
+msgid "Drawing Images"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4859(para)
+#: C/index-in.docbook:4476
 msgid ""
-"There is also a method for drawing from a <classname>Gdk::Pixbuf</"
-"classname>. A <classname>Gdk::Pixbuf</classname> buffer is a useful wrapper "
-"around a collection of pixels, which can be read from files, and manipulated "
-"in various ways."
+"There is a method for drawing from a <classname>Gdk::Pixbuf</classname> to a "
+"<classname>Cairo::Context</classname>. A <classname>Gdk::Pixbuf</classname> "
+"buffer is a useful wrapper around a collection of pixels, which can be read "
+"from files, and manipulated in various ways."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4866(para)
+#: C/index-in.docbook:4483
 msgid ""
 "Probably the most common way of creating <classname>Gdk::Pixbuf</classname>s "
-"is to use <methodname>Gdk::Pixbuf::create_from_file()</methodname>, which "
-"can read an image file, such as a png file into a pixbuf ready for rendering."
+"is to use <methodname>Gdk::Pixbuf::create_from_file()</methodname> or "
+"<methodname>Gdk::Pixbuf::create_from_resource()</methodname>, which can read "
+"an image file, such as a png file into a pixbuf ready for rendering."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4873(para)
+#: C/index-in.docbook:4491
 msgid ""
-"The <classname>Gdk::Pixbuf</classname> can be rendered with "
-"<methodname>render_to_drawable</methodname>, which takes quite a few "
-"parameters. The <methodname>render_to_drawable</methodname> is a member of "
-"<classname>Gdk::Pixbuf</classname> rather than <classname>Gdk::Drawable</"
-"classname>, which is unlike the <methodname>draw_*</methodname> functions "
-"described earlier. As such, its first parameter is the drawable to render "
-"to. The second parameter is still the <classname>Gdk::GC</classname>. The "
-"next two parameters are the point in the pixbuf to start drawing from. This "
-"is followed by the point in the drawable to draw it at, and by the width and "
-"height to actually draw (which may not be the whole image, especially if "
-"you're only responding to an expose event for part of the window). Finally, "
-"there are the dithering parameters. If you use Gdk::RGB_DITHER_NONE as the "
-"dither type, then the dither offset parameters can both be 0."
+"The <classname>Gdk::Pixbuf</classname> can be rendered by setting it as the "
+"source pattern of the Cairo context with <methodname>Gdk::Cairo::"
+"set_source_pixbuf()</methodname>. Then draw the image with either "
+"<methodname>Cairo::Context::paint()</methodname> (to draw the whole image), "
+"or <methodname>Cairo::Context::rectangle()</methodname> and "
+"<methodname>Cairo::Context::fill()</methodname> (to fill the specified "
+"rectangle). <methodname>set_source_pixbuf()</methodname> is not a member of "
+"<classname>Cairo::Context</classname>. It takes a <classname>Cairo::Context</"
+"classname> as its first parameter."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4890(para)
+#: C/index-in.docbook:4502
 msgid ""
 "Here is a small bit of code to tie it all together: (Note that usually you "
-"wouldn't load the image every time in the expose event handler! It's just "
-"shown here to keep it all together)"
+"wouldn't load the image every time in the draw signal handler! It's just "
+"shown here to keep it all together.)"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4895(programlisting)
+#: C/index-in.docbook:4507
 #, no-wrap
 msgid ""
-"bool myarea::on_expose_event(GdkEventExpose* ev)\n"
+"void MyArea::on_draw(const Cairo::RefPtr&lt;Cairo::Context&gt;&amp; cr, int width, int height)\n"
 "{\n"
-"Glib::RefPtr&lt;Gdk::Pixbuf&gt; image = Gdk::Pixbuf::create_from_file(\"myimage.png\");\n"
-"image-&gt;render_to_drawable(get_window(), get_style()-&gt;get_black_gc(),\n"
-"0, 0, 100, 80, image-&gt;get_width(), image-&gt;get_height(), // draw the whole image (from 0,0 to the full 
width,height) at 100,80 in the window\n"
-"Gdk::RGB_DITHER_NONE, 0, 0);\n"
-"return true;\n"
+"  auto image = Gdk::Pixbuf::create_from_file(\"myimage.png\");\n"
+"  // Draw the image at 110, 90, except for the outermost 10 pixels.\n"
+"  Gdk::Cairo::set_source_pixbuf(cr, image, 100, 80);\n"
+"  cr-&gt;rectangle(110, 90, image-&gt;get_width()-20, image-&gt;get_height()-20);\n"
+"  cr-&gt;fill();\n"
 "}"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4922(title)
+#: C/index-in.docbook:4524
+#, no-wrap
+msgid "$ glib-compile-resources --target=resources.c --generate-source image.gresource.xml"
+msgstr ""
+
+#: C/index-in.docbook:4517
+msgid ""
+"Here is an example of a simple program that draws an image. The program "
+"loads the image from a resource file. See the <link linkend=\"sec-gio-"
+"resource\">Gio::Resource and glib-compile-resources</link> section. Use "
+"<application>glib-compile-resources</application> to compile the resources "
+"into a C source file that can be compiled and linked with the C++ code. E.g. "
+"<_:screen-1/>"
+msgstr ""
+
+#: C/index-in.docbook:4527
+msgid "Drawing Area - Image"
+msgstr ""
+
+#: C/index-in.docbook:4533
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/drawingarea/image\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:4547
 msgid "Example Application: Creating a Clock with Cairo"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4923(para)
+#: C/index-in.docbook:4548
 msgid ""
 "Now that we've covered the basics of drawing with Cairo, let's try to put it "
 "all together and create a simple application that actually does something. "
@@ -6211,34 +6578,36 @@ msgid ""
 "hand, and updates itself every second."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4935(para)
+#: C/index-in.docbook:4559
 msgid ""
-"As before, almost all of the interesting stuff is done in the expose event "
-"handler <methodname>on_expose_event()</methodname>. Before we dig into the "
-"expose event handler, notice that the constructor for the <classname>Clock</"
-"classname> widget connects a handler function <methodname>onSecondElapsed()</"
-"methodname> to a timer with a timeout period of 1000 milliseconds (1 "
-"second). This means that <methodname>onSecondElapsed()</methodname> will get "
-"called once per second. The sole responsibility of this function is to "
-"invalidate the window so that <application>gtkmm</application> will be "
-"forced to redraw it."
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/drawingarea/clock\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4946(para)
+#: C/index-in.docbook:4560
+msgid ""
+"As before, almost all of the interesting stuff is done in the draw function "
+"<methodname>on_draw()</methodname>. Before we dig into the draw function, "
+"notice that the constructor for the <classname>Clock</classname> widget "
+"connects a handler function <methodname>on_timeout()</methodname> to a timer "
+"with a timeout period of 1000 milliseconds (1 second). This means that "
+"<methodname>on_timeout()</methodname> will get called once per second. The "
+"sole responsibility of this function is to invalidate the window so that "
+"<application>gtkmm</application> will be forced to redraw it."
+msgstr ""
+
+#: C/index-in.docbook:4571
 msgid ""
 "Now let's take a look at the code that performs the actual drawing. The "
-"first section of <methodname>on_expose_event()</methodname> should be pretty "
-"familiar by now as it's mostly 'boilerplate' code for getting the "
-"<classname>Gdk::Window</classname>, creating a <classname>Cairo::Context</"
-"classname>, and clipping to the area that we want to re-draw. This example "
-"again scales the coordinate system to be a unit square so that it's easier "
-"to draw the clock as a percentage of window size so that it will "
-"automatically scale when the window size is adjusted. Furthermore, the "
-"coordinate system is scaled over and down so that the (0, 0) coordinate is "
-"in the very center of the window."
+"first section of <methodname>on_draw()</methodname> should be pretty "
+"familiar by now. This example again scales the coordinate system to be a "
+"unit square so that it's easier to draw the clock as a percentage of window "
+"size so that it will automatically scale when the window size is adjusted. "
+"Furthermore, the coordinate system is scaled over and down so that the (0, "
+"0) coordinate is in the very center of the window."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4959(para)
+#: C/index-in.docbook:4581
 msgid ""
 "The function <methodname>Cairo::Context::paint()</methodname> is used here "
 "to set the background color of the window. This function takes no arguments "
@@ -6247,11 +6616,11 @@ msgid ""
 "window, we draw a circle for the clock outline, fill it with white, and then "
 "stroke the outline in black. Notice that both of these actions use the "
 "<methodname>_preserve</methodname> variant to preserve the current path, and "
-"then this same path is clipped to make sure than our next lines don't go "
+"then this same path is clipped to make sure that our next lines don't go "
 "outside the outline of the clock."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4971(para)
+#: C/index-in.docbook:4593
 msgid ""
 "After drawing the outline, we go around the clock and draw ticks for every "
 "hour, with a larger tick at 12, 3, 6, and 9. Now we're finally ready to "
@@ -6260,78 +6629,62 @@ msgid ""
 "hands at the correct angles."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4983(para)
+#: C/index-in.docbook:4605
 msgid ""
 "<classname>Gtk::Widget</classname> has several methods and signals which are "
 "prefixed with \"drag_\". These are used for Drag and Drop."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4988(title)
+#: C/index-in.docbook:4610
 msgid "Sources and Destinations"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4989(para)
+#: C/index-in.docbook:4611
 msgid ""
 "Things are dragged from <literal>sources</literal> to be dropped on "
-"<literal>destinations</literal>. Each source and destination has infomation "
+"<literal>destinations</literal>. Each source and destination has information "
 "about the data formats that it can send or receive, provided by "
-"<classname>Gtk::TargetEntry</classname> items. A drop destination will only "
-"accept a dragged item if they both share a compatible <classname>Gtk::"
-"TargetEntry</classname> item. Appropriate signals will then be emitted, "
-"telling the signal handlers which <classname>Gtk::TargetEntry</classname> "
-"was used."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:5002(para)
-msgid "target: A name, such as \"STRING\""
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:5003(para)
-msgid ""
-"info: An identifier which will be sent to your signals to tell you which "
-"TargetEntry was used."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:5004(para)
-msgid "flags: TODO"
+"<classname>Gdk::ContentFormats</classname>. A drop destination will only "
+"accept a dragged item if they both share a compatible format. Appropriate "
+"signals will then be emitted, telling the signal handlers which format was "
+"used."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:4999(para)
+#: C/index-in.docbook:4619
 msgid ""
-"<classname>Gtk::TargetEntry</classname> objects contain this information: "
-"<placeholder-1/>"
+"<classname>Gdk::ContentFormats</classname> objects contain information about "
+"available <type>GType</type>s and mime types (media types)."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5012(para)
+#: C/index-in.docbook:4628
 msgid ""
-"<classname>Widgets</classname> can be identified as sources or destinations "
+"<classname>Widget</classname>s can be identified as sources or destinations "
 "using these <classname>Gtk::Widget</classname> methods:"
 msgstr ""
+"<classname>Gtk::Widget</classname>的以下方法可以将<classname>Widget</classname>作为来源或者目标:"
 
-#: C/gtkmm-tutorial-in.xml:5016(programlisting)
+#: C/index-in.docbook:4632
 #, no-wrap
 msgid ""
-"void drag_source_set(const ArrayHandle_TargetEntry&amp; targets,\n"
-"      GdkModifierType start_button_mask, GdkDragAction actions);"
+"void drag_source_set(const Glib::RefPtr&lt;Gdk::ContentFormats&gt;&amp; targets,\n"
+"      Gdk::ModifierType start_button_mask, Gdk::DragAction actions);"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5021(para)
+#: C/index-in.docbook:4637
 msgid ""
-"<literal>targets</literal> is a container of <classname>Gtk::TargetEntry</"
-"classname> (<classname>std::list&lt;Gtk::TargetEntry&gt;</classname> or "
-"<classname>std::vector&lt;Gtk::TargetEntry&gt;</classname>, for instance) "
-"elements."
+"<literal>targets</literal> is a <classname>Gdk::ContentFormats</classname> "
+"object."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5030(para)
+#: C/index-in.docbook:4642
 msgid ""
 "<literal>start_button_mask</literal> is an ORed combination of values, which "
 "specify which modifier key or mouse button must be pressed to start the drag."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5037(para)
+#: C/index-in.docbook:4649
 msgid ""
-"<literal>actions</literal> is an ORed combination of values, which specified "
+"<literal>actions</literal> is an ORed combination of values, which specify "
 "which Drag and Drop operations will be possible from this source - for "
 "instance, copy, move, or link. The user can choose between the actions by "
 "using modifier keys, such as <keycap>Shift</keycap> to change from "
@@ -6339,403 +6692,354 @@ msgid ""
 "by a different cursor."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5048(programlisting)
+#: C/index-in.docbook:4660
 #, no-wrap
 msgid ""
-"void drag_dest_set(const ArrayHandle_TargetEntry&amp; targets,\n"
-"    GtkDestDefaults flags, GdkDragAction actions);"
+"void drag_dest_set(const Glib::RefPtr&lt;Gdk::ContentFormats&gt;&amp; targets,\n"
+"    Gtk::DestDefaults flags, Gdk::DragAction actions);"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5053(para)
+#: C/index-in.docbook:4665
 msgid ""
 "<literal>flags</literal> is an ORed combination of values which indicates "
 "how the widget will respond visually to Drag and Drop items."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5059(para)
+#: C/index-in.docbook:4671
 msgid ""
 "<literal>actions</literal> indicates the Drag and Drop actions which this "
 "destination can receive - see the description above."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5069(para)
+#: C/index-in.docbook:4680
+msgid "<methodname>drag_source_add_text_targets()</methodname>"
+msgstr ""
+
+#: C/index-in.docbook:4681
+msgid "<methodname>drag_source_add_image_targets()</methodname>"
+msgstr ""
+
+#: C/index-in.docbook:4682
+msgid "<methodname>drag_dest_add_text_targets()</methodname>"
+msgstr ""
+
+#: C/index-in.docbook:4683
+msgid "<methodname>drag_dest_add_image_targets()</methodname>"
+msgstr ""
+
+#: C/index-in.docbook:4677
+msgid ""
+"There are several methods to add source formats and destination formats. "
+"Examples: <_:itemizedlist-1/>"
+msgstr ""
+
+#: C/index-in.docbook:4690
 msgid ""
 "When a drop destination has accepted a dragged item, certain signals will be "
 "emitted, depending on what action has been selected. For instance, the user "
 "might have held down the <keycap>Shift</keycap> key to specify a "
 "<literal>move</literal> rather than a <literal>copy</literal>. Remember that "
 "the user can only select the actions which you have specified in your calls "
-"to <methodname>drag_dest_set()</methodname> and <methodname>drag_source_set()"
-"</methodname>."
+"to <methodname>drag_dest_set()</methodname> and "
+"<methodname>drag_source_set()</methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5080(title) C/gtkmm-tutorial-in.xml:5201(title)
+#: C/index-in.docbook:4701 C/index-in.docbook:4822
 msgid "Copy"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5084(para)
-msgid "<literal>drag_begin</literal>: Provides DragContext."
+#: C/index-in.docbook:4705
+msgid ""
+"<literal>drag_begin</literal>: Provides a <classname>Gdk::Drag</classname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5085(para)
+#: C/index-in.docbook:4706
 msgid ""
-"<literal>drag_motion</literal>: Provides DragContext and coordinates. You "
-"can call the drag_status() method of the DragContext to indicate which "
-"target will be accepted."
+"<literal>drag_data_get</literal>: Provides a <classname>Gdk::Drag</"
+"classname>, and a <classname>Gtk::SelectionData</classname> object, in which "
+"you should put the requested data."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5086(para)
+#: C/index-in.docbook:4708
 msgid ""
-"<literal>drag_get</literal>: Provides <literal>info</literal> about the "
-"dragged data format, and a <literal>GtkSelectionData</literal> structure, in "
-"which you should put the requested data."
+"<literal>drag_end</literal>: Provides a <classname>Gdk::Drag</classname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5087(para)
-msgid "<literal>drag_drop</literal>: Provides DragContext and coordinates."
+#: C/index-in.docbook:4702
+msgid ""
+"The source widget will emit these signals, in this order: <_:itemizedlist-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5088(para)
-msgid "<literal>drag_end</literal>: Provides DragContext."
+#: C/index-in.docbook:4714
+msgid ""
+"<literal>drag_motion</literal>: Provides a <classname>Gdk::Drop</classname> "
+"and coordinates. You can call the <methodname>status()</methodname> method "
+"of the <classname>Gdk::Drop</classname> to indicate which action will be "
+"accepted."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5081(para)
+#: C/index-in.docbook:4717
 msgid ""
-"The source widget will emit these signals, in this order: <placeholder-1/>"
+"<literal>drag_drop</literal>: Provides a <classname>Gdk::Drop</classname> "
+"and coordinates. You can call <methodname>drag_get_data()</methodname>, "
+"which triggers the <literal>drag_data_get</literal> signal in the source "
+"widget, and then the <literal>drag_data_received</literal> signal in the "
+"destination widget."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5095(para)
+#: C/index-in.docbook:4722
 msgid ""
-"<literal>drag_data_received</literal>: Provides <literal>info</literal> "
-"about the dragged data format, and a <literal>GtkSelectionData</literal> "
-"structure which contains the dropped data. You should call the "
-"<methodname>drag_finish()</methodname> method of the <literal>DragContext</"
-"literal> to indicate whether the operation was successful."
+"<literal>drag_data_received</literal>: Provides a <classname>Gdk::Drop</"
+"classname>, and a <methodname>Gtk::SelectionData</methodname> object which "
+"contains the dropped data. You should call the <methodname>finish()</"
+"methodname> or <methodname>failed()</methodname> method of the "
+"<classname>Gdk::Drop</classname> to indicate whether the operation was "
+"successful."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5091(para)
+#: C/index-in.docbook:4711
 msgid ""
-"The destination widget will emit this signal, after the source destination "
-"has emitted the <literal>drag_get</literal> signal: <placeholder-1/>"
+"The destination widget will emit these signals, in this order: <_:"
+"itemizedlist-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5110(title)
+#: C/index-in.docbook:4736
 msgid "Move"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5113(para)
+#: C/index-in.docbook:4739
 msgid ""
-"<literal>drag_delete</literal>: Gives the source the opportunity to delete "
-"the original data if that's appropriate."
+"<literal>drag_data_delete</literal>: Gives the source the opportunity to "
+"delete the original data if that's appropriate."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5111(para)
+#: C/index-in.docbook:4737
 msgid ""
 "During a <literal>move</literal>, the source widget will also emit this "
-"signal: <placeholder-1/>"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:5119(title)
-msgid "Link"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:5120(para)
-msgid "TODO: Find an example or documentation."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:5125(title)
-msgid "DragContext"
+"signal: <_:itemizedlist-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5126(para)
+#: C/index-in.docbook:4754
 msgid ""
-"The drag and drop signals provide a DragContext, which contains some "
-"information about the drag and drop operation and can be used to influence "
-"the process. For instance, you can discover the source widget, or change the "
-"drag and drop icon, by using the <methodname>set_icon()</methodname> "
-"methods. More importantly, you should call the <methodname>drag_finish()</"
-"methodname> method from your <literal>drag_data_received</literal> signal "
-"handler to indicate whether the drop was successful."
+"Here is a very simple example, demonstrating a drag and drop <literal>Copy</"
+"literal> operation:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5139(para)
+#: C/index-in.docbook:4763
 msgid ""
-"Here is a very simple example, demonstrating a drag and drop <literal>Copy</"
-"literal> operation:"
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/drag_and_drop\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5150(para)
-msgid "There is a more complex example in examples/dnd."
+#: C/index-in.docbook:4765
+msgid "There is a more complex example in examples/others/dnd."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5159(title)
+#: C/index-in.docbook:4774
 msgid "The Clipboard"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5160(para)
+#: C/index-in.docbook:4775
 msgid ""
 "Simple text copy-paste functionality is provided for free by widgets such as "
-"Gtk::Entry and Gtk::TextView, but you might need special code to deal with "
-"your own data formats. For instance, a drawing program would need special "
-"code to allow copy and paste within a view, or between documents."
+"<classname>Gtk::Entry</classname> and <classname>Gtk::TextView</classname>, "
+"but you might need special code to deal with your own data formats. For "
+"instance, a drawing program would need special code to allow copy and paste "
+"within a view, or between documents."
+msgstr ""
+
+#: C/index-in.docbook:4781
+msgid ""
+"You can get a clipboard instance with <methodname>Gtk::Widget::"
+"get_clipboard()</methodname> or <methodname>Gdk::Display::get_clipboard()</"
+"methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5162(para)
+#: C/index-in.docbook:4786
 msgid ""
-"<classname>Gtk::Clipboard</classname> is a singleton. You can get the one "
-"and only instance with <methodname>Gtk::Clipboard::get()</methodname>."
+"Your application doesn't need to wait for clipboard operations, particularly "
+"between the time when the user chooses Copy and then later chooses Paste. "
+"Many <classname>Gdk::Clipboard</classname> methods take <classname>sigc::"
+"slot</classname>s which specify callback methods. When <classname>Gdk::"
+"Clipboard</classname> is ready, it will call these methods, providing the "
+"requested data."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5167(para)
+#: C/index-in.docbook:4794
 msgid ""
-"So your application doesn't need to wait for clipboard operations, "
-"particularly between the time when the user chooses Copy and then later "
-"chooses Paste, most <classname>Gtk::Clipboard</classname> methods take "
-"<classname>sigc::slot</classname>s which specify callback methods. When "
-"<classname>Gtk::Clipboard</classname> is ready, it will call these methods, "
-"either providing the requested data, or asking for data."
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGdk_1_1Clipboard.";
+"html\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5179(title)
-msgid "Targets"
+#: C/index-in.docbook:4797
+msgid "Formats"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5180(para)
+#: C/index-in.docbook:4798
 msgid ""
 "Different applications contain different types of data, and they might make "
 "that data available in a variety of formats. <application>gtkmm</"
-"application> calls these data types <literal>target</literal>s."
+"application> calls these data types <literal>format</literal>s."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5184(para)
+#: C/index-in.docbook:4802
 msgid ""
-"For instance, gedit can supply and receive the <literal>\"UTF8_STRING\"</"
-"literal> target, so you can paste data into gedit from any application that "
-"supplies that target. Or two different image editing applications might "
-"supply and receive a variety of image formats as targets. As long as one "
-"application can receive one of the targets that the other supplies then you "
-"will be able to copy data from one to the other."
+"For instance, <application>gedit</application> can supply and receive the "
+"<literal>text/plain</literal> mime type, so you can paste data into "
+"<application>gedit</application> from any application that supplies that "
+"format. Or two different image editing applications might supply and receive "
+"a variety of image formats. As long as one application can receive one of "
+"the formats that the other supplies then you will be able to copy data from "
+"one to the other."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5188(para)
+#: C/index-in.docbook:4810
 msgid ""
-"A target can be in a variety of binary formats. This chapter, and the "
+"Clipboard data can be in a variety of binary formats. This chapter, and the "
 "examples, assume that the data is 8-bit text. This would allow us to use an "
 "XML format for the clipboard data. However this would probably not be "
-"appropriate for binary data such as images. <classname>Gtk::Clipboard</"
-"classname> provides overloads that allow you to specify the format in more "
-"detail if necessary."
+"appropriate for binary data such as images."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5197(para)
+#: C/index-in.docbook:4817
 msgid ""
 "The <link linkend=\"chapter-draganddrop\">Drag and Drop</link> API uses the "
-"same mechanism. You should probably use the same data targets and formats "
-"for both Clipboard and Drag and Drap operations."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:5202(para)
-msgid ""
-"When the user asks to copy some data, you should tell the "
-"<classname>Clipboard</classname> what targets are available, and provide the "
-"callback methods that it can use to get the data. At this point you should "
-"store a copy of the data, to be provided when the clipboard calls your "
-"callback method in repsonse to a paste."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:5211(programlisting)
-#, no-wrap
-msgid ""
-"Glib::RefPtr&lt;Gtk::Clipboard&gt; refClipboard = Gtk::Clipboard::get();\n"
-"\n"
-"//Targets:\n"
-"std::list&lt;Gtk::TargetEntry&gt; listTargets;\n"
-"listTargets.push_back( Gtk::TargetEntry(\"example_custom_target\") );\n"
-"listTargets.push_back( Gtk::TargetEntry(\"UTF8_STRING\") );\n"
-"\n"
-"refClipboard-&gt;set( listTargets,\n"
-"    sigc::mem_fun(*this, &amp;ExampleWindow::on_clipboard_get),\n"
-"    sigc::mem_fun(*this, &amp;ExampleWindow::on_clipboard_clear) );"
+"same mechanism. You should probably use the same data formats for both "
+"Clipboard and Drag and Drop operations."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5222(para)
+#: C/index-in.docbook:4823
 msgid ""
-"Your callback will then provide the store data when the user chooses to "
-"paste the data. For instance:"
+"When the user asks to copy some data, you should copy the data to the "
+"<classname>Clipboard</classname>. For instance,"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5224(programlisting)
+#: C/index-in.docbook:4827
 #, no-wrap
 msgid ""
-"void ExampleWindow::on_clipboard_get(\n"
-"    Gtk::SelectionData&amp; selection_data, guint info)\n"
+"void ExampleWindow::on_button_copy()\n"
 "{\n"
-"  const Glib::ustring target = selection_data.get_target();\n"
-"\n"
-"  if(target == \"example_custom_target\")\n"
-"    selection_data.set(\"example_custom_target\", m_ClipboardStore);\n"
+"  get_clipboard()-&gt;set_text(\"example_custom_target\");\n"
 "}"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5232(para)
-msgid ""
-"The <literal>ideal</literal> example below can supply more than one "
-"clipboard target."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:5236(para)
-msgid ""
-"The clear callback allows you to free the memory used by your stored data "
-"when the clipboard replaces its data with something else."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:5242(title)
+#: C/index-in.docbook:4835
 msgid "Paste"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5243(para)
+#: C/index-in.docbook:4836
 msgid ""
 "When the user asks to paste data from the <classname>Clipboard</classname>, "
 "you should request a specific format and provide a callback method which "
 "will be called with the actual data. For instance:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5248(programlisting)
+#: C/index-in.docbook:4841
 #, no-wrap
 msgid ""
-"refClipboard-&gt;request_contents(\"example_custom_target\",\n"
-"    sigc::mem_fun(*this, &amp;ExampleWindow::on_clipboard_received) );"
+"void ExampleWindow::on_button_paste()\n"
+"{\n"
+"  get_clipboard()-&gt;read_text_async(sigc::mem_fun(*this,\n"
+"              &amp;ExampleWindow::on_clipboard_received));\n"
+"}"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5251(para)
+#: C/index-in.docbook:4847
 msgid "Here is an example callback method:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5253(programlisting)
+#: C/index-in.docbook:4849
 #, no-wrap
 msgid ""
-"void ExampleWindow::on_clipboard_received(\n"
-"    const Gtk::SelectionData&amp; selection_data)\n"
+"void ExampleWindow::on_clipboard_received(Glib::RefPtr&lt;Gio::AsyncResult&gt;&amp; result)\n"
 "{\n"
-"  Glib::ustring clipboard_data = selection_data.get_data_as_string();\n"
+"  auto text = get_clipboard()-&gt;read_text_finish(result);\n"
 "  //Do something with the pasted data.\n"
 "}"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5261(title)
-msgid "Discovering the available targets"
+#: C/index-in.docbook:4856
+msgid "Discovering the available formats"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5262(para)
+#: C/index-in.docbook:4857
 msgid ""
-"To find out what targets are currently available on the "
+"To find out what formats are currently available on the "
 "<classname>Clipboard</classname> for pasting, call the "
-"<methodname>request_targets()</methodname> method, specifying a method to be "
-"called with the information. For instance:"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:5268(programlisting)
-#, no-wrap
-msgid ""
-"refClipboard-&gt;request_targets( sigc::mem_fun(*this,\n"
-"    &amp;ExampleWindow::on_clipboard_received_targets) );"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:5271(para)
-msgid ""
-"In your callback, compare the list of available targets with those that your "
-"application supports for pasting. You could enable or disable a Paste menu "
-"item, depending on whether pasting is currently possible. For instance:"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:5274(programlisting)
-#, no-wrap
-msgid ""
-"void ExampleWindow::on_clipboard_received_targets(\n"
-"  const Glib::StringArrayHandle&amp; targets_array)\n"
-"{\n"
-"  // Get the list of available clipboard targets:\n"
-"  std::list&lt;std::string&gt; targets = targets_array;\n"
-"\n"
-"  const bool bPasteIsPossible =\n"
-"    std::find(targets.begin(), targets.end(),\n"
-"      example_target_custom) != targets.end();\n"
-"\n"
-"  // Enable/Disable the Paste button appropriately:\n"
-"  m_Button_Paste.set_sensitive(bPasteIsPossible);\n"
-"}"
+"<methodname>get_formats()</methodname> method. Then call a <classname>Gdk::"
+"ContentFormats</classname> method to find out if a format that your "
+"application supports is available."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5293(title) C/gtkmm-tutorial-in.xml:5690(title)
+#: C/index-in.docbook:4869 C/index-in.docbook:5260
 msgid "Simple"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5294(para)
+#: C/index-in.docbook:4870
 msgid ""
 "This example allows copy and pasting of application-specific data, using the "
-"standard text target. Although this is simple, it's not ideal because it "
+"standard text format. Although this is simple, it's not ideal because it "
 "does not identify the <classname>Clipboard</classname> data as being of a "
 "particular type."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5302(title)
+#: C/index-in.docbook:4878
 msgid "Clipboard - Simple"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5312(title)
-msgid "Ideal"
+#: C/index-in.docbook:4884
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/clipboard/simple/\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5315(simpara)
-msgid ""
-"Defines a custom clipboard target, though the format of that target is still "
-"text."
+#: C/index-in.docbook:4888
+msgid "Ideal"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5316(simpara)
-msgid ""
-"It supports pasting of 2 targets - both the custom one and a text one that "
-"creates an arbitrary text representation of the custom data."
+#: C/index-in.docbook:4891
+msgid "Defines a custom clipboard target, though the format is still text."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5317(simpara)
+#: C/index-in.docbook:4892
 msgid ""
-"It uses <methodname>request_targets()</methodname> and disables the Paste "
-"button if it can't use anything on the clipboard"
+"It uses the <methodname>Gdk::ContentFormats::signal_changed()</methodname> "
+"signal and disables the Paste button if it can't use anything on the "
+"clipboard."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5313(para)
-msgid "This is like the simple example, but it <placeholder-1/>"
+#: C/index-in.docbook:4889
+msgid "This is like the simple example, but it <_:orderedlist-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5322(title)
+#: C/index-in.docbook:4898
 msgid "Clipboard - Ideal"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5338(title)
-msgid "Printing"
+#: C/index-in.docbook:4904
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/clipboard/ideal/\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5341(para)
-msgid ""
-"Printing support is available in <application>gtkmm</application> version "
-"2.10 and later."
+#: C/index-in.docbook:4914
+msgid "Printing"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5344(para)
+#: C/index-in.docbook:4916
 msgid ""
 "At the application development level, <application>gtkmm</application>'s "
 "printing API provides dialogs that are consistent across applications and "
-"allows us of Cairo's common drawing API, with Pango-driven text rendering. "
+"allows use of Cairo's common drawing API, with Pango-driven text rendering. "
 "In the implementation of this common API, platform-specific backends and "
 "printer-specific drivers are used."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5350(title)
+#: C/index-in.docbook:4922
 msgid "PrintOperation"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5352(para)
+#: C/index-in.docbook:4924
 msgid ""
 "The primary object is <classname>Gtk::PrintOperation</classname>, allocated "
 "for each print operation. To handle page drawing connect to its signals, or "
@@ -6744,7 +7048,7 @@ msgid ""
 "affecting the print loop."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5369(para)
+#: C/index-in.docbook:4941
 msgid ""
 "<literal>begin_print</literal>: You must handle this signal, because this is "
 "where you create and set up a <classname>Pango::Layout</classname> using the "
@@ -6752,21 +7056,21 @@ msgid ""
 "printing output into pages."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5379(para)
+#: C/index-in.docbook:4951
 msgid ""
 "<literal>paginate</literal>: Pagination is potentially slow so if you need "
-"to monitor it you can call the <methodname>PrintOperation::set_show_progress"
-"()</methodname> method and handle this signal."
+"to monitor it you can call the <methodname>PrintOperation::"
+"set_show_progress()</methodname> method and handle this signal."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5393(para)
+#: C/index-in.docbook:4965
 msgid ""
 "<literal>request_page_setup</literal>: Provides a <classname>PrintContext</"
 "classname>, page number and <classname>Gtk::PageSetup</classname>. Handle "
 "this signal if you need to modify page setup on a per-page basis."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5402(para)
+#: C/index-in.docbook:4974
 msgid ""
 "<literal>draw_page</literal>: You must handle this signal, which provides a "
 "<classname>PrintContext</classname> and a page number. The "
@@ -6776,13 +7080,13 @@ msgid ""
 "you created in the <literal>begin_print</literal> handler."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5388(para)
+#: C/index-in.docbook:4960
 msgid ""
 "For each page that needs to be rendered, the following signals are emitted: "
-"<placeholder-1/>"
+"<_:itemizedlist-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5417(para)
+#: C/index-in.docbook:4989
 msgid ""
 "<literal>end_print</literal>: A handler for it is a safe place to free any "
 "resources related to a <classname>PrintOperation</classname>. If you have "
@@ -6790,7 +7094,7 @@ msgid ""
 "it is naturally simpler to do it in the destructor."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5427(para)
+#: C/index-in.docbook:4999
 msgid ""
 "<literal>done</literal>: This signal is emitted when printing is finished, "
 "meaning when the print data is spooled. Note that the provided <literal>Gtk::"
@@ -6798,7 +7102,7 @@ msgid ""
 "case you probably want to notify the user about the final status."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5437(para)
+#: C/index-in.docbook:5009
 msgid ""
 "<literal>status_changed</literal>: Emitted whenever a print job's status "
 "changes, until it is finished. Call the <methodname>PrintOperation::"
@@ -6807,17 +7111,23 @@ msgid ""
 "<methodname>get_status_string()</methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5363(para)
+#: C/index-in.docbook:4935
 msgid ""
 "The <methodname>PrintOperation::run()</methodname> method starts the print "
-"loop, during which various signals are emitted: <placeholder-1/>"
+"loop, during which various signals are emitted: <_:itemizedlist-1/>"
+msgstr ""
+
+#: C/index-in.docbook:5022
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/";
+"classGtk_1_1PrintOperation.html\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5459(title)
+#: C/index-in.docbook:5031
 msgid "Page setup"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5461(para)
+#: C/index-in.docbook:5033
 msgid ""
 "The <classname>PrintOperation</classname> class has a method called "
 "<methodname>set_default_page_setup()</methodname> which selects the default "
@@ -6829,27 +7139,32 @@ msgid ""
 "<literal>Gtk::PageOrientation</literal> and printer-specific margins."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5471(para)
+#: C/index-in.docbook:5043
 msgid ""
 "You should save the chosen <classname>Gtk::PageSetup</classname> so you can "
 "use it again if the page setup dialog is shown again."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5475(programlisting)
+#: C/index-in.docbook:5047
 #, no-wrap
 msgid ""
 "\n"
 "//Within a class that inherits from Gtk::Window and keeps m_refPageSetup and m_refSettings as members...\n"
-"Glib::RefPtr&lt;Gtk::PageSetup&gt; new_page_setup = Gtk::run_page_setup_dialog(*this, m_refPageSetup, 
m_refSettings);\n"
+"auto new_page_setup = Gtk::run_page_setup_dialog(*this, m_refPageSetup, m_refSettings);\n"
 "m_refPageSetup = new_page_setup;\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5474(para) C/gtkmm-tutorial-in.xml:5539(para)
-#: C/gtkmm-tutorial-in.xml:9319(para)
-msgid "For instance, <placeholder-1/>"
+#: C/index-in.docbook:5046 C/index-in.docbook:5111 C/index-in.docbook:10637
+msgid "For instance, <_:programlisting-1/>"
+msgstr ""
+
+#: C/index-in.docbook:5054
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1PageSetup.";
+"html\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5486(para)
+#: C/index-in.docbook:5058
 msgid ""
 "The Cairo coordinate system, in the <literal>draw_page</literal> handler, is "
 "automatically rotated to the current page orientation. It is normally within "
@@ -6859,11 +7174,11 @@ msgid ""
 "<methodname>PrintOperation::set_unit()</methodname> method."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5498(title)
+#: C/index-in.docbook:5070
 msgid "Rendering text"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5500(para)
+#: C/index-in.docbook:5072
 msgid ""
 "Text rendering is done using Pango. The <classname>Pango::Layout</classname> "
 "object for printing should be created by calling the "
@@ -6878,17 +7193,17 @@ msgid ""
 "page number."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5515(para)
+#: C/index-in.docbook:5087
 msgid ""
 "See <link linkend=\"sec-printing-example-simple\">an example</link> of "
 "exactly how this can be done."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5523(title)
+#: C/index-in.docbook:5095
 msgid "Asynchronous operations"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5525(para)
+#: C/index-in.docbook:5097
 msgid ""
 "By default, <methodname>PrintOperation::run()</methodname> returns when a "
 "print operation is completed. If you need to run a non-blocking print "
@@ -6897,7 +7212,7 @@ msgid ""
 "platforms, however the <literal>done</literal> signal will still be emitted."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5532(para)
+#: C/index-in.docbook:5104
 msgid ""
 "<methodname>run()</methodname> may return "
 "<literal>PRINT_OPERATION_RESULT_IN_PROGRESS</literal>. To track status and "
@@ -6905,18 +7220,18 @@ msgid ""
 "<literal>done</literal> and <literal>status_changed</literal> signals:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5540(programlisting)
+#: C/index-in.docbook:5112
 #, no-wrap
 msgid ""
 "\n"
 "// in class ExampleWindow's method...\n"
-"Glib::RefPtr&lt;PrintOperation&gt; op = PrintOperation::create();\n"
+"auto op = PrintOperation::create();\n"
 "// ...set up op...\n"
 "op-&gt;signal_done().connect(sigc::bind(sigc::mem_fun(*this, &amp;ExampleWindow::on_printoperation_done), 
op));\n"
 "// run the op\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5550(programlisting)
+#: C/index-in.docbook:5122
 #, no-wrap
 msgid ""
 "\n"
@@ -6932,17 +7247,17 @@ msgid ""
 "}\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5549(para)
+#: C/index-in.docbook:5121
 msgid ""
 "Second, check for an error and connect to the <literal>status_changed</"
-"literal> signal. For instance: <placeholder-1/>"
+"literal> signal. For instance: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5565(programlisting)
+#: C/index-in.docbook:5137
 #, no-wrap
 msgid ""
 "\n"
-"void ExampleWindow::on_printoperation_status_changed(const Glib::RefPtr&lt;PrintFormOperation&gt;&amp; 
op)\n"
+"void ExampleWindow::on_printoperation_status_changed(const Glib::RefPtr&lt;PrintOperation&gt;&amp; op)\n"
 "{\n"
 "  if (op-&gt;is_finished())\n"
 "    //the print job is finished\n"
@@ -6953,54 +7268,54 @@ msgid ""
 "}\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5564(para)
-msgid "Finally, check the status. For instance, <placeholder-1/>"
+#: C/index-in.docbook:5136
+msgid "Finally, check the status. For instance, <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5581(title)
+#: C/index-in.docbook:5153
 msgid "Export to PDF"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5585(programlisting)
+#: C/index-in.docbook:5157
 #, no-wrap
 msgid ""
 "\n"
-"Glib::RefPtr&lt;Gtk::PrintOperation&gt; op = Gtk::PrintOperation::create();\n"
+"auto op = Gtk::PrintOperation::create();\n"
 "// ...set up op...\n"
 "op-&gt;set_export_filename(\"test.pdf\");\n"
-"Gtk::PrintOperationResult res = op-&gt;run(Gtk::PRINT_OPERATION_ACTION_EXPORT);\n"
+"auto res = op-&gt;run(Gtk::PRINT_OPERATION_ACTION_EXPORT);\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5582(para)
+#: C/index-in.docbook:5154
 msgid ""
 "The 'Print to file' option is available in the print dialog, without the "
 "need for extra implementation. However, it is sometimes useful to generate a "
-"pdf file directly from code. For instance, <placeholder-1/>"
+"pdf file directly from code. For instance, <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5597(title)
+#: C/index-in.docbook:5169
 msgid "Extending the print dialog"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5604(para)
+#: C/index-in.docbook:5176
 msgid ""
-"Set the title of the tab via <methodname>PrintOperation::set_custom_tab_label"
-"()</methodname>, create a new widget and return it from the "
-"<literal>create_custom_widget</literal> signal handler. You'll probably want "
-"this to be a container widget, packed with some others."
+"Set the title of the tab via <methodname>PrintOperation::"
+"set_custom_tab_label()</methodname>, create a new widget and return it from "
+"the <literal>create_custom_widget</literal> signal handler. You'll probably "
+"want this to be a container widget, packed with some others."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5614(para)
+#: C/index-in.docbook:5186
 msgid ""
 "Get the data from the widgets in the <literal>custom_widget_apply</literal> "
 "signal handler."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5599(para)
-msgid "You may add a custom tab to the print dialog: <placeholder-1/>"
+#: C/index-in.docbook:5171
+msgid "You may add a custom tab to the print dialog: <_:itemizedlist-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5629(programlisting)
+#: C/index-in.docbook:5201
 #, no-wrap
 msgid ""
 "\n"
@@ -7008,61 +7323,59 @@ msgid ""
 "{\n"
 "  set_custom_tab_label(\"My custom tab\");\n"
 "\n"
-"  Gtk::HBox* hbox = new Gtk::HBox(false, 8);\n"
-"  hbox-&gt;set_border_width(6);\n"
+"  auto hbox = new Gtk::Box(Gtk::Orientation::HORIZONTAL, 8);\n"
+"  hbox-&gt;set_margin(6);\n"
 "\n"
-"  Gtk::Label* label = Gtk::manage(new Gtk::Label(\"Enter some text: \"));\n"
-"  hbox-&gt;pack_start(*label, false, false);\n"
-"  label-&gt;show();\n"
+"  auto label = Gtk::make_managed&lt;Gtk::Label&gt;(\"Enter some text: \");\n"
+"  hbox-&gt;append(*label);\n"
 "\n"
-"  hbox-&gt;pack_start(m_Entry, false, false);\n"
-"  m_Entry.show();\n"
+"  hbox-&gt;append(m_Entry);\n"
 "\n"
 "  return hbox;\n"
 "}\n"
 "\n"
 "void CustomPrintOperation::on_custom_widget_apply(Gtk::Widget* /* widget */)\n"
 "{\n"
-"  Glib::ustring user_input = m_Entry.get_text();\n"
+"  auto user_input = m_Entry.get_text();\n"
 "  //...\n"
 "}\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5622(para)
+#: C/index-in.docbook:5194
 msgid ""
 "Although the <literal>custom_widget_apply</literal> signal provides the "
 "widget you previously created, to simplify things you can keep the widgets "
 "you expect to contain some user input as class members. For example, let's "
 "say you have a <classname>Gtk::Entry</classname> called <literal>m_Entry</"
 "literal> as a member of your <classname>CustomPrintOperation</classname> "
-"class: <placeholder-1/>"
+"class: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5656(para)
+#: C/index-in.docbook:5226
 msgid "The example in examples/book/printing/advanced demonstrates this."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5663(title)
+#: C/index-in.docbook:5233
 msgid "Preview"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5669(programlisting)
+#: C/index-in.docbook:5239
 #, no-wrap
 msgid ""
 "\n"
 "// in a class that inherits from Gtk::Window...\n"
-"Glib::RefPtr&lt;PrintOperation&gt; op = PrintOperation::create();\n"
+"auto op = PrintOperation::create();\n"
 "// ...set up op...\n"
 "op-&gt;run(Gtk::PRINT_OPERATION_ACTION_PREVIEW, *this);\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5665(para)
+#: C/index-in.docbook:5235
 msgid ""
-"The native GTK+ print dialog has a preview button, but you may also start a "
-"preview directly from an application: <placeholder-1/>"
+"The native GTK print dialog has a preview button, but you may also start a "
+"preview directly from an application: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5677(para)
+#: C/index-in.docbook:5247
 msgid ""
 "On Unix, the default preview handler uses an external viewer program. On "
 "Windows, the native preview dialog will be shown. If necessary you may "
@@ -7070,7 +7383,7 @@ msgid ""
 "located in /examples/book/printing/advanced."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5692(para)
+#: C/index-in.docbook:5262
 msgid ""
 "The following example demonstrates how to print some input from a user "
 "interface. It shows how to implement <literal>on_begin_print</literal> and "
@@ -7078,31 +7391,28 @@ msgid ""
 "update the print settings."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5700(title)
+#: C/index-in.docbook:5270
 msgid "Printing - Simple"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5715(title)
-msgid "Recently Used Documents"
+#: C/index-in.docbook:5276
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/printing/simple/\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5717(para) C/gtkmm-tutorial-in.xml:5873(para)
-msgid ""
-"Recent Files support is available in <application>gtkmm</application> "
-"version 2.10 and later"
+#: C/index-in.docbook:5285
+msgid "Recently Used Documents"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5720(para)
+#: C/index-in.docbook:5287
 msgid ""
 "<application>gtkmm</application> provides an easy way to manage recently "
-"used documents. The classes involved in implementing this functionality are "
-"<classname>RecentManager</classname>, <classname>RecentChooserDialog</"
-"classname>, <classname>RecentChooserMenu</classname>, "
-"<classname>RecentChooserWidget</classname>, and <classname>RecentFilter</"
-"classname>."
+"used documents. This functionality is implemented in the <classname>Gtk::"
+"RecentManager</classname> class."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5729(para)
+#: C/index-in.docbook:5291
 msgid ""
 "Each item in the list of recently used files is identified by its URI, and "
 "can have associated metadata. The metadata can be used to specify how the "
@@ -7111,18 +7421,19 @@ msgid ""
 "application, and several other things."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5737(title)
+#: C/index-in.docbook:5299
 msgid "RecentManager"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5738(para)
+#: C/index-in.docbook:5300
 msgid ""
-"<classname>RecentManager</classname> acts as the central database of "
-"recently used files. You use this class to register new files, remove files "
-"from the list, or look up recently used files."
+"<classname>RecentManager</classname> acts as a database of recently used "
+"files. You use this class to register new files, remove files from the list, "
+"or look up recently used files. There is one list of recently used files per "
+"user."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5743(para)
+#: C/index-in.docbook:5306
 msgid ""
 "You can create a new <classname>RecentManager</classname>, but you'll most "
 "likely just want to use the default one. You can get a reference to the "
@@ -7130,57 +7441,57 @@ msgid ""
 "methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5750(title)
+#: C/index-in.docbook:5313
 msgid "Adding Items to the List of Recent Files"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5751(para)
+#: C/index-in.docbook:5314
 msgid ""
 "To add a new file to the list of recent documents, in the simplest case, you "
 "only need to provide the URI. For example:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5755(programlisting)
+#: C/index-in.docbook:5318
 #, no-wrap
 msgid ""
-"Glib::RefPtr&lt;Gtk::RecentManager&gt; recent_manager = Gtk::RecentManager::get_default();\n"
+"auto recent_manager = Gtk::RecentManager::get_default();\n"
 "recent_manager-&gt;add_item(uri);"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5757(para)
+#: C/index-in.docbook:5320
 msgid ""
 "If you want to register a file with metadata, you can pass a "
-"<classname>RecentManager::Data</classname> parameter to <methodname>add_item"
-"()</methodname>. The metadata that can be set on a particular file item is "
-"as follows:"
+"<classname>RecentManager::Data</classname> parameter to "
+"<methodname>add_item()</methodname>. The metadata that can be set on a "
+"particular file item is as follows:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5765(para)
+#: C/index-in.docbook:5328
 msgid ""
 "<varname>app_exec</varname>: The command line to be used to launch this "
 "resource. This string may contain the \"f\" and \"u\" escape characters "
 "which will be expanded to the resource file path and URI respectively"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5771(para)
+#: C/index-in.docbook:5334
 msgid ""
 "<varname>app_name</varname>: The name of the application that registered the "
 "resource"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5775(para)
+#: C/index-in.docbook:5338
 msgid ""
-"<varname>description</varname>: A short description of the resource as a UTF-"
-"8 encoded string"
+"<varname>description</varname>: A short description of the resource as a "
+"UTF-8 encoded string"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5779(para)
+#: C/index-in.docbook:5342
 msgid ""
 "<varname>display_name</varname>: The name of the resource to be used for "
 "display as a UTF-8 encoded string"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5783(para)
+#: C/index-in.docbook:5346
 msgid ""
 "<varname>groups</varname>: A list of groups associated with this item. "
 "Groups are essentially arbitrary strings associated with a particular "
@@ -7188,410 +7499,388 @@ msgid ""
 "\"graphics\", etc) or tags for the resource."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5789(para)
+#: C/index-in.docbook:5352
 msgid ""
 "<varname>is_private</varname>: Whether this resource should be visible only "
 "to applications that have registered it or not"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5793(para)
+#: C/index-in.docbook:5356
 msgid "<varname>mime_type</varname>: The MIME type of the resource"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5796(para)
+#: C/index-in.docbook:5359
 msgid ""
 "In addition to adding items to the list, you can also look up items from the "
 "list and modify or remove items."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5802(title)
+#: C/index-in.docbook:5365
 msgid "Looking up Items in the List of Recent Files"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5803(para)
+#: C/index-in.docbook:5366
 msgid ""
 "To look up recently used files, <classname>RecentManager</classname> "
 "provides several functions. To look up a specific item by its URI, you can "
 "use the <methodname>lookup_item()</methodname> function, which will return a "
 "<classname>RecentInfo</classname> class. If the specified URI did not exist "
-"in the list of recent files, the <classname>RecentInfo</classname> object "
-"will be invalid. <classname>RecentInfo</classname> provides an "
-"implementation for <methodname>operator bool()</methodname> which can be "
-"used to test for validity. For example:"
+"in the list of recent files, <methodname>lookup_item()</methodname> throws a "
+"<classname>RecentManagerError</classname> exception. For example:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5814(programlisting)
+#: C/index-in.docbook:5375
 #, no-wrap
 msgid ""
-"Gtk::RecentInfo info = recent_manager-&gt;lookup_item(uri);\n"
+"Glib::RefPtr&lt;Gtk::RecentInfo&gt; info;\n"
+"try\n"
+"{\n"
+"  info = recent_manager-&gt;lookup_item(uri);\n"
+"}\n"
+"catch(const Gtk::RecentManagerError&amp; ex)\n"
+"{\n"
+"  std::cerr &lt;&lt; \"RecentManagerError: \" &lt;&lt; ex.what() &lt;&lt; std::endl;\n"
+"}\n"
 "if (info)\n"
 "{\n"
 "  // item was found\n"
 "}"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5819(para)
+#: C/index-in.docbook:5388
 msgid ""
 "A <classname>RecentInfo</classname> object is essentially an object "
 "containing all of the metadata about a single recently-used file. You can "
-"use this object to look up any of the properties listed above. FIXME - add "
-"cross-reference."
+"use this object to look up any of the properties listed <link linkend=\"list-"
+"file-metadata\">above</link>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5825(para)
+#: C/index-in.docbook:5394
 msgid ""
 "If you don't want to look for a specific URI, but instead want to get a list "
 "of all recently used items, <classname>RecentManager</classname> provides "
 "the <methodname>get_items()</methodname> function. The return value of this "
-"function can be assigned to any standard C++ container (e.g. <classname>std::"
-"vector</classname>, <classname>std::list</classname>, etc) and contains a "
-"list of all recently-used files up to a user-defined limit (FIXME: what's "
-"the default limit?). The following code demonstrates how you might get a "
-"list of recently-used files:"
+"function is a <classname>std::vector</classname> of all recently used files. "
+"The following code demonstrates how you might get a list of recently used "
+"files:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5836(programlisting)
+#: C/index-in.docbook:5402
 #, no-wrap
-msgid "std::vector&lt;Gtk::RecentInfo&gt; info_list = recent_manager-&gt;get_items();"
+msgid "auto info_list = recent_manager-&gt;get_items();"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5837(para)
+#: C/index-in.docbook:5403
 msgid ""
-"The limit on the number of items returned can be set by <methodname>set_limit"
-"()</methodname>, and queried with <methodname>get_limit()</methodname>."
+"The maximum age of items in the recently used files list can be set with "
+"<methodname>Gtk::Settings::property_gtk_recent_files_max_age()</methodname>. "
+"Default value: 30 days."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5844(title)
+#: C/index-in.docbook:5410
 msgid "Modifying the List of Recent Files"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5845(para)
+#: C/index-in.docbook:5411
 msgid ""
 "There may be times when you need to modify the list of recent files. For "
 "instance, if a file is moved or renamed, you may need to update the file's "
 "location in the recent files list so that it doesn't point to an incorrect "
-"location. You can update an item's location by using <methodname>move_item()"
-"</methodname>."
+"location. You can update an item's location by using "
+"<methodname>move_item()</methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5852(para)
+#: C/index-in.docbook:5418
 msgid ""
 "In addition to changing a file's URI, you can also remove items from the "
-"list, either one at a time or by clearint them all at once. The former is "
+"list, either one at a time or by clearing them all at once. The former is "
 "accomplished with <methodname>remove_item()</methodname>, the latter with "
 "<methodname>purge_items()</methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5859(para)
-msgid ""
-"The functions <methodname>move_item()</methodname>, <methodname>remove_item()"
-"</methodname> and <methodname>purge_items()</methodname> have no effect on "
-"the actual files that are referred to by the URIs, they only modify the list "
-"of recent files."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:5871(title)
-msgid "RecentChooser"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:5876(para)
+#: C/index-in.docbook:5425
 msgid ""
-"<classname>RecentChooser</classname> is an interface that can be implemented "
-"by widgets displaying the list of recently used files. <application>gtkmm</"
-"application> provides three built-in implementations for choosing recent "
-"files: <classname>RecentChooserWidget</classname>, "
-"<classname>RecentChooserDialog</classname>, and "
-"<classname>RecentChooserMenu</classname>."
+"The functions <methodname>move_item()</methodname>, "
+"<methodname>remove_item()</methodname> and <methodname>purge_items()</"
+"methodname> have no effect on the actual files that are referred to by the "
+"URIs, they only modify the list of recent files."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5884(para)
+#: C/index-in.docbook:5438
 msgid ""
-"<classname>RecentChooserWidget</classname> is a simple widget for displaying "
-"a list of recently used files. <classname>RecentChooserWidget</classname> is "
-"the basic building block for <classname>RecentChooserDialog</classname>, but "
-"you can embed it into your user interface if you want to."
+"<classname>FileChooser</classname> is an interface that can be implemented "
+"by widgets displaying a list of files. <application>gtkmm</application> "
+"provides three built-in implementations for choosing recent files or other "
+"files: <classname>FileChooserWidget</classname>, "
+"<classname>FileChooserDialog</classname>, and <classname>FileChooserNative</"
+"classname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5891(para)
+#: C/index-in.docbook:5447
 msgid ""
-"The last class that implements the <classname>RecentChooser</classname> "
-"interface is <classname>RecentChooserMenu</classname>. This class allows you "
-"to list recently used files as a menu."
+"<classname>FileChooserWidget</classname> is a simple widget for displaying a "
+"list of recently used files or other files. <classname>FileChooserWidget</"
+"classname> is the basic building block for <classname>FileChooserDialog</"
+"classname>, but you can embed it into your user interface if you want to."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5897(title)
-msgid "Simple RecentChooserWidget example"
+#: C/index-in.docbook:5455
+msgid "Simple FileChooserDialog example"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5898(para)
+#: C/index-in.docbook:5456
 msgid ""
 "Shown below is a simple example of how to use the "
-"<classname>RecentChooserDialog</classname> class in a program. This simple "
-"program has a menubar with a \"Recent Files Dialog\" menu item. When you "
-"select this menu item, a dialog pops up showing the list of recently used "
-"files."
+"<classname>FileChooserDialog</classname> class in a program. This simple "
+"program has a menubar with a <guimenuitem>File Chooser Dialog</guimenuitem> "
+"menu item. When you select this menu item, a dialog pops up showing a list "
+"of files. If you select <guimenuitem>Recent</guimenuitem> in the sidebar, "
+"the list of recently used files is shown."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5906(para)
+#: C/index-in.docbook:5466
 msgid ""
 "If this is the first time you're using a program that uses the Recent Files "
 "framework, the dialog may be empty at first. Otherwise it should show the "
 "list of recently used documents registered by other applications."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5913(para)
+#: C/index-in.docbook:5473
+msgid ""
+"After selecting the <guimenuitem>File Chooser Dialog</guimenuitem> menu item "
+"and the <guimenuitem>Recent</guimenuitem> sidebar item, you should see "
+"something similar to the following window."
+msgstr ""
+
+#: C/index-in.docbook:5481
 msgid ""
-"After selecting the <guimenuitem>Recent Files Dialog</guimenuitem> menu "
-"item, you should see something similar to the following window."
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/recent_files\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5922(para)
+#: C/index-in.docbook:5482
 msgid ""
 "The constructor for <classname>ExampleWindow</classname> creates the menu "
-"using <classname>UIManager</classname> (see <xref linkend=\"chapter-menus-"
-"and-toolbars\"/> for more information). It then adds the menu and the "
-"toolbar to the window."
+"and the toolbar using <classname>Builder</classname> (see <xref linkend="
+"\"chapter-menus-and-toolbars\"/> for more information). It then adds the "
+"menu and the toolbar to the window."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5930(title)
-msgid "Filtering Recent Files"
+#: C/index-in.docbook:5490
+msgid "Filtering Files"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5931(para)
+#: C/index-in.docbook:5491
 msgid ""
-"For any of the <classname>RecentChooser</classname> classes, if you don't "
-"wish to display all of the items in the list of recent files, you can filter "
-"the list to show only those that you want. You can filter the list with the "
-"help of the <classname>RecentFilter</classname> class. This class allows you "
-"to filter recent files by their name (<methodname>add_pattern()</"
-"methodname>), their mime type (<methodname>add_mime_type()</methodname>), "
-"the application that registered them (<methodname>add_application()</"
-"methodname>), or by a custom filter function (<methodname>add_custom()</"
-"methodname>). It also provides the ability to filter based on how long ago "
-"the file was modified and which groups it belongs to."
+"For any of the <classname>FileChooser</classname> classes, if you don't wish "
+"to display all of the items in the list of files, you can filter the list to "
+"show only those that you want. You can filter the list with the help of the "
+"<classname>FileFilter</classname> class. This class allows you to filter "
+"files by their name (<methodname>add_pattern()</methodname>), or their mime "
+"type (<methodname>add_mime_type()</methodname>)."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5944(para)
+#: C/index-in.docbook:5500
 msgid ""
 "After you've created and set up the filter to match only the items you want, "
-"you can apply a filter to a chooser widget with the "
-"<methodname>RecentChooser::add_filter()</methodname> function."
+"you can apply a filter to a chooser widget with the <methodname>FileChooser::"
+"add_filter()</methodname> function."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5954(title)
-msgid "Plugs and Sockets"
+#: C/index-in.docbook:5510
+msgid "Keyboard Events"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5956(title)
-msgid "Overview"
+#: C/index-in.docbook:5511
+msgid ""
+"X events differ in some ways from other signals. These differences are "
+"described in the <link linkend=\"sec-xeventsignals\">X Event signals</link> "
+"section in the appendix. Here we will use keyboard events to show how X "
+"events can be used in a program."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5957(para)
-msgid ""
-"From time to time, it may be useful to be able to embed a widget from "
-"another application within your application. <application>gtkmm</"
-"application> allows you to do this with the <classname>Gtk::Socket</"
-"classname> and <classname>Gtk::Plug</classname> classes. It is not "
-"anticipated that very many applications will need this functionality, but in "
-"the rare case that you need to display a widget that is running in a "
-"completely different process, these classes can be very helpful."
+#: C/index-in.docbook:5518
+msgid "Overview"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5966(para)
+#: C/index-in.docbook:5519
 msgid ""
-"The communication between a <classname>Socket</classname> and a "
-"<classname>Plug</classname> follows the XEmbed protocol. This protocol has "
-"also been implemented in other toolkits (e.g. Qt), which allows the same "
-"level of integration when embedding a Qt widget in GTK+ or vice versa."
+"Whenever you press or release a key, an event is emitted. You can connect a "
+"signal handler to handle such events."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5972(para)
+#: C/index-in.docbook:5523
 msgid ""
-"The way that <classname>Sockets</classname> and <classname>Plugs</classname> "
-"work together is through their window ids. Both a <classname>Socket</"
-"classname> and a <classname>Plug</classname> have IDs that can be retrieved "
-"with their <methodname>get_id()</methodname> member functions. The use of "
-"these IDs will be explained below in <xref linkend=\"sec-connecting-plugs-"
-"sockets\"/>."
+"The event signal handler will receive an argument that depends on the type "
+"of event. For keyboard events it's a <type>GdkEventKey*</type>. As discribed "
+"in the <link linkend=\"sec-xeventsignals\">appendix</link>, the event signal "
+"handler returns a <type>bool</type> value, to indicate that the signal is "
+"fully handled (<literal>true</literal>) or allow event propagation "
+"(<literal>false</literal>)."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5981(title)
-msgid "Sockets"
+#: C/index-in.docbook:5532
+msgid ""
+"To determine which key was pressed or released, you read the value of "
+"<varname>GdkEventKey::keyval</varname> and compare it with a constant in the "
+"<filename>&lt;gdk/gdkkeysyms.h&gt;</filename> header file. The states of "
+"modifier keys (shift, ctrl, etc.) are available as bit-flags in "
+"<varname>GdkEventKey::state</varname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5982(para)
+#: C/index-in.docbook:5541
+#, no-wrap
 msgid ""
-"A <classname>Socket</classname> is a special kind of container widget that "
-"provides the ability to embed widgets from one process into another process "
-"in a way that is transparent to the user."
+"\n"
+"bool on_key_press_or_release_event(GdkEventKey* event)\n"
+"{\n"
+"  if (event-&gt;type == GDK_KEY_PRESS &amp;&amp;\n"
+"    event-&gt;keyval == GDK_KEY_1 &amp;&amp;\n"
+"    (event-&gt;state &amp; (GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK)) == GDK_MOD1_MASK)\n"
+"  {\n"
+"    handle_alt_1_press(); // GDK_MOD1_MASK is normally the Alt key\n"
+"    return true;\n"
+"  }\n"
+"  return false;\n"
+"}\n"
+"\n"
+"Gtk::Entry m_entry; // in a class definition\n"
+"\n"
+"// in the class constructor\n"
+"m_entry.signal_key_press_event().connect( sigc::ptr_fun(&amp;on_key_press_or_release_event) );\n"
+"m_entry.signal_key_release_event().connect( sigc::ptr_fun(&amp;on_key_press_or_release_event) );\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5989(title)
-msgid "Plugs"
+#: C/index-in.docbook:5539 C/index-in.docbook:8443
+msgid "Here's a simple example: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5990(para)
+#: C/index-in.docbook:5564
 msgid ""
-"A <classname>Plug</classname> is a special kind of Window that can be "
-"plugged into a <classname>Socket</classname>. Besides the normal properties "
-"and methods of <classname>Gtk::Window</classname>, a <classname>Plug</"
-"classname> provides a constructor that takes the ID of a <classname>Socket</"
-"classname>, which will automatically embed the <classname>Plug</classname> "
-"into the <classname>Socket</classname> that matches that ID."
+"In this example there are three keyboard shortcuts: <keycap>Alt</keycap>"
+"+<keycap>1</keycap> selects the first radio button, <keycap>Alt</keycap>"
+"+<keycap>2</keycap> selects the second one, and the <keycap>Esc</keycap> key "
+"hides (closes) the window. The default event signal handler is overridden, "
+"as described in the <link linkend=\"sec-overriding-default-signal-handlers"
+"\">Overriding default signal handlers</link> section in the appendix."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:5999(para)
-msgid ""
-"Since a <classname>Plug</classname> is just a special type of "
-"<classname>Gtk::Window</classname> class, you can add containers or widgets "
-"to it like you would to any other window."
+#: C/index-in.docbook:5575
+msgid "Keyboard Events - Simple"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6006(title)
-msgid "Connecting Plugs and Sockets"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:6007(para)
+#: C/index-in.docbook:5581
 msgid ""
-"After a <classname>Socket</classname> or <classname>Plug</classname> object "
-"is realized, you can obtain its ID with its <methodname>get_id()</"
-"methodname> function. This ID can then be shared with other processes so "
-"that other processes know how to connect to eachother."
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/keyboard_events/simple/\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6018(para)
-msgid ""
-"Create a <classname>Socket</classname> object in one process and pass the ID "
-"of that <classname>Socket</classname> to another process so that it can "
-"create a <classname>Plug</classname> object by specifying the given "
-"<classname>Socket</classname> ID in its constructor. There is no way to "
-"assign a <classname>Plug</classname> to a particular <classname>Socket</"
-"classname> after creation, so you must pass the <classname>Socket</"
-"classname> ID to the <classname>Plug</classname>'s constructor."
+#: C/index-in.docbook:5586
+msgid "Event Propagation"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6031(para)
+#: C/index-in.docbook:5587
 msgid ""
-"Create a <classname>Plug</classname> independantly from any particular "
-"<classname>Socket</classname> and pass the ID of the <classname>Plug</"
-"classname> to other processes that need to use it. The ID of the "
-"<classname>Plug</classname> can be associated with a particular "
-"<classname>Socket</classname> object using the <methodname>Socket::add_id()</"
-"methodname> function. This is the approach used in the example below."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:6014(para)
-msgid "There are two basic strategies that can be used: <placeholder-1/>"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:6046(title)
-msgid "Plugs and Sockets Example"
+"Event propagation means that, when an event is emitted on a particular "
+"widget, it can be passed to its parent widget (and that widget can pass it "
+"to its parent, and so on) and, if the parent has an event handler, that "
+"handler will be called."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6047(para)
+#: C/index-in.docbook:5593
 msgid ""
-"The following is a simple example of using sockets and plugs. The method of "
-"communication between processes is deliberately kept very simple: The "
-"<classname>Plug</classname> writes its ID out to a text file named "
-"<filename>plug.id</filename> and the process with the socket reads the ID "
-"from this files. In a real program, you may want to use a more sophisticated "
-"method of inter-process communication."
+"Contrary to other events, keyboard events are first sent to the toplevel "
+"window (<classname>Gtk::Window</classname>), where it will be checked for "
+"any keyboard shortcuts that may be set (accelerator keys and mnemonics, used "
+"for selecting menu items from the keyboard). After this (and assuming the "
+"event wasn't handled), it is sent to the widget which has focus, and the "
+"propagation begins from there."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6056(para)
+#: C/index-in.docbook:5601
 msgid ""
-"This example creates two executable programs: <filename>socket</filename> "
-"and <filename>plug</filename>. The idea is that <filename>socket</filename> "
-"has an application window that will embed a widget from the <filename>plug</"
-"filename> program. The way this example is designed, <filename>plug</"
-"filename> must be running first before starting <filename>socket</filename>. "
-"To see the example in action, execute the following commands in order from "
-"within the example directory:"
+"The event will propagate until it reaches the top-level widget, or until you "
+"stop the propagation by returning <literal>true</literal> from an event "
+"handler."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6065(para)
+#: C/index-in.docbook:5606
 msgid ""
-"Start the <filename>plug</filename> program and send it to the background "
-"(or just use a different terminal)."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:6069(screen)
-#, no-wrap
-msgid "$ ./plug &amp;"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:6070(para)
-msgid "After which you should see something like the following:"
+"Notice, that after canceling an event, no other function will be called "
+"(even if it is from the same widget)."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6073(screen)
-#, no-wrap
-msgid "The window ID is: 69206019"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:6074(para)
-msgid "Then start the <filename>socket</filename> program:"
+#: C/index-in.docbook:5613
+msgid ""
+"In this example there are three event handlers that are called after "
+"<classname>Gtk::Window</classname>'s default event handler, one in the "
+"<classname>Gtk::Entry</classname>, one in the <classname>Gtk::Grid</"
+"classname> and one in the <classname>Gtk::Window</classname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6075(screen)
-#, no-wrap
-msgid "$ ./socket"
+#: C/index-in.docbook:5619
+msgid ""
+"In the <classname>Gtk::Window</classname>, we have also the default handler "
+"overridden (<methodname>on_key_release_event()</methodname>), and another "
+"handler being called before the default handler "
+"(<methodname>windowKeyReleaseBefore()</methodname>)."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6076(para)
+#: C/index-in.docbook:5625
 msgid ""
-"After starting <filename>socket</filename>, you should see the following "
-"output in the terminal:"
+"The purpose of this example is to show the steps the event takes when it is "
+"emitted."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6080(screen)
-#, no-wrap
+#: C/index-in.docbook:5628
 msgid ""
-"I've been embedded.\n"
-"A plug was added"
+"When you write in the entry, a key release event will be emitted, which will "
+"go first to the toplevel window (<classname>Gtk::Window</classname>), since "
+"we have one event handler set to be called before, that's what is called "
+"first (<methodname>windowKeyReleaseBefore()</methodname>). Then the default "
+"handler is called (which we have overridden), and after that the event is "
+"sent to the widget that has focus, the <classname>Entry</classname> in our "
+"example and, depending on whether we let it propagate, it can reach the "
+"<classname>Grid</classname>'s and the <classname>Window</classname>'s event "
+"handlers. If it propagates, the text you're writing will appear in the "
+"<classname>Label</classname> above the <classname>Entry</classname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6082(para)
-msgid ""
-"The first line of output is from <filename>plug</filename>, after it has "
-"been notified that it has been embedded inside of a <classname>Socket</"
-"classname>. The second line was emitted by <filename>socket</filename> in "
-"response to its <methodname>plug_added</methodname> signal. If everything "
-"was done as described above, the <filename>socket</filename> window should "
-"look roughly like the following:"
+#: C/index-in.docbook:5643
+msgid "Keyboard Events - Event Propagation"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6094(para)
+#: C/index-in.docbook:5649
 msgid ""
-"If for some reason the <classname>Socket</classname> couldn't attach the "
-"<classname>Plug</classname>, the window would look something like this:"
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/keyboard_events/propagation/\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6105(title)
+#: C/index-in.docbook:5655
 msgid "Timeouts, I/O and Idle Functions"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6108(title)
+#: C/index-in.docbook:5658
 msgid "Timeouts"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6110(para)
+#: C/index-in.docbook:5660
 msgid ""
 "You may be wondering how to make <application>gtkmm</application> do useful "
-"work while it's idling along (well, sleeping actually) in <methodname>Gtk::"
-"Main::run()</methodname>. Happily, you have several options. Using the "
+"work while it's idling along. Happily, you have several options. Using the "
 "following methods you can create a timeout method that will be called every "
 "few milliseconds."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6118(programlisting)
+#: C/index-in.docbook:5667
 #, no-wrap
 msgid ""
 "\n"
-"sigc::connection Glib::SignalTimeout::connect(const sigc::slot&lt;bool&gt;&amp; slot, unsigned int 
interval, int priority = Glib::PRIORITY_DEFAULT);\n"
+"sigc::connection Glib::SignalTimeout::connect(const sigc::slot&lt;bool()&gt;&amp; slot,\n"
+"                                      unsigned int interval, int priority = Glib::PRIORITY_DEFAULT);\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6123(para)
+#: C/index-in.docbook:5673
 msgid ""
 "The first argument is a <classname>slot</classname> you wish to have called "
 "when the timeout occurs. The second argument is the number of milliseconds "
@@ -7600,45 +7889,51 @@ msgid ""
 "<methodname>disconnect()</methodname> method:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6133(programlisting)
+#: C/index-in.docbook:5683
 #, no-wrap
 msgid ""
 "\n"
 "my_connection.disconnect();\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6145(programlisting)
+#: C/index-in.docbook:5695
 #, no-wrap
 msgid ""
 "\n"
 "bool MyCallback() { std::cout &lt;&lt; \"Hello World!\\n\" &lt;&lt; std::endl; return true; }\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6138(para)
+#: C/index-in.docbook:5688
 msgid ""
 "Another way of destroying the connection is your signal handler. It has to "
-"be of the type <classname>sigc::slot&lt;bool&gt;</classname>. As you see "
+"be of the type <classname>sigc::slot&lt;bool()&gt;</classname>. As you see "
 "from the definition your signal handler has to return a value of the type "
 "<literal>bool</literal>. A definition of a sample method might look like "
-"this: <placeholder-1/>"
+"this: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6151(para)
+#: C/index-in.docbook:5701
 msgid ""
 "You can stop the timeout method by returning <literal>false</literal> from "
 "your signal handler. Therefore, if you want your method to be called "
 "repeatedly, it should return <literal>true</literal>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6157(para)
+#: C/index-in.docbook:5707
 msgid "Here's an example of this technique:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6166(title)
+#: C/index-in.docbook:5711
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/timeout/\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:5716
 msgid "Monitoring I/O"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6168(para)
+#: C/index-in.docbook:5718
 msgid ""
 "A nifty feature of Glib (one of the libraries underlying <application>gtkmm</"
 "application>) is the ability to have it check for data on a file descriptor "
@@ -7646,77 +7941,77 @@ msgid ""
 "following method is used to do this:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6176(programlisting)
+#: C/index-in.docbook:5726
 #, no-wrap
 msgid ""
 "\n"
-"sigc::connection Glib::SignalInput::connect(const sigc::slot&lt;bool,Glib::IOCondition&gt;&amp; slot,\n"
-"                                    int fd, Glib::IOCondition condition,\n"
-"                                    int priority = Glib::PRIORITY_DEFAULT);\n"
+"sigc::connection Glib::SignalIO::connect(const sigc::slot&lt;bool(Glib::IOCondition)&gt;&amp; slot,\n"
+"                                 Glib::PollFD::fd_t fd, Glib::IOCondition condition,\n"
+"                                 int priority = Glib::PRIORITY_DEFAULT);\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6183(para)
+#: C/index-in.docbook:5733
 msgid ""
-"The first argument is a slot you wish to have called when then the specified "
+"The first argument is a slot you wish to have called when the specified "
 "event (see argument 3) occurs on the file descriptor you specify using "
 "argument two. Argument three may be one or more (using <literal>|</literal>) "
 "of:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6193(para)
+#: C/index-in.docbook:5743
 msgid ""
 "Glib::IO_IN - Call your method when there is data ready for reading on your "
 "file descriptor."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6201(para)
+#: C/index-in.docbook:5751
 msgid ""
 "Glib::IO_OUT - Call your method when the file descriptor is ready for "
 "writing."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6209(para)
+#: C/index-in.docbook:5759
 msgid ""
 "Glib::IO_PRI - Call your method when the file descriptor has urgent data to "
 "be read."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6216(para)
+#: C/index-in.docbook:5766
 msgid ""
 "Glib::IO_ERR - Call your method when an error has occurred on the file "
 "descriptor."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6223(para)
+#: C/index-in.docbook:5773
 msgid ""
 "Glib::IO_HUP - Call your method when hung up (the connection has been broken "
 "usually for pipes and sockets)."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6230(para)
+#: C/index-in.docbook:5780
 msgid ""
 "The return value is a <classname>sigc::connection</classname> that may be "
-"used to stop monitoring this file descriptor using its <methodname>disconnect"
-"()</methodname> method. The <parameter>slot</parameter> signal handler "
-"should be declared as follows:"
+"used to stop monitoring this file descriptor using its "
+"<methodname>disconnect()</methodname> method. The <parameter>slot</"
+"parameter> signal handler should be declared as follows:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6237(programlisting)
+#: C/index-in.docbook:5787
 #, no-wrap
 msgid ""
 "\n"
 "bool input_callback(Glib::IOCondition condition);\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6242(para)
+#: C/index-in.docbook:5792
 msgid ""
 "where <parameter>condition</parameter> is as specified above. As usual the "
 "slot is created with <function>sigc::mem_fun()</function> (for a member "
-"method of an object.), or <function>sigc::ptr_fun()</function> (for a "
+"method of an object), or <function>sigc::ptr_fun()</function> (for a "
 "function)."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6249(para)
+#: C/index-in.docbook:5799
 msgid ""
 "A little example follows. To use the example just execute it from a "
 "terminal; it doesn't create a window. It will create a pipe named "
@@ -7726,24 +8021,31 @@ msgid ""
 "&gt; testfifo</literal>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6263(title)
+#: C/index-in.docbook:5808
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/input/\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:5813
 msgid "Idle Functions"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6265(para)
+#: C/index-in.docbook:5815
 msgid ""
 "If you want to specify a method that gets called when nothing else is "
 "happening, use the following:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6270(programlisting)
+#: C/index-in.docbook:5820
 #, no-wrap
 msgid ""
 "\n"
-"sigc::connection  Glib::SignalIdle::connect(const sigc::slot&lt;bool&gt;&amp; slot, int priority = 
Glib::PRIORITY_DEFAULT_IDLE);\n"
+"sigc::connection  Glib::SignalIdle::connect(const sigc::slot&lt;bool()&gt;&amp; slot,\n"
+"                                    int priority = Glib::PRIORITY_DEFAULT_IDLE);\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6275(para)
+#: C/index-in.docbook:5826
 msgid ""
 "This causes <application>gtkmm</application> to call the specified method "
 "whenever nothing else is happening. You can add a priority (lower numbers "
@@ -7753,20 +8055,26 @@ msgid ""
 "signal handler, which should be declared as follows:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6285(programlisting)
+#: C/index-in.docbook:5836
 #, no-wrap
 msgid ""
 "\n"
 "bool idleFunc();\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6290(para)
+#: C/index-in.docbook:5841
 msgid ""
 "Since this is very similar to the methods above this explanation should be "
 "sufficient to understand what's going on. However, here's a little example:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6297(para)
+#: C/index-in.docbook:5846
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/idle/\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:5848
 msgid ""
 "This example points out the difference of idle and timeout methods a little. "
 "If you need methods that are called periodically, and speed is not very "
@@ -7775,21 +8083,21 @@ msgid ""
 "use idle methods."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6305(para)
+#: C/index-in.docbook:5856
 msgid ""
 "Try executing the example and increasing the system load. The upper progress "
 "bar will increase steadily; the lower one will slow down."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6315(title)
+#: C/index-in.docbook:5866
 msgid "Memory management"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6321(title)
+#: C/index-in.docbook:5872
 msgid "Normal C++ memory management"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6323(para)
+#: C/index-in.docbook:5874
 msgid ""
 "<application>gtkmm</application> allows the programmer to control the "
 "lifetime (that is, the construction and destruction) of any widget in the "
@@ -7802,15 +8110,15 @@ msgid ""
 "subset of C++'s memory management features."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6335(para)
+#: C/index-in.docbook:5886
 msgid "Here are some examples of normal C++ memory management:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6338(title)
+#: C/index-in.docbook:5889
 msgid "Class Scope widgets"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6340(para)
+#: C/index-in.docbook:5891
 msgid ""
 "If a programmer does not need dynamic memory allocation, automatic widgets "
 "in class scope may be used. One advantage of automatic widgets in class "
@@ -7818,20 +8126,19 @@ msgid ""
 "not risk memory leaks from failing to <literal>delete</literal> a widget."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6347(para)
+#: C/index-in.docbook:5898
 msgid ""
-"The primary disadvantages of using class scope widgets are revealing the "
-"class implementation rather than the class interface in the class header. "
-"Class scope widgets also require Automatic widgets in class scope suffer the "
-"same disadvantages as any other class scope automatic variable."
+"The primary disadvantage of using class scope widgets is revealing the class "
+"implementation rather than the class interface in the class header."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6355(programlisting)
+#: C/index-in.docbook:5904
 #, no-wrap
 msgid ""
 "\n"
 "#include &lt;gtkmm/button.h&gt;\n"
-"class Foo\n"
+"#include &lt;gtkmm/window.h&gt;\n"
+"class Foo : public Gtk::Window\n"
 "{\n"
 "private:\n"
 "  Gtk::Button theButton;\n"
@@ -7839,11 +8146,11 @@ msgid ""
 "};\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6368(title)
+#: C/index-in.docbook:5918
 msgid "Function scope widgets"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6376(programlisting)
+#: C/index-in.docbook:5924
 #, no-wrap
 msgid ""
 "\n"
@@ -7851,215 +8158,233 @@ msgid ""
 "  Gtk::Button aButton;\n"
 "  aButton.show();\n"
 "  ...\n"
-"  kit.run();\n"
+"  app-&gt;run();\n"
 "}\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6370(para)
+#: C/index-in.docbook:5920
 msgid ""
 "If a programmer does not need a class scope widget, a function scope widget "
 "may also be used. The advantages to function scope over class scope are the "
-"increased data hiding and reduced dependencies. <placeholder-1/>"
+"increased data hiding and reduced dependencies. <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6388(title)
+#: C/index-in.docbook:5936
 msgid "Dynamic allocation with new and delete"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6390(para)
-msgid ""
-"Although, in most cases, the programmer will prefer to allow containers to "
-"automatically destroy their children using <function>manage()</function> "
-"(see below), the programmer is not required to use <function>manage()</"
-"function>. The traditional <literal>new</literal> and <literal>delete</"
-"literal> operators may also be used."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:6400(programlisting)
+#: C/index-in.docbook:5946
 #, no-wrap
 msgid ""
 "\n"
-"Gtk::Button* pButton = new Gtk::Button(\"Test\");\n"
+"auto pButton = new Gtk::Button(\"Test\");\n"
 "\n"
 "// do something useful with pButton\n"
 "\n"
 "delete pButton;\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6398(para)
+#: C/index-in.docbook:5938
 msgid ""
-"<placeholder-1/> Here, the programmer deletes pButton to prevent a memory "
-"leak."
+"Usually, the programmer will prefer to allow containers to automatically "
+"destroy their children by creating them using <function>Gtk::make_managed()</"
+"function> (see below). This is not strictly required, as the <literal>new</"
+"literal> and <literal>delete</literal> operators may also be used, but "
+"modern C++ style discourages those in favour of safer models of memory "
+"management, so it is better to create widgets using <function>Gtk::"
+"make_managed()</function> and let their parent destroy them, than to "
+"manually perform dynamic allocation. <_:programlisting-1/> Here, the "
+"programmer deletes <varname>pButton</varname> to prevent a memory leak."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6415(title)
+#: C/index-in.docbook:5960
 msgid "Managed Widgets"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6417(para)
+#: C/index-in.docbook:5962
 msgid ""
 "Alternatively, you can let a widget's container control when the widget is "
 "destroyed. In most cases, you want a widget to last only as long as the "
 "container it is in. To delegate the management of a widget's lifetime to its "
-"container, first create it with <function>manage()</function> and pack it "
-"into its container with <methodname>add()</methodname>. Now, the widget will "
-"be destroyed whenever its container is destroyed."
+"container, create it with <function>Gtk::make_managed()</function> and then "
+"pack it into its container with <methodname>Gtk::Box::append()</methodname> "
+"or a similar method. Now the widget will be destroyed whenever its container "
+"is destroyed."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6427(title)
-msgid "Dynamic allocation with manage() and add()"
+#: C/index-in.docbook:5972
+msgid "Dynamic allocation with make_managed() and append()"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6429(para)
+#: C/index-in.docbook:5974
 msgid ""
-"<application>gtkmm</application> provides the <function>manage()</function> "
-"function and <methodname>add()</methodname> methods to create and destroy "
-"widgets. Every widget except a top-level window must be added or packed into "
-"a container in order to be displayed. The <function>manage()</function> "
-"function marks a packed widget so that when the widget is added to a "
-"container, the container becomes responsible for deleting the widget."
+"<application>gtkmm</application> provides ways including the "
+"<function>make_managed()</function> function and <methodname>Gtk::Box::"
+"append()</methodname> method to simplify creation and destruction of widgets "
+"whose lifetime can be managed by a parent."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6439(programlisting)
-#, no-wrap
+#: C/index-in.docbook:5980
 msgid ""
-"\n"
-"MyWidget::MyWidget()\n"
-"{\n"
-"  Gtk::Button* pButton = manage(new Gtk::Button(\"Test\"));\n"
-"  add(*pButton); //add aButton to MyWidget\n"
-"}\n"
+"Every widget except a top-level window must be added to a parent container "
+"in order to be displayed. The <function>manage()</function> function marks a "
+"widget so that when that widget is added to a parent container, said "
+"container becomes responsible for deleting the widget, meaning the user no "
+"longer needs to do so. The original way to create widgets whose lifetime is "
+"managed by their parent in this way was to call <function>manage()</"
+"function>, passing in the result of a <literal>new</literal> expression that "
+"created a dynamically allocated widget."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6438(para)
+#: C/index-in.docbook:5990
 msgid ""
-"<placeholder-1/> Now, when objects of type <classname>MyWidget</classname> "
-"are destroyed, the button will also be deleted. It is no longer necessary to "
-"delete pButton to free the button's memory; its deletion has been delegated "
-"to the <classname>MyWidget</classname> object."
+"However, usually, when you create such a widget, you will already know that "
+"its parent container should be responsible for destroying it, In addition, "
+"modern C++ style discourages use of the <literal>new</literal> operator, "
+"which was required when passing a newly created widget to "
+"<function>manage()</function>. Therefore, <application>gtkmm</application> "
+"has added <function>make_managed()</function>, which combines creation and "
+"marking with <function>manage()</function> into a single step. This avoids "
+"you having to write <literal>new</literal>, which is discouraged in modern C+"
+"+ style, and more clearly expresses intent to create a managed widget."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6453(para)
+#: C/index-in.docbook:6002
+#, no-wrap
 msgid ""
-"<application>gtkmm</application> also provides the <methodname>set_manage()</"
-"methodname> method for all widgets. This can be used to generate the same "
-"result as <function>manage()</function>, but is more tedious:"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:6459(para)
-msgid "foo.add( (w=new Gtk::Label(\"Hello\"), w-&gt;set_manage(), &amp;w) );"
+"\n"
+"MyContainer::MyContainer()\n"
+"{\n"
+"  auto pButton = Gtk::make_managed&lt;Gtk::Button&gt;(\"Test\");\n"
+"  append(*pButton); //add *pButton to MyContainer\n"
+"}\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6463(para)
-msgid "is the same as"
+#: C/index-in.docbook:6001
+msgid ""
+"<_:programlisting-1/> Now, when objects of type <classname>MyContainer</"
+"classname> are destroyed, the button will also be deleted. It is no longer "
+"necessary to delete <varname>pButton</varname> to free the button's memory; "
+"its deletion has been delegated to the <classname>MyContainer</classname> "
+"object."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6467(para)
-msgid "foo.add( manage(new Gtk::Label(\"Hello\")) );"
+#: C/index-in.docbook:6015
+msgid ""
+"Note that if you never added the widget to any parent container, or you did "
+"but later <methodname>Gtk::Container::remove()</methodname>d it from said "
+"parent, <application>gtkmm</application> restores the widget’s lifetime "
+"management to whatever state it had before <function>manage()</function> was "
+"called, which typically means that the responsibility for <literal>delete</"
+"literal>ing the widget returns to the user."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6471(para)
+#: C/index-in.docbook:6023
 msgid ""
-"Of course, a top level container will not be added to another container. The "
-"programmer is responsible for destroying the top level container using one "
+"Of course, a top-level container will not be added to another container. The "
+"programmer is responsible for destroying the top-level container using one "
 "of the traditional C++ techniques. For instance, your top-level Window might "
-"just be an instance in your <function>main()</function> function.."
+"just be an instance in your <function>main()</function> function."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6483(title)
+#: C/index-in.docbook:6035
 msgid "Shared resources"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6485(para)
+#: C/index-in.docbook:6037
 msgid ""
-"Some objects, such as <classname>Gdk::Pixmap</classname>s and "
+"Some objects, such as <classname>Gdk::Pixbuf</classname>s and "
 "<classname>Pango::Font</classname>s, are obtained from a shared store. "
 "Therefore you cannot instantiate your own instances. These classes typically "
 "inherit from <classname>Glib::Object</classname>. Rather than requiring you "
 "to reference and unreference these objects, <application>gtkmm</application> "
-"uses the <classname>RefPtr&lt;&gt;</classname> smartpointer."
+"uses the <classname>Glib::RefPtr&lt;&gt;</classname> smartpointer. Cairomm "
+"has its own smartpointer, <classname>Cairo::RefPtr&lt;&gt;</classname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6497(programlisting)
+#: C/index-in.docbook:6050
 #, no-wrap
 msgid ""
 "\n"
-"Glib::RefPtr&lt;Gdk::Bitmap&gt; bitmap = Gdk::Bitmap::create(window, data, width, height);\n"
+"auto pixbuf = Gdk::Pixbuf::create_from_file(filename);\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6494(para)
+#: C/index-in.docbook:6047
 msgid ""
-"Objects such as <classname>Gdk::Bitmap</classname> can only be instantiated "
-"with a <methodname>create()</methodname> function. For instance, "
-"<placeholder-1/>"
+"Objects such as <classname>Gdk::Pixbuf</classname> can only be instantiated "
+"with a <methodname>create()</methodname> function. For instance, <_:"
+"programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6506(programlisting)
+#: C/index-in.docbook:6059
 #, no-wrap
 msgid ""
 "\n"
-"if(bitmap)\n"
+"auto width = 0;\n"
+"if(pixbuf)\n"
 "{\n"
-"  int depth = bitmap-&gt;get_depth().\n"
+"  width = pixbuf-&gt;get_width();\n"
 "}\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6502(para)
+#: C/index-in.docbook:6055
 msgid ""
-"You have no way of getting a bare <classname>Gdk::Bitmap</classname>. In the "
-"example, <varname>bitmap</varname> is a smart pointer, so you can do this, "
-"much like a normal pointer: <placeholder-1/>"
+"You have no way of getting a bare <classname>Gdk::Pixbuf</classname>. In the "
+"example, <varname>pixbuf</varname> is a smart pointer, so you can do this, "
+"much like a normal pointer: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6514(para)
+#: C/index-in.docbook:6068
 msgid ""
-"When <varname>bitmap</varname> goes out of scope an <methodname>unref()</"
+"When <varname>pixbuf</varname> goes out of scope an <methodname>unref()</"
 "methodname> will happen in the background and you don't need to worry about "
 "it anymore. There's no <literal>new</literal> so there's no <literal>delete</"
 "literal>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6522(programlisting)
+#: C/index-in.docbook:6076
 #, no-wrap
 msgid ""
 "\n"
-"Glib::RefPtr&lt;Gdk::Bitmap&gt; bitmap2 = bitmap.\n"
+"auto pixbuf2 = pixbuf;\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6520(para)
+#: C/index-in.docbook:6074
 msgid ""
-"If you copy a <classname>RefPtr</classname>, for instance <placeholder-1/> , "
-"or if you pass it as a method argument or a return type, then "
-"<classname>RefPtr</classname> will do any necessary referencing to ensure "
-"that the instance will not be destroyed until the last <classname>RefPtr</"
-"classname> has gone out of scope."
+"If you copy a <classname>RefPtr</classname>, for instance <_:"
+"programlisting-1/> , or if you pass it as a method argument or a return "
+"type, then <classname>RefPtr</classname> will do any necessary referencing "
+"to ensure that the instance will not be destroyed until the last "
+"<classname>RefPtr</classname> has gone out of scope."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6530(para)
+#: C/index-in.docbook:6084
 msgid ""
 "See the <link linkend=\"chapter-refptr\">appendix</link> for detailed "
 "information about RefPtr."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6535(para)
-msgid "Bjarne Stroustrup, \"The C++ Programming Language\" - section 14.4.2"
+#: C/index-in.docbook:6089
+msgid ""
+"Bjarne Stroustrup, \"The C++ Programming Language\" Forth Edition - section "
+"34.3"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6538(para)
+#: C/index-in.docbook:6092
 msgid "Nicolai M. Josuttis, \"The C++ Standard Library\" - section 4.2"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6531(para)
+#: C/index-in.docbook:6085
 msgid ""
 "If you wish to learn more about smartpointers, you might look in these "
-"books: <placeholder-1/>"
+"books: <_:itemizedlist-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6549(title)
+#: C/index-in.docbook:6103
 msgid "Glade and Gtk::Builder"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6550(para)
+#: C/index-in.docbook:6104
 msgid ""
 "Although you can use C++ code to instantiate and arrange widgets, this can "
 "soon become tedious and repetitive. And it requires a recompilation to show "
@@ -8070,153 +8395,161 @@ msgid ""
 "specifically named widget instances."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6563(simpara)
+#: C/index-in.docbook:6117
 msgid "Less C++ code is required."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6564(simpara)
+#: C/index-in.docbook:6118
 msgid "UI changes can be seen more quickly, so UIs are able to improve."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6565(simpara)
+#: C/index-in.docbook:6119
 msgid "Designers without programming skills can create and edit UIs."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6560(para)
-msgid "This has the following advantages: <placeholder-1/>"
+#: C/index-in.docbook:6114
+msgid "This has the following advantages: <_:orderedlist-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6569(para)
+#: C/index-in.docbook:6123
 msgid ""
 "You still need C++ code to deal with User Interface changes triggered by "
 "user actions, but using <application>Gtk::Builder</application> for the "
 "widget layout allows you to focus on implementing that functionality."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6576(title)
+#: C/index-in.docbook:6130
 msgid "Loading the .glade file"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6581(programlisting)
+#: C/index-in.docbook:6135
 #, no-wrap
 msgid ""
 "\n"
-"Glib::RefPtr&lt;Gtk::Builder&gt; builder = Gtk::Builder::create_from_file(\"basic.glade\");\n"
+"auto builder = Gtk::Builder::create_from_file(\"basic.glade\");\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6577(para)
+#: C/index-in.docbook:6131
 msgid ""
 "<classname>Gtk::Builder</classname> must be used via a <classname>Glib::"
 "RefPtr</classname>. Like all such classes, you need to use a "
-"<methodname>create()</methodname> method to instantiate it. For instance, "
-"<placeholder-1/> This will instantiate the windows defined in the .glade "
-"file, though they will not be shown immediately unless you have specified "
-"that via the <guilabel>Properties</guilabel> window in <application>Glade</"
-"application>."
+"<methodname>create()</methodname> method to instantiate it. For instance, <_:"
+"programlisting-1/> This will instantiate the windows defined in the "
+"<filename>.glade</filename> file."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6590(programlisting)
+#: C/index-in.docbook:6142
 #, no-wrap
 msgid ""
 "\n"
-"Glib::RefPtr&lt;Gtk::Builder&gt; builder = Gtk::Builder::create_from_file(\"basic.glade\", 
\"treeview_products\");\n"
+"auto builder = Gtk::Builder::create_from_file(\"basic.glade\", \"treeview_products\");\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6589(para)
+#: C/index-in.docbook:6141
 msgid ""
 "To instantiate just one window, or just one of the child widgets, you can "
-"specify the name of a widget as the second parameter. For instance, "
-"<placeholder-1/>"
+"specify the name of a widget as the second parameter. For instance, <_:"
+"programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6598(title)
+#: C/index-in.docbook:6150
 msgid "Accessing widgets"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6606(programlisting)
+#: C/index-in.docbook:6158
 #, no-wrap
 msgid ""
 "\n"
-"Gtk::Dialog* pDialog = 0;\n"
-"builder-&gt;get_widget(\"DialogBasic\", pDialog);\n"
+"auto pDialog = builder-&gt;get_widget&lt;Gtk::Dialog&gt;(\"DialogBasic\");\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6600(para)
+#: C/index-in.docbook:6152
 msgid ""
 "To access a widget, for instance to <methodname>show()</methodname> a "
 "dialog, use the <methodname>get_widget()</methodname> method, providing the "
 "widget's name. This name should be specified in the <application>Glade</"
 "application> Properties window. If the widget could not be found, or is of "
-"the wrong type, then the pointer will be set to 0. <placeholder-1/>"
+"the wrong type, then the pointer will be set to nullptr. <_:programlisting-1/"
+">"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6612(para)
+#: C/index-in.docbook:6163
 msgid ""
 "<application>Gtk::Builder</application> checks for a null pointer, and "
 "checks that the widget is of the expected type, and will show warnings on "
 "the command line about these."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6618(para)
+#: C/index-in.docbook:6169
 msgid ""
-"Remember that you are not instantiating a widget with <methodname>get_widget"
-"()</methodname>, you are just obtaining a pointer to one that already "
-"exists. You will always receive a pointer to the same instance when you call "
-"<methodname>get_widget()</methodname> on the same <classname>Gtk::Builder</"
-"classname>, with the same widget name. The widgets are instantiated during "
-"<methodname>Gtk::Builder::create_from_file()</methodname>."
+"Remember that you are not instantiating a widget with "
+"<methodname>get_widget()</methodname>, you are just obtaining a pointer to "
+"one that already exists. You will always receive a pointer to the same "
+"instance when you call <methodname>get_widget()</methodname> on the same "
+"<classname>Gtk::Builder</classname>, with the same widget name. The widgets "
+"are instantiated during <methodname>Gtk::Builder::create_from_file()</"
+"methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6627(para)
+#: C/index-in.docbook:6178
 msgid ""
 "<methodname>get_widget()</methodname> returns child widgets that are "
 "<function>manage()</function>ed (see the <link linkend=\"chapter-memory"
 "\">Memory Management</link> chapter), so they will be deleted when their "
-"parent container is deleted. So, if you get only a child widget from "
-"<application>Gtk::Builder</application>, instead of a whole window, then you "
-"must either put it in a <classname>Container</classname> or delete it. "
-"<classname>Windows</classname> (such as <classname>Dialogs</classname>) "
-"cannot be managed because they have no parent container, so you must delete "
-"them at some point."
+"parent container is deleted. <classname>Windows</classname> (such as "
+"<classname>Dialogs</classname>) cannot be managed because they have no "
+"parent container, so you must delete them at some point. The documentation "
+"of <classname>Gtk::Builder</classname> has more to say about the memory "
+"management of different kinds of objects."
+msgstr ""
+
+#: C/index-in.docbook:6188
+msgid ""
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/classGtk_1_1Builder.";
+"html\">Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6641(para)
+#: C/index-in.docbook:6192
 msgid ""
 "This simple example shows how to load a <application>Glade</application> "
 "file at runtime and access the widgets with <application>Gtk::Builder</"
 "application>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6654(title)
+#: C/index-in.docbook:6197
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/builder/basic\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:6204
 msgid "Using derived widgets"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6655(para)
+#: C/index-in.docbook:6205
 msgid ""
-"You can use <application>Glade</application> to layout your own custom "
-"widgets derived from <application>gtkmm</application> widget classes. This "
-"keeps your code organized and encapsulated. Of course you won't see the "
-"exact appearance and properties of your derived widget in "
-"<application>Glade</application>, but you can specify its location and child "
-"widgets and the properties of its <application>gtkmm</application> base "
-"class."
+"You can use <classname>Gtk::Builder</classname> and <application>Glade</"
+"application> to layout your own custom widgets derived from "
+"<application>gtkmm</application> widget classes. This keeps your code "
+"organized and encapsulated, separating declarative presentation from "
+"business logic, avoiding having most of your source just be setting "
+"properties and packing in containers."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6664(programlisting)
+#: C/index-in.docbook:6214
 #, no-wrap
 msgid ""
 "\n"
-"DerivedDialog* pDialog = 0;\n"
-"builder-&gt;get_widget_derived(\"DialogBasic\", pDialog);\n"
+"auto pDialog = Gtk::Builder::get_widget_derived&lt;DerivedDialog&gt;(builder, \"DialogDerived\");\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6663(para)
+#: C/index-in.docbook:6213
 msgid ""
-"Use <methodname>Gtk::Builder::get_widget_derived()</methodname> like so: "
-"<placeholder-1/>"
+"Use <methodname>Gtk::Builder::get_widget_derived()</methodname> like so: <_:"
+"programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6670(para)
+#: C/index-in.docbook:6219
 msgid ""
 "Your derived class must have a constructor that takes a pointer to the "
 "underlying C type, and the <classname>Gtk::Builder</classname> instance. All "
@@ -8226,7 +8559,7 @@ msgid ""
 "<type>GtkDialog</type>, for instance)."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6680(programlisting)
+#: C/index-in.docbook:6229
 #, no-wrap
 msgid ""
 "\n"
@@ -8236,23 +8569,22 @@ msgid ""
 "}\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6677(para)
+#: C/index-in.docbook:6226
 msgid ""
 "You must call the base class's constructor in the initialization list, "
-"providing the C pointer. For instance, <placeholder-1/>"
+"providing the C pointer. For instance, <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6692(programlisting)
+#: C/index-in.docbook:6241
 #, no-wrap
 msgid ""
 "\n"
 "DerivedDialog::DerivedDialog(BaseObjectType* cobject, const Glib::RefPtr&lt;Gtk::Builder&gt;&amp; 
builder)\n"
 ": Gtk::Dialog(cobject),\n"
 "  m_builder(builder),\n"
-"  m_pButton(0)\n"
-"{\n"
 "  //Get the Glade-instantiated Button, and connect a signal handler:\n"
-"  m_builder-&gt;get_widget(\"quit_button\", m_pButton);\n"
+"  m_pButton(m_builder-&gt;get_widget&lt;Gtk::Button&gt;(\"quit_button\"))\n"
+"{\n"
 "  if(m_pButton)\n"
 "  {\n"
 "    m_pButton-&gt;signal_clicked().connect( sigc::mem_fun(*this, &amp;DerivedDialog::on_button_quit) );\n"
@@ -8260,25 +8592,107 @@ msgid ""
 "}\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6688(para)
+#: C/index-in.docbook:6237
 msgid ""
 "You could then encapsulate the manipulation of the child widgets in the "
 "constructor of the derived class, maybe using <methodname>get_widget()</"
 "methodname> or <methodname>get_widget_derived()</methodname> again. For "
-"instance, <placeholder-1/>"
+"instance, <_:programlisting-1/>"
+msgstr ""
+
+#: C/index-in.docbook:6260
+#, no-wrap
+msgid ""
+"\n"
+"auto pDialog = Gtk::Builder::get_widget_derived&lt;DerivedDialog&gt;(builder, \"DialogDerived\", true);\n"
+msgstr ""
+
+#: C/index-in.docbook:6264
+#, no-wrap
+msgid ""
+"\n"
+"DerivedDialog::DerivedDialog(BaseObjectType* cobject, const Glib::RefPtr&lt;Gtk::Builder&gt;&amp; builder, 
bool warning)\n"
+": Gtk::Dialog(cobject),\n"
+"  m_builder(builder),\n"
+"  m_pButton(m_builder-&gt;get_widget&lt;Gtk::Button&gt;(\"quit_button\"))\n"
+"{\n"
+"  // ....\n"
+"}\n"
+msgstr ""
+
+#: C/index-in.docbook:6256
+msgid ""
+"It's possible to pass additional arguments from "
+"<methodname>get_widget_derived()</methodname> to the constructor of the "
+"derived widget. For instance, this call to <methodname>get_widget_derived()</"
+"methodname> <_:programlisting-1/> can invoke this constructor <_:"
+"programlisting-2/>"
+msgstr ""
+
+#: C/index-in.docbook:6276
+msgid "Gtk::Builder and Glib::Property"
+msgstr ""
+
+#: C/index-in.docbook:6287
+#, no-wrap
+msgid ""
+"\n"
+"DerivedButton::DerivedButton(BaseObjectType* cobject, const Glib::RefPtr&lt;Gtk::Builder&gt;&amp; 
builder)\n"
+": Glib::ObjectBase(\"MyButton\"), // The GType name will be gtkmm__CustomObject_MyButton.\n"
+"  Gtk::Button(cobject),\n"
+"  prop_ustring(*this, \"button-ustring\"),\n"
+"  prop_int(*this, \"button-int\", 10)\n"
+"{\n"
+"  // ....\n"
+"}\n"
+msgstr ""
+
+#: C/index-in.docbook:6277
+msgid ""
+"If your derived widget uses <classname>Glib::Property</classname>, it "
+"becomes slightly more complicated. A derived widget that contains "
+"<classname>Glib::Property</classname> members must be registered with its "
+"own name in the <type>GType</type> system. It must be registered before any "
+"of the <methodname>create_from_*()</methodname> or <methodname>add_from_*()</"
+"methodname> methods are called, meaning that you may have to create an "
+"instance of your derived widget just to have its class registered. Your "
+"derived widget must have a constructor that has the parameters required by "
+"<methodname>get_widget_derived()</methodname> and calls the <classname>Glib::"
+"ObjectBase</classname> constructor to register the <type>GType</type>. <_:"
+"programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6710(para)
+#: C/index-in.docbook:6298
+msgid ""
+"When using <application>gtkmm</application> with a version of "
+"<application>glibmm</application> from 2.62 onwards, it is possible also to "
+"specify properties of derived widgets, declared in C++ using "
+"<application>gtkmm</application>, within <filename>.glade</filename> files "
+"and load/set these using <classname>Gtk::Builder</classname>. See the "
+"documentation of <classname>Gtk::Builder</classname> for more details on how "
+"to achieve this. Glade won’t recognise such properties as-is, but it should "
+"be able to through use of <ulink url=\"https://developer.gnome.org/gladeui/";
+"stable/properties.html\"> property class definitions</ulink> and a catalog "
+"declaring those new properties."
+msgstr ""
+
+#: C/index-in.docbook:6312
 msgid ""
 "This example shows how to load a <application>Glade</application> file at "
-"runtime and access the widgets via a derived class."
+"runtime and access the widgets via derived classes."
+msgstr ""
+
+#: C/index-in.docbook:6316
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/builder/derived\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6723(title)
+#: C/index-in.docbook:6325
 msgid "Internationalization and Localization"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6725(para)
+#: C/index-in.docbook:6327
 msgid ""
 "<application>gtkmm</application> applications can easily support multiple "
 "languages, including non-European languages such as Chinese and right-to-"
@@ -8287,14 +8701,14 @@ msgid ""
 "language at runtime based on the user's environment."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6731(para)
+#: C/index-in.docbook:6333
 msgid ""
 "You might not anticipate the need to support additional languages, but you "
 "can never rule it out. And it's easier to develop the application properly "
 "in the first place rather than retrofitting later."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6737(para)
+#: C/index-in.docbook:6339
 msgid ""
 "The process of writing source code that allows for translation is called "
 "<literal>internationalization</literal>, often abbreviated to <literal>i18n</"
@@ -8303,7 +8717,7 @@ msgid ""
 "based on that source code."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6745(para)
+#: C/index-in.docbook:6347
 msgid ""
 "The main activity in the internationalization process is finding strings "
 "seen by users and marking them for translation. You do not need to do it all "
@@ -8312,19 +8726,19 @@ msgid ""
 "covered."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6753(para)
+#: C/index-in.docbook:6355
 msgid ""
 "String literals should be typed in the source code in English, but "
 "surrounded by a macro. The <application>gettext</application> (or intltool) "
-"utility can then extract the marked strings for tramslation, and substitute "
+"utility can then extract the marked strings for translation, and substitute "
 "the translated text at runtime."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6761(title)
+#: C/index-in.docbook:6363
 msgid "Preparing your project"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6764(para)
+#: C/index-in.docbook:6366
 msgid ""
 "In the instructions below we will assume that you will not be using "
 "<application>gettext</application> directly, but <application>intltool</"
@@ -8333,21 +8747,41 @@ msgid ""
 "which extracts strings from source code, but <application>intltool</"
 "application> can also combine strings from other files, for example from "
 "desktop menu details, and GUI resource files such as <application>Glade</"
-"application> files, into standard <application>gettext</"
-"application><filename>.pot/.po</filename> files."
+"application> files, into standard <application>gettext</application> "
+"<filename>.pot/.po</filename> files."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6775(para)
+#: C/index-in.docbook:6377
 msgid ""
 "We also assume that you are using autotools (e.g. <application>automake</"
 "application> and <application>autoconf</application>) to build your project, "
-"and that you are using <ulink url=\"http://svn.gnome.org/viewcvs/gnome-";
-"common/trunk/autogen.sh?view=markup\"><literal>./autogen.sh</literal> from "
-"<application>gnome-common</application></ulink>, which, among other things, "
-"takes care of some <application>intltool</application> initialization."
+"and that you are using <ulink url=\"https://gitlab.gnome.org/GNOME/gnome-";
+"common/blob/master/autogen.sh\"> <literal>./autogen.sh</literal> from "
+"<application>gnome-common</application></ulink> or a similar "
+"<literal>autogen.sh</literal> file, which, among other things, takes care of "
+"some <application>intltool</application> initialization."
+msgstr ""
+
+#: C/index-in.docbook:6391
+msgid ""
+"An alternative to <application>gnome-common</application>'s <literal>autogen."
+"sh</literal> may look like this:"
+msgstr ""
+
+#: C/index-in.docbook:6395
+#, no-wrap
+msgid ""
+"#! /bin/sh -e\n"
+"test -n \"$srcdir\" || srcdir=`dirname \"$0\"`\n"
+"test -n \"$srcdir\" || srcdir=.\n"
+"\n"
+"autoreconf --force --install --verbose --warnings=all \"$srcdir\"\n"
+"echo \"Running intltoolize --copy --force --automake\"\n"
+"intltoolize --copy --force --automake\n"
+"test -n \"$NOCONFIGURE\" || \"$srcdir/configure\" \"$@\""
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6788(para)
+#: C/index-in.docbook:6404
 msgid ""
 "Create a sub-directory named <literal>po</literal> in your project's root "
 "directory. This directory will eventually contain all of your translations. "
@@ -8357,7 +8791,7 @@ msgid ""
 "that translators can keep track of translation changes."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6798(para)
+#: C/index-in.docbook:6414
 msgid ""
 "<literal>LINGUAS</literal> contains an alphabetically sorted list of codes "
 "identifying the languages for which your program is translated (comment "
@@ -8367,7 +8801,7 @@ msgid ""
 "translations, your <literal>LINGUAS</literal> file would look like this:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6807(programlisting)
+#: C/index-in.docbook:6423
 #, no-wrap
 msgid ""
 "# keep this file sorted alphabetically, one language code per line\n"
@@ -8375,14 +8809,14 @@ msgid ""
 "ja"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6810(para)
+#: C/index-in.docbook:6426
 msgid ""
 "(In addition, you'd have the files <literal>ja.po</literal> and <literal>de."
 "po</literal> in your <literal>po</literal> directory which contain the "
 "German and Japanese translations, respectively.)"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6817(para)
+#: C/index-in.docbook:6433
 msgid ""
 "<literal>POTFILES.in</literal> is a list of paths to all files which contain "
 "strings marked up for translation, starting from the project root directory. "
@@ -8392,14 +8826,14 @@ msgid ""
 "like this:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6826(programlisting)
+#: C/index-in.docbook:6442
 #, no-wrap
 msgid ""
 "src/main.cc\n"
 "src/other.cc"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6829(para)
+#: C/index-in.docbook:6445
 msgid ""
 "If you are using <application>gettext</application> directly, you can only "
 "mark strings for translation if they are in source code file. However, if "
@@ -8412,7 +8846,7 @@ msgid ""
 "filename> files to the list in <literal>POTFILES.in</literal>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6842(para)
+#: C/index-in.docbook:6458
 msgid ""
 "Now that there is a place to put your translations, you need to initialize "
 "<application>intltool</application> and <application>gettext</application>. "
@@ -8420,7 +8854,7 @@ msgid ""
 "'programname' with the name of your program:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6849(programlisting)
+#: C/index-in.docbook:6465
 #, no-wrap
 msgid ""
 "IT_PROG_INTLTOOL([0.35.0])\n"
@@ -8429,27 +8863,36 @@ msgid ""
 "AC_SUBST(GETTEXT_PACKAGE)\n"
 "AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE], [\"$GETTEXT_PACKAGE\"],\n"
 "                   [The domain to use with gettext])\n"
-"AM_GLIB_GNU_GETTEXT\n"
+"AM_GNU_GETTEXT([external])\n"
+"AM_GNU_GETTEXT_VERSION([0.17])\n"
 "\n"
 "PROGRAMNAME_LOCALEDIR=[${datadir}/locale]\n"
 "AC_SUBST(PROGRAMNAME_LOCALEDIR)"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6860(para)
+#: C/index-in.docbook:6477
 msgid ""
 "This <varname>PROGRAMNAME_LOCALEDIR</varname> variable will be used later in "
 "the <literal>Makefile.am</literal> file, to define a macro that will be used "
 "when you initialize <application>gettext</application> in your source code."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6871(para)
+#: C/index-in.docbook:6484
+msgid ""
+"<literal>AM_GLIB_GNU_GETTEXT</literal> has been an alternative to "
+"<literal>AM_GNU_GETTEXT</literal> and <literal>AM_GNU_GETTEXT_VERSION</"
+"literal>, but <literal>AM_GLIB_GNU_GETTEXT</literal> is now deprecated, and "
+"shall not be used in new code."
+msgstr ""
+
+#: C/index-in.docbook:6495
 msgid ""
 "Add <literal>po</literal> to the <literal>SUBDIRS</literal> variable. "
 "Without this, your translations won't get built and installed when you build "
 "the program"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6878(programlisting)
+#: C/index-in.docbook:6502
 #, no-wrap
 msgid ""
 "INTLTOOL_FILES = intltool-extract.in \\\n"
@@ -8457,18 +8900,18 @@ msgid ""
 "                 intltool-update.in"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6876(para)
-msgid "Define <literal>INTLTOOL_FILES</literal> as: <placeholder-1/>"
+#: C/index-in.docbook:6500
+msgid "Define <literal>INTLTOOL_FILES</literal> as: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6884(para)
+#: C/index-in.docbook:6508
 msgid ""
 "Add <literal>INTLTOOL_FILES</literal> to the <literal>EXTRA_DIST</literal> "
 "list of files. This ensures that when you do a <command>make dist</command>, "
-"these commands will be included in the source tarball."
+"these files will be included in the source tarball."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6894(programlisting)
+#: C/index-in.docbook:6518
 #, no-wrap
 msgid ""
 "DISTCLEANFILES = ... intltool-extract \\\n"
@@ -8477,37 +8920,52 @@ msgid ""
 "                 po/.intltool-merge-cache"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6892(para)
-msgid "Update your <literal>DISTCLEANFILES</literal>: <placeholder-1/>"
+#: C/index-in.docbook:6516
+msgid "Update your <literal>DISTCLEANFILES</literal>: <_:programlisting-1/>"
+msgstr ""
+
+#: C/index-in.docbook:6528
+#, no-wrap
+msgid ""
+"desktopdir = $(datadir)/applications\n"
+"desktop_in_files = programname.desktop.in\n"
+"desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)\n"
+"@INTLTOOL_DESKTOP_RULE@"
+msgstr ""
+
+#: C/index-in.docbook:6525
+msgid ""
+"Depending on the types of files that contain translatable strings, add code "
+"such as <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6867(para)
-msgid "In the top-level Makefile.am: <placeholder-1/>"
+#: C/index-in.docbook:6491
+msgid "In the top-level Makefile.am: <_:itemizedlist-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6903(para)
+#: C/index-in.docbook:6537
 msgid ""
 "In your <literal>src/Makefile.am</literal>, update your "
 "<literal>AM_CPPFLAGS</literal> to add the following preprocessor macro "
 "definition:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6908(programlisting)
+#: C/index-in.docbook:6542
 #, no-wrap
 msgid "AM_CPPFLAGS = ... -DPROGRAMNAME_LOCALEDIR=\\\"${PROGRAMNAME_LOCALEDIR}\\\""
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6909(para)
+#: C/index-in.docbook:6543
 msgid ""
 "This macro will be used when you initialize <literal>gettext</literal> in "
 "your source code."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6916(title)
+#: C/index-in.docbook:6550
 msgid "Marking strings for translation"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6918(para)
+#: C/index-in.docbook:6552
 msgid ""
 "String literals should be typed in the source code in English, but they "
 "should be surrounded by a call to the <function>gettext()</function> "
@@ -8515,46 +8973,47 @@ msgid ""
 "translations may be used at runtime instead of the original English strings."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6926(para)
+#: C/index-in.docbook:6560
 msgid ""
 "The <application>GNU gettext</application> package allows you to mark "
 "strings in source code, extract those strings for translation, and use the "
 "translated strings in your application."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6938(programlisting)
+#: C/index-in.docbook:6572
 #, no-wrap
 msgid "display_message(\"Getting ready for i18n.\");"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6940(programlisting)
+#: C/index-in.docbook:6574
 #, no-wrap
 msgid "display_message(_(\"Getting ready for i18n.\"));"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6932(para)
+#: C/index-in.docbook:6566
 msgid ""
 "However, <application>Glib</application> defines <function>gettext()</"
 "function> support macros which are shorter wrappers in an easy-to-use form. "
 "To use these macros, include <literal>&lt;glibmm/i18n.h&gt;</literal>, and "
-"then, for example, substitute: <placeholder-1/> with: <placeholder-2/>"
+"then, for example, substitute: <_:programlisting-1/> with: <_:"
+"programlisting-2/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6951(programlisting)
+#: C/index-in.docbook:6585
 #, no-wrap
 msgid "xgettext -a -o my-strings --omit-header *.cc *.h"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6943(para)
+#: C/index-in.docbook:6577
 msgid ""
 "For reference, it is possible to generate a file which contains all strings "
 "which appear in your code, even if they are not marked for translation, "
 "together with file name and line number references. To generate such a file "
 "named <literal>my-strings</literal>, execute the following command, within "
-"the source code directory: <placeholder-1/>"
+"the source code directory: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6958(programlisting)
+#: C/index-in.docbook:6592
 #, no-wrap
 msgid ""
 "bindtextdomain(GETTEXT_PACKAGE, PROGRAMNAME_LOCALEDIR);\n"
@@ -8562,31 +9021,32 @@ msgid ""
 "textdomain(GETTEXT_PACKAGE);"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6954(para)
+#: C/index-in.docbook:6588
 msgid ""
-"Finally, to let you program use the translation for the current locale, add "
+"Finally, to let your program use the translation for the current locale, add "
 "this code to the beginning of your <filename>main.cc</filename> file, to "
-"initialize gettext. <placeholder-1/>"
+"initialize gettext. <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6964(title)
+#: C/index-in.docbook:6598
 msgid "How gettext works"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6966(para)
+#: C/index-in.docbook:6600
 msgid ""
-"<application>intltool</application> / <application>xgettext</application> "
-"script extracts the strings and puts them in a <filename>mypackage.pot</"
-"filename> file. The translators of your application create their "
-"translations by first copying this <filename>.pot</filename> file to a "
-"<filename>localename.po</filename> file. A locale identifies a language and "
-"an encoding for that language, including date and numerical formats. Later, "
-"when the text in your source code has changed, the <literal>msmerge</"
-"literal> script is used to update the <filename>localename.po</filename> "
+"The <application>intltool-update</application> or <application>xgettext</"
+"application> script extracts the strings and puts them in a "
+"<filename>mypackage.pot</filename> file. The translators of your application "
+"create their translations by first copying this <filename>.pot</filename> "
+"file to a <filename>localename.po</filename> file. A locale identifies a "
+"language and an encoding for that language, including date and numerical "
+"formats. Later, when the text in your source code has changed, the "
+"<application>msgmerge</application> or <application>intltool-update</"
+"application> script is used to update the <filename>localename.po</filename> "
 "files from the regenerated <filename>.pot</filename> file."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6980(para)
+#: C/index-in.docbook:6614
 msgid ""
 "At install time, the <filename>.po</filename> files are converted to a "
 "binary format (with the extension <filename>.mo</filename>) and placed in a "
@@ -8594,7 +9054,7 @@ msgid ""
 "locale/</filename>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6987(para)
+#: C/index-in.docbook:6621
 msgid ""
 "When the application runs, the <application>gettext</application> library "
 "checks the system-wide directory to see if there is a <filename>.mo</"
@@ -8605,24 +9065,24 @@ msgid ""
 "used."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:6999(title)
+#: C/index-in.docbook:6633
 msgid "Testing and adding translations"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7006(programlisting)
+#: C/index-in.docbook:6640
 #, no-wrap
 msgid "intltool-update --pot"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7001(para)
+#: C/index-in.docbook:6635
 msgid ""
 "To convince yourself that you've done well, you may wish to add a "
 "translation for a new locale. In order to do that, go to the <filename>po</"
-"filename> subdirectory of your project and execute the following command: "
-"<placeholder-1/>"
+"filename> subdirectory of your project and execute the following command: <_:"
+"programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7009(para)
+#: C/index-in.docbook:6643
 msgid ""
 "That will create a file named <filename>programname.pot</filename>. Now copy "
 "that file to <filename>languagecode.po</filename>, such as <filename>de.po</"
@@ -8634,7 +9094,7 @@ msgid ""
 "<literal>UTF-8</literal>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7022(para)
+#: C/index-in.docbook:6656
 msgid ""
 "It's possible that certain strings will be marked as <literal>fuzzy</"
 "literal> in the <filename>.po</filename> file. These translations will not "
@@ -8642,49 +9102,57 @@ msgid ""
 "<literal>fuzzy</literal> tag."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7032(title)
+#: C/index-in.docbook:6666
 msgid "Resources"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7041(ulink)
-msgid "Internationalizing GNOME applications"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:7048(ulink)
-msgid "Intltool README"
+#: C/index-in.docbook:6674
+msgid ""
+"<ulink url=\"https://wiki.gnome.org/TranslationProject/DevGuidelines\";> L10N "
+"Guidelines for Developers</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7054(ulink)
-msgid "How to use GNOME CVS as a Translator"
+#: C/index-in.docbook:6681
+msgid ""
+"<ulink url=\"http://bazaar.launchpad.net/~intltool/intltool/trunk/view/head:/";
+"README\">Intltool README</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7060(ulink)
-msgid "gettext manual"
+#: C/index-in.docbook:6687
+msgid ""
+"<ulink url=\"https://wiki.gnome.org/TranslationProject/GitHowTo\";>How to use "
+"Git for GNOME translators</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7066(literal)
-msgid "gtkmm_hello"
+#: C/index-in.docbook:6693
+msgid ""
+"<ulink url=\"http://www.gnu.org/software/gettext/manual/gettext.html";
+"\">gettext manual</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7066(ulink) C/gtkmm-tutorial-in.xml:7072(ulink)
-msgid "<placeholder-1/> example package"
+#: C/index-in.docbook:6699
+msgid ""
+"<ulink url=\"http://ftp.gnome.org/pub/GNOME/sources/gtkmm_hello/";
+"\"><literal>gtkmm_hello</literal> example package</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7072(literal)
-msgid "gnomemm_hello"
+#: C/index-in.docbook:6705
+msgid ""
+"<ulink url=\"http://ftp.gnome.org/pub/GNOME/sources/gnomemm_hello/";
+"\"><literal>gnomemm_hello</literal> example package</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7034(para)
+#: C/index-in.docbook:6668
 msgid ""
 "More information about what lies behind the internationalization and "
-"localization process is presented and demonstrated in: <placeholder-1/>"
+"localization process is presented and demonstrated in: <_:itemizedlist-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7082(title)
+#: C/index-in.docbook:6716
 msgid "Expecting UTF8"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7083(para)
+#: C/index-in.docbook:6717
 msgid ""
 "A properly internationalized application will not make assumptions about the "
 "number of bytes in a character. That means that you shouldn't use pointer "
@@ -8693,7 +9161,7 @@ msgid ""
 "such as <function>strlen()</function> because they make the same assumption."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7090(para)
+#: C/index-in.docbook:6724
 msgid ""
 "However, you probably already avoid bare char* arrays and pointer arithmetic "
 "by using <classname>std::string</classname>, so you just need to start using "
@@ -8702,33 +9170,29 @@ msgid ""
 "classname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7098(title)
+#: C/index-in.docbook:6733
 msgid "Glib::ustring and std::iostreams"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7099(para)
-msgid ""
-"TODO: This section is not clear - it needs to spell things out more clearly "
-"and obviously."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:7115(programlisting)
+#: C/index-in.docbook:6750
 #, no-wrap
 msgid ""
+"std::locale::global(std::locale(\"\")); // Set the global locale to the user's preferred locale.\n"
+"                                      // Usually unnecessary here, because Glib::init()\n"
+"                                      // or Gtk::Application::create() does it for you.\n"
 "std::ostringstream output;\n"
-"output.imbue(std::locale(\"\")); // use the user's locale for this stream\n"
 "output &lt;&lt; percentage &lt;&lt; \" % done\";\n"
 "label-&gt;set_text(Glib::locale_to_utf8(output.str()));"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7100(para)
+#: C/index-in.docbook:6735
 msgid ""
 "Unfortunately, the integration with the standard iostreams is not completely "
 "foolproof. <application>gtkmm</application> converts <classname>Glib::"
-"ustring</classname>s to a locale-specific encoding (which usually is not UTF-"
-"8) if you output them to an <classname>ostream</classname> with "
+"ustring</classname>s to a locale-specific encoding (which usually is not "
+"UTF-8) if you output them to an <classname>ostream</classname> with "
 "<function>operator&lt;&lt;</function>. Likewise, retrieving <classname>Glib::"
-"ustrings</classname> from <classname>istream</classname> with "
+"ustring</classname>s from <classname>istream</classname> with "
 "<function>operator&gt;&gt;</function> causes a conversion in the opposite "
 "direction. But this scheme breaks down if you go through a <classname>std::"
 "string</classname>, e.g. by inputting text from a stream to a "
@@ -8737,43 +9201,43 @@ msgid ""
 "characters and the current locale is not UTF-8 encoded, the result is a "
 "corrupted <classname>Glib::ustring</classname>. You can work around this "
 "with a manual conversion. For instance, to retrieve the <classname>std::"
-"string</classname> from a <classname>ostringstream</classname>: <placeholder-"
-"1/>"
+"string</classname> from a <classname>ostringstream</classname>: <_:"
+"programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7125(title)
+#: C/index-in.docbook:6762
 msgid "Pitfalls"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7127(para)
+#: C/index-in.docbook:6764
 msgid ""
 "There are a few common mistakes that you would discover eventually yourself. "
 "But this section might help you to avoid them."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7130(title)
+#: C/index-in.docbook:6767
 msgid "Same strings, different semantics"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7132(para)
+#: C/index-in.docbook:6769
 msgid ""
-"Sometimes two english strings are identical but have different meanings in "
+"Sometimes two English strings are identical but have different meanings in "
 "different contexts, so they would probably not be identical when translated. "
 "Since the English strings are used as look-up keys, this causes problems."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7136(para)
+#: C/index-in.docbook:6773
 msgid ""
 "In these cases, you should add extra characters to the strings. For "
-"instance, use <literal>\"jumps[noun]\"</literal> and <literal>\"jumps[verb]"
-"\"</literal> instead of just <literal>\"jumps\"</literal>) and strip them "
-"again outside the <function>gettext</function> call. If you add extra "
-"characters you should also add a comment for the translators before the "
-"<function>gettext</function> call. Such comments will be shown in the "
+"instance, use <literal>\"jumps[noun]\"</literal> and <literal>"
+"\"jumps[verb]\"</literal> instead of just <literal>\"jumps\"</literal> and "
+"strip them again outside the <function>gettext</function> call. If you add "
+"extra characters you should also add a comment for the translators before "
+"the <function>gettext</function> call. Such comments will be shown in the "
 "<filename>.po</filename> files. For instance:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7146(programlisting)
+#: C/index-in.docbook:6782
 #, no-wrap
 msgid ""
 "// note to translators: don't translate the \"[noun]\" part - it is\n"
@@ -8781,11 +9245,23 @@ msgid ""
 "text = strip(gettext(\"jumps[noun]\"), \"[noun]\");"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7152(title)
+#: C/index-in.docbook:6786
+msgid ""
+"If you use <application>Glib</application>'s support macros, it's easier. "
+"Use <function>C_()</function> instead of <function>_()</function>. For "
+"instance:"
+msgstr ""
+
+#: C/index-in.docbook:6790
+#, no-wrap
+msgid "GLib::ustring text(C_(\"noun\", \"jumps\"));"
+msgstr ""
+
+#: C/index-in.docbook:6795
 msgid "Composition of strings"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7154(para)
+#: C/index-in.docbook:6797
 msgid ""
 "C programmers use <function>sprintf()</function> to compose and concatenate "
 "strings. C++ favours streams, but unfortunately, this approach makes "
@@ -8794,11 +9270,11 @@ msgid ""
 "the grammar of the language."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7161(para)
+#: C/index-in.docbook:6804
 msgid "For instance, this code would be problematic:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7163(programlisting)
+#: C/index-in.docbook:6806
 #, no-wrap
 msgid ""
 "std::cout &lt;&lt; _(\"Current amount: \") &lt;&lt; amount\n"
@@ -8807,24 +9283,28 @@ msgid ""
 "label.set_text(_(\"Really delete \") + filename + _(\" now?\"));"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7168(para)
+#: C/index-in.docbook:6815
+#, no-wrap
 msgid ""
-"So you should either avoid this situation or revert to the C-style "
-"<function>sprintf()</function>. One possible solution is the <ulink url="
-"\"http://www.cs.auc.dk/~olau/compose/\";>compose library</ulink> which "
-"supports syntax such as:"
+"std::cout &lt;&lt; Glib::ustring::compose(\n"
+"             _(\"Current amount: %1 Future: %2\"), amount, future) &lt;&lt; std::endl;\n"
+"\n"
+"label.set_text(Glib::ustring::compose(_(\"Really delete %1 now?\"), filename));"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7175(programlisting)
-#, no-wrap
-msgid "label.set_text(compose(_(\"Really delete %1 now?\"), filename));"
+#: C/index-in.docbook:6811
+msgid ""
+"So you should either avoid this situation or use <ulink url=\"http://";
+"developer.gnome.org/glibmm/unstable/classGlib_1_1ustring.html"
+"\"><function>Glib::ustring::compose()</function></ulink> which supports "
+"syntax such as: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7179(title)
+#: C/index-in.docbook:6823
 msgid "Assuming the displayed size of strings"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7181(para)
+#: C/index-in.docbook:6825
 msgid ""
 "You never know how much space a string will take on screen when translated. "
 "It might very possibly be twice the size of the original English string. "
@@ -8832,61 +9312,61 @@ msgid ""
 "runtime to the required size."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7185(title)
+#: C/index-in.docbook:6829
 msgid "Unusual words"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7187(para)
+#: C/index-in.docbook:6831
 msgid ""
 "You should avoid cryptic abbreviations, slang, or jargon. They are usually "
 "difficult to translate, and are often difficult for even native speakers to "
 "understand. For instance, prefer \"application\" to \"app\""
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7193(title)
+#: C/index-in.docbook:6837
 msgid "Using non-ASCII characters in strings"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7195(para)
+#: C/index-in.docbook:6839
 msgid ""
 "Currently, <application>gettext</application> does not support non-ASCII "
 "characters (i.e. any characters with a code above 127) in source code. For "
 "instance, you cannot use the copyright sign (©)."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7201(para)
+#: C/index-in.docbook:6845
 msgid ""
 "To work around this, you could write a comment in the source code just "
 "before the string, telling the translators to use the special character if "
-"it is available in their languages. For english, you could then make an "
+"it is available in their languages. For English, you could then make an "
 "American English <filename>en_US.po</filename> translation which used that "
-"special charactger."
+"special character."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7209(title)
+#: C/index-in.docbook:6853
 msgid "Getting help with translations"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7211(para)
+#: C/index-in.docbook:6855
 msgid ""
 "If your program is free software, there is a whole <literal>GNOME</literal> "
-"subproject devoted to helping you make translations, the <ulink url=\"http://";
-"developer.gnome.org/projects/gtp/\"><literal>GNOME</literal> Translation "
-"Project</ulink>."
+"subproject devoted to helping you make translations, the <ulink url="
+"\"https://wiki.gnome.org/TranslationProject/\";><literal>GNOME</literal> "
+"Translation Project</ulink>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7216(para)
+#: C/index-in.docbook:6860
 msgid ""
-"The way it works is that you contact the gnome-i18n mailing list to find out "
-"how the translators can access your <filename>po/</filename> subdirectory, "
-"and to add your project to the big <ulink url=\"http://developer.gnome.org/";
-"projects/gtp/status/\">status tables</ulink>."
+"The way it works is that you upload your source code to a git repository "
+"where translators can access it, then contact the gnome-i18n mailing list "
+"and ask to have your program added to the <ulink url=\"http://l10n.gnome.org/";
+"module/\">list of modules to translate</ulink>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7223(para)
+#: C/index-in.docbook:6865
 msgid ""
 "Then you make sure you update the file <filename>POTFILES.in</filename> in "
-"the <filename>po/</filename> subdirectory (<command>intltool-update -M</"
+"the <filename>po/</filename> subdirectory (<command>intltool-update -m</"
 "command> can help with this) so that the translators always access updated "
 "<filename>myprogram.pot</filename> files, and simply freeze the strings at "
 "least a couple of days before you make a new release, announcing it on gnome-"
@@ -8895,7 +9375,7 @@ msgid ""
 "<filename>languagename.po</filename> files."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7235(para)
+#: C/index-in.docbook:6877
 msgid ""
 "Note that most language teams only consist of 1-3 persons, so if your "
 "program contains a lot of strings, it might last a while before anyone has "
@@ -8905,11 +9385,11 @@ msgid ""
 "being maintained) they may decide to spend their time on some other project."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7247(title) C/gtkmm-tutorial-in.xml:7336(title)
+#: C/index-in.docbook:6889 C/index-in.docbook:6960
 msgid "Custom Widgets"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7249(para)
+#: C/index-in.docbook:6891
 msgid ""
 "<application>gtkmm</application> makes it very easy to derive new widgets by "
 "inheriting from an existing widget class, either by deriving from a "
@@ -8919,128 +9399,92 @@ msgid ""
 "widget from scratch."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7251(title)
+#: C/index-in.docbook:6898
 msgid "Custom Containers"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7254(para)
-msgid ""
-"<methodname>on_size_request()</methodname>: Calculate the minimum height and "
-"width needed by the container."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:7255(para)
+#: C/index-in.docbook:6902
 msgid ""
-"<methodname>on_size_allocate()</methodname>: Position the child widgets, "
-"given the height and width that the container has actually been given."
+"<methodname>get_request_mode_vfunc()</methodname>: Return what <literal>Gtk::"
+"SizeRequestMode</literal> is preferred by the container."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7256(para)
+#: C/index-in.docbook:6903
 msgid ""
-"<methodname>forall_vfunc()</methodname>: Call the same callback for each of "
-"the children."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:7257(para)
-msgid "<methodname>on_add()</methodname>:"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:7258(para)
-msgid "<methodname>on_remove()</methodname>:"
+"<methodname>measure_vfunc()</methodname>: Calculate the minimum and natural "
+"width or height of the container."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7259(para)
+#: C/index-in.docbook:6904
 msgid ""
-"<methodname>child_type_vfunc()</methodname>: Return what type of child can "
-"be added."
+"<methodname>on_size_allocate()</methodname>: Position the child widgets, "
+"given the height and width that the container has actually been given."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7252(para)
+#: C/index-in.docbook:6899
 msgid ""
-"When deriving from <classname>Gtk::Container</classname>, you should "
-"override the following virtual methods: <placeholder-1/>"
+"When deriving a custom container widget directly from <classname>Gtk::"
+"Widget</classname>, you should override the following virtual methods: <_:"
+"itemizedlist-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7263(para)
+#: C/index-in.docbook:6908
 msgid ""
-"The <methodname>on_size_request()</methodname> and "
+"The <methodname>get_request_mode_vfunc()</methodname>, "
+"<methodname>measure_vfunc()</methodname>, and "
 "<methodname>on_size_allocate()</methodname> virtual methods control the "
 "layout of the child widgets. For instance, if your container has 2 child "
-"widgets, with one below the other, your <methodname>on_size_request()</"
-"methodname> might report the maximum of their widths and the sum of their "
-"heights. If you want padding between the child widgets then you would add "
+"widgets, with one below the other, your "
+"<methodname>get_request_mode_vfunc()</methodname> might request height-for-"
+"width layout. Then your <methodname>measure_vfunc()</methodname> might "
+"report the maximum of the widths of the child widgets when asked to report "
+"width, and it might report the sum of their heights when asked to report "
+"height. If you want padding between the child widgets then you would add "
 "that to the width and height too. Your widget's container will use this "
 "result to ensure that your widget gets enough space, and not less. By "
 "examining each widget's parent, and its parent, this logic will eventually "
 "decide the size of the top-level window."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7275(para)
-msgid ""
-"<methodname>on_size_allocate()</methodname>, however, receives the actual "
-"height and width that the parent container has decided to give to your "
-"widget. This might be more than the minimum, for instance if the top-level "
-"window has been expanded. You might choose to ignore the extra space and "
-"leave a blank area, or you might choose to expand your child widgets to fill "
-"the space, or you might choose to expand the padding between your widgets. "
-"Its your container, so you decide. Don't forget to call "
-"<methodname>set_allocation()</methodname> inside your "
-"<methodname>on_size_allocate()</methodname> implementation to actually use "
-"the allocated space that has been offered by the parent container."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:7286(para)
+#: C/index-in.docbook:6925
 msgid ""
-"Unless your container is a top-level window that derives from "
-"<classname>Gtk::Window</classname>, you should also call <methodname>Gtk::"
-"Container::set_flags(Gtk::NO_WINDOW)</methodname> in your constructor. "
-"Otherwise, your container will appear in its own window, regardless of what "
-"container you put it in. And unless your container draws directly onto the "
-"underlying <classname>Gdk::Window</classname>, you should probably call "
-"<methodname>set_redraw_on_allocate(false)</methodname> to improve "
-"performance."
+"You are not guaranteed to get the <literal>Gtk::SizeRequestMode</literal> "
+"that you request. Therefore <methodname>measure_vfunc()</methodname> must "
+"return sensible values for all reasonable values of its input parameters. "
+"For a description of <methodname>measure_vfunc()</methodname>'s parameters "
+"see also the description of <methodname>Gtk::Widget::measure()</methodname>, "
+"which may be better documented than <methodname>measure_vfunc()</methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7296(para)
+#: C/index-in.docbook:6932
 msgid ""
-"By overriding <methodname>forall_vfunc()</methodname> you can allow "
-"applications to operate on all of the container's child widgets. For "
-"instance, <methodname>show_all_children()</methodname> uses this to find all "
-"the child widgets and show them."
+"<methodname>on_size_allocate()</methodname> receives the actual height and "
+"width that the parent container has decided to give to your widget. This "
+"might be more than the minimum, or even more than the natural size, for "
+"instance if the top-level window has been expanded. You might choose to "
+"ignore the extra space and leave a blank area, or you might choose to expand "
+"your child widgets to fill the space, or you might choose to expand the "
+"padding between your widgets. It's your container, so you decide."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7301(para)
-msgid ""
-"Although your container might have its own method to set the child widgets, "
-"you should still provide an implementation for the virtual <methodname>on_add"
-"()</methodname> and <methodname>on_remove()</methodname> methods from the "
-"base class, so that the add() and remove() methods will do something "
-"appropriate if they are called."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:7307(para)
-msgid ""
-"Your implementation of the <methodname>child_type_vfunc()</methodname> "
-"method should report the type of widget that may be added to your container, "
-"if it is not yet full. This is usually <methodname>Gtk::Widget::get_type()</"
-"methodname> to indicate that the container may contain any class derived "
-"from <classname>Gtk::Widget</classname>. If the container may not contain "
-"any more widgets, then this method should return <literal>G_TYPE_NONE</"
-"literal>."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:7319(para)
+#: C/index-in.docbook:6943
 msgid ""
 "This example implements a container with two child widgets, one above the "
 "other. Of course, in this case it would be far simpler just to use a "
-"<classname>Gtk::VBox</classname>."
+"vertical <classname>Gtk::Box</classname> or <classname>Gtk::Grid</classname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7324(title)
+#: C/index-in.docbook:6948
 msgid "Custom Container"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7337(para)
+#: C/index-in.docbook:6954
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/custom/custom_container/\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:6961
 msgid ""
 "By deriving directly from <classname>Gtk::Widget</classname> you can do all "
 "the drawing for your widget directly, instead of just arranging child "
@@ -9048,2572 +9492,4630 @@ msgid ""
 "the label, but does not do this by using other widgets."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7345(para)
-msgid "This example implements a widget which draws a Penrose triangle."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:7348(title)
-msgid "Custom Widget"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:7364(title)
-msgid "Recommended Techniques"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:7366(para)
+#: C/index-in.docbook:6972
 msgid ""
-"This section is simply a gathering of wisdom, general style guidelines and "
-"hints for creating <application>gtkmm</application> applications."
+"<methodname>get_request_mode_vfunc()</methodname>: (optional) Return what "
+"<literal>Gtk::SizeRequestMode</literal> is preferred by the widget."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7370(para)
+#: C/index-in.docbook:6973
 msgid ""
-"Use GNU <application>autoconf</application> and <application>automake</"
-"application>! They are your friends :) <application>Automake</application> "
-"examines C files, determines how they depend on each other, and generates a "
-"<filename>Makefile</filename> so the files can be compiled in the correct "
-"order. <application>Autoconf</application> permits automatic configuration "
-"of software installation, handling a large number of system quirks to "
-"increase portability.."
+"<methodname>measure_vfunc()</methodname>: Calculate the minimum and natural "
+"width or height of the widget."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7380(para)
+#: C/index-in.docbook:6974
 msgid ""
-"Subclass Widgets to better organize your code. You should probably subclass "
-"your main <classname>Window</classname> at least. Then you can make your "
-"child Widgets and signal handlers members of that class."
+"<methodname>on_size_allocate()</methodname>: Position the widget, given the "
+"height and width that it has actually been given."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7385(para)
+#: C/index-in.docbook:6975
 msgid ""
-"Create your own signals instead of passing pointers around. Objects can "
-"communicate with each other via signals and signal handlers. This is much "
-"simpler than objects holding pointers to each other and calling each other's "
-"methods. <application>gtkmm</application>'s classes uses special versions of "
-"<classname>sigc::signal</classname>, but you should use normal "
-"<classname>sigc::signal</classname>s, as described in the "
-"<application>libsigc++</application> documentation."
+"<methodname>on_realize()</methodname>: Associate a <classname>Gdk::Surface</"
+"classname> with the widget."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7394(title)
-msgid "Application Lifetime"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:7395(para)
+#: C/index-in.docbook:6976
 msgid ""
-"Most applications will have only one <classname>Window</classname>, or only "
-"one main window. These applications can use the <methodname>Gtk::Main::run"
-"(Gtk::Window&amp;)</methodname> overload. It shows the window and returns "
-"when the window has been hidden. This might happen when the user closes the "
-"window, or when your code decides to <methodname>hide()</methodname> the "
-"window. You can prevent the user from closing the window (for instance, if "
-"there are unsaved changes) by overriding <methodname>Gtk::Window::"
-"on_delete_event()</methodname>."
+"<methodname>on_unrealize()</methodname>: (optional) Break the association "
+"with the <classname>Gdk::Surface</classname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7403(para)
-msgid "Most of our examples use this technique."
+#: C/index-in.docbook:6977
+msgid "<methodname>on_map()</methodname>: (optional)"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7407(title)
-msgid "Using a <application>gtkmm</application> widget"
+#: C/index-in.docbook:6978
+msgid "<methodname>on_unmap()</methodname>: (optional)"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7409(para)
+#: C/index-in.docbook:6979
 msgid ""
-"Our examples all tend to have the same structure. They follow these steps "
-"for using a <classname>Widget</classname>:"
+"<methodname>snapshot_vfunc()</methodname>: Create a render node, e.g. a "
+"<classname>Cairo::Context</classname> node, and draw on it."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7418(para)
+#: C/index-in.docbook:6967
 msgid ""
-"Declare a variable of the type of <classname>Widget</classname> you wish to "
-"use, generally as member variable of a derived container class. You could "
-"also declare a pointer to the widget type, and then create it with "
-"<literal>new</literal> in your code. Even when using the widget via a "
-"pointer, it's still probably best to make that pointer a member variable of "
-"a container class so that you can access it later."
+"When deriving from <classname>Gtk::Widget</classname>, you should override "
+"the following virtual methods. The methods marked (optional) need not be "
+"overridden in all custom widgets. The base class's methods may be "
+"appropriate. <_:itemizedlist-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7429(para)
+#: C/index-in.docbook:6983
 msgid ""
-"Set the attributes of the widget. If the widget has no default constructor, "
-"then you will need to initialize the widget in the initalizer list of your "
-"container class's constructor."
+"The first 3 methods in the previous table are also overridden in custom "
+"containers. They are briefly described in the <link linkend=\"sec-custom-"
+"containers\">Custom Containers</link> section."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7435(para)
-msgid "Connect any signals you wish to use to the appropriate handlers."
+#: C/index-in.docbook:6989
+msgid "Class Init and Instance Init Functions"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7441(para)
+#: C/index-in.docbook:6991
 msgid ""
-"Pack the widget into a container using the appropriate call, e.g. "
-"<methodname>Gtk::Container::add()</methodname> or <methodname>pack_start()</"
-"methodname>."
+"Some <application>GTK</application> functions, if called at all, must be "
+"called from the class init function. Some other <application>GTK</"
+"application> functions, if called, must be called from the instance init "
+"function. If your custom widget must call any of those functions, you can "
+"derive a class from <classname>Glib::ExtraClassInit</classname> and derive "
+"your custom class from that class. The following example shows how that's "
+"done."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7449(para)
-msgid "Call <methodname>show()</methodname> to display the widget."
+#: C/index-in.docbook:7000
+msgid "Custom Style Information"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7458(para)
+#: C/index-in.docbook:7002
 msgid ""
-"<methodname>Gtk::Widget::show()</methodname> lets <application>gtkmm</"
-"application> know that we have finished setting the attributes of the "
-"widget, and that it is ready to be displayed. You can use <methodname>Gtk::"
-"Widget::hide()</methodname> to make it disappear again. The order in which "
-"you show the widgets is not important, but we do suggest that you show the "
-"top-level window last; this way, the whole window will appear with its "
-"contents already drawn. Otherwise, the user will first see a blank window, "
-"into which the widgets will be gradually drawn."
+"Your widget class, whether it's derived directly from <classname>Gtk::"
+"Widget</classname> or from another widget class, can read some style "
+"information from a CSS (Cascading Style Sheets) file. The users of your "
+"widget, or the users of an application program with your widget, can then "
+"modify the style of your widget without modifying the source code. Useful "
+"classes are <classname>Gtk::StyleContext</classname> and <classname>Gtk::"
+"CssProvider</classname>. With the methods of <classname>Gtk::StyleContext</"
+"classname> you can read the values of your widget's style information. CSS "
+"files are described in the documentation of <application>GTK</application>. "
+"The following example shows a simple use of <methodname>Gtk::StyleContext::"
+"get_padding()</methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7472(title)
-msgid "Contributing"
+#: C/index-in.docbook:7016
+msgid "This example implements a widget which draws Penrose triangles."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7474(para)
-msgid ""
-"This document, like so much other great software out there, was created for "
-"free by volunteers. If you are at all knowledgeable about any aspect of "
-"<application>gtkmm</application> that does not already have documentation, "
-"please consider contributing to this document."
+#: C/index-in.docbook:7019
+msgid "Custom Widget"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7480(para)
+#: C/index-in.docbook:7025
 msgid ""
-"Ideally, we would like you to <ulink url=\"http://www.gtkmm.org/bugs.shtml";
-"\">provide a patch</ulink> to the <filename>docs/tutorial/C/gtkmm-tutorial-"
-"in.xml</filename> file. This file is currently in the <literal>gtkmm-"
-"documentation</literal> module in GNOME git."
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/custom/custom_widget/\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7486(para)
-msgid ""
-"If you do decide to contribute, please post your contribution to the "
-"<application>gtkmm</application> mailing list at <ulink url=\"mailto:gtkmm-";
-"list gnome org\">&lt;gtkmm-list gnome org&gt;</ulink>. Also, be aware that "
-"the entirety of this document is free, and any addition you provide must "
-"also be free. That is, people must be able to use any portion of your "
-"examples in their programs, and copies of this document (including your "
-"contribution) may be distributed freely."
+#: C/index-in.docbook:7033
+msgid "Multi-threaded programs"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7498(title)
-msgid "The RefPtr smartpointer"
+#: C/index-in.docbook:7036
+msgid "The constraints"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7499(para)
+#: C/index-in.docbook:7047
 msgid ""
-"<classname>Glib::RefPtr</classname> is a smartpointer. Specifically, it is a "
-"reference-counting smartpointer. You might be familiar with <literal>std::"
-"auto_ptr&lt;&gt;</literal>, which is also a smartpointer, but <literal>Glib::"
-"RefPtr&lt;&gt;</literal> is much simpler, and more useful. We expect a "
-"future version of the C++ Standard Library to contain a reference-counting "
-"shared smartpointer, and a future version of <application>gtkmm</"
-"application> might possibly use that instead."
+"These interactions arise from the fact that, amongst other things, a class "
+"inheriting from <classname>sigc::trackable</classname> will, via that "
+"inheritance, have a <classname>std::list</classname> object keeping track of "
+"slots created by calls to <function>sigc::mem_fun()</function> representing "
+"any of its non-static methods (more particularly it keeps a list of "
+"callbacks which will null the connected slots on its destruction). Each "
+"<classname>sigc::slot</classname> object also keeps, via <classname>sigc::"
+"slot_rep</classname>, its own <classname>sigc::trackable</classname> object "
+"to track any <classname>sigc::connection</classname> objects which it needs "
+"to inform about its demise, and also has a function to deregister itself "
+"from any <classname>sigc::trackable</classname> on disconnection or "
+"destruction. <classname>sigc::signal</classname> objects also keep lists of "
+"slots, which will be updated by a call to their <methodname>connect()</"
+"methodname> method or calls to any <classname>sigc::connection</classname> "
+"object relating to such a connection."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7509(para)
+#: C/index-in.docbook:7038
 msgid ""
-"A smartpointer acts much like a normal pointer. Here are a few examples."
+"Care is required when writing programs based on <application>gtkmm</"
+"application> using multiple threads of execution, arising from the fact that "
+"<application>libsigc++</application>, and in particular <classname>sigc::"
+"trackable</classname>, are not thread-safe. That's because none of the "
+"complex interactions that occur behind the scenes when using "
+"<application>libsigc++</application> are protected by a mutex or other means "
+"of synchronization. <_:footnote-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7512(title)
-msgid "Copying"
+#: C/index-in.docbook:7071
+msgid "The rules"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7513(para)
+#: C/index-in.docbook:7073
 msgid ""
-"You can copy <classname>RefPtr</classname>s, just like normal pointers. But "
-"unlike normal pointers, you don't need to worry about deleting the "
-"underlying instance."
+"This requires a number of rules to be observed when writing multi-threaded "
+"programs using <application>gtkmm</application>. These are set out below, "
+"but one point to note is that extra care is required when deriving classes "
+"from <classname>sigc::trackable</classname>, because the effects are "
+"unintuitive (see particularly points 4 and 5 below)."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7519(programlisting)
-#, no-wrap
+#: C/index-in.docbook:7084
 msgid ""
-"\n"
-"Glib::RefPtr&lt;Gdk::Bitmap&gt; refBitmap = Gdk::Bitmap::create(window,\n"
-"data, width, height);\n"
-"Glib::RefPtr&lt;Gdk::Bitmap&gt; refBitmap2 = refBitmap;\n"
+"Use <classname>Glib::Dispatcher</classname> to invoke <application>gtkmm</"
+"application> functions from worker threads (this is dealt with in more "
+"detail in the next section)."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7525(para)
+#: C/index-in.docbook:7092
 msgid ""
-"Of course this means that you can store <classname>RefPtrs</classname> in "
-"standard containers, such as <classname>std::vector</classname> or "
-"<classname>std::list</classname>."
+"A <classname>sigc::signal</classname> object should be regarded as owned by "
+"the thread which created it. Only that thread should connect a "
+"<classname>sigc::slot</classname> object to the signal object, and only that "
+"thread should <methodname>emit()</methodname> or call <methodname>operator()"
+"()</methodname> on the signal, or null any connected <classname>sigc::slot</"
+"classname> object. It follows (amongst other things) that any signal object "
+"provided by a <application>gtkmm</application> widget should only be "
+"operated on in the main GUI thread and any object deriving from "
+"<classname>sigc::trackable</classname> having its non-static methods "
+"referenced by slots connected to the signal object should only be destroyed "
+"in that thread."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7530(programlisting)
-#, no-wrap
+#: C/index-in.docbook:7108
 msgid ""
-"\n"
-"std::list&lt; Glib::RefPtr&lt;Gdk::Pixmap&gt; &gt; listPixmaps;\n"
-"Glib::RefPtr&lt;Gdk::Pixmap&gt; refPixmap = Gdk::Pixmap::create(window,\n"
-"width, height, depth);\n"
-"listPixmaps.push_back(refPixmap);\n"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:7539(title)
-msgid "Dereferencing"
+"Any <classname>sigc::connection</classname> object should be regarded as "
+"owned by the thread in which the method returning the <classname>sigc::"
+"connection</classname> object was called. Only that thread should call "
+"<classname>sigc::connection</classname> methods on the object."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7540(para)
+#: C/index-in.docbook:7118
 msgid ""
-"You can dereference a smartpointer with the -&gt; operator, to call the "
-"methods of the underlying instance, just like a normal pointer."
+"A <classname>sigc::slot</classname> object created by a call to "
+"<function>sigc::mem_fun()</function> which references a method of a class "
+"deriving from <classname>sigc::trackable</classname> should never be copied "
+"to another thread, nor destroyed by a different thread than the one which "
+"created it."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7544(programlisting)
-#, no-wrap
+#: C/index-in.docbook:7128
 msgid ""
-"\n"
-"Glib::RefPtr&lt;Gdk::Bitmap&gt; refBitmap = Gdk::Bitmap::create(window,\n"
-"data, width, height);\n"
-"int depth = refBitmap-&gt;get_depth();\n"
+"If a particular class object derives from <classname>sigc::trackable</"
+"classname>, only one thread should create <classname>sigc::slot</classname> "
+"objects representing any of the class's non-static methods by calling "
+"<function>sigc::mem_fun()</function>. The first thread to create such a slot "
+"should be regarded as owning the relevant object for the purpose of creating "
+"further slots referencing <emphasis>any</emphasis> of its non-static methods "
+"using that function, or nulling those slots by disconnecting them or "
+"destroying the trackable object."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7550(para)
+#: C/index-in.docbook:7142
 msgid ""
-"But unlike most smartpointers, you can't use the * operator to access the "
-"underlying instance."
+"Although <application>glib</application> is itself thread-safe, any "
+"<application>glibmm</application> wrappers which use <application>libsigc++</"
+"application> will not be. So for example, only the thread in which a main "
+"loop runs should call <methodname>Glib::SignalIdle::connect()</methodname>, "
+"<methodname>Glib::SignalIO::connect()</methodname>, <methodname>Glib::"
+"SignalTimeout::connect()</methodname>, <methodname>Glib::SignalTimeout::"
+"connect_seconds</methodname> for that main loop, or manipulate any "
+"<classname>sigc::connection</classname> object returned by them."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7554(programlisting)
-#, no-wrap
+#: C/index-in.docbook:7154
 msgid ""
-"\n"
-"Glib::RefPtr&lt;Gdk::Bitmap&gt; refBitmap = Gdk::Bitmap::create(window,\n"
-"data, width, height);\n"
-"Gdk::Bitmap* underlying = *refBitmap; //Syntax error - will not compile.\n"
+"The connect*_once() variants, <methodname>Glib::SignalIdle::connect_once()</"
+"methodname>, <methodname>Glib::SignalTimeout::connect_once()</methodname>, "
+"<methodname>Glib::SignalTimeout::connect_seconds_once()</methodname>, are "
+"thread-safe for any case where the slot is not created by a call to "
+"<function>sigc::mem_fun()</function> which represents a method of a class "
+"deriving from <classname>sigc::trackable</classname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7562(title)
-msgid "Casting"
+#: C/index-in.docbook:7172
+msgid "Using Glib::Dispatcher"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7563(para)
+#: C/index-in.docbook:7174
 msgid ""
-"You can cast <classname>RefPtrs</classname> to base types, just like normal "
-"pointers."
+"The slots connected to <classname>sigc::signal</classname> objects execute "
+"in the thread which calls <methodname>emit()</methodname> or "
+"<methodname>operator()()</methodname> on the signal. <classname>Glib::"
+"Dispatcher</classname> does not behave this way: instead its connected slots "
+"execute in the thread in which the <classname>Glib::Dispatcher</classname> "
+"object was constructed (which must have a glib main loop). If a "
+"<classname>Glib::Dispatcher</classname> object is constructed in the main "
+"GUI thread (which will therefore be the receiver thread), any worker thread "
+"can emit on it and have the connected slots safely execute "
+"<application>gtkmm</application> functions."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7568(programlisting)
-#, no-wrap
+#: C/index-in.docbook:7188
 msgid ""
-"\n"
-"Glib::RefPtr&lt;Gtk::TreeStore&gt; refStore = Gtk::TreeStore::create(columns);\n"
-"Glib::RefPtr&lt;Gtk::TreeModel&gt; refModel = refStore;\n"
+"Some thread safety rules on the use of <classname>Glib::Dispatcher</"
+"classname> still apply. As mentioned, a <classname>Glib::Dispatcher</"
+"classname> object must be constructed in the receiver thread (the thread in "
+"whose main loop it will execute its connected slots). By default this is the "
+"main program thread, although there is a <classname>Glib::Dispatcher</"
+"classname> constructor which can take the <classname>Glib::MainContext</"
+"classname> object of any thread which has a main loop. Only the receiver "
+"thread should call <methodname>connect()</methodname> on the "
+"<classname>Glib::Dispatcher</classname> object, or manipulate any related "
+"<classname>sigc::connection</classname> object, unless additional "
+"synchronization is employed. However, any worker thread can safely emit on "
+"the <classname>Glib::Dispatcher</classname> object without any locking once "
+"the receiver thread has connected the slots, provided that it is constructed "
+"before the worker thread is started (if it is constructed after the thread "
+"has started, additional synchronization will normally be required to ensure "
+"visibility)."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7573(para)
+#: C/index-in.docbook:7208
 msgid ""
-"This means that any method which takes a <type>const Glib::RefPtr&lt;"
-"BaseType&gt;</type> argument can also take a <type>const Glib::RefPtr&lt;"
-"DerivedType&gt;</type>. The cast is implicit, just as it would be for a "
-"normal pointer."
+"Aside from the fact that connected slots always execute in the receiver "
+"thread, <classname>Glib::Dispatcher</classname> objects are similar to "
+"<classname>sigc::signal&lt;void()&gt;</classname> objects. They therefore "
+"cannot pass unbound arguments nor return a value. The best way to pass "
+"unbound arguments is with a thread-safe (asynchronous) queue. At the time of "
+"writing <application>glibmm</application> does not have one, although most "
+"people writing multi-threaded code will have one available to them (they are "
+"relatively easy to write although there are subtleties in combining thread "
+"safety with strong exception safety)."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7577(para)
+#: C/index-in.docbook:7221
 msgid ""
-"You can also cast to a derived type, but the syntax is a little different "
-"than with a normal pointer."
+"A <classname>Glib::Dispatcher</classname> object can be emitted on by the "
+"receiver thread as well as by a worker thread, although this should be done "
+"within reasonable bounds. On unix-like systems <classname>Glib::Dispatcher</"
+"classname> objects share a single common pipe, which could in theory at "
+"least fill up on a very heavily loaded system running a program with a very "
+"large number of <classname>Dispatcher</classname> objects in use. Were the "
+"pipe to fill up before the receiver thread's main loop has had an "
+"opportunity to read from it to empty it, and the receiver thread attempt to "
+"emit and so write to it when it is in that condition, the receiver thread "
+"would block on the write, so deadlocking. Where the receiver thread is to "
+"emit, a normal <classname>sigc::signal&lt;void()&gt;</classname> object "
+"could of course be used instead."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7581(programlisting)
-#, no-wrap
+#: C/index-in.docbook:7241
 msgid ""
-"\n"
-"Glib::RefPtr&lt;Gtk::TreeStore&gt; refStore =\n"
-"Glib::RefPtr&lt;Gtk::TreeStore&gt;::cast_dynamic(refModel);\n"
-"Glib::RefPtr&lt;Gtk::TreeStore&gt; refStore2 =\n"
-"Glib::RefPtr&lt;Gtk::TreeStore&gt;::cast_static(refModel);\n"
+"This is an example program with two threads, one GUI thread, like in all "
+"<application>gtkmm</application> programs, and one worker thread. The worker "
+"thread is created when you press the <literal>Start work</literal> button. "
+"It is deleted when the work is finished, when you press the <literal>Stop "
+"work</literal> button, or when you press the <literal>Quit</literal> button."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7591(title)
-msgid "Checking for null"
+#: C/index-in.docbook:7249
+msgid ""
+"A <classname>Glib::Dispatcher</classname> is used for sending notifications "
+"from the worker thread to the GUI thread. The <classname>ExampleWorker</"
+"classname> class contains data which is accessed by both threads. This data "
+"is protected by a <classname>std::mutex</classname>. Only the GUI thread "
+"updates the GUI."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7592(para)
+#: C/index-in.docbook:7257
 msgid ""
-"Just like normal pointers, you can check whether a <classname>RefPtr</"
-"classname> points to anything."
+"Compiling and linking a multi-threaded program can require special compiler "
+"and linker options. If you use the <application>g++</application> compiler, "
+"add the <literal>-pthread</literal> option. Other compilers may require "
+"other options. If you build with <application>meson</application>, it "
+"handles the multi-threading complications for you, if you add "
+"<function>dependency('threads')</function>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7597(programlisting)
-#, no-wrap
-msgid ""
-"\n"
-"Glib::RefPtr&lt;Gtk::TreeModel&gt; refModel = m_TreeView.get_model();\n"
-"if(refModel)\n"
-"{\n"
-"  int cols_count = refModel-&gt;get_n_columns();\n"
-"  ...\n"
-"}\n"
+#: C/index-in.docbook:7266
+msgid "Multi-Threaded Program"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7606(para)
+#: C/index-in.docbook:7272
 msgid ""
-"But unlike normal pointers, <classname>RefPtr</classname>s are automatically "
-"initialized to null so you don't need to remember to do that yourself."
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/multithread\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7613(title)
-msgid "Constness"
+#: C/index-in.docbook:7279
+msgid "Recommended Techniques"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7614(para)
+#: C/index-in.docbook:7281
 msgid ""
-"The use of the <literal>const</literal> keyword in C++ is not always clear. "
-"You might not realise that <type>const Something*</type> declares a pointer "
-"to a <type>const Something</type>, The pointer can be changed, but not the "
-"<type>Something</type> that it points to."
+"This section is simply a gathering of wisdom, general style guidelines and "
+"hints for creating <application>gtkmm</application> applications."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7620(para)
+#: C/index-in.docbook:7285
 msgid ""
-"Therefore, the <classname>RefPtr</classname> equivalent of <type>Something*</"
-"type> for a method parameter is <type>const Glib::RefPtr&lt;Something&gt;"
-"&amp;</type>, and the equivalent of <type>const Something*</type> is "
-"<type>const Glib::RefPtr&lt;const Something&gt;&amp;</type>."
+"Use GNU <application>autoconf</application> and <application>automake</"
+"application>! They are your friends :) <application>Automake</application> "
+"examines C files, determines how they depend on each other, and generates a "
+"<filename>Makefile</filename> so the files can be compiled in the correct "
+"order. <application>Autoconf</application> permits automatic configuration "
+"of software installation, handling a large number of system quirks to "
+"increase portability."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7627(para)
+#: C/index-in.docbook:7295
 msgid ""
-"The <literal>const ... &amp;</literal> around both is just for efficiency, "
-"like using <classname>const std::string&amp;</classname> instead of "
-"<classname>std::string</classname> for a method parameter to avoid "
-"unnecessary copying."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:7642(title)
-msgid "Connecting signal handlers"
+"Subclass Widgets to better organize your code. You should probably subclass "
+"your main <classname>Window</classname> at least. Then you can make your "
+"child Widgets and signal handlers members of that class."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7643(para)
+#: C/index-in.docbook:7300
 msgid ""
-"<application>gtkmm</application> widget classes have signal accessor "
-"methods, such as <methodname>Gtk::Button::signal_clicked()</methodname>, "
-"which allow you to connect your signal handler. Thanks to the flexibility of "
-"<application>libsigc++</application>, the callback library used by "
-"<application>gtkmm</application>, the signal handler can be almost any kind "
-"of function, but you will probably want to use a class method. Among "
-"<application>GTK+</application> C coders, these signal handlers are often "
-"named callbacks."
+"Create your own signals instead of passing pointers around. Objects can "
+"communicate with each other via signals and signal handlers. This is much "
+"simpler than objects holding pointers to each other and calling each other's "
+"methods. <application>gtkmm</application>'s classes uses special versions of "
+"<classname>sigc::signal</classname>, but you should use normal "
+"<classname>sigc::signal</classname>s, as described in the "
+"<application>libsigc++</application> documentation."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7653(para)
-msgid "Here's an example of a signal handler being connected to a signal:"
+#: C/index-in.docbook:7309
+msgid "Application Lifetime"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7658(programlisting)
-#, no-wrap
+#: C/index-in.docbook:7310
 msgid ""
-"\n"
-"#include &lt;gtkmm/button.h&gt;\n"
-"\n"
-"void on_button_clicked()\n"
-"{\n"
-"    std::cout &lt;&lt; \"Hello World\" &lt;&lt; std::endl;\n"
-"}\n"
-"\n"
-"main()\n"
-"{\n"
-"    Gtk::Button button(\"Hello World\");\n"
-"    button.signal_clicked().connect(sigc::ptr_fun(&amp;on_button_clicked));\n"
-"}\n"
+"Most applications will have only one <classname>Window</classname>, or only "
+"one main window. These applications can use the <methodname>Gtk::"
+"Application::run(Gtk::Window&amp; window)</methodname> or <methodname>Gtk::"
+"Application::run(Gtk::Window&amp; window, int argc, char** argv)</"
+"methodname> overloads. They show the window and return when the window has "
+"been hidden. This might happen when the user closes the window, or when your "
+"code decides to <methodname>hide()</methodname> the window. You can prevent "
+"the user from closing the window (for instance, if there are unsaved "
+"changes) by overriding <methodname>Gtk::Window::on_delete_event()</"
+"methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7674(para)
-msgid ""
-"There's rather a lot to think about in this (non-functional) code. First "
-"let's identify the parties involved:"
+#: C/index-in.docbook:7319
+msgid "Most of our examples use this technique."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7682(para)
-msgid "The signal handler is <methodname>on_button_clicked()</methodname>."
+#: C/index-in.docbook:7323
+msgid "Using a <application>gtkmm</application> widget"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7688(para)
+#: C/index-in.docbook:7325
 msgid ""
-"We're hooking it up to the <classname>Gtk::Button</classname> object called "
-"<varname>button</varname>."
+"Our examples all tend to have the same structure. They follow these steps "
+"for using a <classname>Widget</classname>:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7695(para)
+#: C/index-in.docbook:7334
 msgid ""
-"When the Button emits its <literal>clicked</literal> signal, "
-"<methodname>on_button_clicked()</methodname> will be called."
+"Declare a variable of the type of <classname>Widget</classname> you wish to "
+"use, generally as member variable of a derived container class. You could "
+"also declare a pointer to the widget type, and then create it with "
+"<literal>new</literal> in your code. Even when using the widget via a "
+"pointer, it's still probably best to make that pointer a member variable of "
+"a container class so that you can access it later."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7703(para)
-msgid "Now let's look at the connection again:"
+#: C/index-in.docbook:7345
+msgid ""
+"Set the attributes of the widget. If the widget has no default constructor, "
+"then you will need to initialize the widget in the initalizer list of your "
+"container class's constructor."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7708(programlisting)
-#, no-wrap
-msgid ""
-"\n"
-"    ...\n"
-"    button.signal_clicked().connect(sigc::ptr_fun(&amp;on_button_clicked));\n"
-"    ...\n"
+#: C/index-in.docbook:7351
+msgid "Connect any signals you wish to use to the appropriate handlers."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7715(para)
+#: C/index-in.docbook:7357
 msgid ""
-"Note that we don't pass a pointer to <methodname>on_button_clicked()</"
-"methodname> directly to the signal's <methodname>connect()</methodname> "
-"method. Instead, we call <function>sigc::ptr_fun()</function>, and pass the "
-"result to <methodname>connect()</methodname>."
+"Pack the widget into a container using the appropriate call, e.g. "
+"<methodname>Gtk::Box::append()</methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7722(para)
+#: C/index-in.docbook:7367
 msgid ""
-"<function>sigc::ptr_fun()</function> generates a <classname>sigc::slot</"
-"classname>. A slot is an object which looks and feels like a function, but "
-"is actually an object. These are also known as function objects, or "
-"functors. <function>sigc::ptr_fun()</function> generates a slot for a "
-"standalone function or static method. <function>sigc::mem_fun()</function> "
-"generates a slot for a member method of a particular instance."
+"If you don't want all widgets to be shown, call <methodname>Gtk::Widget::"
+"hide()</methodname> on the widgets that you don't want to show. If a "
+"container widget is hidden, all of its child widgets are also hidden, even "
+"if <methodname>hide()</methodname> is not called on the child widgets."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7731(para)
-msgid "Here's a slightly larger example of slots in action:"
+#: C/index-in.docbook:7378
+msgid "Building applications"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7736(programlisting)
-#, no-wrap
+#: C/index-in.docbook:7380
 msgid ""
-"\n"
-"void on_button_clicked();\n"
-"\n"
-"class some_class\n"
-"{\n"
-"    void on_button_clicked();\n"
-"};\n"
-"\n"
-"some_class some_object;\n"
-"\n"
-"main()\n"
-"{\n"
-"    Gtk::Button button;\n"
-"    button.signal_clicked().connect( sigc::ptr_fun(&amp;on_button_clicked) );\n"
-"    button.signal_clicked().connect( sigc::mem_fun(some_object, &amp;some_class::on_button_clicked) );\n"
-"}\n"
+"This chapter is similar to the \"Building applications\" chapter in the "
+"<ulink url=\"https://developer.gnome.org/gtk4/unstable/\";>GTK4 Reference "
+"Manual</ulink>. The same application is built, but <application>gtkmm</"
+"application> is used instead of <application>GTK</application>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7755(para)
-msgid ""
-"The first call to <methodname>connect()</methodname> is just like the one we "
-"saw last time; nothing new here."
+#: C/index-in.docbook:7389
+msgid "The binary file"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7758(para)
-msgid ""
-"The next is more interesting. <function>sigc::mem_fun()</function> is called "
-"with two arguments. The first argument is <parameter>some_object</"
-"parameter>, which is the object that our new slot will be pointing at. The "
-"second argument is a pointer to one of its methods. This particular version "
-"of <function>sigc::mem_fun()</function> creates a slot which will, when "
-"\"called\", call the pointed-to method of the specified object, in this case "
-"<methodname>some_object.on_button_clicked()</methodname>."
+#: C/index-in.docbook:7390
+msgid "This gets installed in <filename>/usr/bin</filename>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7768(para)
-msgid ""
-"Another thing to note about this example is that we made the call to "
-"<methodname>connect()</methodname> twice for the same signal object. This is "
-"perfectly fine - when the button is clicked, both signal handlers will be "
-"called."
+#: C/index-in.docbook:7393
+msgid "A desktop file"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7775(para)
+#: C/index-in.docbook:7394
 msgid ""
-"We just told you that the button's <literal>clicked</literal> signal is "
-"expecting to call a method with no arguments. All signals have requirements "
-"like this - you can't hook a function with two arguments to a signal "
-"expecting none (unless you use an adapter, such as <function>sigc::bind()</"
-"function>, of course). Therefore, it's important to know what type of signal "
-"handler you'll be expected to connect to a given signal."
+"The desktop file provides important information about the application to the "
+"desktop shell, such as its name, icon, D-Bus name, commandline to launch it, "
+"etc. It is installed in <filename>/usr/share/applications</filename>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7787(title)
-msgid "Writing signal handlers"
+#: C/index-in.docbook:7399
+msgid "An icon"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7789(para)
+#: C/index-in.docbook:7400
 msgid ""
-"To find out what type of signal handler you can connect to a signal, you can "
-"look it up in the reference documentation or the header file. Here's an "
-"example of a signal declaration you might see in the <application>gtkmm</"
-"application> headers:"
+"The icon gets installed in <filename>/usr/share/icons/hicolor/48x48/apps</"
+"filename>, where it will be found regardless of the current theme."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7796(programlisting)
-#, no-wrap
-msgid ""
-"\n"
-"Glib::SignalProxy1&lt;bool, Gtk::DirectionType&gt; signal_focus()\n"
+#: C/index-in.docbook:7404
+msgid "A settings schema"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7801(para)
+#: C/index-in.docbook:7405
 msgid ""
-"Other than the signal's name (<literal>focus</literal>), two things are "
-"important to note here: the number following the word "
-"<classname>SignalProxy</classname> at the beginning (1, in this case), and "
-"the types in the list (<type>bool</type> and <type>Gtk::DirectionType</"
-"type>). The number indicates how many arguments the signal handler should "
-"have; the first type, <type>bool</type>, is the type that the signal handler "
-"should return; and the next type, <type>Gtk::DirectionType</type>, is the "
-"type of this signal's first, and only, argument. By looking at the reference "
-"documentation, you can see the names of the arguments too."
+"If the application uses <classname>Gio::Settings</classname>, it will "
+"install its schema in <filename>/usr/share/glib-2.0/schemas</filename>, so "
+"that tools like dconf-editor can find it."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7813(para)
-msgid ""
-"The same principles apply for signals which have more arguments. Here's one "
-"with three (taken from <filename>&lt;gtkmm/editable.h&gt;</filename>):"
+#: C/index-in.docbook:7410
+msgid "Other resources"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7819(programlisting)
-#, no-wrap
+#: C/index-in.docbook:7411
 msgid ""
-"\n"
-"Glib::SignalProxy3&lt;void, const Glib::ustring&amp;, int, int*&gt; signal_insert_text()\n"
-"\n"
+"Other files, such as <classname>Gtk::Builder</classname> ui files, are best "
+"loaded from resources stored in the application binary itself. This "
+"eliminates the need for most of the files that would traditionally be "
+"installed in an application-specific location in <filename>/usr/share</"
+"filename>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7825(para)
-msgid ""
-"It follows the same form. The number 3 at the end of the type's name "
-"indicates that our signal handler will need three arguments. The first type "
-"in the type list is <type>void</type>, so that should be our signal "
-"handler's return type. The following three types are the argument types, in "
-"order. Our signal handler's prototype could look like this:"
+#: C/index-in.docbook:7385
+msgid "An application consists of a number of files: <_:variablelist-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7834(programlisting)
-#, no-wrap
+#: C/index-in.docbook:7419
 msgid ""
-"\n"
-"void on_insert_text(const Glib::ustring&amp; text, int length, int* position);\n"
+"<application>gtkmm</application> includes application support that is built "
+"on top of <classname>Gio::Application</classname>. In this chapter we'll "
+"build a simple application by starting from scratch, adding more and more "
+"pieces over time. Along the way, we'll learn about <classname>Gtk::"
+"Application</classname>, <classname>Gtk::Builder</classname>, resources, "
+"menus, settings, <classname>Gtk::HeaderBar</classname>, <classname>Gtk::"
+"Stack</classname>, <classname>Gtk::SearchBar</classname>, <classname>Gtk::"
+"ListBox</classname>, and more."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7841(title)
-msgid "Disconnecting signal handlers"
+#: C/index-in.docbook:7428
+msgid ""
+"The full, buildable sources for these examples can be found in the "
+"<filename>examples/book/buildapp</filename> directory of the "
+"<application>gtkmm-documentation</application> source distribution, or "
+"online in the <ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-";
+"documentation/tree/master/examples/book/buildapp\"><application>gtkmm-"
+"documentation</application> git repository</ulink>. You can build each "
+"example separately by using <command>meson</command> and <command>ninja</"
+"command> with the <filename>meson.build</filename> file or by using "
+"<command>make</command> with the <filename>Makefile.example</filename> file. "
+"For more information, see the <filename>README</filename> included in the "
+"<filename>buildapp</filename> directory."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7843(para)
-msgid ""
-"Let's take another look at a Signal's <literal>connect</literal> method:"
+#: C/index-in.docbook:7441 C/index-in.docbook:7485
+msgid "A trivial application"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7848(programlisting)
-#, no-wrap
+#: C/index-in.docbook:7443
 msgid ""
-"\n"
-"sigc::signal&lt;void,int&gt;::iterator signal&lt;void,int&gt;::connect( const 
sigc::slot&lt;void,int&gt;&amp; );\n"
+"When using <classname>Gtk::Application</classname>, the <function>main()</"
+"function> function can be very simple. We just call <methodname>Gtk::"
+"Application::run()</methodname> on an instance of our application class."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7853(para)
+#: C/index-in.docbook:7449
 msgid ""
-"Notice that the return value is of type <classname>sigc::signal&lt;void,"
-"int&gt;::iterator</classname>. This can be implicitely converted into a "
-"<classname>sigc::connection</classname> which in turn can be used to control "
-"the connection. By keeping a connection object you can disconnect its "
-"associated signal handler using the method <methodname>sigc::connection::"
-"disconnect()</methodname>."
+"All the application logic is in the application class, which is a subclass "
+"of <classname>Gtk::Application</classname>. Our example does not yet have "
+"any interesting functionality. All it does is open a window when it is "
+"activated without arguments, and open the files it is given, if it is "
+"started with arguments. (Or rather, our application class tries to open the "
+"files, but our subclassed application window does not yet do what it's told "
+"to do.)"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7864(title)
-msgid "Overriding default signal handlers"
+#: C/index-in.docbook:7458
+msgid ""
+"To handle these two cases, we override <methodname>signal_activate()</"
+"methodname>'s default handler, which gets called when the application is "
+"launched without commandline arguments, and <methodname>signal_open()</"
+"methodname>'s default handler, which gets called when the application is "
+"launched with commandline arguments."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7866(para)
+#: C/index-in.docbook:7465
 msgid ""
-"So far we've told you to perform actions in response to button-presses and "
-"the like by handling signals. That's certainly a good way to do things, but "
-"it's not the only way."
+"<ulink url=\"http://developer.gnome.org/glibmm/unstable/";
+"classGio_1_1Application.html\">Gio::Application Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7873(para)
+#: C/index-in.docbook:7466
 msgid ""
-"Instead of laboriously connecting signal handlers to signals, you can simply "
-"make a new class which inherits from a widget - say, a Button - and then "
-"override the default signal handler, such as Button::on_clicked(). This can "
-"be a lot simpler than hooking up signal handlers for everything."
+"<ulink url=\"http://developer.gnome.org/gtkmm/unstable/";
+"classGtk_1_1Application.html\">Gtk::Application Reference</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7880(para)
+#: C/index-in.docbook:7468
 msgid ""
-"Subclassing isn't always the best way to accomplish things. It is only "
-"useful when you want the widget to handle its own signal by itself. If you "
-"want some other class to handle the signal then you'll need to connect a "
-"separate handler. This is even more true if you want several objects to "
-"handle the same signal, or if you want one signal handler to respond to the "
-"same signal from different objects."
+"Another important class that is part of the application support in "
+"<application>gtkmm</application> is <classname>Gtk::ApplicationWindow</"
+"classname>. It is typically subclassed as well. Our subclass does not do "
+"anything yet, so we will just get an empty window."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7885(para)
+#: C/index-in.docbook:7474
 msgid ""
-"<application>gtkmm</application> classes are designed with overriding in "
-"mind; they contain virtual member methods specifically intended to be "
-"overridden."
+"As part of the initial setup of our application, we also create an icon and "
+"a desktop file. Note that @bindir@ in the desktop file needs to be replaced "
+"with the actual path to the binary before this desktop file can be used."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7890(para)
-msgid "Let's look at an example of overriding:"
+#: C/index-in.docbook:7480
+msgid "Here is what we've achieved so far:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7895(programlisting)
-#, no-wrap
+#: C/index-in.docbook:7491
 msgid ""
-"\n"
-"#include &lt;gtkmm/button.h&gt;\n"
-"\n"
-"class OverriddenButton : public Gtk::Button\n"
-"{\n"
-"protected:\n"
-"    virtual void on_clicked();\n"
-"}\n"
-"\n"
-"void OverriddenButton::on_clicked()\n"
-"{\n"
-"    std::cout &lt;&lt; \"Hello World\" &lt;&lt; std::endl;\n"
-"\n"
-"    // call the base class's version of the method:\n"
-"    Gtk::Button::on_clicked();\n"
-"}\n"
+"This does not look very impressive yet, but our application is already "
+"presenting itself on the session bus, it has single-instance semantics, and "
+"it accepts files as commandline arguments."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7914(para)
+#: C/index-in.docbook:7496
 msgid ""
-"Here we define a new class called <classname>OverriddenButton</classname>, "
-"which inherits from <classname>Gtk::Button</classname>. The only thing we "
-"change is the <methodname>on_clicked()</methodname> method, which is called "
-"whenever <classname>Gtk::Button</classname> emits the <literal>clicked</"
-"literal> signal. This method prints \"Hello World\" to <literal>stdout</"
-"literal>, and then calls the original, overridden method, to let "
-"<classname>Gtk::Button</classname> do what it would have done had we not "
-"overridden."
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/buildapp/step1\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:7501 C/index-in.docbook:7544
+msgid "Populating the window"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7925(para)
+#: C/index-in.docbook:7503
 msgid ""
-"You don't always need to call the parent's method; there are times when you "
-"might not want to. Note that we called the parent method <emphasis>after</"
-"emphasis> writing \"Hello World\", but we could have called it before. In "
-"this simple example, it hardly matters much, but there are times when it "
-"will. With signals, it's not quite so easy to change details like this, and "
-"you can do something here which you can't do at all with connected signal "
-"handlers: you can call the parent method in the <emphasis>middle</emphasis> "
-"of your custom code."
+"In this step, we use a <classname>Gtk::Builder</classname> instance to "
+"associate a <classname>Gtk::Builder</classname> ui file with our application "
+"window class."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7939(title)
-msgid "Binding extra arguments"
+#: C/index-in.docbook:7508
+msgid ""
+"Our simple ui file gives the window a title, and puts a <classname>Gtk::"
+"Stack</classname> widget as the main content."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7947(programlisting)
-#, no-wrap
+#: C/index-in.docbook:7513
 msgid ""
-"\n"
-"m_button1.signal_clicked().connect( sigc::bind&lt;Glib::ustring&gt;( sigc::mem_fun(*this, 
&amp;HelloWorld::on_button_clicked), \"button 1\") );\n"
+"To make use of this file in our application, we revisit our <classname>Gtk::"
+"ApplicationWindow</classname> subclass, and call <methodname>Gtk::Builder::"
+"create_from_resource()</methodname> and <methodname>Gtk::Builder::"
+"get_widget_derived()</methodname> from the <methodname>ExampleAppWindow::"
+"create()</methodname> method to get an instance of our subclassed "
+"<classname>Gtk::ApplicationWindow</classname>. See the <link linkend=\"sec-"
+"builder-using-derived-widgets\">Using derived widgets</link> section for "
+"more information about <methodname>get_widget_derived()</methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7954(programlisting)
+#: C/index-in.docbook:7532
 #, no-wrap
-msgid ""
-"\n"
-"virtual void on_button_clicked(Glib::ustring data);\n"
+msgid "$ glib-compile-resources --target=resources.c --generate-source exampleapp.gresource.xml"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7940(para)
+#: C/index-in.docbook:7524
 msgid ""
-"If you use one signal handler to catch the same signal from several widgets, "
-"you might like that signal handler to receive some extra information. For "
-"instance, you might want to know which button was clicked. You can do this "
-"with <function>sigc::bind()</function>. Here's some code from the <link "
-"linkend=\"sec-helloworld2\">helloworld2</link> example, which you will "
-"encounter later. <placeholder-1/> This says that we want the signal to send "
-"an extra <classname>Glib::ustring</classname> argument to the signal "
-"handler, and that the value of that argument should be \"button 1\". Of "
-"course we will need to add that extra argument to the declaration of our "
-"signal handler: <placeholder-2/> Of course, a normal \"clicked\" signal "
-"handler would have no arguments."
+"You may have noticed that we use the <methodname>_from_resource()</"
+"methodname> variant of the method that reads the ui file. Now we need to use "
+"<application>GLib</application>'s resource functionality to include the ui "
+"file in the binary. This is commonly done by listing all resources in a ."
+"gresource.xml file. This file has to be converted into a C source file that "
+"will be compiled and linked into the application together with the other "
+"source files. To do so, we use the <application>glib-compile-resources</"
+"application> utility: <_:screen-1/> The <link linkend=\"sec-gio-resource"
+"\">Gio::Resource and glib-compile-resources</link> section contains more "
+"information about resource files. If you build with Meson, use the "
+"<function>compile_resources()</function> function in Meson's <ulink url="
+"\"https://mesonbuild.com/Gnome-module.html\";>GNOME module</ulink>."
+msgstr ""
+
+#: C/index-in.docbook:7539
+msgid "Our application now looks like this:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7959(para)
+#: C/index-in.docbook:7550
 msgid ""
-"<function>sigc::bind()</function> is not commonly used, but you might find "
-"it helpful sometimes. If you are familiar with <application>GTK+</"
-"application> programming then you have probably noticed that this is similar "
-"to the extra <literal>gpointer data</literal> arguments which all GTK+ "
-"callbacks have. This is generally overused in <application>GTK+</"
-"application> to pass information that should be stored as member data in a "
-"derived widget, but widget derivation is very difficult in C. We have far "
-"less need of this hack in <application>gtkmm</application>."
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/buildapp/step2\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7971(title)
-msgid "X Event signals"
+#: C/index-in.docbook:7555 C/index-in.docbook:7591
+msgid "Opening files"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7972(para)
+#: C/index-in.docbook:7557
 msgid ""
-"The <classname>Widget</classname> class has some special signals which "
-"correspond to the underlying X-Windows events. These are suffixed by "
-"<literal>_event</literal>; for instance, <methodname>Widget::"
-"signal_button_pressed_event()</methodname>."
+"In this step, we make our application show the contents of all the files "
+"that it is given on the commandline."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7978(para)
+#: C/index-in.docbook:7562
 msgid ""
-"You might occasionally find it useful to handle X events when there's "
-"something you can't accomplish with normal signals. <classname>Gtk::Button</"
-"classname>, for example, does not send mouse-pointer coordinates with its "
-"<literal>clicked</literal> signal, but you could handle "
-"<literal>button_pressed_event</literal> if you needed this information. X "
-"events are also often used to handle key-presses."
+"To this end, we add a data member to our application window and keep a "
+"pointer to the <classname>Gtk::Stack</classname> there. We get the pointer "
+"with a call to <methodname>Gtk::Builder::get_widget()</methodname> in the "
+"application window's constructor."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7987(para)
+#: C/index-in.docbook:7568
 msgid ""
-"These signals behave slightly differently. The value returned from the "
-"signal handler indicates whether it has fully \"handled\" the event. If the "
-"value is <literal>false</literal> then <application>gtkmm</application> will "
-"pass the event on to the next signal handler. If the value is <literal>true</"
-"literal> then no other signal handlers will need to be called."
+"Now we revisit the <methodname>ExampleAppWindow::open_file_view()</"
+"methodname> method that is called for each commandline argument, and "
+"construct a <classname>Gtk::TextView</classname> that we then add as a page "
+"to the stack."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7992(para)
+#: C/index-in.docbook:7574
 msgid ""
-"Handling an X event doesn't affect the Widget's other signals. If you handle "
-"<literal>button_pressed_event</literal> for <classname>Gtk::Button</"
-"classname>, you'll still be able to get the <literal>clicked</literal> "
-"signal. They are emitted at (nearly) the same time."
+"Lastly, we add a <classname>Gtk::StackSwitcher</classname> to the titlebar "
+"area in the ui file, and we tell it to display information about our stack."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:7999(para)
+#: C/index-in.docbook:7579
 msgid ""
-"Note also that not all widgets recieve all X events by default. To receive "
-"additional X events, you can use <methodname>Gtk::Widget::set_events()</"
-"methodname> before showing the widget, or <methodname>Gtk::Widget::add_events"
-"()</methodname> after showing the widget. However, some widgets must first "
-"be placed inside an <classname>EventBox</classname> widget. See the <link "
-"linkend=\"chapter-widgets-without-xwindows\">Widgets Without X-Windows</"
-"link> chapter."
+"The stack switcher gets all its information it needs to display tabs from "
+"the stack that it belongs to. Here, we are passing the label to show for "
+"each file as the last argument to the <methodname>Gtk::Stack::add()</"
+"methodname> method."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8008(programlisting)
-#, no-wrap
+#: C/index-in.docbook:7586
+msgid "Our application is beginning to take shape:"
+msgstr ""
+
+#: C/index-in.docbook:7597
 msgid ""
-"\n"
-"bool on_button_press(GdkEventButton* event);\n"
-"Gtk::Button button(\"label\");\n"
-"button.signal_button_press_event().connect( sigc::ptr_fun(&amp;on_button_press) );\n"
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/buildapp/step3\">Source Code</ulink>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8006(para)
-msgid "Here's a simple example: <placeholder-1/>"
+#: C/index-in.docbook:7602 C/index-in.docbook:7637
+msgid "A menu"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8014(para)
+#: C/index-in.docbook:7604
 msgid ""
-"When the mouse is over the button and a mouse button is pressed, "
-"<methodname>on_button_press()</methodname> will be called."
+"The menu is shown at the right side of the headerbar. It is meant to collect "
+"infrequently used actions that affect the whole application."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8019(para)
+#: C/index-in.docbook:7609
 msgid ""
-"<type>GdkEventButton</type> is a structure containing the event's "
-"parameters, such as the coordinates of the mouse pointer at the time the "
-"button was pressed. There are several different types of <type>GdkEvent</"
-"type> structures for the various events."
+"Just like the application window, we specify our menu in a ui file, and add "
+"it as a resource to our binary."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8027(title)
-msgid "Signal Handler sequence"
+#: C/index-in.docbook:7614
+msgid ""
+"To make the menu appear, we have to load the ui file and associate the "
+"resulting menu model with the menu button that we've added to the headerbar. "
+"Since menus work by activating <classname>Gio::Action</classname>s, we also "
+"have to add a suitable set of actions to our application."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8029(programlisting)
-#, no-wrap
+#: C/index-in.docbook:7621
 msgid ""
-"\n"
-"button.signal_button_press_event().connect( sigc::ptr_fun(&amp;on_mywindow_button_press), false );\n"
+"Adding the actions is best done in the <methodname>on_startup()</methodname> "
+"default signal handler, which is guaranteed to be called once for each "
+"primary application instance."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8028(para)
+#: C/index-in.docbook:7626
 msgid ""
-"By default, your signal handlers are called after any previously-connected "
-"signal handlers. However, this can be a problem with the X Event signals. "
-"For instance, the existing signal handlers, or the default signal handler, "
-"might return true to stop other signal handlers from being called. To "
-"specify that your signal handler should be called before the other signal "
-"handlers, so that will always be called, you can specify <literal>false</"
-"literal> for the optional <literal>after</literal> parameter. For instance, "
-"<placeholder-1/>"
+"Our preferences menu item does not do anything yet, but the Quit menu item "
+"is fully functional. It can also be activated by the usual Ctrl-Q shortcut. "
+"The shortcut is added with <methodname>Gtk::Application::"
+"set_accel_for_action()</methodname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8043(title)
-msgid "Creating your own signals"
+#: C/index-in.docbook:7632
+msgid "The menu looks like this:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8044(para)
+#: C/index-in.docbook:7643
 msgid ""
-"Now that you've seen signals and signal handlers in <application>gtkmm</"
-"application>, you might like to use the same technique to allow interaction "
-"between your own classes. That's actually very simple by using the "
-"<application>libsigc++</application> library directly."
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/buildapp/step4\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:7648
+msgid "A preference dialog"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8050(para)
+#: C/index-in.docbook:7650
 msgid ""
-"This isn't purely a <application>gtkmm</application> or GUI issue. "
-"<application>gtkmm</application> uses <application>libsigc++</application> "
-"to implement its proxy wrappers for the <application>GTK+</application> "
-"signal system, but for new, non-GTK+ signals, you can create pure C++ "
-"signals, using the <classname>sigc::signal&lt;&gt;</classname> template."
+"A typical application will have some preferences that should be remembered "
+"from one run to the next. Even for our simple example application, we may "
+"want to change the font that is used for the content."
+msgstr ""
+
+#: C/index-in.docbook:7656
+msgid ""
+"We are going to use <classname>Gio::Settings</classname> to store our "
+"preferences. <classname>Gio::Settings</classname> requires a schema that "
+"describes our settings, in our case the <filename>org.gtkmm.exampleapp."
+"gschema.xml</filename> file."
+msgstr ""
+
+#: C/index-in.docbook:7662
+msgid ""
+"Before we can make use of this schema in our application, we need to compile "
+"it into the binary form that <classname>Gio::Settings</classname> expects. "
+"GIO provides macros to do this in autotools-based projects. See the "
+"description of <ulink url=\"https://developer.gnome.org/gio/stable/GSettings.";
+"html\">GSettings</ulink>. Meson provides the <function>compile_schemas()</"
+"function> function in the <ulink url=\"https://mesonbuild.com/Gnome-module.";
+"html\">GNOME module</ulink>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8061(programlisting)
+#: C/index-in.docbook:7676
 #, no-wrap
 msgid ""
 "\n"
-"sigc::signal&lt;void, bool int&gt; signal_something;\n"
+"m_settings = Gio::Settings::create(\"org.gtkmm.exampleapp\");\n"
+"m_settings-&gt;bind(\"transition\", m_stack-&gt;property_transition_type());\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8057(para)
+#: C/index-in.docbook:7671
 msgid ""
-"For instance, to create a signal that sends 2 parameters, a <type>bool</"
-"type> and an <type>int</type>, just declare a <classname>sigc::signal</"
-"classname>, like so: <placeholder-1/>"
+"Next, we need to connect our settings to the widgets that they are supposed "
+"to control. One convenient way to do this is to use <methodname>Gio::"
+"Settings::bind()</methodname> to bind settings keys to object properties, as "
+"we do for the transition setting in <classname>ExampleAppWindow</"
+"classname>'s constructor. <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8069(programlisting)
+#: C/index-in.docbook:7686
 #, no-wrap
 msgid ""
 "\n"
-"class Server\n"
-"{\n"
-"public:\n"
-"  //signal accessor:\n"
-"  typedef sigc::signal&lt;void, bool, int&gt; type_signal_something;\n"
-"  type_signal_something signal_something();\n"
+"auto tag = buffer-&gt;create_tag();\n"
+"m_settings-&gt;bind(\"font\", tag-&gt;property_font());\n"
+"buffer-&gt;apply_tag(tag, buffer-&gt;begin(), buffer-&gt;end());\n"
+msgstr ""
+
+#: C/index-in.docbook:7682
+msgid ""
+"The code to connect the font setting is a little more involved, since it "
+"corresponds to an object property in a <classname>Gtk::TextTag</classname> "
+"that we must first create. The code is in <methodname>ExampleAppWindow::"
+"open_file_view()</methodname>. <_:programlisting-1/>"
+msgstr ""
+
+#: C/index-in.docbook:7693
+msgid ""
+"At this point, the application will already react if you change one of the "
+"settings, e.g. using the <command>gsettings</command> commandline tool. Of "
+"course, we expect the application to provide a preference dialog for these. "
+"So lets do that now. Our preference dialog will be a subclass of "
+"<classname>Gtk::Dialog</classname>, and we'll use the same techniques that "
+"we've already seen in <classname>ExampleAppWindow</classname>: a "
+"<classname>Gtk::Builder</classname> ui file and settings bindings."
+msgstr ""
+
+#: C/index-in.docbook:7706
+#, no-wrap
+msgid ""
 "\n"
-"protected:\n"
-"  type_signal_something m_signal_something;\n"
-"};\n"
+"auto prefs_dialog = ExampleAppPrefs::create(*get_active_window());\n"
+"prefs_dialog-&gt;present();\n"
+msgstr ""
+
+#: C/index-in.docbook:7702
+msgid ""
+"When we've created the <filename>prefs.ui</filename> file and the "
+"<classname>ExampleAppPrefs</classname> class, we revisit the "
+"<methodname>ExampleApplication::on_action_preferences()</methodname> method "
+"in our application class, and make it open a new preference dialog. <_:"
+"programlisting-1/>"
+msgstr ""
+
+#: C/index-in.docbook:7712
+msgid ""
+"After all this work, our application can now show a preference dialog like "
+"this:"
+msgstr ""
+
+#: C/index-in.docbook:7717
+msgid "An preference dialog"
+msgstr ""
+
+#: C/index-in.docbook:7723
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/buildapp/step5\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:7728 C/index-in.docbook:7771
+msgid "Adding a search bar"
+msgstr ""
+
+#: C/index-in.docbook:7730
+msgid ""
+"We continue to flesh out the functionality of our application. For now, we "
+"add search. <application>gtkmm</application> supports this with "
+"<classname>Gtk::SearchEntry</classname> and <classname>Gtk::SearchBar</"
+"classname>. The search bar is a widget that can slide in from the top to "
+"present a search entry."
+msgstr ""
+
+#: C/index-in.docbook:7736
+msgid ""
+"We add a toggle button to the header bar, which can be used to slide out the "
+"search bar below the header bar. The new widgets are added in the "
+"<filename>window.ui</filename> file."
+msgstr ""
+
+#: C/index-in.docbook:7745
+#, no-wrap
+msgid ""
 "\n"
-"Server::type_signal_something Server::signal_something()\n"
+"void ExampleAppWindow::on_search_text_changed()\n"
 "{\n"
-"  return m_signal_something;\n"
+"  const auto text = m_searchentry-&gt;get_text();\n"
+"  auto tab = dynamic_cast&lt;Gtk::ScrolledWindow*&gt;(m_stack-&gt;get_visible_child());\n"
+"  auto view = dynamic_cast&lt;Gtk::TextView*&gt;(tab-&gt;get_child());\n"
+"\n"
+"  // Very simple-minded search implementation.\n"
+"  auto buffer = view-&gt;get_buffer();\n"
+"  Gtk::TextIter match_start;\n"
+"  Gtk::TextIter match_end;\n"
+"  if (buffer-&gt;begin().forward_search(text, Gtk::TextSearchFlags::CASE_INSENSITIVE,\n"
+"      match_start, match_end))\n"
+"  {\n"
+"    buffer-&gt;select_range(match_start, match_end);\n"
+"    view-&gt;scroll_to(match_start);\n"
+"  }\n"
 "}\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8065(para)
+#: C/index-in.docbook:7741
 msgid ""
-"You could just declare that signal as a public member variable, but some "
-"people find that distasteful and prefer to make it available via an accessor "
-"method, like so: <placeholder-1/>"
+"Implementing the search needs quite a few code changes that we are not going "
+"to completely go over here. The central piece of the search implementation "
+"is a signal handler that listens for text changes in the search entry, shown "
+"here without error handling. <_:programlisting-1/>"
+msgstr ""
+
+#: C/index-in.docbook:7766
+msgid "With the search bar, our application now looks like this:"
+msgstr ""
+
+#: C/index-in.docbook:7777
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/buildapp/step6\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:7782 C/index-in.docbook:7817
+msgid "Adding a side bar"
+msgstr ""
+
+#: C/index-in.docbook:7784
+msgid ""
+"As another piece of functionality, we are adding a sidebar, which "
+"demonstrates <classname>Gtk::Revealer</classname> and <classname>Gtk::"
+"ListBox</classname>. The new widgets are added in the <filename>window.ui</"
+"filename> file."
+msgstr ""
+
+#: C/index-in.docbook:7790
+msgid ""
+"The code to populate the sidebar with buttons for the words found in each "
+"file is a little too involved to go into here. But we'll look at the code to "
+"add a checkbutton for the new feature to the menu. A menu item is added to "
+"the ui file <filename>gears_menu.ui</filename>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8091(programlisting)
+#: C/index-in.docbook:7801
 #, no-wrap
 msgid ""
 "\n"
-"server.signal_something().connect(\n"
-"  sigc::mem_fun(client, &amp;Client::on_server_something) );\n"
+"// Connect the menu to the MenuButton m_gears, and bind the show-words setting\n"
+"// to the win.show-words action and the \"Words\" menu item.\n"
+"// (The connection between action and menu item is specified in gears_menu.ui.)\n"
+"auto menu_builder = Gtk::Builder::create_from_resource(\"/org/gtkmm/exampleapp/gears_menu.ui\");\n"
+"auto menu = menu_builder-&gt;get_object&lt;Gio::MenuModel&gt;(\"menu\");\n"
+"m_gears-&gt;set_menu_model(menu);\n"
+"add_action(m_settings-&gt;create_action(\"show-words\"));\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8088(para)
+#: C/index-in.docbook:7797
 msgid ""
-"You can then connect to the signal using the same syntax used when "
-"connecting to <application>gtkmm</application> signals. For instance, "
-"<placeholder-1/>"
+"To connect the menu item to the new <literal>show-words</literal> setting, "
+"we use a <classname>Gio::Action</classname> corresponding to the given "
+"<classname>Gio::Settings</classname> key. In <classname>ExampleAppWindow</"
+"classname>'s constructor: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8099(para)
-msgid "This is a full working example that defines and uses custom signal."
+#: C/index-in.docbook:7812
+msgid "What our application looks like now:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8113(title)
-msgid "Comparison with other signalling systems"
+#: C/index-in.docbook:7823
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/buildapp/step7\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:7829 C/index-in.docbook:7871
+msgid "Properties"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8114(para)
+#: C/index-in.docbook:7831
 msgid ""
-"TODO: Rewrite this paragraph and talk about Qt's moc. (An aside: "
-"<application>GTK+</application> calls this scheme \"signalling\"; the sharp-"
-"eyed reader with GUI toolkit experience will note that this same design is "
-"often seen under the name of \"broadcaster-listener\" (e.g., in Metrowerks' "
-"PowerPlant framework for the Macintosh). It works in much the same way: one "
-"sets up <literal>broadcasters</literal>, and then connects "
-"<literal>listeners</literal> to them; the broadcaster keeps a list of the "
-"objects listening to it, and when someone gives the broadcaster a message, "
-"it calls all of its objects in its list with the message. In "
-"<application>gtkmm</application>, signal objects play the role of "
-"broadcasters, and slots play the role of listeners - sort of. More on this "
-"later.)"
+"Widgets and other objects have many useful properties. Here we show some "
+"ways to use them in new and flexible ways, by wrapping them in actions with "
+"<classname>Gio::PropertyAction</classname> or by binding them with "
+"<classname>Glib::Binding</classname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8128(para)
+#: C/index-in.docbook:7837
 msgid ""
-"<application>gtkmm</application> signal handlers are strongly-typed, whereas "
-"<application>GTK+</application> C code allows you to connect a callback with "
-"the wrong number and type of arguments, leading to a segfault at runtime. "
-"And, unlike <application>Qt</application>, <application>gtkmm</application> "
-"achieves this without modifying the C++ language."
+"To set this up, we add two labels to the header bar in our <filename>window."
+"ui</filename> file, named <literal>lines_label</literal> and <literal>lines</"
+"literal>, and get pointers to them in the application window's constructor, "
+"as we've seen a couple of times by now. We add a new \"Lines\" menu item to "
+"the gears menu, which triggers the <literal>show-lines</literal> action."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8134(para)
+#: C/index-in.docbook:7854
+#, no-wrap
 msgid ""
-"Re. Overriding signal handlers: You can do this in the straight-C world of "
-"GTK+ too; that's what GTK's object system is for. But in GTK+, you have to "
-"go through some complicated procedures to get object-oriented features like "
-"inheritance and overloading. In C++, it's simple, since those features are "
-"supported in the language itself; you can let the compiler do the dirty work."
+"add_action(Gio::PropertyAction::create(\"show-lines\", m_lines-&gt;property_visible()));\n"
+"m_binding_lines_visible = Glib::Binding::bind_property(m_lines-&gt;property_visible(),\n"
+"  m_lines_label-&gt;property_visible());\n"
+"\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8142(para)
+#: C/index-in.docbook:7845
 msgid ""
-"This is one of the places where the beauty of C++ really comes out. One "
-"wouldn't think of subclassing a GTK+ widget simply to override its action "
-"method; it's just too much trouble. In GTK+, you almost always use signals "
-"to get things done, unless you're writing a new widget. But because "
-"overriding methods is so easy in C++, it's entirely practical - and sensible "
-"- to subclass a button for that purpose."
+"To make this menu item do something, we create a property action for the "
+"<literal>visible</literal> property of the <literal>lines</literal> label, "
+"and add it to the actions of the window. The effect of this is that the "
+"visibility of the label gets toggled every time the action is activated. "
+"Since we want both labels to appear and disappear together, we bind the "
+"<literal>visible</literal> property of the <literal>lines_label</literal> "
+"widget to the same property of the <literal>lines</literal> widget. In "
+"<classname>ExampleAppWindow</classname>'s constructor: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8153(title)
-msgid "<application>gtkmm</application> and Win32"
+#: C/index-in.docbook:7861
+msgid ""
+"We also need a function that counts the lines of the currently active tab, "
+"and updates the <literal>lines</literal> label. See the full source if you "
+"are interested in the details."
+msgstr ""
+
+#: C/index-in.docbook:7866
+msgid "This brings our example application to this appearance:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8154(para)
+#: C/index-in.docbook:7877
 msgid ""
-"One of the major advantages of <application>gtkmm</application> is that it "
-"is crossplatform. <application>gtkmm</application> programs written on other "
-"platforms such as GNU/Linux can generally be transferred to Windows (and "
-"vice versa) with few modifications to the source."
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/buildapp/step8\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:7882 C/index-in.docbook:7908
+msgid "Header bar"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8159(para)
+#: C/index-in.docbook:7884
 msgid ""
-"<application>gtkmm</application> currently works with the <ulink url="
-"\"http://mingw.org/\";>MingW/GCC3.4 compiler</ulink> and Microsoft Visual C++ "
-"2005 or later (including the freely available express editions) on the "
-"Windows platform. There is an <ulink url=\"ftp://ftp.gnome.org/pub/GNOME/";
-"binaries/win32/gtkmm\"> installer</ulink> available for gtkmm on Microsoft "
-"Windows. Refer to <ulink url=\"http://live.gnome.org/gtkmm/MSWindows/\";> "
-"http://live.gnome.org/gtkmm/MSWindows</ulink> for instructions how to use it."
+"Our application already uses a <classname>Gtk::HeaderBar</classname> instead "
+"of a 'normal' window titlebar. The header bar is a direct child of the "
+"window, and its type is <literal>titlebar</literal>. This is set in the "
+"<filename>window.ui</filename> file."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8171(title)
-msgid "Building <application>gtkmm</application> on Win32"
+#: C/index-in.docbook:7897
+#, no-wrap
+msgid ""
+"Gtk::IconTheme::get_for_display(get_display())-&gt;add_resource_path(\"/org/gtkmm/exampleapp\");\n"
+"set_icon_name(\"exampleapp\");\n"
+"\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8172(para)
+#: C/index-in.docbook:7891
 msgid ""
-"Please see <ulink url=\"http://live.gnome.org/gtkmm/MSWindows/BuildingGtkmm";
-"\">http://live.gnome.org/gtkmm/MSWindows/BuildingGtkmm</ulink> for "
-"instructions on how to build gtkmm on Windws."
+"Here we'll just make two small changes to the header bar. The "
+"<literal>decoration-layout</literal> property is set in the <filename>window."
+"ui</filename> file, to show only the close button, and hide the minimize and "
+"maximize buttons. We also include an icon in the resource file, and set up "
+"this icon as the window icon. In <classname>ExampleAppWindow</classname>'s "
+"constructor: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8179(title)
-msgid "Working with gtkmm's Source Code"
+#: C/index-in.docbook:7903
+msgid "Here is how the application now looks:"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8180(para)
+#: C/index-in.docbook:7914
 msgid ""
-"If you are interested in helping out with the development of "
-"<application>gtkmm</application>, or fixing a bug in <application>gtkmm</"
-"application>, you'll probably need to build the development version of "
-"<application>gtkmm</application>. However, you should not to install a "
-"development version over your stable version. Instead, you should install it "
-"alongside your existing <application>gtkmm</application> installation, in a "
-"separate path."
+"The <filename>window.ui</filename> file sets a header bar title, but this "
+"title is not shown. That's because the stack switcher is a child of type "
+"<literal>title</literal>. The stack switcher becomes a custom title that "
+"hides the title label."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8187(para)
+#: C/index-in.docbook:7920
 msgid ""
-"The easiest way to do this is using <ulink url=\"http://library.gnome.org/";
-"devel/jhbuild/unstable/\">jhbuild</ulink>. <application>jhbuild</"
-"application> is a program that makes building GNOME software much easier by "
-"calculating dependencies and building things in the correct order. This "
-"section will give a brief explanation of how to set up jhbuild to build and "
-"install <application>gtkmm</application> from the source repository (git). "
-"For up-to-date information on <application>jhbuild</application>, please "
-"refer to the <ulink url=\"http://library.gnome.org/devel/jhbuild/unstable/";
-"\">jhbuild manual</ulink>. If you need assistance using "
-"<application>jhbuild</application>, you should ask for help on the <ulink "
-"url=\"http://mail.gnome.org/mailman/listinfo/gnome-love\";>gnome-love mailing "
-"list</ulink>."
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/buildapp/step9\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:7927
+msgid "Contributing"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8202(para)
+#: C/index-in.docbook:7929
 msgid ""
-"Note that to build <application>gtkmm</application> from git, you'll often "
-"need to build all of its dependencies from git as well. "
-"<application>jhbuild</application> makes this easier than it would normally "
-"be, but it will take quite a while to build and install them all. You will "
-"probably encounter build problems, though these will usually be corrected "
-"quickly if you report them."
+"This document, like so much other great software out there, was created for "
+"free by volunteers. If you are at all knowledgeable about any aspect of "
+"<application>gtkmm</application> that does not already have documentation, "
+"please consider contributing to this document."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8210(title)
-msgid "Setting up jhbuild"
+#: C/index-in.docbook:7935
+msgid ""
+"Ideally, we would like you to <ulink url=\"https://gitlab.gnome.org/GNOME/";
+"gtkmm-documentation/-/merge_requests\"> provide a merge request</ulink> to "
+"the <filename>docs/tutorial/C/index-in.docbook</filename> file. This file is "
+"in the <literal>gtkmm-documentation</literal> module in GNOME git."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8211(para)
+#: C/index-in.docbook:7941
 msgid ""
-"To set up <application>jhbuild</application>, follow the basic installation "
-"instructions from the <ulink url=\"http://library.gnome.org/devel/jhbuild/";
-"unstable/\">jhbuild manual</ulink>. After you've have installd "
-"<application>jhbuild</application>, you should copy the sample "
-"<application>jhbuild</application> configuration file into your home "
-"directory by executing the following command from the <application>jhbuild</"
-"application> directory: <command>$ cp sample.jhbuildrc ~/.jhbuildrc</command>"
+"If you do decide to contribute, please post your contribution to the "
+"<application>gtkmm</application> mailing list at <ulink url=\"mailto:gtkmm-";
+"list gnome org\">&lt;gtkmm-list gnome org&gt;</ulink> or as an issue or "
+"merge request to <ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-";
+"documentation\">GitLab</ulink>. Also, be aware that the entirety of this "
+"document is free, and any addition you provide must also be free. That is, "
+"people must be able to use any portion of your examples in their programs, "
+"and copies of this document (including your contribution) may be distributed "
+"freely."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8226(programlisting)
-#, no-wrap
-msgid "moduleset = 'gnome-2.30'"
+#: C/index-in.docbook:7954
+msgid "The RefPtr smartpointer"
+msgstr ""
+
+#: C/index-in.docbook:7955
+msgid ""
+"<classname>Glib::RefPtr</classname> is a smartpointer. Specifically, it is a "
+"reference-counting smartpointer. You might be familiar with <classname>std::"
+"unique_ptr&lt;&gt;</classname> and <classname>std::shared_ptr&lt;&gt;</"
+"classname>, which are also smartpointers. In <application>gtkmm</"
+"application>-4.0 <classname>Glib::RefPtr&lt;&gt;</classname> is an alias for "
+"<classname>std::shared_ptr&lt;&gt;</classname>, which is reference-counting. "
+"<classname>Glib::RefPtr&lt;&gt;</classname> was introduced long before there "
+"was a reference-counting smartpointer in the C++ Standard Library."
+msgstr ""
+
+#: C/index-in.docbook:7966
+msgid ""
+"<ulink url=\"http://developer.gnome.org/glibmm/unstable/classGlib_1_1RefPtr.";
+"html\">Reference</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:7968
+msgid ""
+"A smartpointer acts much like a normal pointer. Here are a few examples."
+msgstr ""
+
+#: C/index-in.docbook:7971
+msgid "Copying"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8221(para)
+#: C/index-in.docbook:7972
 msgid ""
-"The <application>gtkmm</application> module is defined in the GNOME "
-"moduleset (i.e. <filename>gnome-2.xx.modules</filename>, so edit your "
-"<filename>.jhbuildrc</filename> file and set your moduleset setting to the "
-"latest version of GNOME like so: <placeholder-1/>"
+"You can copy <classname>RefPtr</classname>s, just like normal pointers. But "
+"unlike normal pointers, you don't need to worry about deleting the "
+"underlying instance."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8232(programlisting)
+#: C/index-in.docbook:7978
 #, no-wrap
-msgid "modules = [ 'gtkmm', ]"
+msgid ""
+"\n"
+"auto refPixbuf = Gdk::Pixbuf::create_from_file(filename);\n"
+"auto refPixbuf2 = refPixbuf;\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8228(para)
+#: C/index-in.docbook:7983
 msgid ""
-"After setting the correct moduleset, you need to tell <application>jhbuild</"
-"application> which module or modules to build. To build <application>gtkmm</"
-"application> and all of its dependencies, set <varname>modules</varname> "
-"like so: <placeholder-1/>"
+"Of course this means that you can store <classname>RefPtr</classname>s in "
+"standard containers, such as <classname>std::vector</classname> or "
+"<classname>std::list</classname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8234(para)
+#: C/index-in.docbook:7988
+#, no-wrap
 msgid ""
-"You can build all GNOME C++ modules by setting the <varname>modules</"
-"varname> variable to the meta-package named <literal>meta-gnome-c++</"
-"literal> or build all of the core GNOME modules with <literal>meta-gnome-"
-"desktop</literal>. The <varname>modules</varname> variable specifies which "
-"modules that will be built when you don't explicitly specify anything on the "
-"command line. You can always build a different moduleset later by specifying "
-"it on the commandline (e.g. <command>jhbuild build gtkmm</command>)."
+"\n"
+"std::list&lt;Glib::RefPtr&lt;Gdk::Pixbuf&gt;&gt; listPixbufs;\n"
+"auto refPixbuf = Gdk::Pixbuf::create_from_file(filename);\n"
+"listPixbufs.push_back(refPixbuf);\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8245(title)
-msgid "Setting a prefix"
+#: C/index-in.docbook:7996
+msgid "Dereferencing"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8246(para)
+#: C/index-in.docbook:7997
 msgid ""
-"By default, <application>jhbuild</application>'s configuration is configured "
-"to install all software built with <application>jhbuild</application> under "
-"the <filename>/opt/gnome2</filename> prefix. You can choose a different "
-"prefix, but it is recommended that you keep this prefix different from other "
-"software that you've installed (don't set it to <filename>/usr</filename>!) "
-"If you've followed the jhbuild instructions then this prefix belongs to your "
-"user, so you don't need to run jhbuild as <literal>root</literal>."
+"You can dereference a smartpointer with the -&gt; operator, to call the "
+"methods of the underlying instance, just like a normal pointer."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8260(title)
+#: C/index-in.docbook:8001
+#, no-wrap
 msgid ""
-"Installing and Using the git version of <application>gtkmm</application>"
+"\n"
+"auto refPixbuf = Gdk::Pixbuf::create_from_file(filename);\n"
+"auto width = refPixbuf-&gt;get_width();\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8261(para)
+#: C/index-in.docbook:8006
 msgid ""
-"Once you've configured <application>jhbuild</application> as described "
-"above, building <application>gtkmm</application> should be relatively "
-"straightforward. The first time you run <application>jhbuild</application>, "
-"you should run the following sequence of commands to ensure that "
-"<application>jhbuild</application> has the required tools and verify that it "
-"is set up correctly: <screen>$ jhbuild bootstrap\n"
-"$ jhbuild sanitycheck</screen>"
+"You can also use the * operator and the <methodname>get()</methodname> "
+"method to access the underlying instance, but it's usually a bad idea to do "
+"so. Unless you are careful, you can end up with a pointer or a reference "
+"which is not included in the reference count."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8272(title)
+#: C/index-in.docbook:8012
+#, no-wrap
 msgid ""
-"Installing <application>gtkmm</application> with <application>jhbuild</"
-"application>"
+"\n"
+"auto refPixbuf = Gdk::Pixbuf::create_from_file(filename);\n"
+"auto&amp; underlying = *refPixbuf; // Possible, but not recommended\n"
+msgstr ""
+
+#: C/index-in.docbook:8019
+msgid "Casting"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8273(para)
+#: C/index-in.docbook:8020
 msgid ""
-"If everything worked correctly, you should be able to build "
-"<application>gtkmm</application> and all of its dependencies from git by "
-"executing <command>jhbuild build</command> (or, if you didn't specify "
-"<application>gtkmm</application> in the <varname>modules</varname> variable, "
-"with the command <command>jhbuild build gtkmm</command>)."
+"You can cast <classname>RefPtr</classname>s to base types, just like normal "
+"pointers."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8280(para)
+#: C/index-in.docbook:8025
+#, no-wrap
 msgid ""
-"This command will build and install a series of modules and will probably "
-"take quite a long time the first time through. After the first time, "
-"however, it should go quite a bit faster since it only needs to rebuild "
-"files than changed since the last build. Alternatively, after you've built "
-"and installed <application>gtkmm</application> the first time, you can "
-"rebuild <application>gtkmm</application> by itself (without rebuilding all "
-"of its dependencies) with the command <command>jhbuild buildone gtkmm</"
-"command>."
+"\n"
+"auto refStore = Gtk::TreeStore::create(columns);\n"
+"Glib::RefPtr&lt;Gtk::TreeModel&gt; refModel = refStore;\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8291(title)
-msgid "Using the git version of <application>gtkmm</application>"
+#: C/index-in.docbook:8030
+msgid ""
+"This means that any method which takes a <type>const Glib::RefPtr&lt;"
+"BaseType&gt;&amp;</type> argument can also take a <type>const Glib::"
+"RefPtr&lt;DerivedType&gt;&amp;</type>. The cast is implicit, just as it "
+"would be for a normal pointer."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8292(para)
+#: C/index-in.docbook:8034
 msgid ""
-"After you've installed the git version of <application>gtkmm</application>, "
-"you're ready to start using and experimenting with it. In order to use the "
-"new version of <application>gtkmm</application> you've just installed, you "
-"need to set some environment variables so that your <filename>configure</"
-"filename> script knows where to find the new libraries. Fortunately, "
-"<application>jhbuild</application> offers an easy solution to this problem. "
-"Executing the command <command>jhbuild shell</command> will start a new "
-"shell with all of the correct environment variables set. Now if you re-"
-"configure and build your project just as you usually do, it should link "
-"against the newly installed libraries. To return to your previous "
-"environment, simply exit the <application>jhbuild</application> shell."
+"You can also cast to a derived type, but the syntax is a little different "
+"than with a normal pointer."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8306(para)
+#: C/index-in.docbook:8038
+#, no-wrap
 msgid ""
-"Once you've built your software, you'll need to run your program within the "
-"jhbuild environment as well. To do this, you can again use the "
-"<command>jhbuild shell</command> command to start a new shell with the "
-"<application>jhbuild</application> environment set up. Alternatively, you "
-"can execute a one-off command in the <application>jhbuild</application> "
-"environment using the following command: <command>jhbuild run command-name</"
-"command>. In this case, the command will be run with the correct environment "
-"variables set, but will return to your previous environment after the "
-"program exits."
+"\n"
+"auto refStore = std::dynamic_pointer_cast&lt;Gtk::TreeStore&gt;(refModel);\n"
+"auto refStore2 = std::static_pointer_cast&lt;Gtk::TreeStore&gt;(refModel);\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8323(title)
-msgid "Wrapping C Libraries with gmmproc"
+#: C/index-in.docbook:8045
+msgid "Checking for nullptr"
+msgstr ""
+
+#: C/index-in.docbook:8046
+msgid ""
+"Just like normal pointers, you can check whether a <classname>RefPtr</"
+"classname> points to anything."
+msgstr ""
+
+#: C/index-in.docbook:8051
+#, no-wrap
+msgid ""
+"\n"
+"auto refModel = m_TreeView.get_model();\n"
+"if (refModel)\n"
+"{\n"
+"  auto cols_count = refModel-&gt;get_n_columns();\n"
+"  ...\n"
+"}\n"
+msgstr ""
+
+#: C/index-in.docbook:8060
+msgid ""
+"But unlike normal pointers, <classname>RefPtr</classname>s are automatically "
+"initialized to <literal>nullptr</literal> so you don't need to remember to "
+"do that yourself."
+msgstr ""
+
+#: C/index-in.docbook:8066
+msgid "Constness"
+msgstr ""
+
+#: C/index-in.docbook:8067
+msgid ""
+"The use of the <literal>const</literal> keyword in C++ is not always clear. "
+"You might not realise that <type>const Something*</type> declares a pointer "
+"to a <type>const Something</type>. The pointer can be changed, but not the "
+"<type>Something</type> that it points to."
+msgstr ""
+
+#: C/index-in.docbook:8073
+msgid ""
+"Therefore, the <classname>RefPtr</classname> equivalent of <type>Something*</"
+"type> for a method parameter is <type>const Glib::RefPtr&lt;Something&gt;"
+"&amp;</type>, and the equivalent of <type>const Something*</type> is "
+"<type>const Glib::RefPtr&lt;const Something&gt;&amp;</type>."
+msgstr ""
+
+#: C/index-in.docbook:8080
+msgid ""
+"The <literal>const ... &amp;</literal> around both is just for efficiency, "
+"like using <classname>const std::string&amp;</classname> instead of "
+"<classname>std::string</classname> for a method parameter to avoid "
+"unnecessary copying."
+msgstr ""
+
+#: C/index-in.docbook:8095
+msgid "Connecting signal handlers"
+msgstr ""
+
+#: C/index-in.docbook:8096
+msgid ""
+"<application>gtkmm</application> widget classes have signal accessor "
+"methods, such as <methodname>Gtk::Button::signal_clicked()</methodname>, "
+"which allow you to connect your signal handler. Thanks to the flexibility of "
+"<application>libsigc++</application>, the callback library used by "
+"<application>gtkmm</application>, the signal handler can be almost any kind "
+"of function, but you will probably want to use a class method. Among "
+"<application>GTK</application> C coders, these signal handlers are often "
+"named callbacks."
+msgstr ""
+
+#: C/index-in.docbook:8106
+msgid "Here's an example of a signal handler being connected to a signal:"
+msgstr ""
+
+#: C/index-in.docbook:8111
+#, no-wrap
+msgid ""
+"\n"
+"#include &lt;gtkmm/button.h&gt;\n"
+"\n"
+"void on_button_clicked()\n"
+"{\n"
+"    std::cout &lt;&lt; \"Hello World\" &lt;&lt; std::endl;\n"
+"}\n"
+"\n"
+"int main()\n"
+"{\n"
+"    Gtk::Button button(\"Hello World\");\n"
+"    button.signal_clicked().connect(sigc::ptr_fun(&amp;on_button_clicked));\n"
+"}\n"
+msgstr ""
+
+#: C/index-in.docbook:8127
+msgid ""
+"There's rather a lot to think about in this (non-functional) code. First "
+"let's identify the parties involved:"
+msgstr ""
+
+#: C/index-in.docbook:8135
+msgid "The signal handler is <methodname>on_button_clicked()</methodname>."
+msgstr ""
+
+#: C/index-in.docbook:8141
+msgid ""
+"We're hooking it up to the <classname>Gtk::Button</classname> object called "
+"<varname>button</varname>."
+msgstr ""
+
+#: C/index-in.docbook:8148
+msgid ""
+"When the Button emits its <literal>clicked</literal> signal, "
+"<methodname>on_button_clicked()</methodname> will be called."
+msgstr ""
+
+#: C/index-in.docbook:8156
+msgid "Now let's look at the connection again:"
+msgstr ""
+
+#: C/index-in.docbook:8161
+#, no-wrap
+msgid ""
+"\n"
+"    ...\n"
+"    button.signal_clicked().connect(sigc::ptr_fun(&amp;on_button_clicked));\n"
+"    ...\n"
+msgstr ""
+
+#: C/index-in.docbook:8168
+msgid ""
+"Note that we don't pass a pointer to <methodname>on_button_clicked()</"
+"methodname> directly to the signal's <methodname>connect()</methodname> "
+"method. Instead, we call <function>sigc::ptr_fun()</function>, and pass the "
+"result to <methodname>connect()</methodname>."
+msgstr ""
+
+#: C/index-in.docbook:8175
+msgid ""
+"<function>sigc::ptr_fun()</function> generates a <classname>sigc::slot</"
+"classname>. A slot is an object which looks and feels like a function, but "
+"is actually an object. These are also known as function objects, or "
+"functors. <function>sigc::ptr_fun()</function> generates a slot for a "
+"standalone function or static method. <function>sigc::mem_fun()</function> "
+"generates a slot for a member method of a particular instance."
+msgstr ""
+
+#: C/index-in.docbook:8184
+msgid "Here's a slightly larger example of slots in action:"
+msgstr ""
+
+#: C/index-in.docbook:8189
+#, no-wrap
+msgid ""
+"\n"
+"void on_button_clicked();\n"
+"\n"
+"class some_class\n"
+"{\n"
+"    void on_button_clicked();\n"
+"};\n"
+"\n"
+"some_class some_object;\n"
+"\n"
+"int main()\n"
+"{\n"
+"    Gtk::Button button;\n"
+"    button.signal_clicked().connect( sigc::ptr_fun(&amp;on_button_clicked) );\n"
+"    button.signal_clicked().connect( sigc::mem_fun(some_object, &amp;some_class::on_button_clicked) );\n"
+"}\n"
+msgstr ""
+
+#: C/index-in.docbook:8208
+msgid ""
+"The first call to <methodname>connect()</methodname> is just like the one we "
+"saw last time; nothing new here."
+msgstr ""
+
+#: C/index-in.docbook:8211
+msgid ""
+"The next is more interesting. <function>sigc::mem_fun()</function> is called "
+"with two arguments. The first argument is <parameter>some_object</"
+"parameter>, which is the object that our new slot will be pointing at. The "
+"second argument is a pointer to one of its methods. This particular version "
+"of <function>sigc::mem_fun()</function> creates a slot which will, when "
+"\"called\", call the pointed-to method of the specified object, in this case "
+"<methodname>some_object.on_button_clicked()</methodname>."
+msgstr ""
+
+#: C/index-in.docbook:8221
+msgid ""
+"Another thing to note about this example is that we made the call to "
+"<methodname>connect()</methodname> twice for the same signal object. This is "
+"perfectly fine - when the button is clicked, both signal handlers will be "
+"called."
+msgstr ""
+
+#: C/index-in.docbook:8228
+msgid ""
+"We just told you that the button's <literal>clicked</literal> signal is "
+"expecting to call a method with no arguments. All signals have requirements "
+"like this - you can't hook a function with two arguments to a signal "
+"expecting none (unless you use an adapter, such as <function>sigc::bind()</"
+"function>, of course). Therefore, it's important to know what type of signal "
+"handler you'll be expected to connect to a given signal."
+msgstr ""
+
+#: C/index-in.docbook:8240
+msgid "Writing signal handlers"
+msgstr ""
+
+#: C/index-in.docbook:8242
+msgid ""
+"To find out what type of signal handler you can connect to a signal, you can "
+"look it up in the reference documentation or the header file. Here's an "
+"example of a signal declaration you might see in the <application>gtkmm</"
+"application> headers:"
+msgstr ""
+
+#: C/index-in.docbook:8249
+#, no-wrap
+msgid ""
+"\n"
+"Glib::SignalProxy&lt;bool(Gtk::DirectionType)&gt; signal_focus()\n"
+msgstr ""
+
+#: C/index-in.docbook:8254
+msgid ""
+"Other than the signal's name (<literal>focus</literal>), the template "
+"arguments are important to note here. The first argument, <type>bool</type>, "
+"is the type that the signal handler should return; and the type within "
+"parentheses, <type>Gtk::DirectionType</type>, is the type of this signal's "
+"first, and only, argument. By looking at the reference documentation, you "
+"can see the names of the arguments too."
+msgstr ""
+
+#: C/index-in.docbook:8263
+msgid ""
+"The same principles apply for signals which have more arguments. Here's one "
+"with three (taken from <filename>&lt;gtkmm/textbuffer.h&gt;</filename>):"
+msgstr ""
+
+#: C/index-in.docbook:8269
+#, no-wrap
+msgid ""
+"\n"
+"Glib::SignalProxy&lt;void(TextBuffer::iterator&amp;, const Glib::ustrin&amp;, int)&gt; signal_insert();\n"
+msgstr ""
+
+#: C/index-in.docbook:8274
+msgid ""
+"It follows the same form. The first type is <type>void</type>, so that "
+"should be our signal handler's return type. The following three types are "
+"the argument types, in order. Our signal handler's prototype could look like "
+"this:"
+msgstr ""
+
+#: C/index-in.docbook:8282
+#, no-wrap
+msgid ""
+"\n"
+"void on_insert(TextBuffer::iterator&amp; pos, const Glib::ustring&amp; text, int bytes)\n"
+msgstr ""
+
+#: C/index-in.docbook:8289
+msgid "Disconnecting signal handlers"
+msgstr ""
+
+#: C/index-in.docbook:8291
+msgid ""
+"Let's take another look at a Signal's <literal>connect</literal> method:"
+msgstr ""
+
+#: C/index-in.docbook:8296
+#, no-wrap
+msgid ""
+"\n"
+"sigc::connection signal&lt;void(int)&gt;::connect(const sigc::slot&lt;void(int)&gt;&amp;);\n"
+msgstr ""
+
+#: C/index-in.docbook:8301
+msgid ""
+"The returned <classname>sigc::connection</classname> can be used to control "
+"the connection. By keeping a connection object you can disconnect its "
+"associated signal handler using the <methodname>sigc::connection::"
+"disconnect()</methodname> method."
+msgstr ""
+
+#: C/index-in.docbook:8309
+msgid "Overriding default signal handlers"
+msgstr ""
+
+#: C/index-in.docbook:8311
+msgid ""
+"So far we've told you to perform actions in response to button-presses and "
+"the like by handling signals. That's certainly a good way to do things, but "
+"it's not the only way."
+msgstr ""
+
+#: C/index-in.docbook:8318
+msgid ""
+"Instead of laboriously connecting signal handlers to signals, you can simply "
+"make a new class which inherits from a widget - say, a Button - and then "
+"override the default signal handler, such as Button::on_clicked(). This can "
+"be a lot simpler than hooking up signal handlers for everything."
+msgstr ""
+
+#: C/index-in.docbook:8325
+msgid ""
+"Subclassing isn't always the best way to accomplish things. It is only "
+"useful when you want the widget to handle its own signal by itself. If you "
+"want some other class to handle the signal then you'll need to connect a "
+"separate handler. This is even more true if you want several objects to "
+"handle the same signal, or if you want one signal handler to respond to the "
+"same signal from different objects."
+msgstr ""
+
+#: C/index-in.docbook:8330
+msgid ""
+"<application>gtkmm</application> classes are designed with overriding in "
+"mind; they contain virtual member methods specifically intended to be "
+"overridden."
+msgstr ""
+
+#: C/index-in.docbook:8335
+msgid "Let's look at an example of overriding:"
+msgstr ""
+
+#: C/index-in.docbook:8340
+#, no-wrap
+msgid ""
+"\n"
+"#include &lt;gtkmm/button.h&gt;\n"
+"\n"
+"class OverriddenButton : public Gtk::Button\n"
+"{\n"
+"protected:\n"
+"  void on_clicked() override;\n"
+"}\n"
+"\n"
+"void OverriddenButton::on_clicked()\n"
+"{\n"
+"  std::cout &lt;&lt; \"Hello World\" &lt;&lt; std::endl;\n"
+"\n"
+"  // call the base class's version of the method:\n"
+"  Gtk::Button::on_clicked();\n"
+"}\n"
+msgstr ""
+
+#: C/index-in.docbook:8359
+msgid ""
+"Here we define a new class called <classname>OverriddenButton</classname>, "
+"which inherits from <classname>Gtk::Button</classname>. The only thing we "
+"change is the <methodname>on_clicked()</methodname> method, which is called "
+"whenever <classname>Gtk::Button</classname> emits the <literal>clicked</"
+"literal> signal. This method prints \"Hello World\" to <literal>stdout</"
+"literal>, and then calls the original, overridden method, to let "
+"<classname>Gtk::Button</classname> do what it would have done had we not "
+"overridden."
+msgstr ""
+
+#: C/index-in.docbook:8370
+msgid ""
+"You don't always need to call the parent's method; there are times when you "
+"might not want to. Note that we called the parent method <emphasis>after</"
+"emphasis> writing \"Hello World\", but we could have called it before. In "
+"this simple example, it hardly matters much, but there are times when it "
+"will. With connected signal handlers, it's not quite so easy to change "
+"details like this, and you can do something here which you can't do at all "
+"with connected signal handlers: you can call the parent method in the "
+"<emphasis>middle</emphasis> of your custom code."
+msgstr ""
+
+#: C/index-in.docbook:8384
+msgid "Binding extra arguments"
+msgstr ""
+
+#: C/index-in.docbook:8391
+#, no-wrap
+msgid ""
+"\n"
+"m_button1.signal_clicked().connect(sigc::bind(sigc::mem_fun(*this, &amp;HelloWorld::on_button_clicked), 
\"button 1\"));\n"
+msgstr ""
+"\n"
+"m_button1.signal_clicked().connect(sigc::bind(sigc::mem_fun(*this, &amp;HelloWorld::on_button_clicked), 
\"button 1\"));\n"
+
+#: C/index-in.docbook:8398
+#, no-wrap
+msgid ""
+"\n"
+"void on_button_clicked(const Glib::ustring&amp; data);\n"
+msgstr ""
+
+#: C/index-in.docbook:8385
+msgid ""
+"If you use one signal handler to catch the same signal from several widgets, "
+"you might like that signal handler to receive some extra information. For "
+"instance, you might want to know which button was clicked. You can do this "
+"with <function>sigc::bind()</function>. Here's some code from the <link "
+"linkend=\"sec-helloworld2\">helloworld2</link> example. <_:programlisting-1/"
+"> This says that we want the signal to send an extra <classname>Glib::"
+"ustring</classname> argument to the signal handler, and that the value of "
+"that argument should be \"button 1\". Of course we will need to add that "
+"extra argument to the declaration of our signal handler: <_:programlisting-2/"
+"> Of course, a normal \"clicked\" signal handler would have no arguments."
+msgstr ""
+
+#: C/index-in.docbook:8403
+msgid ""
+"<function>sigc::bind()</function> is not commonly used, but you might find "
+"it helpful sometimes. If you are familiar with <application>GTK</"
+"application> programming then you have probably noticed that this is similar "
+"to the extra <literal>gpointer data</literal> arguments which all GTK "
+"callbacks have. This is generally overused in <application>GTK</application> "
+"to pass information that should be stored as member data in a derived "
+"widget, but widget derivation is very difficult in C. We have far less need "
+"of this hack in <application>gtkmm</application>."
+msgstr ""
+
+#: C/index-in.docbook:8415
+msgid "X Event signals"
+msgstr ""
+
+#: C/index-in.docbook:8416
+msgid ""
+"The <classname>Widget</classname> class has some special signals which "
+"correspond to the underlying X-Windows events. These are suffixed by "
+"<literal>_event</literal>; for instance, <methodname>Widget::"
+"signal_button_press_event()</methodname>."
+msgstr ""
+
+#: C/index-in.docbook:8422
+msgid ""
+"You might occasionally find it useful to handle X events when there's "
+"something you can't accomplish with normal signals. <classname>Gtk::Button</"
+"classname>, for example, does not send mouse-pointer coordinates with its "
+"<literal>clicked</literal> signal, but you could handle "
+"<literal>button_press_event</literal> if you needed this information. X "
+"events are also often used to handle key-presses."
+msgstr ""
+
+#: C/index-in.docbook:8431
+msgid ""
+"These signals behave slightly differently. The value returned from the "
+"signal handler indicates whether it has fully \"handled\" the event. If the "
+"value is <literal>false</literal> then <application>gtkmm</application> will "
+"pass the event on to the next signal handler. If the value is <literal>true</"
+"literal> then no other signal handlers will need to be called."
+msgstr ""
+
+#: C/index-in.docbook:8436
+msgid ""
+"Handling an X event doesn't affect the Widget's other signals. If you handle "
+"<literal>button_press_event</literal> for <classname>Gtk::Button</"
+"classname>, you'll still be able to get the <literal>clicked</literal> "
+"signal. They are emitted at (nearly) the same time."
+msgstr ""
+
+#: C/index-in.docbook:8445
+#, no-wrap
+msgid ""
+"\n"
+"bool on_button_press(GdkEventButton* event);\n"
+"Gtk::Button button(\"label\");\n"
+"button.signal_button_press_event().connect( sigc::ptr_fun(&amp;on_button_press) );\n"
+msgstr ""
+
+#: C/index-in.docbook:8451
+msgid ""
+"When the mouse is over the button and a mouse button is pressed, "
+"<methodname>on_button_press()</methodname> will be called."
+msgstr ""
+
+#: C/index-in.docbook:8456
+msgid ""
+"<type>GdkEventButton</type> is a structure containing the event's "
+"parameters, such as the coordinates of the mouse pointer at the time the "
+"button was pressed. There are several different types of <type>GdkEvent</"
+"type> structures for the various events."
+msgstr ""
+
+#: C/index-in.docbook:8464
+msgid "Signal Handler sequence"
+msgstr ""
+
+#: C/index-in.docbook:8472
+#, no-wrap
+msgid ""
+"\n"
+"button.signal_button_press_event().connect( sigc::ptr_fun(&amp;on_mywindow_button_press), false );\n"
+msgstr ""
+
+#: C/index-in.docbook:8465
+msgid ""
+"By default, your signal handlers are called after any previously-connected "
+"signal handlers. However, this can be a problem with the X Event signals. "
+"For instance, the existing signal handlers, or the default signal handler, "
+"might return <literal>true</literal> to stop other signal handlers from "
+"being called. To specify that your signal handler should be called before "
+"the other signal handlers, so that it will always be called, you can specify "
+"<literal>false</literal> for the optional <literal>after</literal> "
+"parameter. For instance, <_:programlisting-1/>"
+msgstr ""
+
+#: C/index-in.docbook:8476
+msgid ""
+"The event is delivered first to the widget the event occurred in. If all "
+"signal handlers in that widget return <literal>false</literal> (indicating "
+"that the event has not been handled), then the signal will be propagated to "
+"the parent widget and emitted there. This continues all the way up to the "
+"top-level widget if no one handles the event."
+msgstr ""
+
+#: C/index-in.docbook:8487
+msgid "Exceptions in signal handlers"
+msgstr ""
+
+#: C/index-in.docbook:8488
+msgid ""
+"When a program is aborted because of an unhandled C++ exception, it's "
+"sometimes possible to use a debugger to find the location where the "
+"exception was thrown. This is more difficult than usual if the exception was "
+"thrown from a signal handler."
+msgstr ""
+
+#: C/index-in.docbook:8493
+msgid ""
+"This section describes primarily what you can expect on a Linux system, when "
+"you use <ulink url=\"http://www.gnu.org/software/gdb/\";>the gdb debugger</"
+"ulink>."
+msgstr ""
+
+#: C/index-in.docbook:8500
+#, no-wrap
+msgid ""
+"\n"
+"// without_signal.cc\n"
+"#include &lt;gtkmm.h&gt;\n"
+"\n"
+"bool throwSomething()\n"
+"{\n"
+"  throw \"Something\";\n"
+"  return true;\n"
+"}\n"
+"\n"
+"int main(int argc, char** argv)\n"
+"{\n"
+"  throwSomething();\n"
+"  auto app = Gtk::Application::create(\"org.gtkmm.without_signal\");\n"
+"  return app-&gt;run();\n"
+"}\n"
+msgstr ""
+
+#: C/index-in.docbook:8497
+msgid ""
+"First, let's look at a simple example where an exception is thrown from a "
+"normal function (no signal handler). <_:programlisting-1/>"
+msgstr ""
+
+#: C/index-in.docbook:8521
+#, no-wrap
+msgid ""
+"\n"
+"&gt; gdb without_signal\n"
+"(gdb) run\n"
+"terminate called after throwing an instance of 'char const*'\n"
+"\n"
+"Program received signal SIGABRT, Aborted.\n"
+"(gdb) backtrace\n"
+"#7  0x08048864 in throwSomething () at without_signal.cc:6\n"
+"#8  0x0804887d in main (argc=1, argv=0xbfffecd4) at without_signal.cc:12\n"
+msgstr ""
+
+#: C/index-in.docbook:8518
+msgid ""
+"Here is an excerpt from a <application>gdb</application> session. Only the "
+"most interesting parts of the output are shown. <_:programlisting-1/> You "
+"can see that the exception was thrown from <filename>without_signal.cc</"
+"filename>, line 6 (<code>throw \"Something\";</code>)."
+msgstr ""
+
+#: C/index-in.docbook:8537
+#, no-wrap
+msgid ""
+"\n"
+"// with_signal.cc\n"
+"#include &lt;gtkmm.h&gt;\n"
+"\n"
+"bool throwSomething()\n"
+"{\n"
+"  throw \"Something\";\n"
+"  return true;\n"
+"}\n"
+"\n"
+"int main(int argc, char** argv)\n"
+"{\n"
+"  Glib::signal_timeout().connect(sigc::ptr_fun(throwSomething), 500);\n"
+"  auto app = Gtk::Application::create(\"org.gtkmm.with_signal\");\n"
+"  app-&gt;hold();\n"
+"  return app-&gt;run();\n"
+"}\n"
+msgstr ""
+
+#: C/index-in.docbook:8534
+msgid ""
+"Now let's see what happens when an exception is thrown from a signal "
+"handler. Here's the source code. <_:programlisting-1/>"
+msgstr ""
+
+#: C/index-in.docbook:8558
+#, no-wrap
+msgid ""
+"\n"
+"&gt; gdb with_signal\n"
+"(gdb) run\n"
+"(with_signal:2703): glibmm-ERROR **:\n"
+"unhandled exception (type unknown) in signal handler\n"
+"\n"
+"Program received signal SIGTRAP, Trace/breakpoint trap.\n"
+"(gdb) backtrace\n"
+"#2  0x0063c6ab in glibmm_unexpected_exception () at exceptionhandler.cc:77\n"
+"#3  Glib::exception_handlers_invoke () at exceptionhandler.cc:150\n"
+"#4  0x0063d370 in glibmm_source_callback (data=0x804d620) at main.cc:212\n"
+"#13 0x002e1b31 in Gtk::Application::run (this=0x804f300) at application.cc:178\n"
+"#14 0x08048ccc in main (argc=1, argv=0xbfffecd4) at with_signal.cc:16\n"
+msgstr ""
+
+#: C/index-in.docbook:8556
+msgid ""
+"And here's an excerpt from a <application>gdb</application> session. <_:"
+"programlisting-1/> The exception is caught in <application>glibmm</"
+"application>, and the program ends with a call to <function>g_error()</"
+"function>. Other exceptions may result in different behaviour, but in any "
+"case the exception from a signal handler is caught in <application>glibmm</"
+"application> or <application>gtkmm</application>, and <application>gdb</"
+"application> can't see where it was thrown."
+msgstr ""
+
+#: C/index-in.docbook:8581
+#, no-wrap
+msgid ""
+"\n"
+"&gt; gdb with_signal\n"
+"(gdb) catch throw\n"
+"Catchpoint 1 (throw)\n"
+"(gdb) run\n"
+"Catchpoint 1 (exception thrown), 0x00714ff0 in __cxa_throw ()\n"
+"(gdb) backtrace\n"
+"#0  0x00714ff0 in __cxa_throw () from /usr/lib/i386-linux-gnu/libstdc++.so.6\n"
+"#1  0x08048bd4 in throwSomething () at with_signal.cc:6\n"
+"(gdb) continue\n"
+"Continuing.\n"
+"(with_signal:2375): glibmm-ERROR **\n"
+"unhandled exception (type unknown) in signal handler\n"
+"\n"
+"Program received signal SIGTRAP, Trace/breakpoint trap.\n"
+msgstr ""
+
+#: C/index-in.docbook:8578
+msgid ""
+"To see where the exception is thrown, you can use the <application>gdb</"
+"application> command <userinput>catch throw</userinput>. <_:programlisting-1/"
+">"
+msgstr ""
+
+#: C/index-in.docbook:8602
+#, no-wrap
+msgid ""
+"\n"
+"(gdb) catch throw\n"
+"(gdb) commands\n"
+"(gdb)   backtrace\n"
+"(gdb)   continue\n"
+"(gdb)   end\n"
+"(gdb) set pagination off\n"
+"(gdb) run\n"
+msgstr ""
+
+#: C/index-in.docbook:8598
+msgid ""
+"If there are many caught exceptions before the interesting uncaught one, "
+"this method can be tedious. It can be automated with the following "
+"<application>gdb</application> commands. <_:programlisting-1/> These "
+"commands will print a backtrace from each <code>throw</code> and continue. "
+"The backtrace from the last (or possibly the last but one) <code>throw</"
+"code> before the program stops, is the interesting one."
+msgstr ""
+
+#: C/index-in.docbook:8621
+msgid "Creating your own signals"
+msgstr ""
+
+#: C/index-in.docbook:8622
+msgid ""
+"Now that you've seen signals and signal handlers in <application>gtkmm</"
+"application>, you might like to use the same technique to allow interaction "
+"between your own classes. That's actually very simple by using the "
+"<application>libsigc++</application> library directly."
+msgstr ""
+
+#: C/index-in.docbook:8628
+msgid ""
+"This isn't purely a <application>gtkmm</application> or GUI issue. "
+"<application>gtkmm</application> uses <application>libsigc++</application> "
+"to implement its proxy wrappers for the <application>GTK</application> "
+"signal system, but for new, non-GTK signals, you can create pure C++ "
+"signals, using the <classname>sigc::signal&lt;&gt;</classname> template."
+msgstr ""
+
+#: C/index-in.docbook:8639
+#, no-wrap
+msgid ""
+"\n"
+"sigc::signal&lt;void(bool, int)&gt; signal_something;\n"
+msgstr ""
+
+#: C/index-in.docbook:8635
+msgid ""
+"For instance, to create a signal that sends 2 parameters, a <type>bool</"
+"type> and an <type>int</type>, just declare a <classname>sigc::signal</"
+"classname>, like so: <_:programlisting-1/>"
+msgstr ""
+
+#: C/index-in.docbook:8647
+#, no-wrap
+msgid ""
+"\n"
+"class Server\n"
+"{\n"
+"public:\n"
+"  //signal accessor:\n"
+"  using type_signal_something = sigc::signal&lt;void(bool, int)&gt;;\n"
+"  type_signal_something signal_something();\n"
+"\n"
+"protected:\n"
+"  type_signal_something m_signal_something;\n"
+"};\n"
+"\n"
+"Server::type_signal_something Server::signal_something()\n"
+"{\n"
+"  return m_signal_something;\n"
+"}\n"
+msgstr ""
+
+#: C/index-in.docbook:8643
+msgid ""
+"You could just declare that signal as a public member variable, but some "
+"people find that distasteful and prefer to make it available via an accessor "
+"method, like so: <_:programlisting-1/>"
+msgstr ""
+
+#: C/index-in.docbook:8669
+#, no-wrap
+msgid ""
+"\n"
+"server.signal_something().connect(\n"
+"  sigc::mem_fun(client, &amp;Client::on_server_something) );\n"
+msgstr ""
+
+#: C/index-in.docbook:8666
+msgid ""
+"You can then connect to the signal using the same syntax used when "
+"connecting to <application>gtkmm</application> signals. For instance, <_:"
+"programlisting-1/>"
+msgstr ""
+
+#: C/index-in.docbook:8677
+msgid "This is a full working example that defines and uses custom signals."
+msgstr ""
+
+#: C/index-in.docbook:8681
+msgid ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/signals/custom/\">Source Code</ulink>"
+msgstr ""
+
+#: C/index-in.docbook:8689
+msgid "Comparison with other signalling systems"
+msgstr ""
+
+#: C/index-in.docbook:8690
+msgid ""
+"(An aside: <application>GTK</application> calls this scheme \"signalling\"; "
+"the sharp-eyed reader with GUI toolkit experience will note that this same "
+"design is often seen under the name of \"broadcaster-listener\" (e.g., in "
+"Metrowerks' PowerPlant framework for the Macintosh). It works in much the "
+"same way: one sets up <literal>broadcasters</literal>, and then connects "
+"<literal>listeners</literal> to them; the broadcaster keeps a list of the "
+"objects listening to it, and when someone gives the broadcaster a message, "
+"it calls all of its objects in its list with the message. In "
+"<application>gtkmm</application>, signal objects play the role of "
+"broadcasters, and slots play the role of listeners - sort of. More on this "
+"later.)"
+msgstr ""
+
+#: C/index-in.docbook:8704
+msgid ""
+"<application>gtkmm</application> signal handlers are strongly-typed, whereas "
+"<application>GTK</application> C code allows you to connect a callback with "
+"the wrong number and type of arguments, leading to a segfault at runtime. "
+"And, unlike <application>Qt</application>, <application>gtkmm</application> "
+"achieves this without modifying the C++ language."
+msgstr ""
+
+#: C/index-in.docbook:8710
+msgid ""
+"Re. Overriding signal handlers: You can do this in the straight-C world of "
+"GTK too; that's what GTK's object system is for. But in GTK, you have to go "
+"through some complicated procedures to get object-oriented features like "
+"inheritance and overloading. In C++, it's simple, since those features are "
+"supported in the language itself; you can let the compiler do the dirty work."
+msgstr ""
+
+#: C/index-in.docbook:8718
+msgid ""
+"This is one of the places where the beauty of C++ really comes out. One "
+"wouldn't think of subclassing a GTK widget simply to override its action "
+"method; it's just too much trouble. In GTK, you almost always use signals to "
+"get things done, unless you're writing a new widget. But because overriding "
+"methods is so easy in C++, it's entirely practical - and sensible - to "
+"subclass a button for that purpose."
+msgstr ""
+
+#: C/index-in.docbook:8729
+msgid "<application>gtkmm</application> and Win32"
+msgstr ""
+
+#: C/index-in.docbook:8730
+msgid ""
+"One of the major advantages of <application>gtkmm</application> is that it "
+"is crossplatform. <application>gtkmm</application> programs written on other "
+"platforms such as GNU/Linux can generally be transferred to Windows (and "
+"vice versa) with few modifications to the source."
+msgstr ""
+
+#: C/index-in.docbook:8735
+msgid ""
+"<application>gtkmm</application> currently works with the <ulink url="
+"\"http://mingw.org/\";>MinGW/GCC compiler</ulink> with a compiler version "
+"that supports C++17, such as gcc 7 or 8. It also works with Microsoft Visual "
+"C++ 2017 15.7.x or later (including the freely available express/community "
+"editions) on the Windows platform. There is an <ulink url=\"ftp://ftp.gnome.";
+"org/pub/GNOME/binaries/win32/gtkmm\">installer</ulink> available for "
+"<application>gtkmm</application> on Microsoft Windows, but as of this "
+"writing (October 2020) it has not been updated for a long time. Please be "
+"aware that although normally it is fine to mix builds done with Visual "
+"Studio 2017 and 2019, please do not do so when building <application>gtkmm</"
+"application> with its -mm dependencies."
+msgstr ""
+
+#: C/index-in.docbook:8748
+msgid ""
+"Refer to the <ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm/tree/master/";
+"README.win32\">README.win32</ulink>, as well as the <ulink url=\"https://";
+"gitlab.gnome.org/GNOME/gtkmm/tree/master/MSVC_NMake/README\">README</ulink> "
+"files in the <application>gtkmm</application>, pangomm and glibmm for "
+"instructions on how to build <application>gtkmm</application> on Windows."
+msgstr ""
+
+#: C/index-in.docbook:8755
+msgid "Working with gtkmm's Source Code"
+msgstr ""
+
+#: C/index-in.docbook:8756
+msgid ""
+"If you are interested in helping out with the development of "
+"<application>gtkmm</application>, or fixing a bug in <application>gtkmm</"
+"application>, you'll probably need to build the development version of "
+"<application>gtkmm</application>. However, you should not install a "
+"development version over your stable version. Instead, you should install it "
+"alongside your existing <application>gtkmm</application> installation, in a "
+"separate path."
+msgstr ""
+
+#: C/index-in.docbook:8763
+msgid ""
+"The easiest way to do this is using <ulink url=\"https://wiki.gnome.org/";
+"Projects/Jhbuild\">jhbuild</ulink>. <application>jhbuild</application> is a "
+"program that makes building GNOME software much easier by calculating "
+"dependencies and building things in the correct order. This section will "
+"give a brief explanation of how to set up <application>jhbuild</application> "
+"to build and install <application>gtkmm</application> from the source "
+"repository (git). For up-to-date information on <application>jhbuild</"
+"application>, please refer to the <ulink url=\"http://developer.gnome.org/";
+"jhbuild/unstable/\">jhbuild manual</ulink>. If you need assistance using "
+"<application>jhbuild</application>, you should ask for help on the <ulink "
+"url=\"http://mail.gnome.org/mailman/listinfo/gnome-love\";>gnome-love mailing "
+"list</ulink>."
+msgstr ""
+
+#: C/index-in.docbook:8779
+msgid ""
+"Note that to build <application>gtkmm</application> from git, you'll often "
+"need to build many of its dependencies from git as well. "
+"<application>jhbuild</application> makes this easier than it would normally "
+"be, but it will take quite a while to build and install them all. You will "
+"probably encounter build problems, though these will usually be corrected "
+"quickly if you report them."
+msgstr ""
+
+#: C/index-in.docbook:8788
+msgid "Setting up jhbuild"
+msgstr ""
+
+#: C/index-in.docbook:8797
+#, no-wrap
+msgid "$ cp examples/sample.jhbuildrc ~/.config/jhbuildrc"
+msgstr ""
+
+#: C/index-in.docbook:8789
+msgid ""
+"To set up <application>jhbuild</application>, follow the basic installation "
+"instructions from the <ulink url=\"http://developer.gnome.org/jhbuild/";
+"unstable/\">jhbuild manual</ulink>. After you have installed "
+"<application>jhbuild</application>, you should copy the sample "
+"<application>jhbuild</application> configuration file into your home "
+"directory by executing the following command from the <application>jhbuild</"
+"application> directory: <_:screen-1/>"
+msgstr ""
+
+#: C/index-in.docbook:8806
+#, no-wrap
+msgid "moduleset = 'gnome-world'"
+msgstr ""
+
+#: C/index-in.docbook:8799
+msgid ""
+"The <application>gtkmm</application> module is defined in the "
+"<filename>gnome-suites-core-deps-x.y.modules</filename> moduleset, but if "
+"you are interested in the latest version, it's easier to let "
+"<application>jhbuild</application> read from <filename>gnome-world.modules</"
+"filename>. It always includes the latest version of other <filename>."
+"modules</filename> files. So edit your <filename>jhbuildrc</filename> file "
+"and set your moduleset setting like so: <_:programlisting-1/>"
+msgstr ""
+
+#: C/index-in.docbook:8813
+#, no-wrap
+msgid "modules = [ 'gtkmm' ]"
+msgstr ""
+
+#: C/index-in.docbook:8808
+msgid ""
+"After setting the correct moduleset, you need to tell <application>jhbuild</"
+"application> which module or modules to build. To build <application>gtkmm</"
+"application> and all of its dependencies, set <varname>modules</varname> "
+"like so: <_:programlisting-1/>"
+msgstr ""
+
+#: C/index-in.docbook:8815
+msgid ""
+"You can build several modules by setting the <varname>modules</varname> "
+"variable to a meta-package, e.g. <literal>meta-gnome-core</literal>, or "
+"listing more than one module name. The <varname>modules</varname> variable "
+"specifies which modules will be built when you don't explicitly specify "
+"anything on the command line. You can always build a different moduleset "
+"later by specifying it on the commandline (e.g. <command>jhbuild build "
+"gtkmm</command>)."
+msgstr ""
+
+#: C/index-in.docbook:8825
+msgid "Setting a prefix"
+msgstr ""
+
+#: C/index-in.docbook:8826
+msgid ""
+"By default, <application>jhbuild</application>'s configuration is configured "
+"to install all software built with <application>jhbuild</application> under "
+"the <filename>/opt/gnome</filename> prefix. You can choose a different "
+"prefix, but it is recommended that you keep this prefix different from other "
+"software that you've installed (don't set it to <filename>/usr</filename>!) "
+"If you've followed the jhbuild instructions then this prefix belongs to your "
+"user, so you don't need to run jhbuild as <literal>root</literal>."
+msgstr ""
+
+#: C/index-in.docbook:8838
+msgid ""
+"When you downloaded <application>jhbuild</application> from the git "
+"repository, you got a number of <filename>.modules</filename> files, "
+"specifying dependencies between modules. By default <application>jhbuild</"
+"application> does not use the downloaded versions of these files, but reads "
+"the latest versions in the git repository. This is usually what you want. If "
+"you don't want it, use the <varname>use_local_modulesets</varname> variable "
+"in <filename>.jhbuildrc</filename>."
+msgstr ""
+
+#: C/index-in.docbook:8849
+msgid ""
+"Installing and Using the git version of <application>gtkmm</application>"
+msgstr ""
+
+#: C/index-in.docbook:8857
+#, no-wrap
+msgid ""
+"$ jhbuild bootstrap\n"
+"$ jhbuild sanitycheck"
+msgstr ""
+
+#: C/index-in.docbook:8850
+msgid ""
+"Once you've configured <application>jhbuild</application> as described "
+"above, building <application>gtkmm</application> should be relatively "
+"straightforward. The first time you run <application>jhbuild</application>, "
+"you should run the following sequence of commands to ensure that "
+"<application>jhbuild</application> has the required tools and verify that it "
+"is set up correctly: <_:screen-1/>"
+msgstr ""
+
+#: C/index-in.docbook:8861
+msgid ""
+"Installing <application>gtkmm</application> with <application>jhbuild</"
+"application>"
+msgstr ""
+
+#: C/index-in.docbook:8862
+msgid ""
+"If everything worked correctly, you should be able to build "
+"<application>gtkmm</application> and all of its dependencies from git by "
+"executing <command>jhbuild build</command> (or, if you didn't specify "
+"<application>gtkmm</application> in the <varname>modules</varname> variable, "
+"with the command <command>jhbuild build gtkmm</command>)."
+msgstr ""
+
+#: C/index-in.docbook:8869
+msgid ""
+"This command will build and install a series of modules and will probably "
+"take quite a long time the first time through. After the first time, "
+"however, it should go quite a bit faster since it only needs to rebuild "
+"files that changed since the last build. Alternatively, after you've built "
+"and installed <application>gtkmm</application> the first time, you can "
+"rebuild <application>gtkmm</application> by itself (without rebuilding all "
+"of its dependencies) with the command <command>jhbuild buildone gtkmm</"
+"command>."
+msgstr ""
+
+#: C/index-in.docbook:8880
+msgid "Using the git version of <application>gtkmm</application>"
+msgstr ""
+
+#: C/index-in.docbook:8881
+msgid ""
+"After you've installed the git version of <application>gtkmm</application>, "
+"you're ready to start using and experimenting with it. In order to use the "
+"new version of <application>gtkmm</application> you've just installed, you "
+"need to set some environment variables so that your <filename>configure</"
+"filename> script knows where to find the new libraries. Fortunately, "
+"<application>jhbuild</application> offers an easy solution to this problem. "
+"Executing the command <command>jhbuild shell</command> will start a new "
+"shell with all of the correct environment variables set. Now if you re-"
+"configure and build your project just as you usually do, it should link "
+"against the newly installed libraries. To return to your previous "
+"environment, simply exit the <application>jhbuild</application> shell."
+msgstr ""
+
+#: C/index-in.docbook:8895
+msgid ""
+"Once you've built your software, you'll need to run your program within the "
+"jhbuild environment as well. To do this, you can again use the "
+"<command>jhbuild shell</command> command to start a new shell with the "
+"<application>jhbuild</application> environment set up. Alternatively, you "
+"can execute a one-off command in the <application>jhbuild</application> "
+"environment using the following command: <command>jhbuild run command-name</"
+"command>. In this case, the command will be run with the correct environment "
+"variables set, but will return to your previous environment after the "
+"program exits."
+msgstr ""
+
+#: C/index-in.docbook:8912
+msgid "Wrapping C Libraries with gmmproc"
+msgstr ""
+
+#: C/index-in.docbook:8913
+msgid ""
+"<application>gtkmm</application> uses the <command>gmmproc</command> tool to "
+"generate most of its source code, using .defs files that define the APIs of "
+"<classname>GObject</classname>-based libraries. So it's quite easy to create "
+"additional gtkmm-style wrappers of other glib/GObject-based libraries."
+msgstr ""
+
+#: C/index-in.docbook:8918
+msgid ""
+"This involves a variety of tools, some of them crufty, but at least they "
+"work, and has been used successfully by several projects."
+msgstr ""
+
+#: C/index-in.docbook:8923
+msgid "The build structure"
+msgstr ""
+
+#: C/index-in.docbook:8924
+msgid ""
+"Generation of the source code for a gtkmm-style wrapper API requires use of "
+"tools such as <command>gmmproc</command> and <filename>generate_wrap_init."
+"pl</filename>, which are included in <application>glibmm</application>. In "
+"theory you could write your own build files to use these appropriately, but "
+"a much better option is to make use of the build infrastructure provided by "
+"the <application>mm-common</application> module. To get started, it helps a "
+"lot to pick an existing binding module as an example to look at."
+msgstr ""
+
+#: C/index-in.docbook:8932
+msgid ""
+"For instance, let's pretend that we are wrapping a C library called "
+"libsomething. It provides a <classname>GObject</classname>-based API with "
+"types named, for instance, <classname>SomeWidget</classname> and "
+"<classname>SomeStuff</classname>."
+msgstr ""
+
+#: C/index-in.docbook:8938
+msgid "Copying the skeleton project"
+msgstr ""
+
+#: C/index-in.docbook:8945
+#, no-wrap
+msgid ""
+"\n"
+"  $ git clone https://gitlab.gnome.org/GNOME/mm-common.git\n";
+"  $ cp -a mm-common/skeletonmm libsomethingmm\n"
+msgstr ""
+
+#: C/index-in.docbook:8940
+msgid ""
+"Typically our wrapper library would be called libsomethingmm. We can start "
+"by copying the <ulink url=\"https://gitlab.gnome.org/GNOME/mm-common/tree/";
+"master/skeletonmm\"> skeleton source tree</ulink> from the <application>mm-"
+"common</application> module. Starting with <application>mm-common</"
+"application> 1.0.0 this skeleton application is built with the <ulink url="
+"\"https://mesonbuild.com/\";>Meson build system</ulink>. <_:programlisting-1/>"
+msgstr ""
+
+#: C/index-in.docbook:8955
+msgid "<filename>libsomethingmm</filename>: The top-level directory."
+msgstr ""
+
+#: C/index-in.docbook:8957
+msgid ""
+"<filename>libsomething</filename>: Contains the main include file and the "
+"pkg-config .pc file."
+msgstr ""
+
+#: C/index-in.docbook:8959
+msgid "<filename>src</filename>: Contains .hg and .ccg source files."
+msgstr ""
+
+#: C/index-in.docbook:8960
+msgid ""
+"<filename>libsomethingmm</filename>: Contains hand-written .h and .cc files."
+msgstr ""
+
+#: C/index-in.docbook:8950
+msgid ""
+"This provides a directory structure for the source .hg and .ccg files and "
+"the hand-written .h and .cc files, with <filename>meson.build</filename> "
+"files that can specify the various files in use, in terms of Meson "
+"variables. The directory structure usually looks like this, after we have "
+"renamed the directories appropriately: <_:itemizedlist-1/>"
+msgstr ""
+
+#: C/index-in.docbook:8971
+#, no-wrap
+msgid ""
+"\n"
+"$ for f in $(find libsomethingmm -depth -name '*skeleton*'); do \\\n"
+"    d=\"${f%/*}\"; b=\"${f##*/}\"; mv \"$f\" \"$d/${b//skeleton/libsomething}\"; \\\n"
+"  done\n"
+msgstr ""
+
+#: C/index-in.docbook:8969
+msgid ""
+"As well as renaming the directories, we should rename some of the source "
+"files. For instance: <_:programlisting-1/> A number of the skeleton files "
+"must still be filled in with project-specific content later."
+msgstr ""
+
+#: C/index-in.docbook:8978
+msgid ""
+"Note that files ending in <filename>.in</filename> will be used to generate "
+"files with the same name but without the <filename>.in</filename> suffix, by "
+"replacing some variables with actual values during the configure stage."
+msgstr ""
+
+#: C/index-in.docbook:8981
+msgid ""
+"Generated files are saved in the build tree, which is separated from the "
+"source tree when <command>meson</command> and <command>ninja</command> are "
+"used."
+msgstr ""
+
+#: C/index-in.docbook:8986
+msgid "Modifying build files"
+msgstr ""
+
+#: C/index-in.docbook:8988
+msgid ""
+"Now we edit the files to adapt them to our needs. You might prefer to use a "
+"multiple-file search-replace utility for this, such as <command>regexxer</"
+"command>. Note that nearly all of the files provided with the skeleton "
+"source tree contain placeholder text. Thus, the substitutions should be "
+"performed globally, and not be limited to the Meson files."
+msgstr ""
+
+#: C/index-in.docbook:8992
+msgid ""
+"All mentions of <varname>skeleton</varname> should be replaced by the "
+"correct name of the C library you are wrapping, such as \"something\" or "
+"\"libsomething\". In the same manner, all instances of <varname>SKELETON</"
+"varname> should be replaced by \"SOMETHING\" or \"LIBSOMETHING\", and all "
+"occurrences of <varname>Skeleton</varname> changed to \"Something\"."
+msgstr ""
+
+#: C/index-in.docbook:8996
+msgid ""
+"Likewise, replace all instances of <varname>Joe Hacker</varname> by the name "
+"of the intended copyright holder, which is probably you. Do the same for the "
+"<varname>joe example com</varname> email address."
+msgstr ""
+
+#: C/index-in.docbook:9001
+msgid "meson.build in the top-level directory"
+msgstr ""
+
+#: C/index-in.docbook:9004
+msgid ""
+"It is common for binding modules to track the version number of the library "
+"they are wrapping. So, for instance, if the C library is at version 1.23.4, "
+"then the initial version of the binding module would be 1.23.0. However, "
+"avoid starting with an even minor version number as that usually indicates a "
+"stable release."
+msgstr ""
+
+#: C/index-in.docbook:9009
+msgid ""
+"In the <function>project()</function> function, change the license and the C+"
+"+ version, if necessary."
+msgstr ""
+
+#: C/index-in.docbook:9011
+msgid ""
+"You probably need to add more required modules than <application>glibmm</"
+"application> and <application>skeleton</application> "
+"(<application>libsomething</application>)."
+msgstr ""
+
+#: C/index-in.docbook:9019
+msgid "Other meson.build files"
+msgstr ""
+
+#: C/index-in.docbook:9022
+msgid ""
+"<filename>skeleton/meson.build</filename>: Perhaps not much to change here "
+"more than the global name substitutions."
+msgstr ""
+
+#: C/index-in.docbook:9025
+msgid "<filename>skeleton/skeletonmm/meson.build</filename>"
+msgstr ""
+
+#: C/index-in.docbook:9028
+msgid "<varname>defs_basefiles</varname>"
+msgstr ""
+
+#: C/index-in.docbook:9029
+msgid "If we have more .defs and docs.xml files, we add them here."
+msgstr ""
+
+#: C/index-in.docbook:9033
+msgid "<varname>hg_ccg_basenames</varname>"
+msgstr ""
+
+#: C/index-in.docbook:9034
+msgid ""
+"We must mention all of our <filename>.hg</filename> and <filename>.ccg</"
+"filename> files here."
+msgstr ""
+
+#: C/index-in.docbook:9038
+msgid "<varname>extra_cc_files, extra_h_files</varname>"
+msgstr ""
+
+#: C/index-in.docbook:9039
+msgid ""
+"Any additional hand-written <filename>.h</filename> and <filename>.cc</"
+"filename> source files go here."
+msgstr ""
+
+#: C/index-in.docbook:9020
+msgid ""
+"Next we must adapt the other <filename>meson.build</filename> files: <_:"
+"itemizedlist-1/>"
+msgstr ""
+
+#: C/index-in.docbook:9049
+msgid "Creating .hg and .ccg files"
+msgstr ""
+
+#: C/index-in.docbook:9050
+msgid ""
+"We should now create our first <filename>.hg</filename> and <filename>.ccg</"
+"filename> files, to wrap one of the objects in the C library. One pair of "
+"example source files already exists: <filename>skeleton.ccg</filename> and "
+"<filename>skeleton.hg</filename>. Create copies of these files as necessary."
+msgstr ""
+
+#: C/index-in.docbook:9054
+msgid ""
+"In the <link linkend=\"sec-wrapping-hg-files\">.hg and .ccg files</link> "
+"section you can learn about the syntax used in these files."
+msgstr ""
+
+#: C/index-in.docbook:9061
+msgid "Generating the .defs files."
+msgstr ""
+
+#: C/index-in.docbook:9065
+msgid "objects (GObjects, widgets, interfaces, boxed-types and plain structs)"
+msgstr ""
+
+#: C/index-in.docbook:9066
+msgid "functions"
+msgstr ""
+
+#: C/index-in.docbook:9067
+msgid "enums"
+msgstr ""
+
+#: C/index-in.docbook:9068
+msgid "signals"
+msgstr ""
+
+#: C/index-in.docbook:9069
+msgid "properties"
+msgstr ""
+
+#: C/index-in.docbook:9070
+msgid "vfuncs"
+msgstr ""
+
+#: C/index-in.docbook:9062
+msgid ""
+"The <filename>.defs</filename> files are text files, in a lisp format, that "
+"describe the API of a C library, including its <_:itemizedlist-1/>"
+msgstr ""
+
+#: C/index-in.docbook:9079
+msgid "<filename>gtk.defs</filename>"
+msgstr ""
+
+#: C/index-in.docbook:9080
+msgid "Includes the other files."
+msgstr ""
+
+#: C/index-in.docbook:9083
+msgid "<filename>gtk_methods.defs</filename>"
+msgstr ""
+
+#: C/index-in.docbook:9084
+msgid "Objects and functions."
+msgstr ""
+
+#: C/index-in.docbook:9087
+msgid "<filename>gtk_enums.defs</filename>"
+msgstr ""
+
+#: C/index-in.docbook:9088
+msgid "Enumerations."
+msgstr ""
+
+#: C/index-in.docbook:9091
+msgid "<filename>gtk_signals.defs</filename>"
+msgstr ""
+
+#: C/index-in.docbook:9092
+msgid "Signals and properties."
+msgstr ""
+
+#: C/index-in.docbook:9095
+msgid "<filename>gtk_vfuncs.defs</filename>"
+msgstr ""
+
+#: C/index-in.docbook:9096
+msgid "vfuncs (function pointer member fields in structs), written by hand."
+msgstr ""
+
+#: C/index-in.docbook:9073
+msgid ""
+"At the moment, we have separate tools for generating different parts of "
+"these <filename>.defs</filename>, so we split them up into separate files. "
+"For instance, in the <filename>gtk/src</filename> directory of the "
+"<application>gtkmm</application> sources, you will find these files: <_:"
+"variablelist-1/>"
+msgstr ""
+
+#: C/index-in.docbook:9100
+msgid ""
+"The <filename>skeletonmm/tools/generate_defs_and_docs.sh</filename> script "
+"generates all <filename>.defs</filename> files and the <filename>*_docs.xml</"
+"filename> file, described in the <link linkend=\"sec-wrapping-documentation"
+"\">Documentation</link> section."
+msgstr ""
+
+#: C/index-in.docbook:9106
+msgid "Generating the methods .defs"
+msgstr ""
+
+#: C/index-in.docbook:9110
+#, no-wrap
+msgid ""
+"\n"
+"$ ./h2def.py /usr/include/gtk-4.0/gtk/*.h &gt; gtk_methods.defs\n"
+msgstr ""
+
+#: C/index-in.docbook:9107
+msgid ""
+"This <filename>.defs</filename> file describes objects and their functions. "
+"It is generated by the <command>h2def.py</command> script which you can find "
+"in glibmm's <filename>tools/defs_gen</filename> directory. For instance, <_:"
+"programlisting-1/>"
+msgstr ""
+
+#: C/index-in.docbook:9117
+msgid "Generating the enums .defs"
+msgstr ""
+
+#: C/index-in.docbook:9121
+#, no-wrap
+msgid ""
+"\n"
+"$ ./enum.pl /usr/include/gtk-4.0/gtk/*.h &gt; gtk_enums.defs\n"
+msgstr ""
+
+#: C/index-in.docbook:9118
+msgid ""
+"This <filename>.defs</filename> file describes enum types and their possible "
+"values. It is generated by the <filename>enum.pl</filename> script which you "
+"can find in glibmm's <filename>tools</filename> directory. For instance, <_:"
+"programlisting-1/>"
+msgstr ""
+
+#: C/index-in.docbook:9128
+msgid "Generating the signals and properties .defs"
+msgstr ""
+
+#: C/index-in.docbook:9133
+#, no-wrap
+msgid ""
+"\n"
+"$ cd tools/extra_defs_gen\n"
+"$ ./generate_extra_defs &gt; gtk_signals.defs\n"
+msgstr ""
+
+#: C/index-in.docbook:9129
+msgid ""
+"This <filename>.defs</filename> file describes signals and properties. It is "
+"generated by the special <filename>generate_extra_defs</filename> utility "
+"that is in every wrapping project, such as <filename>gtkmm/tools/"
+"extra_defs_gen/</filename>. For instance <_:programlisting-1/>"
+msgstr ""
+
+#: C/index-in.docbook:9138
+msgid ""
+"You must edit the source code of your own <filename>generate_extra_defs</"
+"filename> tool in order to generate the <filename>.defs</filename> for the "
+"GObject C types that you wish to wrap. In the skeleton source tree, the "
+"source file is named <filename>tools/extra_defs_gen/generate_defs_skeleton."
+"cc</filename>. If not done so already, the file should be renamed, with the "
+"basename of your new binding substituted for the <varname>skeleton</varname> "
+"placeholder. The <filename>tools/extra_defs_gen/meson.build</filename> file "
+"should also mention the new source filename."
+msgstr ""
+
+#: C/index-in.docbook:9147
+#, no-wrap
+msgid ""
+"\n"
+"#include &lt;glibmm_generate_extra_defs/generate_extra_defs.h&gt;\n"
+"#include &lt;libsomething.h&gt;\n"
+"#include &lt;iostream&gt;\n"
+"\n"
+"int main(int, char**)\n"
+"{\n"
+"  something_init();\n"
+"\n"
+"  std::cout &lt;&lt; get_defs(SOME_TYPE_WIDGET)\n"
+"            &lt;&lt; get_defs(SOME_TYPE_STUFF);\n"
+"  return 0;\n"
+"}\n"
+msgstr ""
+
+#: C/index-in.docbook:9145
+msgid ""
+"Then edit the <filename>.cc</filename> file to specify the correct types. "
+"For instance, your <function>main()</function> function might look like "
+"this: <_:programlisting-1/>"
+msgstr ""
+
+#: C/index-in.docbook:9165
+msgid "Writing the vfuncs .defs"
+msgstr ""
+
+#: C/index-in.docbook:9166
+msgid ""
+"This <filename>.defs</filename> file describes virtual functions (vfuncs). "
+"It must be written by hand. There is the skeleton file <filename>skeleton/"
+"src/skeleton_vfunc.defs</filename> to start from. You can also look at "
+"<application>gtkmm</application>'s <filename>gtk/src/gtk_vfuncs.defs</"
+"filename> file."
+msgstr ""
+
+#: C/index-in.docbook:9177
+msgid "The .hg and .ccg files"
+msgstr ""
+
+#: C/index-in.docbook:9178
+msgid ""
+"The .hg and .ccg source files are very much like .h and .cc C++ source "
+"files, but they contain extra macros, such as <function>_CLASS_GOBJECT()</"
+"function> and <function>_WRAP_METHOD()</function>, from which "
+"<command>gmmproc</command> generates appropriate C++ source code, usually at "
+"the same position in the header. Any additional C++ source code will be "
+"copied verbatim into the corresponding .h or .cc file."
+msgstr ""
+
+#: C/index-in.docbook:9191
+#, no-wrap
+msgid ""
+"\n"
+"#include &lt;gtkmm/bin.h&gt;\n"
+"#include &lt;gtkmm/actionable.h&gt;\n"
+"_DEFS(gtkmm,gtk)\n"
+"_PINCLUDE(gtkmm/private/bin_p.h)\n"
+"\n"
+"namespace Gtk\n"
+"{\n"
+"\n"
+"class Button\n"
+"  : public Bin,\n"
+"    public Actionable\n"
+"{\n"
+"  _CLASS_GTKOBJECT(Button,GtkButton,GTK_BUTTON,Gtk::Bin,GtkBin)\n"
+"  _IMPLEMENTS_INTERFACE(Actionable)\n"
+"public:\n"
+"\n"
+"  _CTOR_DEFAULT\n"
+"  explicit Button(const Glib::ustring&amp; label, bool mnemonic = false);\n"
+"\n"
+"  _WRAP_METHOD(void set_label(const Glib::ustring&amp; label), gtk_button_set_label)\n"
+"\n"
+"  ...\n"
+"\n"
+"  _WRAP_SIGNAL(void clicked(), \"clicked\")\n"
+"\n"
+"  ...\n"
+"\n"
+"  _WRAP_PROPERTY(\"label\", Glib::ustring)\n"
+"};\n"
+"\n"
+"} // namespace Gtk\n"
+msgstr ""
+
+#: C/index-in.docbook:9186
+msgid ""
+"A .hg file will typically include some headers and then declare a class, "
+"using some macros to add API or behaviour to this class. For instance, "
+"<application>gtkmm</application>'s <filename>button.hg</filename> looks "
+"roughly like this: <_:programlisting-1/>"
+msgstr ""
+
+#: C/index-in.docbook:9228
+msgid "<function>_DEFS()</function>"
+msgstr ""
+
+#: C/index-in.docbook:9229
+msgid ""
+"Specifies the destination directory for generated sources, and the name of "
+"the main .defs file that <command>gmmproc</command> should parse."
+msgstr ""
+
+#: C/index-in.docbook:9232
+msgid "<function>_PINCLUDE()</function>"
+msgstr ""
+
+#: C/index-in.docbook:9233
+msgid ""
+"Tells <command>gmmproc</command> to include a header in the generated "
+"<filename>private/button_p.h</filename> file."
+msgstr ""
+
+#: C/index-in.docbook:9236
+msgid "<function>_CLASS_GTKOBJECT()</function>"
+msgstr ""
+
+#: C/index-in.docbook:9237
+msgid ""
+"Tells <command>gmmproc</command> to add some typedefs, constructors, and "
+"standard methods to this class, as appropriate when wrapping a widget."
+msgstr ""
+
+#: C/index-in.docbook:9240
+msgid "<function>_IMPLEMENTS_INTERFACE()</function>"
+msgstr ""
+
+#: C/index-in.docbook:9241
+msgid ""
+"Tells <command>gmmproc</command> to add initialization code for the "
+"interface."
+msgstr ""
+
+#: C/index-in.docbook:9244
+msgid "<function>_CTOR_DEFAULT</function>"
+msgstr ""
+
+#: C/index-in.docbook:9245
+msgid "Adds a default constructor."
+msgstr ""
+
+#: C/index-in.docbook:9248
+msgid ""
+"<function>_WRAP_METHOD()</function>, <function>_WRAP_SIGNAL()</function>, "
+"and <function>_WRAP_PROPERTY()</function>"
+msgstr ""
+
+#: C/index-in.docbook:9251
+msgid "Add methods to wrap parts of the C API."
+msgstr ""
+
+#: C/index-in.docbook:9225
+msgid "The macros in this example do the following: <_:variablelist-1/>"
+msgstr ""
+
+#: C/index-in.docbook:9258
+#, no-wrap
+msgid ""
+"\n"
+"$ cd gtk/src\n"
+"$ /usr/lib/glibmm-2.68/proc/gmmproc -I ../../tools/m4 --defs . button . ./../gtkmm\n"
+msgstr ""
+
+#: C/index-in.docbook:9255
+msgid ""
+"The .h and .cc files will be generated from the .hg and .ccg files by "
+"processing them with <command>gmmproc</command> like so, though this happens "
+"automatically when using the above build structure: <_:programlisting-1/>"
+msgstr ""
+
+#: C/index-in.docbook:9263
+msgid ""
+"Notice that we provided <command>gmmproc</command> with the path to the .m4 "
+"convert files, the path to the .defs file, the name of a .hg file, the "
+"source directory, and the destination directory."
+msgstr ""
+
+#: C/index-in.docbook:9266
+msgid ""
+"You should avoid including the C header from your C++ header, to avoid "
+"polluting the global namespace, and to avoid exporting unnecessary public "
+"API. But you will need to include the necessary C headers from your .ccg "
+"file."
+msgstr ""
+
+#: C/index-in.docbook:9271
+msgid "The macros are explained in more detail in the following sections."
+msgstr ""
+
+#: C/index-in.docbook:9274
+msgid "m4 Conversions"
+msgstr ""
+
+#: C/index-in.docbook:9282
+#, no-wrap
+msgid ""
+"\n"
+"_CONVERSION(`GtkTreeView*',`TreeView*',`Glib::wrap($3)')\n"
+msgstr ""
+
+#: C/index-in.docbook:9275
+msgid ""
+"The macros that you use in the .hg and .ccg files often need to know how to "
+"convert a C++ type to a C type, or vice-versa. <command>gmmproc</command> "
+"takes this information from an .m4 file in your <literal>tools/m4/</literal> "
+"or <literal>codegen/m4/</literal> directory. This allows it to call a C "
+"function in the implementation of your C++ method, passing the appropriate "
+"parameters to that C functon. For instance, this tells <command>gmmproc</"
+"command> how to convert a <classname>GtkTreeView</classname> pointer to a "
+"<classname>Gtk::TreeView</classname> pointer: <_:programlisting-1/>"
+msgstr ""
+
+#: C/index-in.docbook:9287
+msgid ""
+"<literal>$3</literal> will be replaced by the parameter name when this "
+"conversion is used by <command>gmmproc</command>."
+msgstr ""
+
+#: C/index-in.docbook:9294
+#, no-wrap
+msgid ""
+"\n"
+"_CONVERSION(`PrintSettings&amp;',`GtkPrintSettings*',__FR2P)\n"
+"_CONVERSION(`const PrintSettings&amp;',`GtkPrintSettings*',__FCR2P)\n"
+"_CONVERSION(`const Glib::RefPtr&lt;Printer&gt;&amp;',`GtkPrinter*',__CONVERT_REFPTR_TO_P($3))\n"
+msgstr ""
+
+#: C/index-in.docbook:9291
+msgid ""
+"Some extra macros make this easier and consistent. Look in "
+"<application>gtkmm</application>'s .m4 files for examples. For instance: <_:"
+"programlisting-1/>"
+msgstr ""
+
+#: C/index-in.docbook:9303
+msgid "m4 Initializations"
+msgstr "安装m4"
+
+#: C/index-in.docbook:9304
+msgid ""
+"Often when wrapping methods, it is desirable to store the return of the C "
+"function in what is called an output parameter. In this case, the C++ method "
+"returns <type>void</type> but an output parameter in which to store the "
+"value of the C function is included in the argument list of the C++ method. "
+"<command>gmmproc</command> allows such functionality, but appropriate "
+"initialization macros must be included to tell <command>gmmproc</command> "
+"how to initialize the C++ parameter from the return of the C function."
+msgstr ""
+
+#: C/index-in.docbook:9319
+#, no-wrap
+msgid ""
+"\n"
+"_INITIALIZATION(`Gtk::Widget&amp;',`GtkWidget*',`$3 = Glib::wrap($4)')\n"
+msgstr ""
+
+#: C/index-in.docbook:9313
+msgid ""
+"For example, if there was a C function that returned a <type>GtkWidget*</"
+"type> and for some reason, instead of having the C++ method also return the "
+"widget, it was desirable to have the C++ method place the widget in a "
+"specified output parameter, an initialization macro such as the following "
+"would be necessary: <_:programlisting-1/>"
+msgstr ""
+
+#: C/index-in.docbook:9324
+msgid ""
+"<literal>$3</literal> will be replaced by the output parameter name of the C+"
+"+ method and <literal>$4</literal> will be replaced by the return of the C "
+"function when this initialization is used by <command>gmmproc</command>. For "
+"convenience, <literal>$1</literal> will also be replaced by the C++ type "
+"without the ampersand (&amp;) and <literal>$2</literal> will be replaced by "
+"the C type."
+msgstr ""
+
+#: C/index-in.docbook:9335
+msgid "Class macros"
+msgstr ""
+
+#: C/index-in.docbook:9336
+msgid ""
+"The class macro declares the class itself and its relationship with the "
+"underlying C type. It generates some internal constructors, the member "
+"<varname>gobject_</varname>, typedefs, the <function>gobj()</function> "
+"accessors, type registration, and the <function>Glib::wrap()</function> "
+"method, among other things."
+msgstr ""
+
+#: C/index-in.docbook:9341
+msgid ""
+"Other macros, such as <function>_WRAP_METHOD()</function> and "
+"<function>_WRAP_SIGNAL()</function> may only be used after a call to a "
+"<function>_CLASS_*</function> macro."
+msgstr ""
+
+#: C/index-in.docbook:9346
+msgid "_CLASS_GOBJECT"
+msgstr ""
+
+#: C/index-in.docbook:9347
+msgid ""
+"This macro declares a wrapper for a type that is derived from "
+"<classname>GObject</classname>, but whose wrapper is not derived from "
+"<classname>Gtk::Object</classname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8324(para)
+#: C/index-in.docbook:9350
 msgid ""
-"<application>gtkmm</application> uses the <command>gmmproc</command> tool to "
-"generate most of its source code, using .defs files that define the APIs of "
-"<classname>GObject</classname>-based libraries. So it's quite easy to create "
-"additional gtkmm-style wrappers of other glib/GObject-based libraries."
+"<function>_CLASS_GOBJECT( C++ class, C class, C casting macro, C++ base "
+"class, C base class )</function>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8329(para)
+#: C/index-in.docbook:9352
+#, no-wrap
 msgid ""
-"This involves a variety of tools, some of them crufty, but it does at least "
-"work, and has been used successfully by several projects."
+"\n"
+"_CLASS_GOBJECT(AccelGroup, GtkAccelGroup, GTK_ACCEL_GROUP, Glib::Object, GObject)\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8334(title)
-msgid "The build structure"
+#: C/index-in.docbook:9351
+msgid ""
+"For instance, from <filename>accelgroup.hg</filename>: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8335(para)
-msgid ""
-"Generation of the source code for a gtkmm-style wrapper API requires use of "
-"tools such as <command>gmmproc</command> and <filename>generate_wrap_init."
-"pl</filename>. In theory you could write your own build files to use these "
-"appropriately, but a much better option is to make use of the build "
-"infrastructure provided by the mm-common module. To get started, it helps a "
-"lot to pick an existing binding module as an example to look at."
+#: C/index-in.docbook:9359
+msgid "_CLASS_GTKOBJECT"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8342(para)
+#: C/index-in.docbook:9360
 msgid ""
-"For instance, let's pretend that we are wrapping a C library called "
-"libexample. It provides a <classname>GObject</classname>-based API with "
-"types named, for instance, <classname>ExampleThing</classname> and "
-"<classname>ExampleStuff</classname>."
+"This macro declares a wrapper for a type whose wrapper is derived from "
+"<classname>Gtk::Object</classname>, such as a widget or dialog."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8348(title)
-msgid "Copying the skeleton project"
+#: C/index-in.docbook:9362
+msgid ""
+"<function>_CLASS_GTKOBJECT( C++ class, C class, C casting macro, C++ base "
+"class, C base class )</function>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8353(programlisting)
+#: C/index-in.docbook:9364
 #, no-wrap
 msgid ""
 "\n"
-"  $ git clone git://git.gnome.org/mm-common\n"
-"  $ cp -a mm-common/skeletonmm libsomethingmm\n"
+"_CLASS_GTKOBJECT(Button, GtkButton, GTK_BUTTON, Gtk::Bin, GtkBin)\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8350(para)
+#: C/index-in.docbook:9363 C/index-in.docbook:9848 C/index-in.docbook:9953
 msgid ""
-"Typically our wrapper library would be called libsomethingmm. We can start "
-"by copying the <ulink url=\"http://git.gnome.org/cgit/mm-common/tree/";
-"skeletonmm\">skeleton source tree</ulink> from the mm-common module. "
-"<placeholder-1/>"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:8363(para)
-msgid "<filename>libsomethingmm</filename>: The top-level directory."
+"For instance, from <filename>button.hg</filename>: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8365(para)
+#: C/index-in.docbook:9368
 msgid ""
-"<filename>libsomething</filename>: Contains the main include file and the "
-"pkg-config .pc file."
+"You will typically use this macro when the class already derives from "
+"<classname>Gtk::Object</classname>. For instance, you will use it when "
+"wrapping a GTK Widget, because <classname>Gtk::Widget</classname> derives "
+"from <classname>Gtk::Object</classname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8367(para)
-msgid "<filename>src</filename>: Contains .hg and .ccg source files."
+#: C/index-in.docbook:9372
+msgid ""
+"You might also derive non-widget classes from <classname>Gtk::Object</"
+"classname> so they can be used without <classname>Glib::RefPtr</classname>. "
+"For instance, they could then be instantiated with <function>Gtk::"
+"make_managed()</function> or on the stack as a member variable. This is "
+"convenient, but you should use this only when you are sure that true "
+"reference-counting is not needed. We consider it useful for widgets."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8368(para)
-msgid ""
-"<filename>libsomethingmm</filename>: Contains generated and hand-written .h "
-"and .cc files."
+#: C/index-in.docbook:9382
+msgid "_CLASS_BOXEDTYPE"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8370(para)
+#: C/index-in.docbook:9383
 msgid ""
-"<filename>private</filename>: Contains generated <filename>*_p.h</filename> "
-"files."
+"This macro declares a wrapper for a non-<classname>GObject</classname> "
+"struct, registered with <function>g_boxed_type_register_static()</function>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8358(para)
+#: C/index-in.docbook:9386
 msgid ""
-"This provides a directory structure for the source .hg and .ccg files and "
-"the generated .h and .cc files, with <filename>filelist.am</filename> "
-"Automake include files that can specify the various files in use, in terms "
-"of generic Automake variables. The directory structure usually looks like "
-"this, after we have renamed the directories appropriately: <placeholder-1/>"
+"<function>_CLASS_BOXEDTYPE( C++ class, C class, new function, copy function, "
+"free function )</function>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8382(programlisting)
+#: C/index-in.docbook:9388
 #, no-wrap
 msgid ""
 "\n"
-"$ for f in $(find libsomethingmm -depth -name '*skeleton*'); do \\\n"
-"    d=\"${f%/*}\"; b=\"${f##*/}\"; mv \"$f\" \"$d/${b//skeleton/libsomething}\"; \\\n"
-"  done\n"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:8380(para)
-msgid ""
-"As well as renaming the directories, we should rename some of the source "
-"files. For instance: <placeholder-1/> A number of the skeleton files must "
-"still be filled in with project-specific content later."
+"_CLASS_BOXEDTYPE(RGBA, GdkRGBA, NONE, gdk_rgba_copy, gdk_rgba_free)\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8389(para)
+#: C/index-in.docbook:9387
 msgid ""
-"Note that files ending in <filename>.in</filename> will be used to generate "
-"files with the same name but without the <filename>.in</filename> suffix, by "
-"replacing some variables with actual values during the configure stage."
+"For instance, from <classname>Gdk::RGBA</classname>: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8395(title)
-msgid "Modifying build files"
+#: C/index-in.docbook:9395
+msgid "_CLASS_BOXEDTYPE_STATIC"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8397(para)
+#: C/index-in.docbook:9396
 msgid ""
-"Now we edit the files to adapt them to to our needs. You might prefer to use "
-"a multiple-file search-replace utility for this, such as <command>regexxer</"
-"command>. Note that nearly all of the files provided with the skeleton "
-"source tree contain placeholder text. Thus, the substitutions should be "
-"performed globally, and not be limited to the Automake and Autoconf files."
+"This macro declares a wrapper for a simple assignable struct such as "
+"<classname>GdkRectangle</classname>. It is similar to "
+"<function>_CLASS_BOXEDTYPE</function>, but the C struct is not allocated "
+"dynamically."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8401(para)
-msgid ""
-"All mentions of <varname>skeleton</varname> should be replaced by the "
-"correct name of the C library you are wrapping, such as \"something\" or "
-"\"libsomething\". In the same manner, all instances of <varname>SKELETON</"
-"varname> should be replaced by \"SOMETHING\" or \"LIBSOMETHING\", and all "
-"occurrences of <varname>Skeleton</varname> changed to \"Something\"."
+#: C/index-in.docbook:9400
+msgid "<function>_CLASS_BOXEDTYPE_STATIC( C++ class, C class )</function>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8405(para)
+#: C/index-in.docbook:9402
+#, no-wrap
 msgid ""
-"Likewise, replace all instances of <varname>Joe Hacker</varname> by the name "
-"of the intended copyright holder, which is probably you. Do the same for the "
-"<varname>joe example com</varname> email address."
+"\n"
+"_CLASS_BOXEDTYPE_STATIC(Rectangle, GdkRectangle)\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8410(title)
-msgid "configure.ac"
+#: C/index-in.docbook:9401
+msgid ""
+"For instance, for <classname>Gdk::Rectangle</classname>: <_:programlisting-1/"
+">"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8413(para)
-msgid ""
-"The <function>AC_CONFIG_SRCDIR()</function> line must mention a file in our "
-"source tree. We can edit this later if we don't yet know the names of any of "
-"the files that we will create."
+#: C/index-in.docbook:9409
+msgid "_CLASS_OPAQUE_COPYABLE"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8416(para)
+#: C/index-in.docbook:9410
 msgid ""
-"It is common for binding modules to track the version number of the library "
-"they are wrapping. So, for instance, if the C library is at version 1.23.4, "
-"then the initial version of the binding module would be 1.23.0. However, "
-"avoid starting with an even minor version number as that usually indicates a "
-"stable release."
+"This macro declares a wrapper for an opaque struct that has copy and free "
+"functions. The new, copy and free functions will be used to instantiate the "
+"default constructor, copy constructor and destructor."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8421(para)
+#: C/index-in.docbook:9413
 msgid ""
-"The <function>AC_CONFIG_HEADERS()</function> line is used to generate two or "
-"more configuration header files. The first header file in the list contains "
-"all configuration macros which are set during the configure run. The "
-"remaining headers in the list contain only a subset of configuration macros "
-"and their corresponding <filename>configh.h.in</filename> file will not be "
-"autogenerated. The reason for this separation is that the namespaced "
-"configuration headers are installed with your library and define publically "
-"visible macros."
+"<function>_CLASS_OPAQUE_COPYABLE( C++ class, C class, new function, copy "
+"function, free function )</function>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8429(para)
+#: C/index-in.docbook:9415
+#, no-wrap
 msgid ""
-"The <function>AC_SUBST([SOMETHINGMM_MODULES], ['...'])</function> line may "
-"need to be modified to check for the correct dependencies."
+"\n"
+"_CLASS_OPAQUE_COPYABLE(Checksum, GChecksum, NONE, g_checksum_copy, g_checksum_free)\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8431(para)
+#: C/index-in.docbook:9414
 msgid ""
-"The <function>AC_CONFIG_FILES()</function> block must mention the correct "
-"directory names, as described above."
+"For instance, from <classname>Glib::Checksum</classname>: <_:"
+"programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8411(para)
-msgid "In <filename>configure.ac</filename>, <placeholder-1/>"
+#: C/index-in.docbook:9422
+msgid "_CLASS_OPAQUE_REFCOUNTED"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8438(title)
-msgid "Makefile.am files"
+#: C/index-in.docbook:9423
+msgid ""
+"This macro declares a wrapper for a reference-counted opaque struct. The C++ "
+"wrapper cannot be directly instantiated and can only be used with "
+"<classname>Glib::RefPtr</classname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8441(para) C/gtkmm-tutorial-in.xml:8459(para)
+#: C/index-in.docbook:9426
 msgid ""
-"In <filename>skeleton/skeletonmm/Makefile.am</filename> we must mention the "
-"correct names in the generic variables that are used elsewhere in the build "
-"system:"
+"<function>_CLASS_OPAQUE_REFCOUNTED( C++ class, C class, new function, ref "
+"function, unref function )</function>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8446(varname)
-msgid "binding_name"
+#: C/index-in.docbook:9428
+#, no-wrap
+msgid ""
+"\n"
+"_CLASS_OPAQUE_REFCOUNTED(Coverage, PangoCoverage, pango_coverage_new, pango_coverage_ref, 
pango_coverage_unref)\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8447(para)
-msgid "The name of the library, such as libsomethingmm."
+#: C/index-in.docbook:9427
+msgid ""
+"For instance, for <classname>Pango::Coverage</classname>: <_:"
+"programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8451(varname)
-msgid "wrap_init_flags"
+#: C/index-in.docbook:9435
+msgid "_CLASS_GENERIC"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8452(para)
+#: C/index-in.docbook:9436
 msgid ""
-"Additional command-line flags passed to the <filename>generate_wrap_init.pl</"
-"filename> script, such as the C++ namespace and the parent directory prefix "
-"of include files."
+"This macro can be used to wrap structs which don't fit into any specialized "
+"category."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8464(varname)
-msgid "lib_LTLIBRARIES"
+#: C/index-in.docbook:9438
+msgid "<function>_CLASS_GENERIC( C++ class, C class )</function>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8465(para)
+#: C/index-in.docbook:9440
+#, no-wrap
 msgid ""
-"This variable must mention the correct library name, and this library name "
-"must be used to form the <varname>_SOURCES</varname>, <varname>_LDFLAGS</"
-"varname>, and <varname>_LIBADD</varname> variable names. It is permissible "
-"to use variables substituted by <filename>configure</filename> like "
-"<varname>@SOMETHINGMM_API_VERSION@</varname> as part of the variable names."
+"\n"
+"_CLASS_GENERIC(AttrIter, PangoAttrIterator)\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8474(varname)
-msgid "AM_CPPFLAGS"
+#: C/index-in.docbook:9439
+msgid ""
+"For instance, for <classname>Pango::AttrIter</classname>: <_:"
+"programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8475(para)
-msgid "The command line options passed to the C preprocessor."
+#: C/index-in.docbook:9447
+msgid "_CLASS_INTERFACE"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8479(varname)
-msgid "AM_CXXFLAGS"
+#: C/index-in.docbook:9448
+msgid ""
+"This macro declares a wrapper for a type that is derived from "
+"<classname>GTypeInterface</classname>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8480(para)
-msgid "The command line options passed to the C++ compiler."
+#: C/index-in.docbook:9451
+msgid ""
+"<function>_CLASS_INTERFACE( C++ class, C class, C casting macro, C interface "
+"struct, Base C++ class (optional), Base C class (optional) )</function>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8439(para)
+#: C/index-in.docbook:9454
+#, no-wrap
 msgid ""
-"Next we must adapt the various <filename>Makefile.am</filename> files: "
-"<placeholder-1/>"
+"\n"
+"_CLASS_INTERFACE(CellEditable, GtkCellEditable, GTK_CELL_EDITABLE, GtkCellEditableIface)\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8490(title)
-msgid "Creating .hg and .ccg files"
+#: C/index-in.docbook:9452
+msgid ""
+"For instance, from <filename>celleditable.hg</filename>: <_:programlisting-1/"
+">"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8491(para)
+#: C/index-in.docbook:9461
+#, no-wrap
 msgid ""
-"We should now create our first <filename>.hg</filename> and <filename>.ccg</"
-"filename> files, to wrap one of the objects in the C library. One pair of "
-"example source files already exists: <filename>skeleton.ccg</filename> and "
-"<filename>skeleton.hg</filename>. Create copies of these files as necessary."
+"\n"
+"_CLASS_INTERFACE(LoadableIcon, GLoadableIcon, G_LOADABLE_ICON, GLoadableIconIface, Icon, GIcon)\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8495(para)
+#: C/index-in.docbook:9458
 msgid ""
-"We must mention all of our <filename>.hg</filename> and <filename>.ccg</"
-"filename> files in the <filename>skeleton/src/filelist.am</filename> file, "
-"typically in the <varname>files_hg</varname> variable."
+"Two extra parameters are optional, for the case that the interface derives "
+"from another interface, which should be the case when the GInterface has "
+"another GInterface as a prerequisite. For instance, from "
+"<filename>loadableicon.hg</filename>: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8499(para)
-msgid ""
-"Any additional non-generated <filename>.h</filename> and <filename>.cc</"
-"filename> source files may be placed in <filename>skeleton/skeletonmm/</"
-"filename> and listed in <filename>skeleton/skeletonmm/filelist.am</"
-"filename>, typically in the <varname>files_extra_h</varname> and "
-"<varname>files_extra_cc</varname> variables."
+#: C/index-in.docbook:9470
+msgid "Constructor macros"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8505(para)
+#: C/index-in.docbook:9471
 msgid ""
-"In the <link linkend=\"sec-wrapping-hg-files\">.hg and .ccg files</link> "
-"section you can learn about the syntax used in these files."
+"The <function>_CTOR_DEFAULT()</function> and <function>_WRAP_CTOR()</"
+"function> macros add constructors, wrapping the specified <function>*_new()</"
+"function> C functions. These macros assume that the C object has properties "
+"with the same names as the function parameters, as is usually the case, so "
+"that it can supply the parameters directly to a <function>g_object_new()</"
+"function> call. These constructors never actually call the "
+"<function>*_new()</function> C functions, because <application>gtkmm</"
+"application> must actually instantiate derived GTypes, and the "
+"<function>*_new()</function> C functions are meant only as convenience "
+"functions for C programmers."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8512(title)
-msgid "Generating the .defs files."
+#: C/index-in.docbook:9486
+#, no-wrap
+msgid ""
+"\n"
+"class TextMark : public Glib::Object\n"
+"{\n"
+"  _CLASS_GOBJECT(TextMark, GtkTextMark, GTK_TEXT_MARK, Glib::Object, GObject)\n"
+"\n"
+"protected:\n"
+"  _WRAP_CTOR(TextMark(const Glib::ustring&amp; name, bool left_gravity = true), gtk_text_mark_new)\n"
+"\n"
+"public:\n"
+"  _WRAP_CREATE(const Glib::ustring&amp; name, bool left_gravity = true)\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8516(para)
-msgid "objects (GObjects, widgets, interfaces, boxed-types and plain structs)"
+#: C/index-in.docbook:9481
+msgid ""
+"When using <function>_CLASS_GOBJECT()</function>, the constructors should be "
+"protected (rather than public) and each constructor should have a "
+"corresponding <function>_WRAP_CREATE()</function> in the public section. "
+"This prevents the class from being instantiated without using a "
+"<classname>RefPtr</classname>. For instance: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8517(para)
-msgid "functions"
+#: C/index-in.docbook:9500
+msgid "_CTOR_DEFAULT"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8518(para)
-msgid "enums"
+#: C/index-in.docbook:9501
+msgid "This macro creates a default constructor with no arguments."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8519(para)
-msgid "signals"
+#: C/index-in.docbook:9506
+msgid "_WRAP_CTOR"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8520(para)
-msgid "properties"
+#: C/index-in.docbook:9507
+msgid ""
+"This macro creates a constructor with arguments, equivalent to a "
+"<function>*_new()</function> C function. It won't actually call the "
+"<function>*_new()</function> function, but will simply create an equivalent "
+"constructor with the same argument types. It takes a C++ constructor "
+"signature, and a C function name."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8521(para)
-msgid "vfuncs"
+#: C/index-in.docbook:9517 C/index-in.docbook:10021
+msgid "errthrow"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8513(para)
+#: C/index-in.docbook:9519
 msgid ""
-"The <filename>.defs</filename> file are text files, in a lisp format, that "
-"describe the API of a C library, including its <placeholder-1/>"
+"This tells <command>gmmproc</command> that the C <function>*_new()</"
+"function> has a final <type>GError**</type> parameter which should be "
+"ignored."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8530(filename)
-msgid "gtk.defs"
+#: C/index-in.docbook:9514
+msgid "It also takes an optional extra argument: <_:variablelist-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8531(para)
-msgid "Includes the other files."
+#: C/index-in.docbook:9528
+msgid "Hand-coding constructors"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8534(filename)
-msgid "gtk_methods.defs"
+#: C/index-in.docbook:9537
+#, no-wrap
+msgid ""
+"\n"
+"Button::Button(const Glib::ustring&amp; label, bool mnemonic)\n"
+":\n"
+"  _CONSTRUCT(\"label\", label.c_str(), \"use_underline\", gboolean(mnemonic))\n"
+"{}\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8535(para)
-msgid "Objects and functions."
+#: C/index-in.docbook:9529
+msgid ""
+"When a constructor must be partly hand written because, for instance, the "
+"<function>*_new()</function> C function's parameters do not correspond "
+"directly to object properties, or because the <function>*_new()</function> C "
+"function does more than call <function>g_object_new()</function>, the "
+"<function>_CONSTRUCT()</function> macro may be used in the .ccg file to save "
+"some work. The <function>_CONSTRUCT</function> macro takes a series of "
+"property names and values. For instance, from <filename>button.ccg</"
+"filename>: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8538(filename)
-msgid "gtk_enums.defs"
+#: C/index-in.docbook:9549
+msgid "Macros that suppress generation of some code"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8539(para)
-msgid "Enumerations."
+#: C/index-in.docbook:9550
+msgid ""
+"Some macros suppress the generation of some code when they are used after a "
+"<function>_CLASS_*</function> macro. Some suppress the definition in the "
+"generated .cc file, others suppress both the declaration in the .h file and "
+"the definition in the .cc file."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8542(filename)
-msgid "gtk_signals.defs"
+#: C/index-in.docbook:9557
+msgid "_CUSTOM_DEFAULT_CTOR"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8543(para)
-msgid "Signals and properties."
+#: C/index-in.docbook:9558
+msgid ""
+"Suppresses declaration and definition of default constructor in "
+"<function>_CLASS_BOXEDTYPE</function>, <function>_CLASS_BOXEDTYPE_STATIC</"
+"function> and <function>_CLASS_OPAQUE_COPYABLE</function>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8546(filename)
-msgid "gtk_vfuncs.defs"
+#: C/index-in.docbook:9565
+msgid "_CUSTOM_CTOR_CAST"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8547(para)
-msgid "vfuncs (function pointer member fields in structs), written by hand."
+#: C/index-in.docbook:9566
+msgid ""
+"Suppresses declaration and definition of the constructor that takes a "
+"pointer to the wrapped C object in <function>_CLASS_BOXEDTYPE</function> and "
+"<function>_CLASS_BOXEDTYPE_STATIC</function>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8524(para)
+#: C/index-in.docbook:9570
 msgid ""
-"At the moment, we have separate tools for generating different parts of "
-"these <filename>.defs</filename>, so we split them up into separate files. "
-"For instance, in the <filename>gtk/src</filename> directory of the "
-"<application>gtkmm</application> sources, you will find these files: "
-"<placeholder-1/>"
+"Suppresses definition of the constructor that takes a pointer to the wrapped "
+"C object in <function>_CLASS_INTERFACE</function> and "
+"<function>_CLASS_OPAQUE_COPYABLE</function>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8553(title)
-msgid "Generating the methods .defs"
+#: C/index-in.docbook:9574
+msgid ""
+"Suppresses definition of the constructor that takes a pointer to the wrapped "
+"C object and the constructor that takes construct_params in "
+"<function>_CLASS_GOBJECT</function> and <function>_CLASS_GTKOBJECT</"
+"function>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8557(programlisting)
-#, no-wrap
-msgid ""
-"\n"
-"$ ./h2def.py /usr/include/gtk-2.0/gtk/*.h &gt; gtk_methods.defs\n"
+#: C/index-in.docbook:9581
+msgid "_CUSTOM_DTOR"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8554(para)
+#: C/index-in.docbook:9582
 msgid ""
-"This <filename>.defs</filename> file describes objects and their functions. "
-"It is generated by the <command>h2def.py</command> script which you can find "
-"in pygobject's <filename>codegen</filename> directory. For instance, "
-"<placeholder-1/>"
+"Suppresses definition of destructor in <function>_CLASS_GOBJECT</function> "
+"and <function>_CLASS_GTKOBJECT</function>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8564(title)
-msgid "Generating the enums .defs"
+#: C/index-in.docbook:9588
+msgid "_CUSTOM_MOVE_OPERATIONS"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8568(programlisting)
+#: C/index-in.docbook:9589
+msgid ""
+"Suppresses declaration and definition of move constructor and move "
+"assignment operator in <function>_CLASS_GOBJECT</function> and "
+"<function>_CLASS_GTKOBJECT</function>."
+msgstr ""
+
+#: C/index-in.docbook:9594
 #, no-wrap
 msgid ""
 "\n"
-"$ ./enum.pl /usr/include/gtk-2.0/gtk/*.h &gt; gtk_enums.defs\n"
+"class Derived : public Glib::Object\n"
+"{\n"
+"  _CLASS_GOBJECT(Derived, GDerived, G_DERIVED, Glib::Object, GObject)\n"
+"\n"
+"  _CUSTOM_MOVE_OPERATIONS\n"
+"\n"
+"public:\n"
+"  Derived(Derived&amp;&amp; src) noexcept;\n"
+"  Derived&amp; operator=(Derived&amp;&amp; src) noexcept;\n"
+"  // ...\n"
+"};\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8565(para)
-msgid ""
-"This <filename>.defs</filename> file describes enum types and their possible "
-"values. It is generated by the <filename>enum.pl</filename> script which you "
-"can find in glibmm's <filename>tools</filename> directory. For instance, "
-"<placeholder-1/>"
+#: C/index-in.docbook:9593
+msgid "For example: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8575(title)
-msgid "Generating the signals and properties .defs"
+#: C/index-in.docbook:9611
+msgid "_CUSTOM_WRAP_NEW"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8580(programlisting)
-#, no-wrap
+#: C/index-in.docbook:9612
 msgid ""
-"\n"
-"$ cd tools/extra_defs_gen\n"
-"$ ./generate_extra_defs &gt; gtk_signals.defs\n"
+"Suppresses definition of <function>Glib::wrap_new()</function> function in "
+"<function>_CLASS_GOBJECT</function>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8576(para)
-msgid ""
-"This <filename>.defs</filename> file describes signals and properties. It is "
-"generated by the special <filename>extra_defs</filename> utility that is in "
-"every wrapping project, such as <filename>gtkmm/tools/extra_defs_gen/</"
-"filename>. For instance <placeholder-1/>"
+#: C/index-in.docbook:9618
+msgid "_CUSTOM_WRAP_FUNCTION"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8585(para)
+#: C/index-in.docbook:9619
 msgid ""
-"You must edit the source code of your own <filename>generate_extra_defs</"
-"filename> tool in order to generate the <filename>.defs</filename> for the "
-"GObject C types that you wish to wrap. In the skeleton source tree, the "
-"source file is named <filename>codegen/extradefs/"
-"generate_extra_defs_skeleton.cc</filename>. If not done so already, the file "
-"should be renamed, with the basename of your new binding substituted for the "
-"<varname>skeleton</varname> placeholder. The <filename>codegen/Makefile.am</"
-"filename> file should also mention the new source filename."
+"Suppresses definition of <function>Glib::wrap()</function> function in "
+"<function>_CLASS_GOBJECT</function> and <function>_CLASS_GTKOBJECT</"
+"function>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8594(programlisting)
-#, no-wrap
-msgid ""
-"\n"
-"#include &lt;libsomething.h&gt;\n"
-"\n"
-"int main(int, char**)\n"
-"{\n"
-"  something_init();\n"
-"\n"
-"  std::cout &lt;&lt; get_defs(EXAMPLE_TYPE_SOMETHING)\n"
-"            &lt;&lt; get_defs(EXAMPLE_TYPE_THING);\n"
-"  return 0;\n"
-"}\n"
+#: C/index-in.docbook:9625
+msgid "_NO_WRAP_FUNCTION"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8592(para)
+#: C/index-in.docbook:9626
 msgid ""
-"Then edit the <filename>.cc</filename> file to specify the correct types. "
-"For instance, your <function>main()</function> function might look like "
-"this: <placeholder-1/>"
+"Suppresses declaration and definition of <function>Glib::wrap()</function> "
+"function in <function>_CLASS_GOBJECT</function>, <function>_CLASS_BOXEDTYPE</"
+"function>, <function>_CLASS_BOXEDTYPE_STATIC</function>, "
+"<function>_CLASS_OPAQUE_COPYABLE</function>, <function>_CLASS_INTERFACE</"
+"function> and <function>_CLASS_GTKOBJECT</function>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8610(title)
-msgid "Writing the vfuncs .defs"
+#: C/index-in.docbook:9636
+msgid "Method macros"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8620(title)
-msgid "The .hg and .ccg files"
+#: C/index-in.docbook:9639
+msgid "_WRAP_METHOD"
+msgstr ""
+
+#: C/index-in.docbook:9640
+msgid "This macro generates the C++ method to wrap a C function."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8621(para)
+#: C/index-in.docbook:9641
 msgid ""
-"The .hg and .ccg source files are very much like .h anc .cc C++ source "
-"files, but they contain extra macros, such as <function>_CLASS_GOBJECT()</"
-"function> and <function>_WRAP_METHOD()</function>, from which "
-"<command>gmmproc</command> generates appropriate C++ source code, usually at "
-"the same position in the header. Any additional C++ source code will be "
-"copied verbatim into the corresponding .h or .cc file."
+"<function>_WRAP_METHOD( C++ method signature, C function name)</function>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8634(programlisting)
+#: C/index-in.docbook:9643
 #, no-wrap
 msgid ""
 "\n"
-"#include &lt;gtkmm/bin.h&gt;\n"
-"#include &lt;gtkmm/stockid.h&gt;\n"
-"_DEFS(gtkmm,gtk)\n"
-"_PINCLUDE(gtkmm/private/bin_p.h)\n"
-"\n"
-"namespace Gtk\n"
-"{\n"
-"\n"
-"class Button : public Bin\n"
-"{\n"
-"  _CLASS_GTKOBJECT(Button,GtkButton,GTK_BUTTON,Gtk::Bin,GtkBin)\n"
-"public:\n"
-"\n"
-"  _CTOR_DEFAULT\n"
-"  explicit Button(const Glib::ustring&amp; label, bool mnemonic = false);\n"
-"  explicit Button(const StockID&amp; stock_id);\n"
-"\n"
-"  _WRAP_METHOD(void set_label(const Glib::ustring&amp; label), gtk_button_set_label)\n"
-"\n"
-"  ...\n"
-"\n"
-"  _WRAP_SIGNAL(void clicked(), \"clicked\")\n"
-"\n"
-"  ...\n"
-"\n"
-"  _WRAP_PROPERTY(\"label\", Glib::ustring)\n"
-"};\n"
-"\n"
-"} // namespace Gtk\n"
+"_WRAP_METHOD(void set_text(const Glib::ustring&amp; text), gtk_entry_set_text)\n"
+msgstr ""
+
+#: C/index-in.docbook:9642
+msgid "For instance, from <filename>entry.hg</filename>: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8629(para)
+#: C/index-in.docbook:9647
 msgid ""
-"A .hg file will typically include some headers and then declare a class, "
-"using some macros to add API or behaviour to this class. For instance, "
-"gtkmm's <filename>button.hg</filename> looks roughly like this: <placeholder-"
-"1/>"
+"The C function (e.g. <function>gtk_entry_set_text</function>) is described "
+"more fully in the .defs file, and the <filename>convert*.m4</filename> files "
+"contain the necessary conversion from the C++ parameter type to the C "
+"parameter type. This macro also generates doxygen documentation comments "
+"based on the <filename>*_docs.xml</filename> and <filename>*_docs_override."
+"xml</filename> files."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8669(function)
-msgid "_DEFS()"
+#: C/index-in.docbook:9656 C/index-in.docbook:9886 C/index-in.docbook:9996
+msgid "refreturn"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8670(para)
+#: C/index-in.docbook:9658
 msgid ""
-"Specifies the destination directry for generated sources, and the name of "
-"the main .defs file that <command>gmmproc</command> should parse."
+"Do an extra <function>reference()</function> on the return value, in case "
+"the C function does not provide a reference."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8673(function)
-msgid "_PINCLUDE()"
+#: C/index-in.docbook:9663 C/index-in.docbook:9786
+msgid "errthrow [\"&lt;exceptions&gt;\"]"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8674(para)
+#: C/index-in.docbook:9665
 msgid ""
-"Tells <command>gmmproc</command> to include a header from the generated "
-"private/button_p.h file."
+"Use the last GError** parameter of the C function to throw an exception. The "
+"optional \"&lt;exceptions&gt;\" is a comma-separated list of exceptions that "
+"can be thrown. It determines which @throws Doxygen commands are added to the "
+"documentation. Default value is <classname>Glib::Error</classname>. If you "
+"want a comma in the description of an exception, precede it by a backslash. "
+"Example: <code>errthrow \"Glib::OptionError Hello\\, world, Glib::"
+"ConvertError\"</code>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8677(function)
-msgid "_CLASS_GTKOBJECT()"
+#: C/index-in.docbook:9676 C/index-in.docbook:9894 C/index-in.docbook:9961
+#: C/index-in.docbook:10207
+msgid "deprecated [\"&lt;text&gt;\"]"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8678(para)
+#: C/index-in.docbook:9678 C/index-in.docbook:9896 C/index-in.docbook:9963
+#: C/index-in.docbook:10209
 msgid ""
-"Tells <command>gmmproc</command> to add some typedefs, constructors, and "
-"standard methods to this class, as appropriate when wrapping a GtkObject-"
-"derived type."
+"Puts the generated code in #ifdef blocks. Text about the deprecation can be "
+"specified as an optional parameter."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8681(term)
+#: C/index-in.docbook:9684
+msgid "constversion"
+msgstr ""
+
+#: C/index-in.docbook:9686
 msgid ""
-"<function>_WRAP_METHOD()</function>, <function>_WRAP_SIGNAL()</function>, "
-"and <function>_WRAP_PROPERTY()</function>"
+"Just call the non-const version of the same function, instead of generating "
+"almost duplicate code."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8684(para)
-msgid "Add methods to wrap parts of the C API."
+#: C/index-in.docbook:9691 C/index-in.docbook:9799 C/index-in.docbook:9901
+#: C/index-in.docbook:9968 C/index-in.docbook:10214
+msgid "newin \"&lt;version&gt;\""
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8666(para)
-msgid "The macros in this example do the following: <placeholder-1/>"
+#: C/index-in.docbook:9693 C/index-in.docbook:9801 C/index-in.docbook:9903
+#: C/index-in.docbook:9970 C/index-in.docbook:10216
+msgid ""
+"Adds a @newin Doxygen command to the documentation, or replaces the @newin "
+"command generated from the C documentation."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8691(programlisting)
-#, no-wrap
+#: C/index-in.docbook:9698 C/index-in.docbook:9908 C/index-in.docbook:10043
+#: C/index-in.docbook:10130
+msgid "ifdef &lt;identifier&gt;"
+msgstr ""
+
+#: C/index-in.docbook:9700 C/index-in.docbook:9910 C/index-in.docbook:10045
+#: C/index-in.docbook:10132
+msgid "Puts the generated code in #ifdef blocks."
+msgstr ""
+
+#: C/index-in.docbook:9704 C/index-in.docbook:10049
+msgid "slot_name &lt;parameter_name&gt;"
+msgstr ""
+
+#: C/index-in.docbook:9706 C/index-in.docbook:10051
 msgid ""
-"\n"
-"$ cd gtk/src\n"
-"$ /usr/lib/glibmm-2.4/proc/gmmproc -I ../../tools/m4 --defs . button . ./../gtkmm\n"
+"Specifies the name of the slot parameter of the method, if it has one. This "
+"enables <command>gmmproc</command> to generate code to copy the slot and "
+"pass the copy on to the C function in its final <literal>gpointer user_data</"
+"literal> parameter. The <literal>slot_callback</literal> option must also be "
+"used to specify the name of the glue callback function to also pass on to "
+"the C function."
+msgstr ""
+
+#: C/index-in.docbook:9716 C/index-in.docbook:10061
+msgid "slot_callback &lt;function_name&gt;"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8688(para)
+#: C/index-in.docbook:9718 C/index-in.docbook:10063
 msgid ""
-"The .h and .cc files will be generated from the .hg and .ccg files by "
-"processing them with <command>gmmproc</command> like so, though this happens "
-"automatically when using the above build structure: <placeholder-1/>"
+"Used in conjunction with the <literal>slot_name</literal> option to specify "
+"the name of the glue callback function that handles extracting the slot and "
+"then calling it. The address of this callback is also passed on to the C "
+"function that the method wraps."
+msgstr ""
+
+#: C/index-in.docbook:9726 C/index-in.docbook:10071
+msgid "no_slot_copy"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8696(para)
+#: C/index-in.docbook:9728 C/index-in.docbook:10073
 msgid ""
-"Notice that we provided <command>gmmproc</command> with the path to the .m4 "
-"convert files, the path to the .defs file, the name of a .hg file, the "
-"source directory, and the destination directory."
+"Tells <command>gmmproc</command> not to pass a copy of the slot to the C "
+"function, if the method has one. Instead the slot itself is passed. The slot "
+"parameter name and the glue callback function must have been specified with "
+"the <literal>slot_name</literal> and <literal>slot_callback</literal> "
+"options respectively."
+msgstr ""
+
+#: C/index-in.docbook:9653 C/index-in.docbook:9783 C/index-in.docbook:9856
+#: C/index-in.docbook:9958 C/index-in.docbook:9993 C/index-in.docbook:10148
+msgid "There are some optional extra arguments: <_:variablelist-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8699(para)
+#: C/index-in.docbook:9741
 msgid ""
-"You should avoid including the C header from your C++ header, to avoid "
-"polluting the global namespace, and to avoid exporting unnecessary public "
-"API. But you will need to include the necessary C headers from your .ccg "
-"file."
+"Objects used via <classname>RefPtr</classname>: Pass the <classname>RefPtr</"
+"classname> as a const reference. For instance, <code>const Glib::RefPtr&lt;"
+"Gtk::FileFilter&gt;&amp; filter</code>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8704(para)
-msgid "The macros are explained in more detail in the following sections."
+#: C/index-in.docbook:9745
+msgid ""
+"Const Objects used via <classname>RefPtr</classname>: If the object should "
+"not be changed by the function, then make sure that the object is const, "
+"even if the <classname>RefPtr</classname> is already const. For instance, "
+"<code>const Glib::RefPtr&lt;const Gtk::FileFilter&gt;&amp; filter</code>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8707(title)
-msgid "m4 Conversions"
+#: C/index-in.docbook:9750
+msgid ""
+"Wrapping <classname>GList*</classname> and <classname>GSList*</classname> "
+"parameters: First, you need to discover what objects are contained in the "
+"list's data field for each item, usually by reading the documentation for "
+"the C function. The list can then be wrapped by a <classname>std::vector</"
+"classname> type. For instance, <code>std::vector&lt;Glib::RefPtr&lt;Gdk::"
+"Pixbuf&gt;&gt;</code>. You may need to define a Traits type to specify how "
+"the C and C++ types should be converted."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8714(programlisting)
+#: C/index-in.docbook:9766
 #, no-wrap
+msgid "#m4 
_CONVERSION(`GSList*',`std::vector&lt;Widget*&gt;',`Glib::SListHandler&lt;Widget*&gt;::slist_to_vector($3, 
Glib::OWNERSHIP_SHALLOW)')"
+msgstr ""
+
+#: C/index-in.docbook:9758
 msgid ""
-"\n"
-"_CONVERSION(`GtkTreeView*',`TreeView*',`Glib::wrap($3)')\n"
+"Wrapping <classname>GList*</classname> and <classname>GSList*</classname> "
+"return types: You must discover whether the caller should free the list and "
+"whether it should release the items in the list, again by reading the "
+"documentation of the C function. With this information you can choose the "
+"ownership (none, shallow or deep) for the m4 conversion rule, which you "
+"should probably put directly into the .hg file because the ownership depends "
+"on the function rather than the type. For instance: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8708(para)
+#: C/index-in.docbook:9737
 msgid ""
-"The macros that you use in the .hg and .ccg files often need to know how to "
-"convert a C++ type to a C type, or vice-versa. gmmproc takes this "
-"information from an .m4 file in your <literal>tools/m4/</literal> directory. "
-"This allows it to call a C function in the implementation of your C++ "
-"method, passing the appropriate parameters to that C functon. For instance, "
-"this tells gmmproc how to convert a GtkTreeView pointer to a Gtk::TreeView "
-"pointer: <placeholder-1/>"
+"Selecting which C++ types should be used is also important when wrapping C "
+"API. Though it's usually obvious what C++ types should be used in the C++ "
+"method, here are some hints: <_:itemizedlist-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8719(para)
+#: C/index-in.docbook:9772
+msgid "_WRAP_METHOD_DOCS_ONLY"
+msgstr ""
+
+#: C/index-in.docbook:9773
 msgid ""
-"<literal>$3</literal> will be replaced by the parameter name when this "
-"conversion is used by gmmproc."
+"This macro is like <function>_WRAP_METHOD()</function>, but it generates "
+"only the documentation for a C++ method that wraps a C function. Use this "
+"when you must hand-code the method, but you want to use the documentation "
+"that would be generated if the method was generated."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8726(programlisting)
+#: C/index-in.docbook:9777
+msgid "<function>_WRAP_METHOD_DOCS_ONLY(C function name)</function>"
+msgstr ""
+
+#: C/index-in.docbook:9779
 #, no-wrap
 msgid ""
 "\n"
-"_CONVERSION(`PrintSettings&amp;',`GtkPrintSettings*',__FR2P)\n"
-"_CONVERSION(`const PrintSettings&amp;',`GtkPrintSettings*',__FCR2P)\n"
-"_CONVERSION(`const Glib::RefPtr&lt;Printer&gt;&amp;',`GtkPrinter*',__CONVERT_REFPTR_TO_P($3))\n"
+"_WRAP_METHOD_DOCS_ONLY(gtk_container_add)\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8723(para)
+#: C/index-in.docbook:9778
 msgid ""
-"Some extra macros make this easier and consistent. Look in gtkmm's .m4 files "
-"for examples. For instance: <placeholder-1/>"
+"For instance, from <filename>container.hg</filename>: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8736(title)
-msgid "Class macros"
+#: C/index-in.docbook:9788
+msgid ""
+"Excludes documentation of the last GError** parameter of the C function. The "
+"optional \"&lt;exceptions&gt;\" is a comma-separated list of exceptions that "
+"can be thrown. It determines which @throws Doxygen commands are added to the "
+"documentation. Default value is <classname>Glib::Error</classname>. If you "
+"want a comma in the description of an exception, precede it by a backslash. "
+"Example: <code>errthrow \"Glib::OptionError Hello\\, world, Glib::"
+"ConvertError\"</code>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8737(para)
-msgid ""
-"The class macro declares the class itself and its relationship with the "
-"underlying C type. It generates some internal constructors, the member "
-"<varname>gobject_</varname>, typedefs, the <function>gobj()</function> "
-"accessors, type registration, and the <function>Glib::wrap()</function> "
-"method, among other things."
+#: C/index-in.docbook:9806
+msgid "voidreturn"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8742(para)
+#: C/index-in.docbook:9808
 msgid ""
-"Other macros, such as <function>_WRAP_METHOD()</function> and "
-"<function>_SIGNAL()</function> may only be used after a call to a "
-"<function>_CLASS_*</function> macro."
+"Don't include a @return Doxygen command in the documentation. Useful if the "
+"wrapped C function returns a value, but the corresponding C++ method returns "
+"<type>void</type>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8747(title)
-msgid "_CLASS_GOBJECT"
+#: C/index-in.docbook:9818
+msgid "_IGNORE, _IGNORE_SIGNAL, _IGNORE_PROPERTY"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8748(para) C/gtkmm-tutorial-in.xml:8838(para)
+#: C/index-in.docbook:9819
 msgid ""
-"This macro declares a wrapper for a type that is derived from "
-"<classname>GObject</classname>, but which is not derived from "
-"<classname>GtkObject</classname>."
+"<command>gmmproc</command> will warn you on stdout about functions, signals, "
+"properties and child properties that you have forgotten to wrap, helping to "
+"ensure that you are wrapping the complete API. But if you don't want to wrap "
+"some functions, signals, properties or child properties, or if you chose to "
+"hand-code some methods then you can use the _IGNORE(), _IGNORE_SIGNAL() or "
+"_IGNORE_PROPERTY() macro to make <command>gmmproc</command> stop complaining."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8751(function)
+#: C/index-in.docbook:9827
+#, no-wrap
 msgid ""
-"_CLASS_GOBJECT( C++ class, C class, C casting macro, C++ base class, C base "
-"class )"
+"<function>_IGNORE(C function name 1, C function name 2, etc)\n"
+"_IGNORE_SIGNAL(C signal name 1, C signal name 2, etc)\n"
+"_IGNORE_PROPERTY(C property name 1, C property name 2, etc)</function>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8753(programlisting)
+#: C/index-in.docbook:9832
 #, no-wrap
 msgid ""
 "\n"
-"_CLASS_GOBJECT(AccelGroup, GtkAccelGroup, GTK_ACCEL_GROUP, Glib::Object, GObject)\n"
+"_IGNORE(gtk_flow_box_set_filter_func, gtk_flow_box_set_sort_func)\n"
+"_IGNORE_SIGNAL(activate-cursor-child, toggle-cursor-child, move-cursor)\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8752(para)
-msgid "For instance, from <filename>accelgroup.hg</filename>: <placeholder-1/>"
+#: C/index-in.docbook:9831
+msgid ""
+"For instance, from <filename>flowbox.hg</filename>: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8760(title)
-msgid "_CLASS_GTKOBJECT"
+#: C/index-in.docbook:9840
+msgid "_WRAP_SIGNAL"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8761(para)
+#: C/index-in.docbook:9841
 msgid ""
-"This macro declares a wrapper for a type that is derived from "
-"<classname>GtkObject</classname>, such as a widget or dialog."
+"This macro generates the C++ libsigc++-style signal to wrap a C GObject "
+"signal. It actually generates a public accessor method, such as "
+"<function>signal_clicked()</function>, which returns a proxy object. "
+"<command>gmmproc</command> uses the .defs file to discover the C parameter "
+"types and the .m4 convert files to discover appropriate type conversions."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8763(function)
+#: C/index-in.docbook:9847
 msgid ""
-"_CLASS_GTKOBJECT( C++ class, C class, C casting macro, C++ base class, C "
-"base class )"
+"<function>_WRAP_SIGNAL( C++ signal handler signature, C signal name)</"
+"function>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8765(programlisting)
+#: C/index-in.docbook:9849
 #, no-wrap
 msgid ""
 "\n"
-"_CLASS_GTKOBJECT(Button, GtkButton, GTK_BUTTON, Gtk::Bin, GtkBin)\n"
+"_WRAP_SIGNAL(void clicked(),\"clicked\")\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8764(para) C/gtkmm-tutorial-in.xml:9052(para)
-#: C/gtkmm-tutorial-in.xml:9083(para)
-msgid "For instance, from <filename>button.hg</filename>: <placeholder-1/>"
+#: C/index-in.docbook:9853
+msgid ""
+"Signals usually have function pointers in the GTK struct, with a "
+"corresponding enum value and a <function>g_signal_new()</function> in the .c "
+"file."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8772(title)
-msgid "_CLASS_BOXEDTYPE"
+#: C/index-in.docbook:9859
+msgid "no_default_handler"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8773(para)
+#: C/index-in.docbook:9861
 msgid ""
-"This macro declares a wrapper for a non-<classname>GObject</classname> "
-"struct, registered with <function>g_boxed_type_register_static()</function>."
+"Do not generate an <function>on_something()</function> virtual method to "
+"allow easy overriding of the default signal handler. Use this when adding a "
+"signal with a default signal handler would break the ABI by increasing the "
+"size of the class's virtual function table, and when adding a signal without "
+"a public C default handler."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8776(function)
-msgid ""
-"_CLASS_BOXEDTYPE( C++ class, C class, new function, copy function, free "
-"function )"
+#: C/index-in.docbook:9870
+msgid "custom_default_handler"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8778(programlisting)
-#, no-wrap
+#: C/index-in.docbook:9872
 msgid ""
-"\n"
-"_CLASS_BOXEDTYPE(Color, GdkColor, NONE, gdk_color_copy, gdk_color_free)\n"
+"Generate a declaration of the <function>on_something()</function> virtual "
+"method in the <filename>.h</filename> file, but do not generate a definition "
+"in the <filename>.cc</filename> file. Use this when you must generate the "
+"definition by hand."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8777(para)
-msgid "For instance, for <classname>Gdk::Color</classname>: <placeholder-1/>"
+#: C/index-in.docbook:9879
+msgid "custom_c_callback"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8785(title)
-msgid "_CLASS_BOXEDTYPE_STATIC"
+#: C/index-in.docbook:9881
+msgid ""
+"Do not generate a C callback function for the signal. Use this when you must "
+"generate the callback function by hand."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8786(para)
+#: C/index-in.docbook:9888
 msgid ""
-"This macro declares a wrapper for a simple assignable struct such as "
-"<classname>GdkRectangle</classname>. It is similar to "
-"<function>_CLASS_BOXEDTYPE</function>, but the C struct is not allocated "
-"dynamically."
+"Do an extra <function>reference()</function> on the return value of the "
+"<function>on_something()</function> virtual method, in case the C function "
+"does not provide a reference."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8790(function)
-msgid "_CLASS_BOXEDTYPE_STATIC( C++ class, C class )"
+#: C/index-in.docbook:9914 C/index-in.docbook:10097
+msgid "exception_handler &lt;method_name&gt;"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8792(programlisting)
-#, no-wrap
+#: C/index-in.docbook:9916 C/index-in.docbook:10099
 msgid ""
-"\n"
-"_CLASS_BOXEDTYPE_STATIC(Rectangle, GdkRectangle)\n"
+"Allows to use custom exception handler instead of default one. Exception "
+"might be rethrown by user-defined handler, and it will be caught by default "
+"handler."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8791(para)
+#: C/index-in.docbook:9922
+msgid "detail_name &lt;parameter_name&gt;"
+msgstr ""
+
+#: C/index-in.docbook:9924
 msgid ""
-"For instance, for <classname>Gdk::Rectangle</classname>: <placeholder-1/>"
+"Adds a <type>const Glib::ustring&amp;</type> parameter to the "
+"<methodname>signal_something()</methodname> method. Use it, if the signal "
+"accepts a detailed signal name, i.e. if the underlying C code registers the "
+"signal with the <literal>G_SIGNAL_DETAILED</literal> flag."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8799(title)
-msgid "_CLASS_OPAQUE_COPYABLE"
+#: C/index-in.docbook:9931
+msgid "two_signal_methods"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8800(para)
+#: C/index-in.docbook:9933
 msgid ""
-"This macro declares a wrapper for an opaque struct that has copy and free "
-"functions. The new, copy and free functions will be used to instantiate the "
-"default constructor, copy constructor and destructor."
+"Used in conjunction with the <literal>detail_name</literal> option to "
+"generate two <methodname>signal_something()</methodname> methods, one "
+"without a parameter and one with a parameter without a default value. With "
+"only the <literal>detail_name</literal> option one method is generated, with "
+"a parameter with default value. Use the <literal>two_signal_methods</"
+"literal> option, if it's necessary in order to preserve ABI."
+msgstr ""
+
+#: C/index-in.docbook:9947
+msgid "_WRAP_PROPERTY"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8803(function)
+#: C/index-in.docbook:9948
 msgid ""
-"_CLASS_OPAQUE_COPYABLE( C++ class, C class, new function, copy function, "
-"free function )"
+"This macro generates the C++ method to wrap a C GObject property. You must "
+"specify the property name and the wanted C++ type for the property. "
+"<command>gmmproc</command> uses the .defs file to discover the C type and "
+"the .m4 convert files to discover appropriate type conversions."
+msgstr ""
+
+#: C/index-in.docbook:9952
+msgid "<function>_WRAP_PROPERTY(C property name, C++ type)</function>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8805(programlisting)
+#: C/index-in.docbook:9954
 #, no-wrap
 msgid ""
 "\n"
-"_CLASS_OPAQUE_COPYABLE(Region, GdkRegion, gdk_region_new, gdk_region_copy, gdk_region_destroy)\n"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:8804(para)
-msgid "For instance, for <classname>Gdk::Region</classname>: <placeholder-1/>"
+"_WRAP_PROPERTY(\"label\", Glib::ustring)\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8812(title)
-msgid "_CLASS_OPAQUE_REFCOUNTED"
+#: C/index-in.docbook:9979
+msgid "_WRAP_VFUNC"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8813(para)
-msgid ""
-"This macro declares a wrapper for a reference-counted opaque struct. The C++ "
-"wrapper cannot be directly instantiated and can only be used with "
-"<classname>Glib::RefPtr</classname>."
+#: C/index-in.docbook:9980
+msgid "This macro generates the C++ method to wrap a virtual C function."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8816(function)
+#: C/index-in.docbook:9981
 msgid ""
-"_CLASS_OPAQUE_COPYABLE( C++ class, C class, new function, ref function, "
-"unref function )"
+"<function>_WRAP_VFUNC( C++ method signature, C function name)</function>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8818(programlisting)
+#: C/index-in.docbook:9983
 #, no-wrap
 msgid ""
 "\n"
-"_CLASS_OPAQUE_REFCOUNTED(Coverage, PangoCoverage, pango_coverage_new, pango_coverage_ref, 
pango_coverage_unref)\n"
+"_WRAP_VFUNC(SizeRequestMode get_request_mode() const, get_request_mode)\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8817(para)
+#: C/index-in.docbook:9982
 msgid ""
-"For instance, for <classname>Pango::Coverage</classname>: <placeholder-1/>"
+"For instance, from <filename>widget.hg</filename>: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8825(title)
-msgid "_CLASS_GENERIC"
+#: C/index-in.docbook:9987
+msgid ""
+"The C function (e.g. <function>get_request_mode</function>) is described "
+"more fully in the <filename>*_vfuncs.defs</filename> file, and the "
+"<filename>convert*.m4</filename> files contain the necessary conversion from "
+"the C++ parameter type to the C parameter type. Conversions can also be "
+"written in the .hg file. Virtual functions often require special conversions "
+"that are best kept local to the .hg file where they are used."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8826(para)
+#: C/index-in.docbook:9998
 msgid ""
-"This macro can be used to wrap structs which don't fit into any specialized "
-"category."
+"Do an extra <function>reference()</function> on the return value of the "
+"<function>something_vfunc()</function> function, in case the virtual C "
+"function does not provide a reference."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8828(function)
-msgid "_CLASS_GENERIC( C++ class, C class )"
+#: C/index-in.docbook:10004
+msgid "refreturn_ctype"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8830(programlisting)
-#, no-wrap
+#: C/index-in.docbook:10006
 msgid ""
-"\n"
-"_CLASS_GENERIC(AttrIter, PangoAttrIterator)\n"
+"Do an extra <function>reference()</function> on the return value of an "
+"overridden <function>something_vfunc()</function> function in the C callback "
+"function, in case the calling C function expects it to provide a reference."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8829(para)
-msgid ""
-"For instance, for <classname>Pango::AttrIter</classname>: <placeholder-1/>"
+#: C/index-in.docbook:10013
+msgid "keep_return"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8837(title)
-msgid "_CLASS_INTERFACE"
+#: C/index-in.docbook:10015
+msgid ""
+"Keep a copy of the return value in the C callback function, in case the "
+"calling C function does not expect to get its own reference."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8842(function)
+#: C/index-in.docbook:10023
 msgid ""
-"_CLASS_INTERFACE( C++ class, C class, C casting macro, C interface struct, "
-"Base C++ class (optional), Base C class (optional) )"
+"Use the last GError** parameter of the C virtual function (if there is one) "
+"to throw an exception."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8845(programlisting)
-#, no-wrap
-msgid ""
-"\n"
-"  _CLASS_INTERFACE(CellEditable, GtkCellEditable, GTK_CELL_EDITABLE, GtkCellEditableIface)\n"
+#: C/index-in.docbook:10028
+msgid "custom_vfunc"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8843(para)
+#: C/index-in.docbook:10030
 msgid ""
-"For instance, from <filename>celleditable.hg</filename>: <placeholder-1/>"
+"Do not generate a definition of the vfunc in the <filename>.cc</filename> "
+"file. Use this when you must generate the vfunc by hand."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8852(programlisting)
-#, no-wrap
-msgid ""
-"\n"
-"  _CLASS_INTERFACE(LoadableIcon, GLoadableIcon, G_LOADABLE_ICON, GLoadableIconIface, Icon, GIcon)\n"
+#: C/index-in.docbook:10036
+msgid "custom_vfunc_callback"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8849(para)
+#: C/index-in.docbook:10038
 msgid ""
-"Two extra parameters are optional, for the case that the interface derives "
-"from another interface, which should be the case when the GInterface has "
-"another GInterface as a prerequisitite. For instance, from "
-"<filename>loadableicon.hg</filename>: <placeholder-1/>"
+"Do not generate a C callback function for the vfunc. Use this when you must "
+"generate the callback function by hand."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8862(title)
-msgid "Constructor macros"
+#: C/index-in.docbook:10081
+msgid "return_value &lt;value&gt;"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8863(para)
-msgid ""
-"The <function>_CTOR_DEFAULT()</function> and <function>_WRAP_CTOR()</"
-"function> macros add constructors, wrapping the specified <function>*_new()</"
-"function> C functions. These macros assume that the C object has properties "
-"with the same names as the function parameters, as is usually the case, so "
-"that it can supply the parameters directly to a <function>g_object_new()</"
-"function> call. These constructors never actually call the <function>*_new()"
-"</function> C functions, because gtkmm must actually instantiate derived "
-"GTypes, and the <function>*_new()</function> C functions are meant only as "
-"convenience functions for C programmers."
+#: C/index-in.docbook:10083
+msgid "Defines a non-default return value."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8878(programlisting)
-#, no-wrap
-msgid ""
-"\n"
-"class ActionGroup : public Glib::Object\n"
-"{\n"
-"  _CLASS_GOBJECT(ActionGroup, GtkActionGroup, GTK_ACTION_GROUP, Glib::Object, GObject)\n"
-"\n"
-"protected:\n"
-"  _WRAP_CTOR(ActionGroup(const Glib::ustring&amp; name = Glib::ustring()), gtk_action_group_new)\n"
-"\n"
-"public:\n"
-"  _WRAP_CREATE(const Glib::ustring&amp; name = Glib::ustring())\n"
+#: C/index-in.docbook:10087
+msgid "err_return_value &lt;value&gt;"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8873(para)
+#: C/index-in.docbook:10089
 msgid ""
-"When using <function>_CLASS_GOBJECT()</function>, the constructors should be "
-"protected (rather than public) and each constructor should have a "
-"corresponding <function>_WRAP_CREATE()</function> in the public section. "
-"This prevents the class from being instantiated without using a "
-"<classname>RefPtr</classname>. For instance: <placeholder-1/>"
+"Defines a non-default return value, used only if the C++ "
+"<function>something_vfunc()</function> function throws an exception which is "
+"propagated to the C callback function. If return_value is specified, but "
+"err_return_value is not, then return_value is used also when an exception is "
+"propagated."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8892(title)
-msgid "_CTOR_DEFAULT"
+#: C/index-in.docbook:10106
+msgid ""
+"A rule to which there may be exceptions: If the virtual C function returns a "
+"pointer to an object derived from <classname>GObject</classname>, i.e. a "
+"reference-counted object, then the virtual C++ function shall return a "
+"<classname>Glib::RefPtr&lt;&gt;</classname> object. One of the extra "
+"arguments <parameter>refreturn</parameter> or <parameter>refreturn_ctype</"
+"parameter> is required."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8893(para)
-msgid "This macro creates a default constructor with no arguments."
+#: C/index-in.docbook:10117
+msgid "Other macros"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8898(title)
-msgid "_WRAP_CTOR"
+#: C/index-in.docbook:10119
+msgid "_IMPLEMENTS_INTERFACE"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8899(para)
-msgid ""
-"This macro creates a constructor with arguments, equivalent to a "
-"<function>*_new()</function> C function. It won't actually call the "
-"<function>*_new()</function> function, but will simply create an equivalent "
-"constructor with the same argument types. It takes a C++ constructor "
-"signature, and a C function name."
+#: C/index-in.docbook:10120
+msgid "This macro generates initialization code for the interface."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8908(title)
-msgid "Hand-coding constructors"
+#: C/index-in.docbook:10121
+msgid "<function>_IMPLEMENTS_INTERFACE(C++ interface name)</function>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8917(programlisting)
+#: C/index-in.docbook:10123
 #, no-wrap
 msgid ""
 "\n"
-"Button::Button(const Glib::ustring&amp; label, bool mnemonic)\n"
-":\n"
-"  _CONSTRUCT(\"label\", label.c_str(), \"use_underline\", gboolean(mnemonic))\n"
-"{}\n"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:8909(para)
-msgid ""
-"When a constructor must be partly hand written because, for instance, the "
-"<function>*_new()</function> C function's parameters do not correspond "
-"directly to object properties, or because the <function>*_new()</function> C "
-"function does more than call <function>g_object_new()</function>, the "
-"<function>_CONSTRUCT()</function> macro may be used in the .ccg file to save "
-"some work. The <function>_CONSTRUCT</function> macro takes a series of "
-"property names and values. For instance, from <filename>button.ccg</"
-"filename>: <placeholder-1/>"
+"_IMPLEMENTS_INTERFACE(Orientable)\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8929(title)
-msgid "Method macros"
+#: C/index-in.docbook:10122
+msgid "For instance, from <filename>grid.hg</filename>: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8932(title)
-msgid "_WRAP_METHOD"
+#: C/index-in.docbook:10127
+msgid "There is one optional extra argument: <_:variablelist-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8933(para)
-msgid "This macro generates the C++ method to wrap a C function."
+#: C/index-in.docbook:10140
+msgid "_WRAP_ENUM"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8934(function)
-msgid "_WRAP_METHOD( C++ method signature, C function name)"
+#: C/index-in.docbook:10141
+msgid ""
+"This macro generates a C++ enum to wrap a C enum. You must specify the "
+"desired C++ name and the name of the underlying C enum."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8936(programlisting)
+#: C/index-in.docbook:10144
 #, no-wrap
 msgid ""
 "\n"
-"_WRAP_METHOD(void set_text(const Glib::ustring&amp; text), gtk_entry_set_text)\n"
+"_WRAP_ENUM(WindowType, GtkWindowType)\n"
+msgstr ""
+
+#: C/index-in.docbook:10143
+msgid "For instance, from <filename>enums.hg</filename>: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8935(para)
-msgid "For instance, from <filename>entry.hg</filename>: <placeholder-1/>"
+#: C/index-in.docbook:10151
+msgid "NO_GTYPE"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8940(para)
+#: C/index-in.docbook:10153
 msgid ""
-"The C function (e.g. <function>gtk_entry_set_text</function>) is described "
-"more fully in the .defs file, and the <filename>convert*.m4</filename> files "
-"contain the necessary conversion from the C++ parameter type to the C "
-"parameter type. This macro also generates doxygen documentation comments "
-"based on the <filename>*_docs.xml</filename> and <filename>*_docs_override."
-"xml</filename> files."
+"Use this option, if the enum is not a <classname>GType</classname>. This is "
+"the case when there is no <function>*_get_type()</function> function for the "
+"C enum, but be careful that you don't just need to include an extra header "
+"for that function. You should also file a bug against the C API, because all "
+"enums should be registered as GTypes."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8949(term)
-msgid "refreturn"
+#: C/index-in.docbook:10158
+msgid ""
+"If you specify <literal>NO_GTYPE</literal>, don't use that enum as the type "
+"in _WRAP_PROPERTY. It would cause a runtime error, when the generated "
+"<methodname>property_*()</methodname> method is called."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8951(para)
+#: C/index-in.docbook:10162
+#, no-wrap
 msgid ""
-"Do an extra reference() on the return value, in case the C function does not "
-"provide a reference."
+"\n"
+"_WRAP_ENUM(IconLookupFlags, GtkIconLookupFlags, NO_GTYPE)\n"
+"      "
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8956(term)
-msgid "errthrow"
+#: C/index-in.docbook:10161
+msgid ""
+"For example, from <filename>icontheme.hg</filename>: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8958(para)
-msgid "Use the last GError* parameter of the C function to throw an exception."
+#: C/index-in.docbook:10169
+msgid "gtype_func &lt;function_name&gt;"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8963(term)
-msgid "deprecated"
+#: C/index-in.docbook:10171
+msgid ""
+"Specifies the name of the <function>*_get_type()</function> function for the "
+"C enum. Use this parameter if <command>gmmproc</command> can't deduce the "
+"correct function name from the name of the C enum type."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8965(para)
+#: C/index-in.docbook:10175
+#, no-wrap
 msgid ""
-"Puts the generated code in #ifdef blocks. Text about the deprecation can be "
-"specified as an optional parameter."
+"\n"
+"_WRAP_ENUM(ProxyFlags, GDBusProxyFlags, gtype_func g_dbus_proxy_flags_get_type)\n"
+"      "
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8971(term)
-msgid "constversion"
+#: C/index-in.docbook:10174
+msgid ""
+"For example, from <filename>dbusproxy.hg</filename> in glibmm: <_:"
+"programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8973(para)
+#: C/index-in.docbook:10182
+msgid "CONV_TO_INT"
+msgstr ""
+
+#: C/index-in.docbook:10184
 msgid ""
-"Just call the non-const version of the same function, instead of generating "
-"almost duplicate code."
+"\"Convertible to int.\" Generates a plain enum (not an enum class) within a "
+"class. Such an enum is scoped like an enum class, but unlike an enum class, "
+"it can be implicitly converted to <type>int</type>."
+msgstr ""
+
+#: C/index-in.docbook:10188
+#, no-wrap
+msgid ""
+"\n"
+"_WRAP_ENUM(ResponseType, GtkResponseType, CONV_TO_INT)\n"
+"      "
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8946(para) C/gtkmm-tutorial-in.xml:9060(para)
-msgid "There are some optional extra arguments: <placeholder-1/>"
+#: C/index-in.docbook:10187
+msgid "For example, from <filename>dialog.hg</filename>: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8981(para)
-msgid ""
-"Objects used via <classname>RefPtr</classname>: Pass the <classname>RefPtr</"
-"classname> as a const reference. For instance, <code>const Glib::RefPtr&lt;"
-"Gtk::Action&gt;&amp; action</code>."
+#: C/index-in.docbook:10195
+msgid "s#&lt;from&gt;#&lt;to&gt;#"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8985(para)
+#: C/index-in.docbook:10197
 msgid ""
-"Const Objects used via <classname>RefPtr</classname>: If the object should "
-"not be changed by the function, then make sure that the object is const, "
-"even if the <classname>RefPtr</classname> is already const. For instance, "
-"<code>const Glib::RefPtr&lt;const Gtk::Action&gt;&amp; action</code>."
+"Substitutes (part of) the name of one or more enum constants. You can add "
+"any number of substitutions."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8990(para)
+#: C/index-in.docbook:10200
+#, no-wrap
 msgid ""
-"Wrapping <classname>GList*</classname> and <classname>GSList*</classname> "
-"parameters: First, you need to discover what objects are contained in the "
-"list's data field for each item, usually by reading the documentation for "
-"the C function. The list can then be wrapped by an appropriate intermediate "
-"type, such as <classname>Glib::ListHandle</classname> or <classname>Glib::"
-"SListHandle</classname>. These are templates, so you can specify the item "
-"type. For instance, <code>Glib::ListHandle&lt; Glib::RefPtr&lt;Action&gt; "
-"&gt;</code>. Existing typedefs exist for some common list types. You may "
-"need to define a Traits type to specify how the C and C++ types should be "
-"converted."
+"\n"
+"_WRAP_ENUM(SeekType, GSeekType, NO_GTYPE, s#^SEEK_#SEEK_TYPE_#)\n"
+"      "
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9009(programlisting)
-#, no-wrap
-msgid "#m4 _CONVERSION(`GSList*', `Glib::SListHandle&lt;Widget*&gt;', `$2($3, Glib::OWNERSHIP_NONE)')"
+#: C/index-in.docbook:10199
+msgid ""
+"For example, from <filename>iochannel.hg</filename> in glibmm: <_:"
+"programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9001(para)
-msgid ""
-"Wrapping <classname>GList*</classname> and <classname>GSList*</classname> "
-"return types: You must discover whether the caller should free the list and "
-"whether it should release the items in the list, again by reading the "
-"documentation of the C function. With this information you can choose the "
-"ownership (none, shallow or deep) for the m4 conversion rule, which you "
-"should probably put directly into the .hg file because the ownership depends "
-"on the function rather than the type. For instance: <placeholder-1/>"
+#: C/index-in.docbook:10225
+msgid "_WRAP_ENUM_DOCS_ONLY"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:8979(para)
+#: C/index-in.docbook:10226
 msgid ""
-"Though it's usually obvious what C++ types should be used in the C++ method, "
-"here are some hints: <placeholder-1/>"
+"This macro just generates a Doxygen documentationn block for the enum. This "
+"is useful for enums that can't be wrapped with <function>_WRAP_ENUM()</"
+"function> because they are complexly defined (maybe using C macros) but "
+"including the generated enum documentation is still desired. It is used with "
+"the same syntax as <function>_WRAP_ENUM()</function> and also processes the "
+"same options (though NO_GTYPE, gtype_func &lt;function_name&gt; and "
+"CONV_TO_INT are ignored because they make no difference when just generating "
+"the enum's documentation)."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9015(title)
-msgid "_WRAP_METHOD_DOCS_ONLY"
+#: C/index-in.docbook:10238
+msgid "_WRAP_GERROR"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9016(para)
+#: C/index-in.docbook:10239
 msgid ""
-"This macro is like <function>_WRAP_METHOD()</function>, but it generates "
-"only the documentation for a C++ method that wraps a C function. Use this "
-"when you must hand-code the method, but you want to use the documentation "
-"that would be generated if the method was generated."
+"This macro generates a C++ exception class, derived from <classname>Glib::"
+"Error</classname>, with a <type>Code</type> enum and a <methodname>code()</"
+"methodname> method. You must specify the desired C++ name, the name of the "
+"corresponding C enum, and the prefix for the C enum values."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9020(function)
-msgid "_WRAP_METHOD_DOCS_ONLY(C function name)"
+#: C/index-in.docbook:10242
+msgid ""
+"This exception can then be thrown by methods which are generated from "
+"_WRAP_METHOD() with the errthrow option."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9022(programlisting)
+#: C/index-in.docbook:10245
 #, no-wrap
 msgid ""
 "\n"
-"_WRAP_METHOD_DOCS_ONLY(gtk_container_remove)\n"
+"_WRAP_GERROR(PixbufError, GdkPixbufError, GDK_PIXBUF_ERROR)\n"
+msgstr ""
+
+#: C/index-in.docbook:10244
+msgid ""
+"For instance, from <filename>pixbuf.hg</filename>: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9021(para)
-msgid "For instance, from <filename>container.hg</filename>: <placeholder-1/>"
+#: C/index-in.docbook:10249
+msgid ""
+"_WRAP_GERROR() accepts the same optional arguments as _WRAP_ENUM() (though "
+"CONV_TO_INT is ignored because all exception class enums are plain enums "
+"within a class)."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9029(title)
-msgid "_IGNORE()"
+#: C/index-in.docbook:10255
+msgid "_MEMBER_GET / _MEMBER_SET"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9030(para)
+#: C/index-in.docbook:10256
 msgid ""
-"<command>gmmproc</command> will warn you on stdout about functions that you "
-"have forgotten to wrap, helping to ensure that you are wrapping the complete "
-"API. Buf if you don't want to wrap some functions or if you chose to hand-"
-"code some methods then you can use the _IGNORE() macro the make "
-"<command>gmmproc</command> stop complaining."
+"Use these macros if you're wrapping a simple struct or boxed type that "
+"provides direct access to its data members, to create getters and setters "
+"for the data members."
+msgstr ""
+
+#: C/index-in.docbook:10260
+msgid "<function>_MEMBER_GET(C++ name, C name, C++ type, C type)</function>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9035(function)
-msgid "_IGNORE(C function name 1, C function name2, etc)"
+#: C/index-in.docbook:10261
+msgid "<function>_MEMBER_SET(C++ name, C name, C++ type, C type)</function>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9037(programlisting)
+#: C/index-in.docbook:10264
 #, no-wrap
+msgid "_MEMBER_GET(x, x, int, int)"
+msgstr ""
+
+#: C/index-in.docbook:10262
 msgid ""
-"\n"
-"_IGNORE(gtk_button_box_set_spacing, gtk_button_box_get_spacing,\n"
+"For example, in <filename>rectangle.hg</filename>: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9036(para)
-msgid "For instance, from <filename>buttonbox.hg</filename>: <placeholder-1/>"
+#: C/index-in.docbook:10268
+msgid "_MEMBER_GET_PTR / _MEMBER_SET_PTR"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9044(title)
-msgid "_WRAP_SIGNAL"
+#: C/index-in.docbook:10269
+msgid ""
+"Use these macros to automatically provide getters and setters for a data "
+"member that is a pointer type. For the getter function, it will create two "
+"methods, one const and one non-const."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9045(para)
+#: C/index-in.docbook:10274
 msgid ""
-"This macro generates the C++ libsigc++-style signal to wrap a C GObject "
-"signal. It actually generates a public accessor method, such as "
-"<function>signal_clicked()</function>, which returns a proxy object. "
-"<command>gmmproc</command> uses the .defs file to discover the C parameter "
-"types and the .m4 convert files to discover appropriate type conversions."
+"<function>_MEMBER_GET_PTR(C++ name, C name, C++ type, C type)</function>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9051(function)
-msgid "_WRAP_SIGNAL( C++ signal handler signature, C signal name)"
+#: C/index-in.docbook:10275
+msgid ""
+"<function>_MEMBER_SET_PTR(C++ name, C name, C++ type, C type)</function>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9053(programlisting)
+#: C/index-in.docbook:10277
 #, no-wrap
 msgid ""
 "\n"
-"_WRAP_SIGNAL(void clicked(),\"clicked\")\n"
+"// _MEMBER_GET_PTR(engine_lang, lang_engine, EngineLang*, PangoEngineLang*)\n"
+"// It's just a comment. It's difficult to find a real-world example.\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9057(para)
+#: C/index-in.docbook:10276
 msgid ""
-"Signals usually have function pointers in the GTK struct, with a "
-"corresponding enum value. and a <function>g_signal_new()</function> in the ."
-"c file."
+"For example, for <classname>Pango::Analysis</classname> in <filename>item."
+"hg</filename>: <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9063(term)
-msgid "no_default_handler"
+#: C/index-in.docbook:10284
+msgid "_MEMBER_GET_GOBJECT / _MEMBER_SET_GOBJECT"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9065(para)
+#: C/index-in.docbook:10285
 msgid ""
-"Do not generate an <function>on_something()</function> virtual method to "
-"allow easy overriding of the default signal handler. Use this when adding a "
-"signal with a default signal handler would break the ABI by increasing the "
-"size of the class's virtual function table."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:9077(title)
-msgid "_WRAP_PROPERTY"
+"Use these macros to provide getters and setters for a data member that is a "
+"<classname>GObject</classname> type that must be referenced before being "
+"returned."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9078(para)
+#: C/index-in.docbook:10290
 msgid ""
-"This macro generates the C++ method to wrap a C GObject property. You must "
-"specify the property name and the wanted C++ type for the property. "
-"<command>gmmproc</command> uses the .defs file to discover the C type and "
-"the .m4 convert files to discover appropriate type conversions."
+"<function>_MEMBER_GET_GOBJECT(C++ name, C name, C++ type, C type)</function>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9082(function)
-msgid "_WRAP_PROPERTY(C property name, C++ type)"
+#: C/index-in.docbook:10291
+msgid ""
+"<function>_MEMBER_SET_GOBJECT(C++ name, C name, C++ type, C type)</function>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9084(programlisting)
+#: C/index-in.docbook:10293
 #, no-wrap
 msgid ""
 "\n"
-"_WRAP_PROPERTY(\"label\", Glib::ustring)\n"
+"_MEMBER_GET_GOBJECT(layout, layout, Pango::Layout, PangoLayout*)\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9093(title)
-msgid "Other macros"
+#: C/index-in.docbook:10292
+msgid ""
+"For example, in Pangomm, <filename>layoutline.hg</filename>: <_:"
+"programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9095(title)
-msgid "_WRAP_ENUM"
+#: C/index-in.docbook:10302
+msgid "gmmproc Parameter Processing"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9096(para)
+#: C/index-in.docbook:10303
 msgid ""
-"This macro generates a C++ enum to wrap a C enum. You must specify the "
-"desired C++ name and the name of the underlying C enum."
+"<command>gmmproc</command> allows processing the parameters in a method "
+"signature for the macros that process method signatures (like "
+"<function>_WRAP_METHOD()</function>, <function>_WRAP_CTOR()</function> and "
+"<function>_WRAP_CREATE()</function>) in a variety of ways:"
+msgstr ""
+
+#: C/index-in.docbook:10310
+msgid "Parameter Reordering"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9099(programlisting)
+#: C/index-in.docbook:10317
 #, no-wrap
 msgid ""
 "\n"
-"_WRAP_ENUM(WindowType, GdkWindowType)\n"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:9098(para)
-msgid "For instance, from <filename>widget.hg</filename>: <placeholder-1/>"
+"void gtk_widget_set_device_events(GtkWidget* widget, GdkDevice* device,\n"
+"  GdkEventMask events);\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9103(para)
+#: C/index-in.docbook:10324
+#, no-wrap
 msgid ""
-"If the enum is not a <classname>GType</classname>, you must pass a third "
-"parameter NO_GTYPE. This is the case when there is no <function>*_get_type()"
-"</function> function for the C enum, but be careful that you don't just need "
-"to include an extra header for that function. You should also file a bug "
-"against the C API, because all enums should be regeistered as GTypes."
+"\n"
+"_WRAP_METHOD(void set_device_events(Gdk::EventMask events{events},\n"
+"  const Glib::RefPtr&lt;const Gdk::Device&gt;&amp; device{device}),\n"
+"  gtk_widget_set_device_events)\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9108(programlisting)
+#: C/index-in.docbook:10334
 #, no-wrap
 msgid ""
 "\n"
-"_WRAP_ENUM(IconLookupFlags, GtkIconLookupFlags)\n"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:9107(para)
-msgid "For example: <placeholder-1/>"
+"_WRAP_METHOD(void set_device_events(Gdk::EventMask events{.},\n"
+"  const Glib::RefPtr&lt;const Gdk::Device&gt;&amp; device{.}),\n"
+"  gtk_widget_set_device_events)\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9115(title)
-msgid "_WRAP_GERROR"
+#: C/index-in.docbook:10311
+msgid ""
+"For all the macros that process method signatures, it is possible to specify "
+"a different order for the C++ parameters than the existing order in the C "
+"function, virtual function or signal. For example, say that the following C "
+"function were being wrapped as a C++ method for the <classname>Gtk::Widget</"
+"classname> class: <_:programlisting-1/> However, changing the order of the C+"
+"+ method's two parameters is necessary. Something like the following would "
+"wrap the function as a C++ method with a different order for the two "
+"parameters: <_:programlisting-2/> The <literal>{c_param_name}</literal> "
+"following the method parameter names tells <command>gmmproc</command> to map "
+"the C++ parameter to the specified C parameter within the <literal>{}</"
+"literal>. Since the C++ parameter names correspond to the C ones, the above "
+"could be re-written as: <_:programlisting-3/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9116(para)
+#: C/index-in.docbook:10341
 msgid ""
-"This macro generates a C++ exception class, derived from Glib::Error, with a "
-"Code enum and a code() method. You must specify the desired C++ name, the "
-"name of the corresponding C enum, and the prefix for the C enum values."
+"Please note that when reordering parameters for a <function>_WRAP_SIGNAL()</"
+"function> method signature, the C parameter names would always be "
+"<literal>p0</literal>, <literal>p1</literal>, etc. because the "
+"<filename>generate_extra_defs</filename> utility uses those parameter names "
+"no matter what the C API's parameter names may be. It's how the utility is "
+"written presently."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9119(para)
-msgid ""
-"This exception can then be thrown by methods which are generated from "
-"_WRAP_METHOD() with the errthrow option."
+#: C/index-in.docbook:10353
+msgid "Optional Parameter Processing"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9121(programlisting)
+#: C/index-in.docbook:10362
 #, no-wrap
 msgid ""
 "\n"
-"_WRAP_GERROR(PixbufError, GdkPixbufError, GDK_PIXBUF_ERROR)\n"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:9120(para)
-msgid "For instance, from <filename>pixbuf.hg</filename>: <placeholder-1/>"
+"GtkToolItem* gtk_tool_button_new(GtkWidget* icon_widget, const gchar* label);\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9128(title)
-msgid "_MEMBER_GET / _MEMBER_SET"
+#: C/index-in.docbook:10371
+#, no-wrap
+msgid ""
+"\n"
+"_WRAP_CTOR(ToolButton(Widget&amp; icon_widget, const Glib::ustring&amp; label{?}),\n"
+"  gtk_tool_button_new)\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9129(para)
+#: C/index-in.docbook:10354
 msgid ""
-"Use these macro if you're wrapping a simple struct or boxed type that "
-"provides direct access to its data members, to create getters and setters "
-"for the data members."
+"For all macros processing method signatures except <function>_WRAP_SIGNAL()</"
+"function> and <function>_WRAP_VFUNC()</function> it is also possible to make "
+"the parameters optional so that extra C++ methods are generated without the "
+"specified optional parameter. For example, say that the following "
+"<function>*_new()</function> function were being wrapped as a constructor in "
+"the <classname>Gtk::ToolButton</classname> class: <_:programlisting-1/> "
+"Also, say that the C API allowed NULL for the function's <parameter>label</"
+"parameter> parameter so that that parameter is optional. It would be "
+"possible to have <command>gmmproc</command> generate the original "
+"constructor (with all the parameters) along with an additional constructor "
+"without that optional parameter by appending a <literal>{?}</literal> to the "
+"parameter name like so: <_:programlisting-2/> In this case, two constructors "
+"would be generated: One with the optional parameter and one without it."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9133(function)
-msgid "_MEMBER_GET(C++ name, C name, C++ type, C type)"
+#: C/index-in.docbook:10381
+msgid "Output Parameter Processing"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9134(function)
-msgid "_MEMBER_SET(C++ name, C name, C++ type, C type)"
+#: C/index-in.docbook:10391
+#, no-wrap
+msgid ""
+"\n"
+"GtkSizeRequestMode gtk_widget_get_request_mode(GtkWidget* widget);\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9137(programlisting)
+#: C/index-in.docbook:10397
 #, no-wrap
-msgid "_MEMBER_GET(x, x, int, int)"
+msgid ""
+"\n"
+"_WRAP_METHOD(void get_request_mode(SizeRequestMode&amp; mode{OUT}) const,\n"
+"  gtk_widget_get_request_mode)\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9135(para)
-msgid "For example, in <filename>rectangle.hg</filename>: <placeholder-1/>"
+#: C/index-in.docbook:10406
+#, no-wrap
+msgid ""
+"\n"
+"_INITIALIZATION(`SizeRequestMode&amp;',`GtkSizeRequestMode',`$3 = (SizeRequestMode)($4)')\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9141(title)
-msgid "_MEMBER_GET_PTR / _MEMBER_SET_PTR"
+#: C/index-in.docbook:10410
+#, no-wrap
+msgid ""
+"\n"
+"_INITIALIZATION(`SizeRequestMode&amp;',`GtkSizeRequestMode',`$3 = ($1)($4)')\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9142(para)
+#: C/index-in.docbook:10382
 msgid ""
-"Use these macros to automatically provide getters and setters for a data "
-"member that is a pointer type. For the getter function, it will create two "
-"methods, one const and one non-const."
+"With <function>_WRAP_METHOD()</function> it is also possible for the return "
+"of the wrapped C function (if it has one) to be placed in an output "
+"parameter of the C++ method instead of having the C++ method also return a "
+"value like the C function does. To do that, simply include the output "
+"parameter in the C++ method parameter list appending a <literal>{OUT}</"
+"literal> to the output parameter name. For example, if "
+"<function>gtk_widget_get_request_mode()</function> is declared as the "
+"following: <_:programlisting-1/> And having the C++ method set an output "
+"parameter is desired instead of returning a <type>SizeRequestMode</type>, "
+"something like the following could be used: <_:programlisting-2/> The "
+"<literal>{OUT}</literal> appended to the name of the <parameter>mode</"
+"parameter> output parameter tells <command>gmmproc</command> to place the "
+"return of the C function in that output parameter. In this case, however, a "
+"necessary initialization macro like the following would also have to be "
+"specified: <_:programlisting-3/> Which could also be written as: <_:"
+"programlisting-4/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9147(function)
-msgid "_MEMBER_GET_PTR(C++ name, C name, C++ type, C type)"
+#: C/index-in.docbook:10420
+#, no-wrap
+msgid ""
+"\n"
+"gboolean gtk_icon_view_get_cell_rect(GtkIconView* icon_view,\n"
+"  GtkTreePath* path, GtkCellRenderer* cell, GdkRectangle* rect);\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9148(function)
-msgid "_MEMBER_SET_PTR(C++ name, C name, C++ type, C type)"
+#: C/index-in.docbook:10427
+#, no-wrap
+msgid ""
+"\n"
+"_WRAP_METHOD(bool get_cell_rect(const TreeModel::Path&amp; path,\n"
+"  const CellRenderer&amp; cell, Gdk::Rectangle&amp; rect{&gt;&gt;}) const,\n"
+"  gtk_icon_view_get_cell_rect)\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9150(programlisting)
+#: C/index-in.docbook:10442
 #, no-wrap
 msgid ""
 "\n"
-"_MEMBER_GET_PTR(vbox, vbox, VBox*, GtkWidget*)\n"
+"_INITIALIZATION(`Gdk::Rectangle&amp;',`GdkRectangle',`$3 = Glib::wrap(&amp;($4))')\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9149(para)
-msgid "For example, in <filename>dialog.hg</filename>: <placeholder-1/>"
+#: C/index-in.docbook:10414
+msgid ""
+"<function>_WRAP_METHOD()</function> also supports setting C++ output "
+"parameters from C output parameters if the C function being wrapped has any. "
+"Suppose, for example, that we want to wrap the following C function that "
+"returns a value in its C output parameter <parameter>rect</parameter>: <_:"
+"programlisting-1/> To have <command>gmmproc</command> place the value "
+"returned in the C++ <parameter>rect</parameter> output parameter, something "
+"like the following <function>_WRAP_METHOD()</function> macro could be used: "
+"<_:programlisting-2/> The <literal>{&gt;&gt;}</literal> following the "
+"<parameter>rect</parameter> parameter name indicates that the C++ output "
+"parameter should be set from the value returned in the C parameter from the "
+"C function. <command>gmmproc</command> will generate a declaration of a "
+"temporary variable in which to store the value of the C output parameter and "
+"a statement that sets the C++ output parameter from the temporary variable. "
+"In this case it may be necessary to have an <function>_INITIALIZATION()</"
+"function> describing how to set a <classname>Gdk::Rectangle&amp;</classname> "
+"from a <classname>GdkRectangle*</classname> such as the following: <_:"
+"programlisting-3/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9156(title)
-msgid "_MEMBER_GET_GOBJECT / _MEMBER_SET_GOBJECT"
+#: C/index-in.docbook:10449
+msgid "String Parameter Processing"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9157(para)
+#: C/index-in.docbook:10450
 msgid ""
-"Use this macro to provide getters and setters for a data member that is a "
-"<classname>GObject</classname> type that must be referenced before being "
-"returned."
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:9162(function)
-msgid "_MEMBER_GET_GOBJECT(C++ name, C name, C++ type, C type)"
+"A string-valued input parameter in a C++ method is usually a <type>const "
+"Glib::ustring&amp;</type> or a <type>const std::string&amp;</type>. In C "
+"code it's a <type>const gchar*</type>. When an empty string is converted to "
+"<type>const gchar*</type>, it can be converted either to <literal>nullptr</"
+"literal> or to a pointer to an empty string (with <methodname>c_str()</"
+"methodname>). Some parameters in some C functions accept a <literal>nullptr</"
+"literal>, and interpret it in a special way. Other parameters must not be "
+"<literal>nullptr</literal>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9163(function)
-msgid "_MEMBER_SET_GOBJECT(C++ name, C name, C++ type, C type)"
+#: C/index-in.docbook:10463
+msgid ""
+"for mandatory parameters (with or without default values): empty string to "
+"empty string,"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9165(programlisting)
-#, no-wrap
+#: C/index-in.docbook:10465
 msgid ""
-"\n"
-"_MEMBER_GET_GOBJECT(offscreen_pixmap, offscreen_pixmap, Gdk::Pixmap, GdkPixmap*)\n"
+"for optional parameters (with appended <literal>{?}</literal>): empty string "
+"to <literal>nullptr</literal>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9164(para)
-msgid "For example, in <filename>progress.hg</filename>: <placeholder-1/>"
+#: C/index-in.docbook:10459
+msgid ""
+"The default conversion in <function>_WRAP_METHOD()</function> and similar "
+"macros is <_:itemizedlist-1/> If the default conversion is not the best "
+"conversion, append <literal>{NULL}</literal> to a mandatory parameter or "
+"<literal>{?!NULL}</literal> to an optional parameter (<literal>!NULL</"
+"literal> = not <literal>NULL</literal>). If you append both a C parameter "
+"name and <literal>NULL</literal>, separate them with a space: "
+"<literal>{c_param_name NULL}</literal>."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9172(title)
+#: C/index-in.docbook:10479
 msgid "Basic Types"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9173(para)
+#: C/index-in.docbook:10480
 msgid ""
 "Some of the basic types that are used in C APIs have better alternatives in C"
 "++. For example, there's no need for a <type>gboolean</type> type since C++ "
@@ -11621,92 +14123,90 @@ msgid ""
 "C APIs and what you might convert them to in a C++ wrapper library."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9178(title)
+#: C/index-in.docbook:10485
 msgid "Basic Type equivalents"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9180(segtitle)
+#: C/index-in.docbook:10487
 msgid "C type"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9181(segtitle)
+#: C/index-in.docbook:10488
 msgid "C++ type"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9182(type)
-msgid "gboolean"
-msgstr ""
-
-#: C/gtkmm-tutorial-in.xml:9182(type)
-msgid "bool"
+#: C/index-in.docbook:10489
+msgid "<type>gboolean</type>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9183(type)
-msgid "gint"
+#: C/index-in.docbook:10489
+msgid "<type>bool</type>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9183(type)
-msgid "int"
+#: C/index-in.docbook:10490
+msgid "<type>gint</type>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9184(type)
-msgid "guint"
+#: C/index-in.docbook:10490
+msgid "<type>int</type>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9185(type)
-msgid "gdouble"
+#: C/index-in.docbook:10491
+msgid "<type>guint</type>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9185(type)
-msgid "double"
+#: C/index-in.docbook:10492
+msgid "<type>gdouble</type>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9186(type)
-msgid "gunichar"
+#: C/index-in.docbook:10492
+msgid "<type>double</type>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9187(type)
-msgid "gchar*"
+#: C/index-in.docbook:10493
+msgid "<type>gunichar</type>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9187(classname)
-msgid "std::string"
+#: C/index-in.docbook:10494
+msgid "<type>gchar*</type>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9187(seg)
-msgid "<placeholder-1/> (or <placeholder-2/> for filenames)"
+#: C/index-in.docbook:10494
+msgid ""
+"<classname>Glib::ustring</classname> (or <classname>std::string</classname> "
+"for filenames)"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9194(title)
+#: C/index-in.docbook:10501
 msgid "Hand-coded source files"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9195(para)
+#: C/index-in.docbook:10502
 msgid ""
 "You might want to include additional source files that will not be generated "
 "by <command>gmmproc</command> from <filename>.hg</filename> and <filename>."
 "ccg</filename> files. You can simply place these in your "
 "<filename>libsomething/libsomethingmm</filename> directory and mention them "
-"in the <filename>Makefile.am</filename> in the <varname>files_extra_h</"
-"varname> and <varname>files_extra_cc</varname> variables."
+"in the <filename>meson.build</filename> in the <varname>extra_h_files</"
+"varname> and <varname>extra_cc_files</varname> variables."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9205(title)
+#: C/index-in.docbook:10512
 msgid "Initialization"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9214(programlisting)
+#: C/index-in.docbook:10521
 #, no-wrap
 msgid ""
 "\n"
 "void init()\n"
 "{\n"
-"  Gtk::Main::init_gtkmm_internals(); //Sets up the g type system and the Glib::wrap() table.\n"
+"  Gtk::init_gtkmm_internals(); //Sets up the g type system and the Glib::wrap() table.\n"
 "  wrap_init(); //Tells the Glib::wrap() table about the libsomethingmm classes.\n"
 "}\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9206(para)
+#: C/index-in.docbook:10513
 msgid ""
 "Your library must be initialized before it can be used, to register the new "
 "types that it makes available. Also, the C library that you are wrapping "
@@ -11715,35 +14215,36 @@ msgid ""
 "coded <filename>init.h</filename> and <filename>init.cc</filename> files. "
 "This function should initialize your dependencies (such as the C function, "
 "and <application>gtkmm</application>) and call your generated "
-"<function>wrap_init()</function> function. For instance: <placeholder-1/>"
+"<function>wrap_init()</function> function. For instance: <_:programlisting-1/"
+">"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9222(para)
+#: C/index-in.docbook:10529
 msgid ""
 "The implementation of the <function>wrap_init()</function> method in "
 "<filename>wrap_init.cc</filename> is generated by "
 "<filename>generate_wrap_init.pl</filename>, but the declaration in "
 "<filename>wrap_init.h</filename> is hand-coded, so you will need to adjust "
-"<filename>wrap_init.h</filename> so that the <function>init()</function> "
-"function appears in the correct C++ namespace."
+"<filename>wrap_init.h</filename> so that the <function>wrap_init()</"
+"function> function appears in the correct C++ namespace."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9231(title)
+#: C/index-in.docbook:10538
 msgid "Problems in the C API."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9232(para)
+#: C/index-in.docbook:10539
 msgid ""
 "You are likely to encounter some problems in the library that you are "
 "wrapping, particularly if it is a new project. Here are some common "
 "problems, with solutions."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9234(title)
+#: C/index-in.docbook:10541
 msgid "Unable to predeclare structs"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9236(programlisting)
+#: C/index-in.docbook:10543
 #, no-wrap
 msgid ""
 "\n"
@@ -11755,23 +14256,23 @@ msgid ""
 "};\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9235(para)
+#: C/index-in.docbook:10542
 msgid ""
-"By convention, structs are declared in glib/GTK+-style headers like so: "
-"<placeholder-1/>"
+"By convention, structs are declared in glib/GTK-style headers like so: <_:"
+"programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9245(para)
+#: C/index-in.docbook:10552
 msgid ""
 "The extra typedef allows the struct to be used in a header without including "
-"its full defintion, simply by predeclaring it, by repeating that typedef. "
+"its full definition, simply by predeclaring it, by repeating that typedef. "
 "This means that you don't have to include the C library's header in your C++ "
 "header, thus keeping it out of your public API. <command>gmmproc</command> "
 "assumes that this technique was used, so you will see compiler errors if "
 "that is not the case."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9248(programlisting)
+#: C/index-in.docbook:10559
 #, no-wrap
 msgid ""
 "\n"
@@ -11780,7 +14281,7 @@ msgid ""
 "make[4]: *** [example-widget.lo] Error 1\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9254(programlisting)
+#: C/index-in.docbook:10565
 #, no-wrap
 msgid ""
 "\n"
@@ -11788,23 +14289,23 @@ msgid ""
 "../../libexample/libexamplemm/example-widget.h:34: error: previous declaration of 'typedef struct 
_ExampleWidget ExampleWidget'\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9246(para)
+#: C/index-in.docbook:10557
 msgid ""
-"This compiler error might look like this: <placeholder-1/> or this: "
-"<placeholder-2/>"
+"This compiler error might look like this: <_:programlisting-1/> or this: <_:"
+"programlisting-2/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9259(para)
+#: C/index-in.docbook:10570
 msgid ""
 "This is easy to correct in the C library, so do send a patch to the relevant "
 "maintainer."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9263(title)
+#: C/index-in.docbook:10574
 msgid "Lack of properties"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9270(programlisting)
+#: C/index-in.docbook:10581
 #, no-wrap
 msgid ""
 "\n"
@@ -11814,17 +14315,17 @@ msgid ""
 "}\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9264(para)
+#: C/index-in.docbook:10575
 msgid ""
-"By convention, glib/GTK+-style objects have <function>*_new()</function> "
+"By convention, glib/GTK-style objects have <function>*_new()</function> "
 "functions, such as <function>example_widget_new()</function> that do nothing "
 "more than call <function>g_object_new()</function> and return the result. "
 "The input parameters are supplied to <function>g_object_new()</function> "
 "along with the names of the properties for which they are values. For "
-"instance, <placeholder-1/>"
+"instance, <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9277(para)
+#: C/index-in.docbook:10588
 msgid ""
 "This allows language bindings to implement their own equivalents (such as C+"
 "+ constructors), without using the <function>*_new()</function> function. "
@@ -11832,7 +14333,7 @@ msgid ""
 "GType, to add their own hooks for signal handlers and vfuncs."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9281(para)
+#: C/index-in.docbook:10592
 msgid ""
 "At the least, the <function>_new()</function> function should not use any "
 "private API (functions that are only in a .c file). Even when there are no "
@@ -11841,7 +14342,7 @@ msgid ""
 "that is available to us."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9289(programlisting)
+#: C/index-in.docbook:10600
 #, no-wrap
 msgid ""
 "\n"
@@ -11860,83 +14361,521 @@ msgid ""
 "}\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9286(para)
+#: C/index-in.docbook:10597
 msgid ""
 "Another workaround is to add a <function>*_construct()</function> function "
 "that the C++ constructor can call after instantiating its own type. For "
-"instance, <placeholder-1/>"
+"instance, <_:programlisting-1/>"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9305(para)
+#: C/index-in.docbook:10616
 msgid ""
 "Adding properties, and ensuring that they interact properly with each other, "
 "is relatively difficult to correct in the C library, but it is possible, so "
 "do file a bug and try to send a patch to the relevant maintainer."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9313(title)
+#: C/index-in.docbook:10624
 msgid "Documentation"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9314(para)
+#: C/index-in.docbook:10625
 msgid ""
 "In general, gtkmm-style projects use Doxygen, which reads specially "
 "formatted C++ comments and generates HTML documentation. You may write these "
 "doxygen comments directly in the header files."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9317(title)
+#: C/index-in.docbook:10628
 msgid "Reusing C documentation"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9318(para)
+#: C/index-in.docbook:10629
 msgid ""
 "You might wish to reuse documentation that exists for the C library that you "
 "are wrapping. GTK-style C libraries typically use gtk-doc and therefore have "
 "source code comments formatted for gtk-doc and some extra documentation in ."
-"tmpl files. The docextract_to_xml.py script, from pygobject's codegen "
-"directory, can read these files and generate an .xml file that "
-"<command>gmmproc</command> can use to generate doxygen comments. "
-"<command>gmmproc</command> will even try to transform the documentation to "
-"make it more appropriate for a C++ API."
+"sgml and .xml files. The docextract_to_xml.py script, from glibmm's "
+"<filename>tools/defs_gen</filename> directory, can read these files and "
+"generate an .xml file that <command>gmmproc</command> can use to generate "
+"doxygen comments. <command>gmmproc</command> will even try to transform the "
+"documentation to make it more appropriate for a C++ API."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9321(programlisting)
+#: C/index-in.docbook:10639
 #, no-wrap
-msgid "./docextract_to_xml.py -s /gnome/head/cvs/gtk+/gtk/ -s /gnome/head/cvs/gtk+/docs/reference/gtk/tmpl/ 
&gt; gtk_docs.xml\n"
+msgid "./docextract_to_xml.py -s ~/checkout/gnome/gtk/gtk/ &gt; gtk_docs.xml\n"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9324(para)
+#: C/index-in.docbook:10642
 msgid ""
 "Because this automatic transformation is not always appropriate, you might "
 "want to provide hand-written text for a particular method. You can do this "
 "by copying the XML node for the function from your <filename>something_docs."
 "xml</filename> file to the <filename>something_docs_override.xml</filename> "
-"file and changing the contents."
+"file and changing the contents. Alternatively you can write your own "
+"documentation in the <filename>.hg</filename> file."
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9333(title)
+#: C/index-in.docbook:10652
 msgid "Documentation build structure"
 msgstr ""
 
-#: C/gtkmm-tutorial-in.xml:9334(para)
+#: C/index-in.docbook:10653
 msgid ""
-"If you copied the skeleton source tree in mm-common and substituted the "
-"placeholder text, then you will already have suitable <filename>Makefile.am</"
-"filename> and <filename>Doxyfile.in</filename> files. With the mm-common "
-"build setup, the list of Doxygen input files is not defined in the Doxygen "
-"configuration file, but passed along from <command>make</command> to the "
-"standard input of <command>doxygen</command>. The input file list is defined "
-"by the <varname>doc_input</varname> variable in the <filename>Makefile.am</"
-"filename> file."
+"If you copied the skeleton source tree in <application>mm-common</"
+"application> and substituted the placeholder text, then you will already "
+"have suitable <filename>meson.build</filename> and <filename>Doxyfile.in</"
+"filename> files in the <filename>doc/reference/</filename> directory. You "
+"probably need to modify the <varname>tag_file_modules</varname> variable in "
+"<filename>meson.build</filename>, though. With the <application>mm-common</"
+"application> build setup, the list of Doxygen input files is not defined in "
+"the Doxygen configuration file, but passed along from <command>meson/ninja</"
+"command> to the standard input of <command>doxygen</command>."
 msgstr ""
 
-#. Put one translator per line, in the form of NAME <EMAIL>, YEAR1, YEAR2
-#: C/gtkmm-tutorial-in.xml:0(None)
-msgid "translator-credits"
-msgstr ""
-"sweord <sweord msn com>, 2004\n"
-"Tao Wang <dancefire gmail com>, 2010"
+#~ msgid "Murray"
+#~ msgstr "Murray"
+
+#~ msgid "Cumming"
+#~ msgstr "Cumming"
+
+#~ msgid "Bernhard"
+#~ msgstr "Bernhard"
+
+#~ msgid "Rieder"
+#~ msgstr "Rieder"
+
+#~ msgid "Chapter on \"Timeouts\"."
+#~ msgstr "章节《超时》"
+
+#~ msgid "Jonathon"
+#~ msgstr "Jonathon"
+
+#~ msgid "Jongsma"
+#~ msgstr "Jongsma"
+
+#~ msgid "Chapter on \"Drawing with Cairo\"."
+#~ msgstr "章节《使用 Cairo 绘图》"
+
+#~ msgid "Chapter on \"Working with gtkmm's Source Code\"."
+#~ msgstr "章节《使用 gtkmm 源代码》"
+
+#~ msgid "Chapter on \"Recent Files\"."
+#~ msgstr "章节《最近的文件》"
+
+#~ msgid "Jason"
+#~ msgstr "Jason"
+
+#~ msgid "M'Sadoques"
+#~ msgstr "M'Sadoques"
+
+#~ msgid "Chapter on \"Drawing Area\"."
+#~ msgstr "章节《绘图区域》"
+
+#~ msgid "Ole"
+#~ msgstr "Ole"
+
+#~ msgid "Laursen"
+#~ msgstr "Laursen"
+
+#~ msgid "Parts of chapter on \"Internationalization\"."
+#~ msgstr "部分章节《国际化》"
+
+#~ msgid "Gene"
+#~ msgstr "Gene"
+
+#~ msgid "Ruebsamen"
+#~ msgstr "Ruebsamen"
+
+#~ msgid "Chapter on \"Win32 Installation\"."
+#~ msgstr "章节《Win32 安装》"
+
+#~ msgid "Cedric"
+#~ msgstr "Cedric"
+
+#~ msgid "Gustin"
+#~ msgstr "Gustin"
+
+#~ msgid "Marko"
+#~ msgstr "Marko"
+
+#~ msgid "Anastasov"
+#~ msgstr "Anastasov"
+
+#~ msgid "Chapter on \"Printing\"."
+#~ msgstr "章节《打印》"
+
+#~ msgid "Alan"
+#~ msgstr "Alan"
+
+#~ msgid "Ott"
+#~ msgstr "Ott"
+
+#~ msgid "Appendix on \"Visual Studio 2005\"."
+#~ msgstr "章节《Visual Studio 2005》"
+
+#~ msgid "Daniel"
+#~ msgstr "Daniel"
+
+#~ msgid "Elstner"
+#~ msgstr "Elstner"
+
+#~ msgid "Murray Cumming"
+#~ msgstr "Murray Cumming"
+
+#~ msgid "libsigc++ 2.0"
+#~ msgstr "libsigc++ 2.0"
+
+#~ msgid "GTK+ 2.4"
+#~ msgstr "GTK+ 2.4"
+
+#~ msgid "cairomm"
+#~ msgstr "cairomm"
+
+#~ msgid "pkg-config"
+#~ msgstr "pkg-config"
+
+#~ msgid "glib"
+#~ msgstr "glib"
+
+#~ msgid "ATK"
+#~ msgstr "ATK"
+
+#~ msgid "Pango"
+#~ msgstr "Pango"
+
+#~ msgid "cairo"
+#~ msgstr "cairo"
+
+#~ msgid ""
+#~ "\n"
+#~ "# ./configure\n"
+#~ "# make\n"
+#~ "# make install\n"
+#~ msgstr ""
+#~ "\n"
+#~ "# ./configure\n"
+#~ "# make\n"
+#~ "# make install\n"
+
+#~ msgid "Source Code"
+#~ msgstr "源代码"
+
+#~ msgid "Gtk::Main kit(argc, argv);"
+#~ msgstr "Gtk::Main kit(argc, argv);"
+
+#~ msgid ""
+#~ "The next line: <placeholder-1/> creates a <classname>Gtk::Main</"
+#~ "classname> object. This is needed in all <application>gtkmm</application> "
+#~ "applications. The constructor for this object initializes "
+#~ "<application>gtkmm</application>, and checks the arguments passed to your "
+#~ "application on the command line, looking for standard options such as "
+#~ "<literal>-display</literal>. It takes these from the argument list, "
+#~ "leaving anything it does not recognize for your application to parse or "
+#~ "ignore. This ensures that all <application>gtkmm</application> "
+#~ "applications accept the same set of standard arguments."
+#~ msgstr ""
+#~ "下面一行:<placeholder-1/> 创建了一个 <classname>Gtk::Main</classname> 对"
+#~ "象。这是所有的 <application>gtkmm</application> 程序中所必须的。这个对象的"
+#~ "构造函数初始化了 <application>gtkmm</application>,并且检查传递给你的程序"
+#~ "的命令行参数,从中寻找像 <literal>-display</literal> 这样的标准选项。然后"
+#~ "它会将这些可以识别的参数从参数列表中删除,留下那些它不能识别的选项,交由你"
+#~ "的程序处理或者忽略。这样就保证了 <application>gtkmm</application> 应用程序"
+#~ "能和其它程序一样接受所有的标准参数。"
+
+#~ msgid "Gtk::Window window;"
+#~ msgstr "Gtk::Window window;"
+
+#~ msgid ""
+#~ "The last line shows the window and enters the <application>gtkmm</"
+#~ "application> main processing loop, which will finish when the window is "
+#~ "closed."
+#~ msgstr ""
+#~ "最后一行显示窗口,并且进入 <application>gtkmm</application> 的主处理循环,"
+#~ "它将一直运行到窗口被关闭。"
+
+#~ msgid "Gtk::Main::run(window);"
+#~ msgstr "Gtk::Main::run(window);"
+
+#~ msgid ""
+#~ "Openismus has more <ulink url=\"http://www.openismus.com/documents/linux/";
+#~ "automake/automake.shtml\">basic help with automake and autoconf</ulink>."
+#~ msgstr ""
+#~ "Openismus 有更多 <ulink url=\"http://www.openismus.com/documents/linux/";
+#~ "automake/automake.shtml\">帮助使用 automake 和 autoconf 的基础知识</"
+#~ "ulink>。"
+
+#~ msgid "Reference"
+#~ msgstr "参考"
+
+#~ msgid "Intermediate types"
+#~ msgstr "中间类型"
+
+#~ msgid ""
+#~ "<classname>Glib::ListHandle&lt;Gtk::Widget*&gt;</classname>: Use "
+#~ "<classname>std::vector&lt;Gtk::Widget*&gt;</classname>, <classname>std::"
+#~ "list&lt;Gtk::Widget*&gt;</classname>, etc."
+#~ msgstr ""
+#~ "<classname>Glib::ListHandle&lt;Gtk::Widget*&gt;</classname>:使用 "
+#~ "<classname>std::vector&lt;Gtk::Widget*&gt;</classname>、<classname>std::"
+#~ "list&lt;Gtk::Widget*&gt;</classname> 等。"
+
+#~ msgid ""
+#~ "<classname>Glib::SListHandle&lt;Gtk::Widget*&gt;</classname>: Use "
+#~ "<classname>std::vector&lt;Gtk::Widget*&gt;</classname>, <classname>std::"
+#~ "list&lt;Gtk::Widget*&gt;</classname>, etc."
+#~ msgstr ""
+#~ "<classname>Glib::SListHandle&lt;Gtk::Widget*&gt;</classname>:使用 "
+#~ "<classname>std::vector&lt;Gtk::Widget*&gt;</classname>、<classname>std::"
+#~ "list&lt;Gtk::Widget*&gt;</classname> 等。"
+
+#~ msgid ""
+#~ "Some parts of the <application>gtkmm</application> API use intermediate "
+#~ "data containers, such as <classname>Glib::StringArrayHandle</classname> "
+#~ "instead of a specific Standard C++ container such as <classname>std::"
+#~ "vector</classname> or <classname>std::list</classname>. You should not "
+#~ "declare these types yourself -- you should use whatever Standard C++ "
+#~ "container you prefer instead. <application>gtkmm</application> will do "
+#~ "the conversion for you. Here are some of these intermediate types: "
+#~ "<placeholder-1/>"
+#~ msgstr ""
+#~ "部分 <application>gtkmm</application> API 使用了中间数据容器,如 "
+#~ "<classname>Glib::StringArrayHandle</classname> 而不是特定的标准 C++ 容器 "
+#~ "<classname>std::vector</classname> 或 <classname>std::list</classname>。但"
+#~ "是你不应该自己声明这些类型,你应当使用你所倾向的标准 C++ 容器。"
+#~ "<application>gtkmm</application> 将会帮你进行类型转换。这里有一些这类中间"
+#~ "类型:<placeholder-1/>"
+
+#~ msgid ""
+#~ "To obtain a <application>gtkmm</application> instance from a C GObject "
+#~ "instance, use the Glib::wrap() function. For instance"
+#~ msgstr ""
+#~ "要从 C GObject 实例得到一个 <application>gtkmm</application> 实例,则使用 "
+#~ "Glib::wrap() 函数。例如"
+
+#~ msgid ""
+#~ "Next, we use the Window's <methodname>add()</methodname> method to put "
+#~ "<literal>m_button</literal> in the Window. (<methodname>add()</"
+#~ "methodname> comes from <classname>Gtk::Container</classname>, which is "
+#~ "described in the chapter on container widgets.) The <methodname>add()</"
+#~ "methodname> method places the Widget in the Window, but it doesn't "
+#~ "display the widget. <application>gtkmm</application> widgets are always "
+#~ "invisible when you create them - to display them, you must call their "
+#~ "<methodname>show()</methodname> method, which is what we do in the next "
+#~ "line."
+#~ msgstr ""
+#~ "下一步,我们使用 Window 类的 <methodname>add()</methodname> 方法把 "
+#~ "<literal>m_button</literal> 加到 Window 类中。(<methodname>add()</"
+#~ "methodname> 方法由 <classname>Gtk::Container</classname> 类继承而来,我们"
+#~ "将在容器组件这一章中具体介绍。) <methodname>add()</methodname> 方法仅仅将"
+#~ "组件添加到窗口中,它并不负责显示这些组件。<application>gtkmm</"
+#~ "application> 组件在创建以后都是不可见的。要显示它们,你必须调用 "
+#~ "<methodname>show()</methodname> 方法,通常我们会在接下来的一行就调用它。"
+
+#~ msgid "Checkboxes"
+#~ msgstr "复选框 (CheckButton)"
+
+#~ msgid "Constructors"
+#~ msgstr "构造函数"
+
+#~ msgid "Gtk::Button* pButton = new Gtk::Button(Gtk::Stock::OK);"
+#~ msgstr "Gtk::Button* pButton = new Gtk::Button(Gtk::Stock::OK);"
+
+#~ msgid ""
+#~ "Wherever possible you should use Stock items, to ensure consistency with "
+#~ "other applications, and to improve the appearance of your applications by "
+#~ "using icons. For instance, <placeholder-1/> This will use standard text, "
+#~ "in all languages, with standard keyboard accelerators, with a standard "
+#~ "icon."
+#~ msgstr ""
+#~ "任何时候你都应尽可能的使用 Stock Item,这样可以使你的应用程序和其它的保持"
+#~ "一致,并且可以通过使用图标来改善程序的外观。例如, <placeholder-1/> 这样在"
+#~ "所有的语言中都会使用标准的文字,标准的快捷键,以及标准的图标。"
+
+#~ msgid "pressed"
+#~ msgstr "pressed (按下)"
+
+#~ msgid "Emitted when the button is pressed."
+#~ msgstr "当按钮按下时发出。"
+
+#~ msgid "released"
+#~ msgstr "released (释放)"
+
+#~ msgid "Emitted when the button is released."
+#~ msgstr "当按钮释放后发出。"
+
+#~ msgid "clicked"
+#~ msgstr "clicked (点击)"
+
+#~ msgid "Emitted when the button is pressed and released."
+#~ msgstr "当按钮按下并抬起时发出。"
+
+#~ msgid "enter"
+#~ msgstr "enter (进入)"
+
+#~ msgid "Emitted when the mouse pointer moves over the button's window."
+#~ msgstr "当鼠标指针移到按钮上时发出。"
+
+#~ msgid "leave"
+#~ msgstr "leave (离开)"
+
+#~ msgid "Emitted when the mouse pointer leaves the button's window."
+#~ msgstr "当鼠标指针离开按钮时发出。"
+
+#~ msgid ""
+#~ "There are two ways to set up a group of radio buttons. The first way is "
+#~ "to create the buttons, and set up their groups afterwards. Only the first "
+#~ "two constructors are used. In the following example, we make a new window "
+#~ "class called <classname>RadioButtons</classname>, and then put three "
+#~ "radio buttons in it:"
+#~ msgstr ""
+#~ "有两种方式创建一个单选按钮的组。第一种方式是先创建按钮,然后再设置它们的"
+#~ "组。这种方式只用到了前两个构造函数。在下面的示例中,我们创建了一个新的窗口"
+#~ "类 <classname>RadioButtons</classname>,然后在其中放置3个单选按钮:"
+
+#~ msgid ""
+#~ "class RadioButtons : public Gtk::Window\n"
+#~ "{\n"
+#~ "public:\n"
+#~ "    RadioButtons();\n"
+#~ "\n"
+#~ "protected:\n"
+#~ "    Gtk::RadioButton m_rb1, m_rb2, m_rb3;\n"
+#~ "};\n"
+#~ "\n"
+#~ "RadioButtons::RadioButtons()\n"
+#~ "  : m_rb1(\"button1\"),\n"
+#~ "    m_rb2(\"button2\"),\n"
+#~ "    m_rb3(\"button3\")\n"
+#~ "{\n"
+#~ "    Gtk::RadioButton::Group group = m_rb1.get_group();\n"
+#~ "    m_rb2.set_group(group);\n"
+#~ "    m_rb3.set_group(group);\n"
+#~ "}"
+#~ msgstr ""
+#~ "class RadioButtons : public Gtk::Window\n"
+#~ "{\n"
+#~ "public:\n"
+#~ "    RadioButtons();\n"
+#~ "\n"
+#~ "protected:\n"
+#~ "    Gtk::RadioButton m_rb1, m_rb2, m_rb3;\n"
+#~ "};\n"
+#~ "\n"
+#~ "RadioButtons::RadioButtons()\n"
+#~ "  : m_rb1(\"button1\"),\n"
+#~ "    m_rb2(\"button2\"),\n"
+#~ "    m_rb3(\"button3\")\n"
+#~ "{\n"
+#~ "    Gtk::RadioButton::Group group = m_rb1.get_group();\n"
+#~ "    m_rb2.set_group(group);\n"
+#~ "    m_rb3.set_group(group);\n"
+#~ "}"
+
+#~ msgid "m_rb2.set_group(m_rb1.get_group()); //doesn't work"
+#~ msgstr "m_rb2.set_group(m_rb1.get_group()); //无法工作"
+
+#~ msgid ""
+#~ "Note that you can't just do <placeholder-1/> because the group is "
+#~ "modified by <methodname>set_group()</methodname> and therefore non-const."
+#~ msgstr ""
+#~ "注意,你不能只是 <placeholder-1/> 因为该组会由 <methodname>set_group()</"
+#~ "methodname> 修改,所以它不能是一个常量。"
+
+#~ msgid ""
+#~ "The second way to set up radio buttons is to make a group first, and then "
+#~ "add radio buttons to it. Here's an example:"
+#~ msgstr ""
+#~ "第二种创建单选按钮的方式是,先创建一个组,然后再向该组加入按钮。请看下面的"
+#~ "示例:"
+
+#~ msgid ""
+#~ "class RadioButtons : public Gtk::Window\n"
+#~ "{\n"
+#~ "public:\n"
+#~ "    RadioButtons();\n"
+#~ "};\n"
+#~ "\n"
+#~ "RadioButtons::RadioButtons()\n"
+#~ "{\n"
+#~ "    Gtk::RadioButton::Group group;\n"
+#~ "    Gtk::RadioButton *m_rb1 = Gtk::manage(\n"
+#~ "      new Gtk::RadioButton(group,\"button1\"));\n"
+#~ "    Gtk::RadioButton *m_rb2 = manage(\n"
+#~ "      new Gtk::RadioButton(group,\"button2\"));\n"
+#~ "      Gtk::RadioButton *m_rb3 = manage(\n"
+#~ "        new Gtk::RadioButton(group,\"button3\"));\n"
+#~ "}"
+#~ msgstr ""
+#~ "class RadioButtons : public Gtk::Window\n"
+#~ "{\n"
+#~ "public:\n"
+#~ "    RadioButtons();\n"
+#~ "};\n"
+#~ "\n"
+#~ "RadioButtons::RadioButtons()\n"
+#~ "{\n"
+#~ "    Gtk::RadioButton::Group group;\n"
+#~ "    Gtk::RadioButton *m_rb1 = Gtk::manage(\n"
+#~ "      new Gtk::RadioButton(group,\"button1\"));\n"
+#~ "    Gtk::RadioButton *m_rb2 = manage(\n"
+#~ "      new Gtk::RadioButton(group,\"button2\"));\n"
+#~ "      Gtk::RadioButton *m_rb3 = manage(\n"
+#~ "        new Gtk::RadioButton(group,\"button3\"));\n"
+#~ "}"
+
+#~ msgid ""
+#~ "We made a new group by simply declaring a variable, <literal>group</"
+#~ "literal>, of type <classname>Gtk::RadioButton::Group</classname>. Then we "
+#~ "made three radio buttons, using a constructor to make each of them part "
+#~ "of <literal>group</literal>."
+#~ msgstr ""
+#~ "我们通过声明一个类型为 <classname>Gtk::RadioButton::Group</classname> 的名"
+#~ "为 <literal>group</literal> 的变量。然后我们创建三个单选按钮,用构造函数把"
+#~ "它们放置到组 <literal>group</literal> 中。"
+
+#~ msgid "Update Policies"
+#~ msgstr "更新策略"
+
+#~ msgid ""
+#~ "<literal>Gtk::UPDATE_CONTINUOUS</literal> - This is the default. The "
+#~ "<literal>value_changed</literal> signal is emitted continuously, i.e. "
+#~ "whenever the slider is moved by even the tiniest amount."
+#~ msgstr ""
+#~ "<literal>Gtk::UPDATE_CONTINUOUS</literal> - 这是默认的更新规则。会连续不断"
+#~ "的发出 <literal>value_changed</literal> 信号,即使滑块只是被移动了一点点,"
+#~ "也会发出该信号。"
+
+#~ msgid ""
+#~ "<literal>Gtk::UPDATE_DISCONTINUOUS</literal> - The "
+#~ "<literal>value_changed</literal> signal is only emitted once the slider "
+#~ "has stopped moving and the user has released the mouse button."
+#~ msgstr ""
+#~ "<literal>Gtk::UPDATE_DISCONTINUOUS</literal> - 只有在滑块停止了移动并且用"
+#~ "户释放了鼠标的时候才会发出 <literal>value_changed</literal> 信号。"
+
+#~ msgid ""
+#~ "<literal>Gtk::UPDATE_DELAYED</literal> - The <literal>value_changed</"
+#~ "literal> signal is emitted when the user releases the mouse button, or if "
+#~ "the slider stops moving for a short period of time."
+#~ msgstr ""
+#~ "<literal>Gtk::UPDATE_DELAYED</literal> - 只有当用户释放鼠标,或者滑块停止"
+#~ "移动一小段时间后,才发出 <literal>value_changed</literal> 信号。"
+
+#~ msgid ""
+#~ "The <emphasis>update policy</emphasis> of a <classname>Range</classname> "
+#~ "widget defines at what points during user interaction it will change the "
+#~ "<literal>value</literal> field of its <classname>Gtk::Adjustment</"
+#~ "classname> and emit the <literal>value_changed</literal> signal. The "
+#~ "update policies, set with the <methodname>set_update_policy()</"
+#~ "methodname> method, are: <placeholder-1/>"
+#~ msgstr ""
+#~ "<classname>Range</classname> 组件的 <emphasis>更新策略</emphasis> 定义了在"
+#~ "用户操作期间的什么时候更新 <classname>Gtk::Adjustment</classname> 的值 "
+#~ "<literal>value</literal>,并且何时发出 <literal>value_changed</literal> 信"
+#~ "号。可以使用 <methodname>set_update_policy()</methodname> 方法来设置更新策"
+#~ "略。这些策略包括:<placeholder-1/>"
 
 #~ msgid ""
 #~ "Note that the <classname>XPMLabelBox</classname> class can be used to "


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]