diff options
author | Elliott Sales de Andrade <quantum.analyst@gmail.com> | 2022-08-23 02:54:58 -0500 |
---|---|---|
committer | Elliott Sales de Andrade <quantum.analyst@gmail.com> | 2022-08-23 02:54:58 -0500 |
commit | b1bbd8064398a00a2879cdbeaaf4628aeaf7a5a3 (patch) | |
tree | 4170f03411a4f40943186c3c2e804b676f1da947 | |
parent | 623cac7a837b571d342d6e7cdeb9c832393d0b61 (diff) | |
download | pidgin-b1bbd8064398a00a2879cdbeaaf4628aeaf7a5a3.tar.gz |
Port account manager to GTK4
Testing Done:
Opened manager, clicked on all the dialog buttons, and checked for no warnings. Did not check that adding/removing, or changing options really worked.
Reviewed at https://reviews.imfreedom.org/r/1629/
-rw-r--r-- | pidgin/gtkaccount.c | 53 | ||||
-rw-r--r-- | pidgin/pidgindialog.c | 2 | ||||
-rw-r--r-- | pidgin/resources/Accounts/editor.ui | 112 | ||||
-rw-r--r-- | pidgin/resources/Accounts/manager.ui | 181 | ||||
-rw-r--r-- | pidgin/resources/proxyoptions.ui | 12 |
5 files changed, 146 insertions, 214 deletions
diff --git a/pidgin/gtkaccount.c b/pidgin/gtkaccount.c index 403e2d5f78..6e490bee20 100644 --- a/pidgin/gtkaccount.c +++ b/pidgin/gtkaccount.c @@ -210,14 +210,14 @@ set_account_protocol_cb(GtkWidget *widget, AccountPrefsDialog *dialog) { if (!dialog->protocol || !PURPLE_PROTOCOL_IMPLEMENTS(dialog->protocol, SERVER, register_user)) { - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->register_button), FALSE); + gtk_check_button_set_active(GTK_CHECK_BUTTON(dialog->register_button), FALSE); gtk_widget_hide(dialog->register_button); } else { if (purple_protocol_get_options(dialog->protocol) & OPT_PROTO_REGISTER_NOSCREENNAME) { gtk_widget_set_sensitive(dialog->register_button, TRUE); } else { - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON( + gtk_check_button_set_active(GTK_CHECK_BUTTON( dialog->register_button), FALSE); gtk_widget_set_sensitive(dialog->register_button, FALSE); } @@ -235,8 +235,8 @@ username_changed_cb(GtkEntry *entry, AccountPrefsDialog *dialog) if (dialog->ok_button) { if (opt_noscreenname && dialog->register_button && - gtk_toggle_button_get_active( - GTK_TOGGLE_BUTTON(dialog->register_button))) + gtk_check_button_get_active( + GTK_CHECK_BUTTON(dialog->register_button))) gtk_widget_set_sensitive(dialog->ok_button, TRUE); else gtk_widget_set_sensitive(dialog->ok_button, @@ -255,8 +255,8 @@ username_changed_cb(GtkEntry *entry, AccountPrefsDialog *dialog) static void register_button_cb(GtkWidget *checkbox, AccountPrefsDialog *dialog) { - int register_checked = gtk_toggle_button_get_active( - GTK_TOGGLE_BUTTON(dialog->register_button)); + int register_checked = gtk_check_button_get_active( + GTK_CHECK_BUTTON(dialog->register_button)); int opt_noscreenname = (dialog->protocol != NULL && (purple_protocol_get_options(dialog->protocol) & OPT_PROTO_REGISTER_NOSCREENNAME)); int register_noscreenname = (opt_noscreenname && register_checked); @@ -531,7 +531,7 @@ add_login_options(AccountPrefsDialog *dialog, GtkWidget *parent) static void icon_check_cb(GtkWidget *checkbox, AccountPrefsDialog *dialog) { - gtk_widget_set_sensitive(dialog->icon_hbox, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->icon_check))); + gtk_widget_set_sensitive(dialog->icon_hbox, gtk_check_button_get_active(GTK_CHECK_BUTTON(dialog->icon_check))); } static void @@ -570,7 +570,7 @@ add_user_options(AccountPrefsDialog *dialog, GtkWidget *parent) gtk_box_append(GTK_BOX(vbox), dialog->icon_check); dialog->icon_hbox = hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6); - gtk_widget_set_sensitive(hbox, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->icon_check))); + gtk_widget_set_sensitive(hbox, gtk_check_button_get_active(GTK_CHECK_BUTTON(dialog->icon_check))); gtk_box_append(GTK_BOX(vbox), hbox); label = gtk_label_new(" "); @@ -626,7 +626,7 @@ add_user_options(AccountPrefsDialog *dialog, GtkWidget *parent) purple_account_get_private_alias(dialog->account)); } - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->icon_check), + gtk_check_button_set_active(GTK_CHECK_BUTTON(dialog->icon_check), !purple_account_get_bool(dialog->account, "use-global-buddyicon", TRUE)); @@ -734,8 +734,8 @@ add_account_options(AccountPrefsDialog *dialog) opt_entry->widget = check = gtk_check_button_new_with_mnemonic(tmp); g_free(tmp); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), - bool_value); + gtk_check_button_set_active(GTK_CHECK_BUTTON(check), + bool_value); gtk_box_append(GTK_BOX(vbox), check); break; @@ -911,16 +911,15 @@ add_voice_options(AccountPrefsDialog *dialog) } if (dialog->account) { - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->suppression_check), - purple_account_get_silence_suppression(dialog->account)); + gtk_check_button_set_active(GTK_CHECK_BUTTON(dialog->suppression_check), + purple_account_get_silence_suppression(dialog->account)); } else { - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->suppression_check), FALSE); + gtk_check_button_set_active(GTK_CHECK_BUTTON(dialog->suppression_check), FALSE); } } -static gboolean -account_win_destroy_cb(GtkWidget *w, GdkEvent *event, - AccountPrefsDialog *dialog) +static void +account_win_destroy_cb(AccountPrefsDialog *dialog) { gtk_window_destroy(GTK_WINDOW(dialog->window)); @@ -937,7 +936,6 @@ account_win_destroy_cb(GtkWidget *w, GdkEvent *event, purple_signals_disconnect_by_handle(dialog); g_free(dialog); - return FALSE; } static void @@ -1048,13 +1046,13 @@ account_prefs_save(AccountPrefsDialog *dialog) { const char *filename; if (new_acct || purple_account_get_bool(account, "use-global-buddyicon", TRUE) == - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->icon_check))) + gtk_check_button_get_active(GTK_CHECK_BUTTON(dialog->icon_check))) { icon_change = TRUE; } - purple_account_set_bool(account, "use-global-buddyicon", !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->icon_check))); + purple_account_set_bool(account, "use-global-buddyicon", !gtk_check_button_get_active(GTK_CHECK_BUTTON(dialog->icon_check))); - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->icon_check))) + if (gtk_check_button_get_active(GTK_CHECK_BUTTON(dialog->icon_check))) { if (dialog->icon_img) { @@ -1112,7 +1110,7 @@ account_prefs_save(AccountPrefsDialog *dialog) { case PURPLE_PREF_BOOLEAN: bool_value = - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(opt_entry->widget)); + gtk_check_button_get_active(GTK_CHECK_BUTTON(opt_entry->widget)); purple_account_set_bool(account, opt_entry->setting, bool_value); break; @@ -1135,7 +1133,7 @@ account_prefs_save(AccountPrefsDialog *dialog) { /* Voice and Video settings */ if (dialog->voice_frame) { purple_account_set_silence_suppression(account, - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->suppression_check))); + gtk_check_button_get_active(GTK_CHECK_BUTTON(dialog->suppression_check))); } /* If this is a new account, add it to our list */ @@ -1146,7 +1144,7 @@ account_prefs_save(AccountPrefsDialog *dialog) { } /* If this is a new account, then sign on! */ - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->register_button))) { + if (gtk_check_button_get_active(GTK_CHECK_BUTTON(dialog->register_button))) { purple_account_set_register_callback(account, account_register_cb, NULL); purple_account_register(account); } else if (new_acct) { @@ -1160,7 +1158,7 @@ account_prefs_save(AccountPrefsDialog *dialog) { } /* We no longer need the data from the dialog window */ - account_win_destroy_cb(NULL, NULL, dialog); + account_win_destroy_cb(dialog); } static void @@ -1172,7 +1170,8 @@ account_prefs_response_cb(GtkDialog *dialog, gint response_id, gpointer data) { account_prefs_save(window); break; case RESPONSE_CLOSE: - account_win_destroy_cb(NULL, NULL, window); + case GTK_RESPONSE_DELETE_EVENT: + account_win_destroy_cb(window); break; default: break; @@ -1210,8 +1209,6 @@ pidgin_account_dialog_show(PidginAccountDialogType type, dialog->window = win = pidgin_dialog_new((type == PIDGIN_ADD_ACCOUNT_DIALOG) ? _("Add Account") : _("Modify Account"), 6, "account", FALSE); - g_signal_connect(win, "delete_event", G_CALLBACK(account_win_destroy_cb), - dialog); g_signal_connect(win, "response", G_CALLBACK(account_prefs_response_cb), dialog); diff --git a/pidgin/pidgindialog.c b/pidgin/pidgindialog.c index f16a18cd35..2814fb372f 100644 --- a/pidgin/pidgindialog.c +++ b/pidgin/pidgindialog.c @@ -56,8 +56,6 @@ pidgin_dialog_new(const gchar *title, guint border_width, const gchar *role, return GTK_WIDGET(g_object_new( PIDGIN_TYPE_DIALOG, "title", title, - "border-width", border_width, - "role", role, "resizable", resizable, NULL)); } diff --git a/pidgin/resources/Accounts/editor.ui b/pidgin/resources/Accounts/editor.ui index d28588d42f..9e5ff9588e 100644 --- a/pidgin/resources/Accounts/editor.ui +++ b/pidgin/resources/Accounts/editor.ui @@ -19,102 +19,62 @@ along with this program; if not, see <https://www.gnu.org/licenses/>. --> <interface> - <requires lib="gtk+" version="3.24"/> + <requires lib="gtk" version="4.0"/> <requires lib="pidgin" version="3.0"/> <!-- interface-license-type gplv2 --> <!-- interface-name Pidgin --> <!-- interface-description Internet Messenger --> <!-- interface-copyright Pidgin Developers <devel@pidgin.im> --> <template class="PidginAccountEditor" parent="GtkDialog"> - <property name="can-focus">False</property> - <property name="type-hint">dialog</property> <signal name="response" handler="pidgin_account_editor_response_cb" swapped="no"/> - <child internal-child="vbox"> + <child internal-child="content_area"> <object class="GtkBox"> - <property name="can-focus">False</property> <property name="orientation">vertical</property> <property name="spacing">2</property> - <child internal-child="action_area"> - <object class="GtkButtonBox"> - <property name="can-focus">False</property> - <property name="layout-style">end</property> - <child> - <object class="GtkButton" id="button1"> - <property name="label" translatable="yes">_Cancel</property> - <property name="visible">True</property> - <property name="can-focus">True</property> - <property name="receives-default">True</property> - <property name="use-underline">True</property> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="button2"> - <property name="label" translatable="yes">_Save</property> - <property name="visible">True</property> - <property name="can-focus">True</property> - <property name="receives-default">True</property> - <property name="use-underline">True</property> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> <child> <object class="GtkNotebook" id="notebook"> - <property name="visible">True</property> - <property name="can-focus">True</property> + <property name="focusable">1</property> <child> - <object class="PidginProxyOptions" id="proxy_options"> - <property name="visible">True</property> - <property name="can-focus">False</property> - <property name="margin-left">12</property> - <property name="margin-right">12</property> - <property name="margin-start">12</property> - <property name="margin-end">12</property> - <property name="margin-top">12</property> - <property name="margin-bottom">12</property> - <property name="orientation">vertical</property> - <property name="spacing">6</property> - </object> - <packing> + <object class="GtkNotebookPage"> <property name="position">0</property> - </packing> - </child> - <child type="tab"> - <object class="GtkLabel"> - <property name="visible">True</property> - <property name="can-focus">False</property> - <property name="label" translatable="yes">_Proxy</property> - <property name="use-underline">True</property> + <property name="child"> + <object class="PidginProxyOptions" id="proxy_options"> + <property name="margin-start">12</property> + <property name="margin-end">12</property> + <property name="margin-top">12</property> + <property name="margin-bottom">12</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + </object> + </property> + <property name="tab"> + <object class="GtkLabel"> + <property name="label" translatable="1">_Proxy</property> + <property name="use-underline">1</property> + </object> + </property> </object> - <packing> - <property name="position">0</property> - <property name="tab-fill">False</property> - </packing> </child> </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> </child> </object> </child> + <child type="action"> + <object class="GtkButton" id="button1"> + <property name="label" translatable="1">_Cancel</property> + <property name="focusable">1</property> + <property name="receives-default">1</property> + <property name="use-underline">1</property> + </object> + </child> + <child type="action"> + <object class="GtkButton" id="button2"> + <property name="label" translatable="1">_Save</property> + <property name="focusable">1</property> + <property name="receives-default">1</property> + <property name="use-underline">1</property> + </object> + </child> <action-widgets> <action-widget response="-6">button1</action-widget> <action-widget response="-10">button2</action-widget> diff --git a/pidgin/resources/Accounts/manager.ui b/pidgin/resources/Accounts/manager.ui index 24fe1b92d9..1d6928db90 100644 --- a/pidgin/resources/Accounts/manager.ui +++ b/pidgin/resources/Accounts/manager.ui @@ -19,7 +19,7 @@ along with this program; if not, see <https://www.gnu.org/licenses/>. --> <interface> - <requires lib="gtk+" version="3.24"/> + <requires lib="gtk" version="4.0"/> <!-- interface-license-type gplv2 --> <!-- interface-name Pidgin --> <!-- interface-description Internet Messenger --> @@ -41,99 +41,83 @@ along with this program; if not, see <https://www.gnu.org/licenses/>. </columns> </object> <template class="PidginAccountManager" parent="GtkDialog"> - <property name="can-focus">False</property> - <property name="title" translatable="yes">Accounts</property> + <property name="title" translatable="1">Accounts</property> <property name="default-width">500</property> <property name="default-height">300</property> - <property name="type-hint">dialog</property> <signal name="response" handler="pidgin_account_manager_response_cb" swapped="no"/> - <child internal-child="vbox"> - <object class="GtkBox"> - <property name="can-focus">False</property> - <property name="orientation">vertical</property> - <property name="spacing">2</property> + <child internal-child="content_area"> + <object class="GtkScrolledWindow"> + <property name="vexpand">1</property> + <property name="valign">fill</property> + <property name="focusable">1</property> <child> - <object class="GtkScrolledWindow"> - <property name="visible">True</property> - <property name="can-focus">True</property> - <property name="shadow-type">in</property> + <object class="GtkTreeView"> + <property name="focusable">1</property> + <property name="model">model</property> + <signal name="row-activated" handler="pidgin_account_manager_row_activated_cb" object="PidginAccountManager" swapped="no"/> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="selection"> + <signal name="changed" handler="pidgin_account_manager_selection_changed_cb" object="PidginAccountManager" swapped="no"/> + </object> + </child> <child> - <object class="GtkTreeView"> - <property name="visible">True</property> - <property name="can-focus">True</property> - <property name="model">model</property> - <signal name="row-activated" handler="pidgin_account_manager_row_activated_cb" object="PidginAccountManager" swapped="no"/> - <child internal-child="selection"> - <object class="GtkTreeSelection" id="selection"> - <signal name="changed" handler="pidgin_account_manager_selection_changed_cb" object="PidginAccountManager" swapped="no"/> + <object class="GtkTreeViewColumn"> + <property name="title" translatable="1">Enabled</property> + <child> + <object class="GtkCellRendererToggle"> + <signal name="toggled" handler="pidgin_account_manager_enable_toggled_cb" object="PidginAccountManager" swapped="no"/> </object> + <attributes> + <attribute name="active">0</attribute> + </attributes> </child> + </object> + </child> + <child> + <object class="GtkTreeViewColumn"> + <property name="resizable">1</property> + <property name="title" translatable="1">Username</property> <child> - <object class="GtkTreeViewColumn"> - <property name="title" translatable="yes">Enabled</property> - <child> - <object class="GtkCellRendererToggle"> - <signal name="toggled" handler="pidgin_account_manager_enable_toggled_cb" object="PidginAccountManager" swapped="no"/> - </object> - <attributes> - <attribute name="active">0</attribute> - </attributes> - </child> - </object> + <object class="GtkCellRendererPixbuf"/> + <attributes> + <attribute name="pixbuf">1</attribute> + </attributes> </child> <child> - <object class="GtkTreeViewColumn"> - <property name="resizable">True</property> - <property name="title" translatable="yes">Username</property> - <child> - <object class="GtkCellRendererPixbuf"/> - <attributes> - <attribute name="pixbuf">1</attribute> - </attributes> - </child> - <child> - <object class="GtkCellRendererText"/> - <attributes> - <attribute name="markup">2</attribute> - </attributes> - </child> - </object> + <object class="GtkCellRendererText"/> + <attributes> + <attribute name="markup">2</attribute> + </attributes> </child> + </object> + </child> + <child> + <object class="GtkTreeViewColumn"> + <property name="resizable">1</property> + <property name="title" translatable="1">Protocol</property> <child> - <object class="GtkTreeViewColumn"> - <property name="resizable">True</property> - <property name="title" translatable="yes">Protocol</property> - <child> - <object class="GtkCellRendererPixbuf"/> - <attributes> - <attribute name="icon-name">3</attribute> - </attributes> - </child> - <child> - <object class="GtkCellRendererText"/> - <attributes> - <attribute name="markup">4</attribute> - </attributes> - </child> - </object> + <object class="GtkCellRendererPixbuf"/> + <attributes> + <attribute name="icon-name">3</attribute> + </attributes> + </child> + <child> + <object class="GtkCellRendererText"/> + <attributes> + <attribute name="markup">4</attribute> + </attributes> </child> </object> </child> </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> </child> </object> </child> <child type="action"> <object class="GtkButton" id="button1"> - <property name="label" translatable="yes">τ</property> - <property name="visible">True</property> - <property name="can-focus">True</property> - <property name="receives-default">True</property> + <property name="label" translatable="1">τ</property> + <property name="focusable">1</property> + <property name="receives-default">1</property> <style> <class name="circular"/> </style> @@ -141,53 +125,48 @@ along with this program; if not, see <https://www.gnu.org/licenses/>. </child> <child type="action"> <object class="GtkButton" id="praetorians"> - <property name="label" translatable="yes">π</property> - <property name="visible">True</property> - <property name="can-focus">True</property> - <property name="focus-on-click">False</property> - <property name="receives-default">True</property> - <property name="relief">none</property> + <property name="label" translatable="1">π</property> + <property name="focusable">1</property> + <property name="focus-on-click">0</property> + <property name="receives-default">1</property> <style> + <class name="flat"/> <class name="circular"/> </style> </object> </child> <child type="action"> <object class="GtkButton" id="button3"> - <property name="label" translatable="yes">_Add...</property> - <property name="visible">True</property> - <property name="can-focus">True</property> - <property name="receives-default">True</property> - <property name="use-underline">True</property> + <property name="label" translatable="1">_Add...</property> + <property name="focusable">1</property> + <property name="receives-default">1</property> + <property name="use-underline">1</property> </object> </child> <child type="action"> <object class="GtkButton" id="modify_button"> - <property name="label" translatable="yes">_Modify...</property> - <property name="visible">True</property> - <property name="sensitive">False</property> - <property name="can-focus">True</property> - <property name="receives-default">True</property> - <property name="use-underline">True</property> + <property name="label" translatable="1">_Modify...</property> + <property name="sensitive">0</property> + <property name="focusable">1</property> + <property name="receives-default">1</property> + <property name="use-underline">1</property> </object> </child> <child type="action"> <object class="GtkButton" id="remove_button"> - <property name="label" translatable="yes">_Remove</property> - <property name="visible">True</property> - <property name="sensitive">False</property> - <property name="can-focus">True</property> - <property name="receives-default">True</property> - <property name="use-underline">True</property> + <property name="label" translatable="1">_Remove</property> + <property name="sensitive">0</property> + <property name="focusable">1</property> + <property name="receives-default">1</property> + <property name="use-underline">1</property> </object> </child> <child type="action"> <object class="GtkButton" id="button2"> - <property name="label" translatable="yes">_Close</property> - <property name="visible">True</property> - <property name="can-focus">True</property> - <property name="receives-default">True</property> - <property name="use-underline">True</property> + <property name="label" translatable="1">_Close</property> + <property name="focusable">1</property> + <property name="receives-default">1</property> + <property name="use-underline">1</property> </object> </child> <action-widgets> diff --git a/pidgin/resources/proxyoptions.ui b/pidgin/resources/proxyoptions.ui index d82143fb35..f8955bd332 100644 --- a/pidgin/resources/proxyoptions.ui +++ b/pidgin/resources/proxyoptions.ui @@ -88,7 +88,7 @@ along with this library; if not, see <https://www.gnu.org/licenses/>. <child> <object class="GtkComboBox" id="proxy_type"> <property name="hexpand">1</property> - <property name="halign">GTK_ALIGN_FILL</property> + <property name="halign">fill</property> <property name="model">filter</property> <signal name="changed" handler="pidgin_proxy_options_proxy_type_changed_cb" object="PidginProxyOptions" swapped="no"/> <child> @@ -120,7 +120,7 @@ along with this library; if not, see <https://www.gnu.org/licenses/>. <child> <object class="GtkEntry" id="hostname"> <property name="hexpand">1</property> - <property name="halign">GTK_ALIGN_FILL</property> + <property name="halign">fill</property> <property name="focusable">1</property> </object> </child> @@ -140,12 +140,10 @@ along with this library; if not, see <https://www.gnu.org/licenses/>. <child> <object class="GtkSpinButton" id="port"> <property name="hexpand">1</property> - <property name="halign">GTK_ALIGN_FILL</property> + <property name="halign">fill</property> <property name="focusable">1</property> - <property name="input-hints">GTK_INPUT_HINT_NO_EMOJI | GTK_INPUT_HINT_NONE</property> <property name="adjustment">port_adjustment</property> <property name="numeric">1</property> - <property name="extra-menu">extra</property> </object> </child> </object> @@ -164,7 +162,7 @@ along with this library; if not, see <https://www.gnu.org/licenses/>. <child> <object class="GtkEntry" id="username"> <property name="hexpand">1</property> - <property name="halign">GTK_ALIGN_FILL</property> + <property name="halign">fill</property> <property name="focusable">1</property> </object> </child> @@ -184,7 +182,7 @@ along with this library; if not, see <https://www.gnu.org/licenses/>. <child> <object class="GtkEntry" id="password"> <property name="hexpand">1</property> - <property name="halign">GTK_ALIGN_FILL</property> + <property name="halign">fill</property> <property name="focusable">1</property> </object> </child> |